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    
015    package org.apache.tapestry.portlet;
016    
017    import java.io.IOException;
018    import java.util.HashMap;
019    import java.util.Map;
020    
021    import org.apache.tapestry.IRequestCycle;
022    import org.apache.tapestry.Tapestry;
023    import org.apache.tapestry.engine.EngineMessages;
024    import org.apache.tapestry.engine.IEngineService;
025    import org.apache.tapestry.engine.ILink;
026    import org.apache.tapestry.services.LinkFactory;
027    import org.apache.tapestry.services.ResponseRenderer;
028    import org.apache.tapestry.services.ServiceConstants;
029    
030    /**
031     * Replacement for the standard home service, used by Portlets. This exists to handle the special
032     * case where a Portlet render request arrives when there is not a Portlet action request prior ...
033     * this can happen when a Portlet is first added to a Portal page.
034     * 
035     * @author Howard M. Lewis Ship
036     * @since 4.0
037     */
038    public class PortletHomeService implements IEngineService
039    {
040        private PortletRenderer _portletRenderer;
041    
042        private PortletRequestGlobals _requestGlobals;
043    
044        private ResponseRenderer _responseRenderer;
045    
046        private LinkFactory _linkFactory;
047    
048        private PortletPageResolver _pageResolver;
049    
050        public String getName()
051        {
052            return Tapestry.HOME_SERVICE;
053        }
054    
055        public ILink getLink(IRequestCycle cycle, boolean post, Object parameter)
056        {
057            if (parameter != null)
058                throw new IllegalArgumentException(EngineMessages.serviceNoParameter(this));
059    
060            Map parameters = new HashMap();
061    
062            parameters.put(ServiceConstants.SERVICE, getName());
063    
064            return _linkFactory.constructLink(cycle, post, parameters, true);
065        }
066    
067        public void setLinkFactory(LinkFactory linkFactory)
068        {
069            _linkFactory = linkFactory;
070        }
071    
072        public void setResponseRenderer(ResponseRenderer responseRenderer)
073        {
074            _responseRenderer = responseRenderer;
075        }
076    
077        public void service(IRequestCycle cycle) throws IOException
078        {
079            String pageName = _pageResolver.getPageNameForRequest(cycle);
080    
081            if (_requestGlobals.isRenderRequest())
082            {
083                _portletRenderer.renderPage(cycle, pageName);
084                return;
085            }
086    
087            cycle.activate(pageName);
088    
089            _responseRenderer.renderResponse(cycle);
090        }
091    
092        public void setPortletRenderer(PortletRenderer portletRenderer)
093        {
094            _portletRenderer = portletRenderer;
095        }
096    
097        public void setRequestGlobals(PortletRequestGlobals requestGlobals)
098        {
099            _requestGlobals = requestGlobals;
100        }
101    
102        public void setPageResolver(PortletPageResolver pageResolver)
103        {
104            _pageResolver = pageResolver;
105        }
106    }