Package org.apache.jetspeed.aggregator.impl

Source Code of org.apache.jetspeed.aggregator.impl.PortletRendererImpl

/*
* Copyright 2000-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*      http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jetspeed.aggregator.impl;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.jetspeed.PortalReservedParameters;
import org.apache.jetspeed.aggregator.ContentDispatcher;
import org.apache.jetspeed.aggregator.ContentDispatcherCtrl;
import org.apache.jetspeed.aggregator.FailedToRenderFragmentException;
import org.apache.jetspeed.aggregator.PortletRenderer;
import org.apache.jetspeed.aggregator.UnknownPortletDefinitionException;
import org.apache.jetspeed.container.window.FailedToRetrievePortletWindow;
import org.apache.jetspeed.container.window.PortletWindowAccessor;
import org.apache.jetspeed.om.page.Fragment;
import org.apache.jetspeed.om.page.Page;
import org.apache.jetspeed.request.RequestContext;
import org.apache.jetspeed.util.JetspeedObjectID;
import org.apache.pluto.PortletContainer;
import org.apache.pluto.PortletContainerServices;
import org.apache.pluto.om.common.ObjectID;
import org.apache.pluto.om.entity.PortletEntity;
import org.apache.pluto.om.window.PortletWindow;

/**
* <h4>PortletRendererService<br />
* Jetspeed-2 Rendering service.</h4>
* <p>This service process all portlet rendering requests and interfaces with the portlet
* container to generate the resulting markup</p>
*
* @author <a href="mailto:raphael@apache.org">Rapha�l Luta</a>
* @version $Id: PortletRendererImpl.java,v 1.24 2004/10/13 15:53:22 weaver Exp $
*/
public class PortletRendererImpl implements PortletRenderer
{
    protected final static Log log = LogFactory.getLog(PortletRendererImpl.class);

    private WorkerMonitor monitor;

    private PortletContainer container;
    private PortletWindowAccessor windowAccessor;

    public PortletRendererImpl(PortletContainer container,
                               PortletWindowAccessor windowAccessor)
    {
        this.container = container;
        this.windowAccessor = windowAccessor;
    }
       
    public void start()
    {
        this.monitor = new WorkerMonitor();
        this.monitor.init();
    }
   
    public void stop()
    {
        // this.monitor.shutdown ?
    }
         
    /**
        Render the specified Page fragment.
        Result is returned in the PortletResponse.
     * @throws FailedToRenderFragmentException
     */
    public void renderNow(Fragment fragment, RequestContext request) throws FailedToRenderFragmentException
    {
        //
        // create the portlet window and render the portlet
        //
        HttpServletRequest servletRequest = null;
        Page outerPage = null;
        Fragment outerFragment = null;
        ContentDispatcher outerFragmentDispatcher = null;
        try
        {
            PortletContainerServices.prepare("jetspeed");
           
            PortletWindow portletWindow = getPortletWindow(fragment);

            servletRequest = request.getRequestForWindow(portletWindow);
            HttpServletResponse servletResponse = request.getResponseForWindow(portletWindow);

            // save and set servlet request attributes required
            // for rendering layout portlets
            outerPage = (Page) servletRequest.getAttribute(PortalReservedParameters.PAGE_ATTRIBUTE_KEY);
            outerFragment = (Fragment) servletRequest.getAttribute("org.apache.jetspeed.Fragment");
            outerFragmentDispatcher = (ContentDispatcher) servletRequest.getAttribute("org.apache.jetspeed.ContentDispatcher");
            servletRequest.setAttribute(PortalReservedParameters.PAGE_ATTRIBUTE_KEY,request.getPage());
            servletRequest.setAttribute("org.apache.jetspeed.Fragment",fragment);
            servletRequest.setAttribute("org.apache.jetspeed.ContentDispatcher",getDispatcher(request,true));

            // should we decorate here instead of rendering Portlet ?
            container.renderPortlet(portletWindow, servletRequest, servletResponse);
        }
        catch (Exception e)
        {           
            throw new FailedToRenderFragmentException("Unable to render fragment because: "+e.toString(), e);
        }
        finally
        {
            if (servletRequest!=null)
            {
                // restore servlet request attributes
                if (outerFragmentDispatcher == null)
                {
                    servletRequest.removeAttribute("org.apache.jetspeed.ContentDispatcher");
                }
                else
                {
                    servletRequest.setAttribute("org.apache.jetspeed.ContentDispatcher",outerFragmentDispatcher);
                }
                if (outerFragment == null)
                {
                    servletRequest.removeAttribute("org.apache.jetspeed.Fragment");
                }
                else
                {
                    servletRequest.setAttribute("org.apache.jetspeed.Fragment",outerFragment);
                }
                if (outerPage == null)
                {
                    servletRequest.removeAttribute(PortalReservedParameters.PAGE_ATTRIBUTE_KEY);
                }
                else
                {
                    servletRequest.setAttribute(PortalReservedParameters.PAGE_ATTRIBUTE_KEY,outerPage);
                }
            }
        }
    }

    /**
        Render the specified Page fragment.
        Result is returned in the PortletResponse.
     * @throws FailedToRenderFragmentException
     */
    public void renderNow(Fragment fragment, HttpServletRequest request, HttpServletResponse response) throws FailedToRenderFragmentException
    {
        //
        // create the portlet window and render the portlet
        //
        try
        {
            PortletContainerServices.prepare("jetspeed");
            RequestContext context = (RequestContext) request.getAttribute("org.apache.jetspeed.request.RequestContext");
            PortletWindow portletWindow = getPortletWindow(fragment);
            HttpServletRequest servletRequest = context.getRequestForWindow(portletWindow);
            HttpServletResponse servletResponse = context.getResponseForWindow(portletWindow);
           
            container.renderPortlet(portletWindow, servletRequest, servletResponse);
        }
        catch (Exception e)
        {           
            throw new FailedToRenderFragmentException("Unable to render fragment because: "+e.toString(), e);
        }
    }

    /** Render the specified Page fragment.
        The method returns before rendering is complete, rendered content can be
        accessed through the ContentDispatcher
     * @throws UnknownPortletDefinitionException
     * @throws FailedToRetrievePortletWindow
    */
    public void render(Fragment fragment, RequestContext request) throws FailedToRenderFragmentException
    {
        RenderingJob rJob = new RenderingJob();
        PortletContainerServices.prepare("jetspeed");

        PortletWindow portletWindow;
        try
        {
            portletWindow = getPortletWindow(fragment);
        }
        catch (FailedToRetrievePortletWindow e)
        {
           throw new FailedToRenderFragmentException("Unable to render fragment because: "+e.toString(), e);
        }
        ContentDispatcherCtrl dispatcher = getDispatcherCtrl(request,true);

        HttpServletRequest servletRequest = request.getRequestForWindow(portletWindow);
        HttpServletResponse servletResponse = dispatcher.getResponseForWindow(portletWindow, request);

        rJob.setWindow(portletWindow);
        rJob.setContainer(this.container);
        rJob.setRequest(servletRequest);
        rJob.setResponse(servletResponse);
        rJob.setDispatcher(dispatcher);

        monitor.process(rJob);
    }

    /**
     * Retrieve the ContentDispatcher for the specified request
     */
    public ContentDispatcher getDispatcher(RequestContext request, boolean isParallel)
    {
        return (ContentDispatcher)getDispatcherCtrl(request,isParallel);
    }

    /**
     * Retrieve the ContentDispatcherCtrl for the specified request
     */
    protected ContentDispatcherCtrl getDispatcherCtrl(RequestContext request, boolean isParallel)
    {
        if (request.getContentDispatcher() == null)
        {
            request.setContentDispatcher(new ContentDispatcherImpl(isParallel, this));
        }

        return (ContentDispatcherCtrl)request.getContentDispatcher();
    }

    protected PortletWindow getPortletWindow(Fragment fragment) throws  FailedToRetrievePortletWindow
    {
        ObjectID oid = JetspeedObjectID.createFromString(fragment.getId());
                       
        PortletWindow portletWindow = windowAccessor.getPortletWindow(fragment);
        if (portletWindow == null)
        {
            throw new FailedToRetrievePortletWindow("Portlet Window creation failed for fragment: " + fragment.getId() + ", " + fragment.getName());
        }
        PortletEntity portletEntity = portletWindow.getPortletEntity();

        return portletWindow;
    }
}
TOP

Related Classes of org.apache.jetspeed.aggregator.impl.PortletRendererImpl

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.