Clover coverage report - Code Coverage for tapestry release 4.0.2
Coverage timestamp: Thu Apr 13 2006 10:52:06 EDT
file stats: LOC: 212   Methods: 5
NCLOC: 120   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
Shell.java 66.7% 82.8% 100% 80.5%
coverage coverage
 1    // Copyright 2004, 2005 The Apache Software Foundation
 2    //
 3    // Licensed under the Apache License, Version 2.0 (the "License");
 4    // you may not use this file except in compliance with the License.
 5    // You may obtain a copy of the License at
 6    //
 7    // http://www.apache.org/licenses/LICENSE-2.0
 8    //
 9    // Unless required by applicable law or agreed to in writing, software
 10    // distributed under the License is distributed on an "AS IS" BASIS,
 11    // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 12    // See the License for the specific language governing permissions and
 13    // limitations under the License.
 14   
 15    package org.apache.tapestry.html;
 16   
 17    import java.util.Date;
 18    import java.util.Iterator;
 19   
 20    import org.apache.hivemind.HiveMind;
 21    import org.apache.tapestry.AbstractComponent;
 22    import org.apache.tapestry.IAsset;
 23    import org.apache.tapestry.IMarkupWriter;
 24    import org.apache.tapestry.IPage;
 25    import org.apache.tapestry.IRender;
 26    import org.apache.tapestry.IRequestCycle;
 27    import org.apache.tapestry.Tapestry;
 28    import org.apache.tapestry.coerce.ValueConverter;
 29    import org.apache.tapestry.engine.IEngineService;
 30    import org.apache.tapestry.engine.ILink;
 31    import org.apache.tapestry.spec.IApplicationSpecification;
 32   
 33    /**
 34    * Component for creating a standard 'shell' for a page, which comprises the <html> and
 35    * &lt;head&gt; portions of the page. [ <a
 36    * href="../../../../../ComponentReference/Shell.html">Component Reference </a>]
 37    * <p>
 38    * Specifically does <em>not</em> provide a &lt;body&gt; tag, that is usually accomplished using a
 39    * {@link Body}&nbsp; component.
 40    *
 41    * @author Howard Lewis Ship
 42    */
 43   
 44    public abstract class Shell extends AbstractComponent
 45    {
 46    private static final String generatorContent = "Tapestry Application Framework, version "
 47    + Tapestry.VERSION;
 48   
 49  109 protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
 50    {
 51  109 long startTime = 0;
 52   
 53  109 boolean rewinding = cycle.isRewinding();
 54   
 55  109 if (!rewinding)
 56    {
 57  106 startTime = System.currentTimeMillis();
 58   
 59  106 writeDocType(writer, cycle);
 60   
 61  106 IPage page = getPage();
 62   
 63  106 writer.comment("Application: " + getApplicationSpecification().getName());
 64   
 65  106 writer.comment("Page: " + page.getPageName());
 66  106 writer.comment("Generated: " + new Date());
 67   
 68  106 writer.begin("html");
 69  106 writer.println();
 70  106 writer.begin("head");
 71  106 writer.println();
 72   
 73  106 writeMetaTag(writer, "name", "generator", generatorContent);
 74   
 75  106 if (getRenderContentType())
 76  106 writeMetaTag(writer, "http-equiv", "Content-Type", writer.getContentType());
 77   
 78  106 if (getRenderBaseTag())
 79  106 getBaseTagWriter().render(writer, cycle);
 80   
 81  106 writer.begin("title");
 82   
 83  106 writer.print(getTitle());
 84  106 writer.end(); // title
 85  106 writer.println();
 86   
 87  106 IRender delegate = getDelegate();
 88   
 89  106 if (delegate != null)
 90  0 delegate.render(writer, cycle);
 91   
 92  106 IAsset stylesheet = getStylesheet();
 93   
 94  106 if (stylesheet != null)
 95  43 writeStylesheetLink(writer, cycle, stylesheet);
 96   
 97  106 Iterator i = (Iterator) getValueConverter().coerceValue(
 98    getStylesheets(),
 99    Iterator.class);
 100   
 101  106 while (i.hasNext())
 102    {
 103  0 stylesheet = (IAsset) i.next();
 104   
 105  0 writeStylesheetLink(writer, cycle, stylesheet);
 106    }
 107   
 108  106 writeRefresh(writer, cycle);
 109   
 110  106 writer.end(); // head
 111    }
 112   
 113    // Render the body, the actual page content
 114   
 115  109 renderBody(writer, cycle);
 116   
 117  102 if (!rewinding)
 118    {
 119  101 writer.end(); // html
 120  101 writer.println();
 121   
 122  101 long endTime = System.currentTimeMillis();
 123   
 124  101 writer.comment("Render time: ~ " + (endTime - startTime) + " ms");
 125    }
 126   
 127    }
 128   
 129  106 private void writeDocType(IMarkupWriter writer, IRequestCycle cycle)
 130    {
 131    // This is the real code
 132  106 String doctype = getDoctype();
 133  106 if (HiveMind.isNonBlank(doctype))
 134    {
 135  106 writer.printRaw("<!DOCTYPE " + doctype + ">");
 136  106 writer.println();
 137    }
 138    }
 139   
 140  43 private void writeStylesheetLink(IMarkupWriter writer, IRequestCycle cycle, IAsset stylesheet)
 141    {
 142  43 writer.beginEmpty("link");
 143  43 writer.attribute("rel", "stylesheet");
 144  43 writer.attribute("type", "text/css");
 145  43 writer.attribute("href", stylesheet.buildURL());
 146  43 writer.println();
 147    }
 148   
 149  106 private void writeRefresh(IMarkupWriter writer, IRequestCycle cycle)
 150    {
 151  106 int refresh = getRefresh();
 152   
 153  106 if (refresh <= 0)
 154  106 return;
 155   
 156    // Here comes the tricky part ... have to assemble a complete URL
 157    // for the current page.
 158   
 159  0 IEngineService pageService = getPageService();
 160  0 String pageName = getPage().getPageName();
 161   
 162  0 ILink link = pageService.getLink(false, pageName);
 163   
 164  0 StringBuffer buffer = new StringBuffer();
 165  0 buffer.append(refresh);
 166  0 buffer.append("; URL=");
 167  0 buffer.append(link.getAbsoluteURL());
 168   
 169  0 writeMetaTag(writer, "http-equiv", "Refresh", buffer.toString());
 170    }
 171   
 172  212 private void writeMetaTag(IMarkupWriter writer, String key, String value, String content)
 173    {
 174  212 writer.beginEmpty("meta");
 175  212 writer.attribute(key, value);
 176  212 writer.attribute("content", content);
 177  212 writer.println();
 178    }
 179   
 180    public abstract IRender getDelegate();
 181   
 182    public abstract int getRefresh();
 183   
 184    public abstract IAsset getStylesheet();
 185   
 186    public abstract Object getStylesheets();
 187   
 188    public abstract String getTitle();
 189   
 190    public abstract String getDoctype();
 191   
 192    public abstract boolean getRenderContentType();
 193   
 194    /** @since 4.0 */
 195    public abstract ValueConverter getValueConverter();
 196   
 197    /** @since 4.0 */
 198   
 199    public abstract IEngineService getPageService();
 200   
 201    /** @since 4.0 */
 202   
 203    public abstract IApplicationSpecification getApplicationSpecification();
 204   
 205    /** @since 4.0 */
 206   
 207    public abstract IRender getBaseTagWriter();
 208   
 209    /** @since 4.0.1 */
 210   
 211    public abstract boolean getRenderBaseTag();
 212    }