Package org.exoplatform.webui.core.lifecycle

Source Code of org.exoplatform.webui.core.lifecycle.Lifecycle

/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/

package org.exoplatform.webui.core.lifecycle;

import org.exoplatform.commons.utils.PropertyManager;
import org.exoplatform.container.ExoContainer;
import org.exoplatform.groovyscript.text.TemplateService;
import org.exoplatform.resolver.ResourceResolver;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.event.Event;

/**
* Created by The eXo Platform SAS May 7, 2006
*/
public class Lifecycle<E extends UIComponent> {

    protected static Log log = ExoLogger.getLogger("portal:Lifecycle");

    // public void init(UIComponent uicomponent, WebuiRequestContext context)
    // throws Exception {}

    public void processDecode(E uicomponent, WebuiRequestContext context) throws Exception {
    }

    public void processAction(E uicomponent, WebuiRequestContext context) throws Exception {
        String action = context.getRequestParameter(context.getActionParameterName());
        if (action == null)
            return;
        Event<UIComponent> event = uicomponent.createEvent(action, Event.Phase.PROCESS, context);
        if (event != null)
            event.broadcast();
    }

    /**
     * That method is the most generic one for every UIComponent that is bound to this Lifecycle object and the class that
     * extends it without overriding the method.
     *
     * The template associated to the specified UIComponent is rendered using renderTemplate(). A WebuiBindingContext context
     * object provides the template with all the necessary objects to render. (WebuiBindingContext extends the Map class)
     *
     */
    public void processRender(E uicomponent, WebuiRequestContext context) throws Exception {
        String template = uicomponent.getTemplate();

        // Fail if we have no template
        if (template == null) {
            throw new IllegalStateException("uicomponent " + uicomponent + " with class " + uicomponent.getClass().getName()
                    + " has no template for rendering");
        }

        //
        ResourceResolver resolver = uicomponent.getTemplateResourceResolver(context, template);
        WebuiBindingContext bcontext = new WebuiBindingContext(resolver, context.getWriter(), uicomponent, context);
        bcontext.put(UIComponent.UICOMPONENT, uicomponent);
        bcontext.put(uicomponent.getUIComponentName(), uicomponent);
        renderTemplate(template, bcontext);
    }

    // public void destroy(UIComponent uicomponent) throws Exception {}

    /**
     * The method allows to use Groovy templates to render the portal components.
     *
     * <ol>
     * <li>Add a decorator object into the context</li>
     * <li>Get a reference to the TemplateService</li>
     * <li>If the system property "exo.product.developing" is set to <code>true</code>, the templates are not cached</li>
     * <li>If the writer used to render the output is of type HtmlValidator, which is the case in the Portal environment, then
     * it is also possible to validate the generated HTML (for debugging purposes)</li>
     * <li>The template and the context are then merged to generate the HTML fragment</li>
     * </ol>
     *
     */
    protected void renderTemplate(String template, WebuiBindingContext bcontext) throws Exception {
        WebuiRequestContext context = bcontext.getRequestContext();
        bcontext.put("locale", context.getLocale());
        ExoContainer pcontainer = context.getApplication().getApplicationServiceContainer();
        TemplateService service = (TemplateService) pcontainer.getComponentInstanceOfType(TemplateService.class);
        ResourceResolver resolver = bcontext.getResourceResolver();

        if (PropertyManager.isDevelopping()) {
            WebuiRequestContext rootContext = (WebuiRequestContext) context.getParentAppRequestContext();
            if (rootContext == null)
                rootContext = context;
            long lastAccess = rootContext.getUIApplication().getLastAccessApplication();
            if (resolver.isModified(template, lastAccess)) {
                if (log.isDebugEnabled())
                    log.debug("Invalidate the template: " + template);
                service.invalidateTemplate(template, resolver);
            }
        }

        try {
            service.merge(template, bcontext);
        } catch (NullPointerException e) {
            log.error("Template: " + template + " not found.");
        }
    }
}
TOP

Related Classes of org.exoplatform.webui.core.lifecycle.Lifecycle

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.