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(boolean post, Object parameter)
056        {
057            if (parameter != null)
058                throw new IllegalArgumentException(EngineMessages.serviceNoParameter(this));
059    
060            Map parameters = new HashMap();
061    
062            return _linkFactory.constructLink(this, post, parameters, true);
063        }
064    
065        public void setLinkFactory(LinkFactory linkFactory)
066        {
067            _linkFactory = linkFactory;
068        }
069    
070        public void setResponseRenderer(ResponseRenderer responseRenderer)
071        {
072            _responseRenderer = responseRenderer;
073        }
074    
075        public void service(IRequestCycle cycle) throws IOException
076        {
077            String pageName = _pageResolver.getPageNameForRequest(cycle);
078    
079            if (_requestGlobals.isRenderRequest())
080            {
081                _portletRenderer.renderPage(cycle, pageName);
082                return;
083            }
084    
085            cycle.activate(pageName);
086    
087            _responseRenderer.renderResponse(cycle);
088        }
089    
090        public void setPortletRenderer(PortletRenderer portletRenderer)
091        {
092            _portletRenderer = portletRenderer;
093        }
094    
095        public void setRequestGlobals(PortletRequestGlobals requestGlobals)
096        {
097            _requestGlobals = requestGlobals;
098        }
099    
100        public void setPageResolver(PortletPageResolver pageResolver)
101        {
102            _pageResolver = pageResolver;
103        }
104    }