Clover coverage report - Code Coverage for tapestry release 4.0-beta-12
Coverage timestamp: Sun Oct 30 2005 16:22:01 EST
file stats: LOC: 207   Methods: 5
NCLOC: 118   Classes: 1
 
 Source file Conditionals Statements Methods TOTAL
Shell.java 68.8% 82.5% 100% 81%
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 getBaseTagWriter().render(writer, cycle);
 79   
 80  106 writer.begin("title");
 81   
 82  106 writer.print(getTitle());
 83  106 writer.end(); // title
 84  106 writer.println();
 85   
 86  106 IRender delegate = getDelegate();
 87   
 88  106 if (delegate != null)
 89  0 delegate.render(writer, cycle);
 90   
 91  106 IAsset stylesheet = getStylesheet();
 92   
 93  106 if (stylesheet != null)
 94  43 writeStylesheetLink(writer, cycle, stylesheet);
 95   
 96  106 Iterator i = (Iterator) getValueConverter().coerceValue(
 97    getStylesheets(),
 98    Iterator.class);
 99   
 100  106 while (i.hasNext())
 101    {
 102  0 stylesheet = (IAsset) i.next();
 103   
 104  0 writeStylesheetLink(writer, cycle, stylesheet);
 105    }
 106   
 107  106 writeRefresh(writer, cycle);
 108   
 109  106 writer.end(); // head
 110    }
 111   
 112    // Render the body, the actual page content
 113   
 114  109 renderBody(writer, cycle);
 115   
 116  102 if (!rewinding)
 117    {
 118  101 writer.end(); // html
 119  101 writer.println();
 120   
 121  101 long endTime = System.currentTimeMillis();
 122   
 123  101 writer.comment("Render time: ~ " + (endTime - startTime) + " ms");
 124    }
 125   
 126    }
 127   
 128  106 private void writeDocType(IMarkupWriter writer, IRequestCycle cycle)
 129    {
 130    // This is the real code
 131  106 String doctype = getDoctype();
 132  106 if (HiveMind.isNonBlank(doctype))
 133    {
 134  106 writer.printRaw("<!DOCTYPE " + doctype + ">");
 135  106 writer.println();
 136    }
 137    }
 138   
 139  43 private void writeStylesheetLink(IMarkupWriter writer, IRequestCycle cycle, IAsset stylesheet)
 140    {
 141  43 writer.beginEmpty("link");
 142  43 writer.attribute("rel", "stylesheet");
 143  43 writer.attribute("type", "text/css");
 144  43 writer.attribute("href", stylesheet.buildURL(cycle));
 145  43 writer.println();
 146    }
 147   
 148  106 private void writeRefresh(IMarkupWriter writer, IRequestCycle cycle)
 149    {
 150  106 int refresh = getRefresh();
 151   
 152  106 if (refresh <= 0)
 153  106 return;
 154   
 155    // Here comes the tricky part ... have to assemble a complete URL
 156    // for the current page.
 157   
 158  0 IEngineService pageService = getPageService();
 159  0 String pageName = getPage().getPageName();
 160   
 161  0 ILink link = pageService.getLink(cycle, false, pageName);
 162   
 163  0 StringBuffer buffer = new StringBuffer();
 164  0 buffer.append(refresh);
 165  0 buffer.append("; URL=");
 166  0 buffer.append(link.getAbsoluteURL());
 167   
 168  0 writeMetaTag(writer, "http-equiv", "Refresh", buffer.toString());
 169    }
 170   
 171  212 private void writeMetaTag(IMarkupWriter writer, String key, String value, String content)
 172    {
 173  212 writer.beginEmpty("meta");
 174  212 writer.attribute(key, value);
 175  212 writer.attribute("content", content);
 176  212 writer.println();
 177    }
 178   
 179    public abstract IRender getDelegate();
 180   
 181    public abstract int getRefresh();
 182   
 183    public abstract IAsset getStylesheet();
 184   
 185    public abstract Object getStylesheets();
 186   
 187    public abstract String getTitle();
 188   
 189    public abstract String getDoctype();
 190   
 191    public abstract boolean getRenderContentType();
 192   
 193    /** @since 4.0 */
 194    public abstract ValueConverter getValueConverter();
 195   
 196    /** @since 4.0 */
 197   
 198    public abstract IEngineService getPageService();
 199   
 200    /** @since 4.0 */
 201   
 202    public abstract IApplicationSpecification getApplicationSpecification();
 203   
 204    /** @since 4.0 */
 205   
 206    public abstract IRender getBaseTagWriter();
 207    }