KickJava   Java API By Example, From Geeks To Geeks.

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


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.HashMap JavaDoc;
18 import java.util.Iterator JavaDoc;
19 import java.util.Map JavaDoc;
20
21 import org.apache.hivemind.ApplicationRuntimeException;
22 import org.apache.hivemind.Resource;
23 import org.apache.tapestry.AbstractComponent;
24 import org.apache.tapestry.IBinding;
25 import org.apache.tapestry.IEngine;
26 import org.apache.tapestry.IMarkupWriter;
27 import org.apache.tapestry.IRequestCycle;
28 import org.apache.tapestry.IScript;
29 import org.apache.tapestry.PageRenderSupport;
30 import org.apache.tapestry.Tapestry;
31 import org.apache.tapestry.TapestryUtils;
32 import org.apache.tapestry.engine.IScriptSource;
33
34 /**
35  * Works with the {@link Body}component to add a script (and perhaps some initialization) to the
36  * HTML response. [ <a HREF="../../../../../ComponentReference/Script.html">Component Reference
37  * </a>]
38  *
39  * @author Howard Lewis Ship
40  */

41
42 public abstract class Script extends AbstractComponent
43 {
44     /**
45      * A Map of input and output symbols visible to the body of the Script.
46      *
47      * @since 2.2
48      */

49
50     private Map JavaDoc _symbols;
51
52     /**
53      * Constructs the symbols {@link Map}. This starts with the contents of the symbols parameter
54      * (if specified) to which is added any informal parameters. If both a symbols parameter and
55      * informal parameters are bound, then a copy of the symbols parameter's value is made (that is,
56      * the {@link Map}provided by the symbols parameter is read, but not modified).
57      */

58
59     private Map JavaDoc getInputSymbols()
60     {
61         Map JavaDoc result = new HashMap JavaDoc();
62
63         Map JavaDoc baseSymbols = getBaseSymbols();
64
65         if (baseSymbols != null)
66             result.putAll(baseSymbols);
67
68         // Now, iterate through all the binding names (which includes both
69
// formal and informal parmeters). Skip the formal ones and
70
// access the informal ones.
71

72         Iterator JavaDoc i = getBindingNames().iterator();
73         while (i.hasNext())
74         {
75             String JavaDoc bindingName = (String JavaDoc) i.next();
76
77             // Skip formal parameters
78

79             if (getSpecification().getParameter(bindingName) != null)
80                 continue;
81
82             IBinding binding = getBinding(bindingName);
83
84             Object JavaDoc value = binding.getObject();
85
86             result.put(bindingName, value);
87         }
88
89         return result;
90     }
91
92     /**
93      * Gets the {@link IScript}for the correct script.
94      */

95
96     private IScript getParsedScript(IRequestCycle cycle)
97     {
98         String JavaDoc scriptPath = getScriptPath();
99
100         if (scriptPath == null)
101             throw Tapestry.createRequiredParameterException(this, "scriptPath");
102
103         IEngine engine = cycle.getEngine();
104         IScriptSource source = engine.getScriptSource();
105
106         // If the script path is relative, it should be relative to the Script component's
107
// container (i.e., relative to a page in the application).
108

109         Resource rootLocation = getContainer().getSpecification().getSpecificationLocation();
110         Resource scriptLocation = rootLocation.getRelativeResource(scriptPath);
111
112         try
113         {
114             return source.getScript(scriptLocation);
115         }
116         catch (RuntimeException JavaDoc ex)
117         {
118             throw new ApplicationRuntimeException(ex.getMessage(), this, null, ex);
119         }
120
121     }
122
123     protected void renderComponent(IMarkupWriter writer, IRequestCycle cycle)
124     {
125         if (!cycle.isRewinding())
126         {
127             PageRenderSupport pageRenderSupport = TapestryUtils.getPageRenderSupport(cycle, this);
128
129             _symbols = getInputSymbols();
130
131             getParsedScript(cycle).execute(cycle, pageRenderSupport, _symbols);
132         }
133
134         // Render the body of the Script;
135
renderBody(writer, cycle);
136     }
137
138     public abstract String JavaDoc getScriptPath();
139
140     // Parameter
141

142     public abstract Map JavaDoc getBaseSymbols();
143
144     /**
145      * Returns the complete set of symbols (input and output) from the script execution. This is
146      * visible to the body of the Script, but is cleared after the Script finishes rendering.
147      *
148      * @since 2.2
149      */

150
151     public Map JavaDoc getSymbols()
152     {
153         return _symbols;
154     }
155
156     protected void cleanupAfterRender(IRequestCycle cycle)
157     {
158         _symbols = null;
159
160         super.cleanupAfterRender(cycle);
161     }
162
163 }
Popular Tags