001// Copyright 2005 The Apache Software Foundation
002//
003// Licensed under the Apache License, Version 2.0 (the "License");
004// you may not use this file except in compliance with the License.
005// You may obtain a copy of the License at
006//
007//     http://www.apache.org/licenses/LICENSE-2.0
008//
009// Unless required by applicable law or agreed to in writing, software
010// distributed under the License is distributed on an "AS IS" BASIS,
011// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012// See the License for the specific language governing permissions and
013// limitations under the License.
014
015package org.apache.tapestry.portlet;
016
017import java.io.IOException;
018import java.util.HashMap;
019import java.util.Map;
020
021import org.apache.tapestry.IRequestCycle;
022import org.apache.tapestry.Tapestry;
023import org.apache.tapestry.engine.EngineMessages;
024import org.apache.tapestry.engine.IEngineService;
025import org.apache.tapestry.engine.ILink;
026import org.apache.tapestry.services.LinkFactory;
027import org.apache.tapestry.services.ResponseRenderer;
028
029/**
030 * Replacement for the standard home service, used by Portlets. This exists to handle the special
031 * case where a Portlet render request arrives when there is not a Portlet action request prior ...
032 * this can happen when a Portlet is first added to a Portal page.
033 * 
034 * @author Howard M. Lewis Ship
035 * @since 4.0
036 */
037public class PortletHomeService implements IEngineService
038{
039    private PortletRenderer _portletRenderer;
040
041    private PortletRequestGlobals _requestGlobals;
042
043    private ResponseRenderer _responseRenderer;
044
045    private LinkFactory _linkFactory;
046
047    private PortletPageResolver _pageResolver;
048
049    public String getName()
050    {
051        return Tapestry.HOME_SERVICE;
052    }
053
054    public ILink getLink(boolean post, Object parameter)
055    {
056        if (parameter != null)
057            throw new IllegalArgumentException(EngineMessages.serviceNoParameter(this));
058
059        Map parameters = new HashMap();
060
061        return _linkFactory.constructLink(this, post, parameters, true);
062    }
063
064    public void setLinkFactory(LinkFactory linkFactory)
065    {
066        _linkFactory = linkFactory;
067    }
068
069    public void setResponseRenderer(ResponseRenderer responseRenderer)
070    {
071        _responseRenderer = responseRenderer;
072    }
073
074    public void service(IRequestCycle cycle) throws IOException
075    {
076        String pageName = _pageResolver.getPageNameForRequest(cycle);
077
078        if (_requestGlobals.isRenderRequest())
079        {
080            _portletRenderer.renderPage(cycle, pageName);
081            return;
082        }
083
084        cycle.activate(pageName);
085
086        _responseRenderer.renderResponse(cycle);
087    }
088
089    public void setPortletRenderer(PortletRenderer portletRenderer)
090    {
091        _portletRenderer = portletRenderer;
092    }
093
094    public void setRequestGlobals(PortletRequestGlobals requestGlobals)
095    {
096        _requestGlobals = requestGlobals;
097    }
098
099    public void setPageResolver(PortletPageResolver pageResolver)
100    {
101        _pageResolver = pageResolver;
102    }
103}