001: package org.apache.dvsl;
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.List;
023: import java.util.ArrayList;
024: import java.util.Map;
025: import java.util.HashMap;
026: import java.util.Stack;
027:
028: import org.apache.velocity.context.Context;
029: import org.apache.velocity.VelocityContext;
030:
031: /**
032: * Context implementation that handles wrapping several
033: * contexts simultaneously. The style context gets
034: * special treatment, getting checked first.
035: *
036: * @author <a href="mailto:geirm@apache.org">Geir Magnusson Jr.</a>
037: */
038: class DVSLContext extends VelocityContext {
039: protected Context styleContext = null;
040: protected List contextList = new ArrayList();
041:
042: /**
043: * Used to hold the nodes as we get invoked from
044: * within the document for applyTemplates() duties
045: */
046: private Stack nodeStack = new Stack();
047:
048: protected Map ctx = new HashMap();
049:
050: public DVSLNode pushNode(DVSLNode n) {
051: nodeStack.push(n);
052: return n;
053: }
054:
055: public DVSLNode peekNode() {
056: return (DVSLNode) nodeStack.peek();
057: }
058:
059: public DVSLNode popNode() {
060: return (DVSLNode) nodeStack.pop();
061: }
062:
063: public void clearNode() {
064: nodeStack.clear();
065: return;
066: }
067:
068: public void clearContexts() {
069: styleContext = null;
070: contextList.clear();
071: }
072:
073: public void addContext(Context c) {
074: if (c != null)
075: contextList.add(c);
076: }
077:
078: public void setStyleContext(Context c) {
079: styleContext = c;
080: }
081:
082: /**
083: * retrieves value for key from internal
084: * storage
085: *
086: * @param key name of value to get
087: * @return value as object
088: */
089: public Object internalGet(String key) {
090: Object o = null;
091:
092: /*
093: * special tokens
094: */
095:
096: if (key.equals("node")) {
097: return peekNode();
098: }
099:
100: /*
101: * start with local storage
102: */
103:
104: o = ctx.get(key);
105:
106: if (o != null)
107: return o;
108:
109: /*
110: * if that doesn't work, try style first
111: * then others
112: */
113:
114: if (styleContext != null) {
115: o = styleContext.get(key);
116:
117: if (o != null)
118: return o;
119: }
120:
121: for (int i = 0; i < contextList.size(); i++) {
122:
123: Context c = (Context) contextList.get(i);
124:
125: o = c.get(key);
126:
127: if (o != null)
128: return o;
129: }
130:
131: return null;
132: }
133:
134: /**
135: * stores the value for key to internal
136: * storage
137: *
138: * @param key name of value to store
139: * @param value value to store
140: * @return previous value of key as Object
141: */
142: public Object internalPut(String key, Object value) {
143: if (key.equals("node"))
144: return null;
145:
146: return ctx.put(key, value);
147: }
148:
149: /**
150: * determines if there is a value for the
151: * given key
152: *
153: * @param key name of value to check
154: * @return true if non-null value in store
155: */
156: public boolean internalContainsKey(Object key) {
157: /*
158: * start with local storage
159: */
160:
161: if (ctx.containsKey(key))
162: return true;
163:
164: /*
165: * if that doesn't work, try style first
166: * then others
167: */
168:
169: if (styleContext != null && styleContext.containsKey(key))
170: return true;
171:
172: for (int i = 0; i < contextList.size(); i++) {
173: Context c = (Context) contextList.get(i);
174:
175: if (c.containsKey(key))
176: return true;
177: }
178:
179: return false;
180: }
181:
182: /**
183: * returns array of keys
184: *
185: * $$$ GMJ todo
186: *
187: * @return keys as []
188: */
189: public Object[] internalGetKeys() {
190: return null;
191: }
192:
193: /**
194: * remove a key/value pair from the
195: * internal storage
196: *
197: * @param key name of value to remove
198: * @return value removed
199: */
200: public Object internalRemove(Object key) {
201: return ctx.remove(key);
202: }
203:
204: }
|