1 package org.apache.torque.generator.variable;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.LinkedList;
23
24 import org.apache.torque.generator.qname.Namespace;
25 import org.apache.torque.generator.qname.QualifiedName;
26 import org.apache.torque.generator.qname.QualifiedNameMap;
27
28
29
30
31 public class VariableStore
32 {
33
34
35
36
37 private QualifiedNameMap<Variable> outletScope
38 = new QualifiedNameMap<Variable>();
39
40
41
42
43
44
45
46
47 private LinkedList<QualifiedNameMap<Variable>> childrenScopeList
48 = new LinkedList<QualifiedNameMap<Variable>>();
49
50
51
52
53
54 private QualifiedNameMap<Variable> fileScope
55 = new QualifiedNameMap<Variable>();
56
57
58
59
60
61 private QualifiedNameMap<Variable> globalScope
62 = new QualifiedNameMap<Variable>();
63
64
65
66
67
68
69
70
71 public void set(Variable variable)
72 {
73 if (Variable.Scope.OUTLET.equals(variable.getScope()))
74 {
75 outletScope.put(variable.getName(), variable);
76 }
77 else if (Variable.Scope.CHILDREN.equals(variable.getScope()))
78 {
79 QualifiedNameMap<Variable> qualifiedNameMap
80 = childrenScopeList.getLast();
81 qualifiedNameMap.put(variable.getName(), variable);
82 }
83 else if (Variable.Scope.FILE.equals(variable.getScope()))
84 {
85 fileScope.put(variable.getName(), variable);
86 }
87 else if (Variable.Scope.GLOBAL.equals(variable.getScope()))
88 {
89 globalScope.put(variable.getName(), variable);
90 }
91 }
92
93
94
95
96
97
98
99
100 public void remove(Variable variable)
101 {
102 if (Variable.Scope.OUTLET.equals(variable.getScope()))
103 {
104 outletScope.remove(variable.getName());
105 }
106 else if (Variable.Scope.CHILDREN.equals(variable.getScope()))
107 {
108 QualifiedNameMap<Variable> qualifiedNameMap
109 = childrenScopeList.getLast();
110 qualifiedNameMap.remove(variable.getName());
111 }
112 else if (Variable.Scope.FILE.equals(variable.getScope()))
113 {
114 fileScope.remove(variable.getName());
115 }
116 else if (Variable.Scope.GLOBAL.equals(variable.getScope()))
117 {
118 globalScope.remove(variable.getName());
119 }
120 }
121
122
123
124
125 public void startOutlet()
126 {
127 childrenScopeList.addLast(new QualifiedNameMap<Variable>());
128 }
129
130
131
132
133
134
135
136
137 public void endOutlet()
138 {
139 outletScope.clear();
140 childrenScopeList.removeLast();
141 }
142
143
144
145
146
147 public void endFile()
148 {
149 fileScope.clear();
150 }
151
152
153
154
155
156 public void endGeneration()
157 {
158 clear();
159 }
160
161
162
163
164 public void clear()
165 {
166 outletScope.clear();
167 childrenScopeList.clear();
168 fileScope.clear();
169 globalScope.clear();
170 }
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189 public QualifiedNameMap<Variable> getContent()
190 {
191 QualifiedNameMap<Variable> result = new QualifiedNameMap<Variable>();
192 result.putAll(globalScope);
193 result.putAll(fileScope);
194
195 for (QualifiedNameMap<Variable> childrenScope : childrenScopeList)
196 {
197 result.putAll(childrenScope);
198 }
199
200 result.putAll(outletScope);
201
202 return result;
203 }
204
205
206
207
208
209
210
211
212
213
214
215
216 public Variable getInHierarchy(QualifiedName key)
217 {
218 Variable inOutletScope = outletScope.getInHierarchy(key);
219 Variable inFileScope = fileScope.getInHierarchy(key);
220 Variable inGenerationScope = globalScope.getInHierarchy(key);
221
222
223
224 Variable result = null;
225 for (QualifiedNameMap<Variable> childrenScope : childrenScopeList)
226 {
227 Variable inChildrenScope = childrenScope.getInHierarchy(key);
228 result = getMoreSpecific(inChildrenScope, result);
229 }
230 result = getMoreSpecific(inOutletScope, result);
231 result = getMoreSpecific(result, inFileScope);
232 result = getMoreSpecific(result, inGenerationScope);
233 return result;
234 }
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254 private Variable getMoreSpecific(Variable variable1, Variable variable2)
255 {
256 if (variable1 == null)
257 {
258 return variable2;
259 }
260 if (variable2 == null)
261 {
262 return variable1;
263 }
264 Namespace variable1Namespace
265 = variable1.getName().getNamespace();
266 Namespace variable2Namespace
267 = variable2.getName().getNamespace();
268 if (variable2Namespace.isVisibleFrom(variable1Namespace))
269 {
270
271
272 return variable1;
273 }
274 else
275 {
276
277 return variable2;
278 }
279 }
280 }