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    
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     */
037    public 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    }