Mercurial > dive4elements > river
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 : |