KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > tapestry > html > Shell


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 JavaDoc;
18 import java.util.Iterator JavaDoc;
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 JavaDoc generatorContent = "Tapestry Application Framework, version "
47             + Tapestry.VERSION;
48
49     protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
50     {
51         long startTime = 0;
52
53         boolean rewinding = cycle.isRewinding();
54
55         if (!rewinding)
56         {
57             startTime = System.currentTimeMillis();
58
59             writeDocType(writer, cycle);
60
61             IPage page = getPage();
62
63             writer.comment("Application: " + getApplicationSpecification().getName());
64
65             writer.comment("Page: " + page.getPageName());
66             writer.comment("Generated: " + new Date JavaDoc());
67
68             writer.begin("html");
69             writer.println();
70             writer.begin("head");
71             writer.println();
72
73             writeMetaTag(writer, "name", "generator", generatorContent);
74
75             if (getRenderContentType())
76                 writeMetaTag(writer, "http-equiv", "Content-Type", writer.getContentType());
77
78             getBaseTagWriter().render(writer, cycle);
79
80             writer.begin("title");
81
82             writer.print(getTitle());
83             writer.end(); // title
84
writer.println();
85
86             IRender delegate = getDelegate();
87
88             if (delegate != null)
89                 delegate.render(writer, cycle);
90
91             IAsset stylesheet = getStylesheet();
92
93             if (stylesheet != null)
94                 writeStylesheetLink(writer, cycle, stylesheet);
95
96             Iterator JavaDoc i = (Iterator JavaDoc) getValueConverter().coerceValue(
97                     getStylesheets(),
98                     Iterator JavaDoc.class);
99
100             while (i.hasNext())
101             {
102                 stylesheet = (IAsset) i.next();
103
104                 writeStylesheetLink(writer, cycle, stylesheet);
105             }
106
107             writeRefresh(writer, cycle);
108
109             writer.end(); // head
110
}
111
112         // Render the body, the actual page content
113

114         renderBody(writer, cycle);
115
116         if (!rewinding)
117         {
118             writer.end(); // html
119
writer.println();
120
121             long endTime = System.currentTimeMillis();
122
123             writer.comment("Render time: ~ " + (endTime - startTime) + " ms");
124         }
125
126     }
127
128     private void writeDocType(IMarkupWriter writer, IRequestCycle cycle)
129     {
130         // This is the real code
131
String JavaDoc doctype = getDoctype();
132         if (HiveMind.isNonBlank(doctype))
133         {
134             writer.printRaw("<!DOCTYPE " + doctype + ">");
135             writer.println();
136         }
137     }
138
139     private void writeStylesheetLink(IMarkupWriter writer, IRequestCycle cycle, IAsset stylesheet)
140     {
141         writer.beginEmpty("link");
142         writer.attribute("rel", "stylesheet");
143         writer.attribute("type", "text/css");
144         writer.attribute("href", stylesheet.buildURL(cycle));
145         writer.println();
146     }
147
148     private void writeRefresh(IMarkupWriter writer, IRequestCycle cycle)
149     {
150         int refresh = getRefresh();
151
152         if (refresh <= 0)
153             return;
154
155         // Here comes the tricky part ... have to assemble a complete URL
156
// for the current page.
157

158         IEngineService pageService = getPageService();
159         String JavaDoc pageName = getPage().getPageName();
160
161         ILink link = pageService.getLink(cycle, pageName);
162
163         StringBuffer JavaDoc buffer = new StringBuffer JavaDoc();
164         buffer.append(refresh);
165         buffer.append("; URL=");
166         buffer.append(link.getAbsoluteURL());
167
168         writeMetaTag(writer, "http-equiv", "Refresh", buffer.toString());
169     }
170
171     private void writeMetaTag(IMarkupWriter writer, String JavaDoc key, String JavaDoc value, String JavaDoc content)
172     {
173         writer.beginEmpty("meta");
174         writer.attribute(key, value);
175         writer.attribute("content", content);
176         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 JavaDoc getStylesheets();
186
187     public abstract String JavaDoc getTitle();
188
189     public abstract String JavaDoc 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 }
Popular Tags