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 org.apache.tapestry.IMarkupWriter;
018    import org.apache.tapestry.IPage;
019    import org.apache.tapestry.IRequestCycle;
020    import org.apache.tapestry.Tapestry;
021    import org.apache.tapestry.asset.AssetFactory;
022    import org.apache.tapestry.markup.MarkupWriterSource;
023    import org.apache.tapestry.services.ResponseBuilder;
024    import org.apache.tapestry.services.impl.DefaultResponseBuilder;
025    import org.apache.tapestry.util.ContentType;
026    import org.apache.tapestry.web.WebResponse;
027    
028    import java.io.IOException;
029    import java.io.PrintWriter;
030    import java.util.Date;
031    
032    /**
033     * The guts of rendering a page as a portlet response; used by
034     * {@link org.apache.tapestry.portlet.RenderService} and
035     * {@link org.apache.tapestry.portlet.PortletHomeService}.
036     * 
037     * @author Howard M. Lewis Ship
038     * @since 4.0
039     */
040    public class PortletRendererImpl implements PortletRenderer
041    {
042    
043        private WebResponse _response;
044    
045        private MarkupWriterSource _markupWriterSource;
046    
047        private AssetFactory _assetFactory;
048    
049        private String _applicationId;
050    
051        public void renderPage(IRequestCycle cycle, String pageName)
052            throws IOException
053        {
054            cycle.activate(pageName);
055    
056            IPage page = cycle.getPage();
057            
058            ContentType contentType = page.getResponseContentType();
059            PrintWriter printWriter = _response.getPrintWriter(contentType);
060            IMarkupWriter writer = _markupWriterSource.newMarkupWriter(printWriter, contentType);
061            String namespace = _response.getNamespace();
062            
063            IMarkupWriter nested = writer.getNestedWriter();
064    
065            ResponseBuilder builder = new DefaultResponseBuilder(cycle, nested, _assetFactory, namespace, false);
066            
067            builder.renderResponse(cycle);
068            
069            String id = "Tapestry Portlet " + _applicationId + " " + namespace;
070            
071            writer.comment("BEGIN " + id);
072            writer.comment("Page: " + page.getPageName());
073            writer.comment("Generated: " + new Date());
074            writer.comment("Framework version: " + Tapestry.VERSION);
075            
076            builder.writeBodyScript(writer, cycle);
077            
078            nested.close();
079            
080            builder.writeInitializationScript(writer);
081    
082            writer.comment("END " + id);
083            
084            writer.close();
085            
086            // TODO: Trap errors and do some error reporting here?
087        }
088    
089        public void setMarkupWriterSource(MarkupWriterSource markupWriterSource)
090        {
091            _markupWriterSource = markupWriterSource;
092        }
093    
094        public void setResponse(WebResponse response)
095        {
096            _response = response;
097        }
098    
099        public void setAssetFactory(AssetFactory assetFactory)
100        {
101            _assetFactory = assetFactory;
102        }
103    
104        public void setApplicationId(String applicationId)
105        {
106            _applicationId = applicationId;
107        }
108    }