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
031     * handle the special case where a Portlet render request arrives when there is
032     * not a Portlet action request prior ... this can happen when a Portlet is
033     * 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    
041        private PortletRenderer _portletRenderer;
042    
043        private PortletRequestGlobals _requestGlobals;
044    
045        private ResponseRenderer _responseRenderer;
046    
047        private LinkFactory _linkFactory;
048    
049        private PortletPageResolver _pageResolver;
050    
051        public String getName()
052        {
053            return Tapestry.HOME_SERVICE;
054        }
055    
056        public ILink getLink(boolean post, Object parameter)
057        {
058            if (parameter != null)
059                throw new IllegalArgumentException(EngineMessages
060                        .serviceNoParameter(this));
061    
062            Map parameters = new HashMap();
063    
064            return _linkFactory.constructLink(this, 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)
078            throws IOException
079        {
080            String pageName = _pageResolver.getPageNameForRequest(cycle);
081    
082            if (_requestGlobals.isRenderRequest())
083            {
084                _portletRenderer.renderPage(cycle, pageName);
085                return;
086            }
087    
088            cycle.activate(pageName);
089    
090            _responseRenderer.renderResponse(cycle);
091        }
092    
093        public void setPortletRenderer(PortletRenderer portletRenderer)
094        {
095            _portletRenderer = portletRenderer;
096        }
097    
098        public void setRequestGlobals(PortletRequestGlobals requestGlobals)
099        {
100            _requestGlobals = requestGlobals;
101        }
102    
103        public void setPageResolver(PortletPageResolver pageResolver)
104        {
105            _pageResolver = pageResolver;
106        }
107    }