comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/StackFrames.java @ 5831:bd047b71ab37

Repaired internal references
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:06:39 +0200
parents flys-artifacts/src/main/java/de/intevation/flys/artifacts/datacage/templating/StackFrames.java@142ed3c62765
children
comparison
equal deleted inserted replaced
5830:160f53ee0870 5831:bd047b71ab37
1 package org.dive4elements.river.artifacts.datacage.templating;
2
3 import java.util.ArrayList;
4 import java.util.Map;
5 import java.util.List;
6 import java.util.HashMap;
7 import java.util.HashSet;
8 import java.util.Set;
9
10 import javax.xml.xpath.XPathVariableResolver;
11
12 import javax.xml.namespace.QName;
13
14 import org.apache.log4j.Logger;
15
16
17 /**
18 * Maintains stack of 'frames' which are maps from string to object.
19 * Used for variables in datacage/meta-data system.
20 */
21 public class StackFrames
22 implements XPathVariableResolver
23 {
24 private static Logger log = Logger.getLogger(StackFrames.class);
25
26 public static final Object NULL = new Object();
27
28 /** The frames (used like a stack). */
29 protected List<Map<String, Object>> frames;
30
31 public StackFrames() {
32 frames = new ArrayList<Map<String, Object>>();
33 }
34
35 public StackFrames(Map<String, Object> initialFrame) {
36 this();
37 if (initialFrame != null) {
38 frames.add(new HashMap<String, Object>(initialFrame));
39 }
40 }
41
42 /** Push a new String->Object map. */
43 public void enter() {
44 frames.add(new HashMap<String, Object>());
45 }
46
47 /** Pop/Remove last String->Object map. */
48 public void leave() {
49 frames.remove(frames.size()-1);
50 }
51
52 /** Put Key/Value in last String->Object map. */
53 public void put(String key, Object value) {
54 int N = frames.size();
55 if (N > 0) {
56 frames.get(N-1).put(key, value);
57 }
58 }
59
60 /** Put multiple Key/Values in last String->Object map. */
61 public void put(String [] keys, Object [] values) {
62 Map<String, Object> top = frames.get(frames.size()-1);
63 for (int i = 0; i < keys.length; ++i) {
64 top.put(keys[i], values[i]);
65 }
66 }
67
68 /** Check last frame (string->object map) for key. */
69 public boolean containsKey(String key) {
70 key = key.toUpperCase();
71 for (int i = frames.size()-1; i >= 0; --i) {
72 if (frames.get(i).containsKey(key)) {
73 return true;
74 }
75 }
76 return false;
77 }
78
79 /**
80 * Get element (variable) key.
81 * Returns null if not found.
82 * @param key name to resolve
83 * @return resolution, null if not found.
84 */
85 public Object get(String key) {
86 return get(key, null);
87 }
88
89 /** result[0] is modified with value when true returned.
90 * @return false if key not found in any frame. */
91 public boolean getStore(String key, Object [] result) {
92
93 key = key.toUpperCase();
94
95 for (int i = frames.size()-1; i >= 0; --i) {
96 Map<String, Object> frame = frames.get(i);
97 if (frame.containsKey(key)) {
98 result[0] = frame.get(key);
99 return true;
100 }
101 }
102
103 return false;
104 }
105
106 public Object get(String key, Object def) {
107
108 key = key.toUpperCase();
109
110 for (int i = frames.size()-1; i >= 0; --i) {
111 Map<String, Object> frame = frames.get(i);
112 if (frame.containsKey(key)) {
113 return frame.get(key);
114 }
115 }
116
117 return def;
118 }
119
120 public Object getNull(String key) {
121 return getNull(key, null);
122 }
123
124 public Object getNull(String key, Object def) {
125
126 key = key.toUpperCase();
127
128 for (int i = frames.size()-1; i >= 0; --i) {
129 Map<String, Object> frame = frames.get(i);
130 if (frame.containsKey(key)) {
131 Object value = frame.get(key);
132 return value != null ? value : NULL;
133 }
134 }
135
136 return def;
137 }
138
139 @Override
140 public Object resolveVariable(QName variableName) {
141 if (log.isDebugEnabled()) {
142 log.debug("resolve var: " + variableName);
143 }
144
145 return getNull(variableName.getLocalPart());
146 }
147
148 public String dump() {
149 StringBuilder sb = new StringBuilder("[");
150 Set<String> already = new HashSet<String>();
151
152 boolean first = true;
153
154 for (int i = frames.size()-1; i >= 0; --i) {
155 Map<String, Object> frame = frames.get(i);
156 for (Map.Entry<String, Object> entry: frame.entrySet()) {
157 if (already.add(entry.getKey())) {
158 if (first) { first = false; }
159 else { sb.append(", "); }
160 sb.append('\'').append(entry.getKey())
161 .append("'='").append(entry.getValue()).append('\'');
162 }
163 }
164 }
165 return sb.append(']').toString();
166 }
167 }
168 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org