001: package org.apache.velocity.context;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import java.util.HashMap;
023: import java.util.Stack;
024:
025: import org.apache.velocity.app.event.EventCartridge;
026: import org.apache.velocity.runtime.resource.Resource;
027: import org.apache.velocity.util.introspection.IntrospectionCacheData;
028:
029: /**
030: * class to encapsulate the 'stuff' for internal operation of velocity.
031: * We use the context as a thread-safe storage : we take advantage of the
032: * fact that it's a visitor of sorts to all nodes (that matter) of the
033: * AST during init() and render().
034: * Currently, it carries the template name for namespace
035: * support, as well as node-local context data introspection caching.
036: *
037: * Note that this is not a public class. It is for package access only to
038: * keep application code from accessing the internals, as AbstractContext
039: * is derived from this.
040: *
041: * @author <a href="mailto:geirm@optonline.net">Geir Magnusson Jr.</a>
042: * @version $Id: InternalContextBase.java 463298 2006-10-12 16:10:32Z henning $
043: */
044: class InternalContextBase implements InternalHousekeepingContext,
045: InternalEventContext {
046: /**
047: * Version Id for serializable
048: */
049: private static final long serialVersionUID = -245905472770843470L;
050:
051: /**
052: * cache for node/context specific introspection information
053: */
054: private HashMap introspectionCache = new HashMap(33);
055:
056: /**
057: * Template name stack. The stack top contains the current template name.
058: */
059: private Stack templateNameStack = new Stack();
060:
061: /**
062: * EventCartridge we are to carry. Set by application
063: */
064: private EventCartridge eventCartridge = null;
065:
066: /**
067: * Current resource - used for carrying encoding and other
068: * information down into the rendering process
069: */
070: private Resource currentResource = null;
071:
072: /**
073: * Is rendering allowed? Defaults to true, can be changed by #stop directive.
074: */
075: private boolean allowRendering = true;
076:
077: /**
078: * set the current template name on top of stack
079: *
080: * @param s current template name
081: */
082: public void pushCurrentTemplateName(String s) {
083: templateNameStack.push(s);
084: }
085:
086: /**
087: * remove the current template name from stack
088: */
089: public void popCurrentTemplateName() {
090: templateNameStack.pop();
091: }
092:
093: /**
094: * get the current template name
095: *
096: * @return String current template name
097: */
098: public String getCurrentTemplateName() {
099: if (templateNameStack.empty())
100: return "<undef>";
101: else
102: return (String) templateNameStack.peek();
103: }
104:
105: /**
106: * get the current template name stack
107: *
108: * @return Object[] with the template name stack contents.
109: */
110: public Object[] getTemplateNameStack() {
111: return templateNameStack.toArray();
112: }
113:
114: /**
115: * returns an IntrospectionCache Data (@see IntrospectionCacheData)
116: * object if exists for the key
117: *
118: * @param key key to find in cache
119: * @return cache object
120: */
121: public IntrospectionCacheData icacheGet(Object key) {
122: return (IntrospectionCacheData) introspectionCache.get(key);
123: }
124:
125: /**
126: * places an IntrospectionCache Data (@see IntrospectionCacheData)
127: * element in the cache for specified key
128: *
129: * @param key key
130: * @param o IntrospectionCacheData object to place in cache
131: */
132: public void icachePut(Object key, IntrospectionCacheData o) {
133: introspectionCache.put(key, o);
134: }
135:
136: /**
137: * @see org.apache.velocity.context.InternalHousekeepingContext#setCurrentResource(org.apache.velocity.runtime.resource.Resource)
138: */
139: public void setCurrentResource(Resource r) {
140: currentResource = r;
141: }
142:
143: /**
144: * @see org.apache.velocity.context.InternalHousekeepingContext#getCurrentResource()
145: */
146: public Resource getCurrentResource() {
147: return currentResource;
148: }
149:
150: /**
151: * @see org.apache.velocity.context.InternalHousekeepingContext#getAllowRendering()
152: */
153: public boolean getAllowRendering() {
154: return allowRendering;
155: }
156:
157: /**
158: * @see org.apache.velocity.context.InternalHousekeepingContext#setAllowRendering(boolean)
159: */
160: public void setAllowRendering(boolean v) {
161: allowRendering = v;
162: }
163:
164: /**
165: * @see org.apache.velocity.context.InternalEventContext#attachEventCartridge(org.apache.velocity.app.event.EventCartridge)
166: */
167: public EventCartridge attachEventCartridge(EventCartridge ec) {
168: EventCartridge temp = eventCartridge;
169:
170: eventCartridge = ec;
171:
172: return temp;
173: }
174:
175: /**
176: * @see org.apache.velocity.context.InternalEventContext#getEventCartridge()
177: */
178: public EventCartridge getEventCartridge() {
179: return eventCartridge;
180: }
181: }
|