1 package org.apache.velocity.context;
2
3 /*
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements. See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership. The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License. You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied. See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 */
21
22 import org.apache.velocity.app.event.EventCartridge;
23 import org.apache.velocity.runtime.resource.Resource;
24 import org.apache.velocity.util.introspection.IntrospectionCacheData;
25
26 /**
27 * This adapter class is the container for all context types for internal
28 * use. The AST now uses this class rather than the app-level Context
29 * interface to allow flexibility in the future.
30 *
31 * Currently, we have two context interfaces which must be supported :
32 * <ul>
33 * <li> Context : used for application/template data access
34 * <li> InternalHousekeepingContext : used for internal housekeeping and caching
35 * <li> InternalWrapperContext : used for getting root cache context and other
36 * such.
37 * <li> InternalEventContext : for event handling.
38 * </ul>
39 *
40 * This class implements the two interfaces to ensure that all methods are
41 * supported. When adding to the interfaces, or adding more context
42 * functionality, the interface is the primary definition, so alter that first
43 * and then all classes as necessary. As of this writing, this would be
44 * the only class affected by changes to InternalContext
45 *
46 * This class ensures that an InternalContextBase is available for internal
47 * use. If an application constructs their own Context-implementing
48 * object w/o subclassing AbstractContext, it may be that support for
49 * InternalContext is not available. Therefore, InternalContextAdapter will
50 * create an InternalContextBase if necessary for this support. Note that
51 * if this is necessary, internal information such as node-cache data will be
52 * lost from use to use of the context. This may or may not be important,
53 * depending upon application.
54 *
55 *
56 * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
57 * @version $Id: InternalContextAdapterImpl.java 471908 2006-11-06 22:39:28Z henning $
58 */
59 public final class InternalContextAdapterImpl implements InternalContextAdapter
60 {
61 /**
62 * the user data Context that we are wrapping
63 */
64 Context context = null;
65
66 /**
67 * the ICB we are wrapping. We may need to make one
68 * if the user data context implementation doesn't
69 * support one. The default AbstractContext-derived
70 * VelocityContext does, and it's recommended that
71 * people derive new contexts from AbstractContext
72 * rather than piecing things together
73 */
74 InternalHousekeepingContext icb = null;
75
76 /**
77 * The InternalEventContext that we are wrapping. If
78 * the context passed to us doesn't support it, no
79 * biggie. We don't make it for them - since its a
80 * user context thing, nothing gained by making one
81 * for them now
82 */
83 InternalEventContext iec = null;
84
85 /**
86 * CTOR takes a Context and wraps it, delegating all 'data' calls
87 * to it.
88 *
89 * For support of internal contexts, it will create an InternalContextBase
90 * if need be.
91 * @param c
92 */
93 public InternalContextAdapterImpl( Context c )
94 {
95 context = c;
96
97 if ( !( c instanceof InternalHousekeepingContext ))
98 {
99 icb = new InternalContextBase();
100 }
101 else
102 {
103 icb = (InternalHousekeepingContext) context;
104 }
105
106 if ( c instanceof InternalEventContext)
107 {
108 iec = ( InternalEventContext) context;
109 }
110 }
111
112 /* --- InternalHousekeepingContext interface methods --- */
113
114 /**
115 * @see org.apache.velocity.context.InternalHousekeepingContext#pushCurrentTemplateName(java.lang.String)
116 */
117 public void pushCurrentTemplateName( String s )
118 {
119 icb.pushCurrentTemplateName( s );
120 }
121
122 /**
123 * @see org.apache.velocity.context.InternalHousekeepingContext#popCurrentTemplateName()
124 */
125 public void popCurrentTemplateName()
126 {
127 icb.popCurrentTemplateName();
128 }
129
130 /**
131 * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentTemplateName()
132 */
133 public String getCurrentTemplateName()
134 {
135 return icb.getCurrentTemplateName();
136 }
137
138 /**
139 * @see org.apache.velocity.context.InternalHousekeepingContext#getTemplateNameStack()
140 */
141 public Object[] getTemplateNameStack()
142 {
143 return icb.getTemplateNameStack();
144 }
145
146 /**
147 * @see org.apache.velocity.context.InternalHousekeepingContext#icacheGet(java.lang.Object)
148 */
149 public IntrospectionCacheData icacheGet( Object key )
150 {
151 return icb.icacheGet( key );
152 }
153
154 /**
155 * @see org.apache.velocity.context.InternalHousekeepingContext#icachePut(java.lang.Object, org.apache.velocity.util.introspection.IntrospectionCacheData)
156 */
157 public void icachePut( Object key, IntrospectionCacheData o )
158 {
159 icb.icachePut( key, o );
160 }
161
162 /**
163 * @see org.apache.velocity.context.InternalHousekeepingContext#setCurrentResource(org.apache.velocity.runtime.resource.Resource)
164 */
165 public void setCurrentResource( Resource r )
166 {
167 icb.setCurrentResource(r);
168 }
169
170 /**
171 * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentResource()
172 */
173 public Resource getCurrentResource()
174 {
175 return icb.getCurrentResource();
176 }
177
178
179 /**
180 * @see org.apache.velocity.context.InternalHousekeepingContext#getAllowRendering()
181 */
182 public boolean getAllowRendering()
183 {
184 return icb.getAllowRendering();
185 }
186
187 /**
188 * @see org.apache.velocity.context.InternalHousekeepingContext#setAllowRendering(boolean)
189 */
190 public void setAllowRendering(boolean v)
191 {
192 icb.setAllowRendering(v);
193 }
194
195
196 /* --- Context interface methods --- */
197
198 /**
199 * @see org.apache.velocity.context.Context#put(java.lang.String, java.lang.Object)
200 */
201 public Object put(String key, Object value)
202 {
203 return context.put( key , value );
204 }
205
206 /**
207 * @see InternalWrapperContext#localPut(String, Object)
208 */
209 public Object localPut(final String key, final Object value)
210 {
211 return put(key, value);
212 }
213
214 /**
215 * @see org.apache.velocity.context.Context#get(java.lang.String)
216 */
217 public Object get(String key)
218 {
219 return context.get( key );
220 }
221
222 /**
223 * @see org.apache.velocity.context.Context#containsKey(java.lang.Object)
224 */
225 public boolean containsKey(Object key)
226 {
227 return context.containsKey( key );
228 }
229
230 /**
231 * @see org.apache.velocity.context.Context#getKeys()
232 */
233 public Object[] getKeys()
234 {
235 return context.getKeys();
236 }
237
238 /**
239 * @see org.apache.velocity.context.Context#remove(java.lang.Object)
240 */
241 public Object remove(Object key)
242 {
243 return context.remove( key );
244 }
245
246
247 /* ---- InternalWrapperContext --- */
248
249 /**
250 * returns the user data context that
251 * we are wrapping
252 * @return The internal user data context.
253 */
254 public Context getInternalUserContext()
255 {
256 return context;
257 }
258
259 /**
260 * Returns the base context that we are
261 * wrapping. Here, its this, but for other thing
262 * like VM related context contortions, it can
263 * be something else
264 * @return The base context.
265 */
266 public InternalContextAdapter getBaseContext()
267 {
268 return this;
269 }
270
271 /* ----- InternalEventContext ---- */
272
273 /**
274 * @see org.apache.velocity.context.InternalEventContext#attachEventCartridge(org.apache.velocity.app.event.EventCartridge)
275 */
276 public EventCartridge attachEventCartridge( EventCartridge ec )
277 {
278 if (iec != null)
279 {
280 return iec.attachEventCartridge( ec );
281 }
282
283 return null;
284 }
285
286 /**
287 * @see org.apache.velocity.context.InternalEventContext#getEventCartridge()
288 */
289 public EventCartridge getEventCartridge()
290 {
291 if ( iec != null)
292 {
293 return iec.getEventCartridge( );
294 }
295
296 return null;
297 }
298 }
299
300