57 |
implements XPathVariableResolver, Cloneable |
implements XPathVariableResolver, Cloneable |
58 |
{ |
{ |
59 |
|
|
60 |
|
static final int VARIABLE = 0; |
61 |
|
static final int PARAM = 1; |
62 |
|
static final int WITH_PARAM = 2; |
63 |
|
|
64 |
final Stylesheet stylesheet; |
final Stylesheet stylesheet; |
65 |
|
|
66 |
/** |
/** |
73 |
*/ |
*/ |
74 |
final LinkedList parameters; |
final LinkedList parameters; |
75 |
|
|
76 |
|
/** |
77 |
|
* Argument (with-param) value stack. |
78 |
|
*/ |
79 |
|
final LinkedList withParameters; |
80 |
|
|
81 |
Bindings(Stylesheet stylesheet) |
Bindings(Stylesheet stylesheet) |
82 |
{ |
{ |
83 |
this.stylesheet = stylesheet; |
this.stylesheet = stylesheet; |
84 |
variables = new LinkedList(); |
variables = new LinkedList(); |
85 |
parameters = new LinkedList(); |
parameters = new LinkedList(); |
86 |
push(true); |
withParameters = new LinkedList(); |
87 |
push(false); |
for (int i = 0; i < 3; i++) |
88 |
|
{ |
89 |
|
push(i); |
90 |
|
} |
91 |
} |
} |
92 |
|
|
93 |
public Object clone() |
public Object clone() |
102 |
} |
} |
103 |
} |
} |
104 |
|
|
105 |
void push(boolean global) |
void push(int type) |
106 |
{ |
{ |
107 |
if (global) |
switch (type) |
108 |
{ |
{ |
109 |
|
case VARIABLE: |
110 |
variables.addFirst(new HashMap()); |
variables.addFirst(new HashMap()); |
111 |
} |
break; |
112 |
else |
case PARAM: |
|
{ |
|
113 |
parameters.addFirst(new HashMap()); |
parameters.addFirst(new HashMap()); |
114 |
|
break; |
115 |
|
case WITH_PARAM: |
116 |
|
withParameters.addFirst(new HashMap()); |
117 |
|
break; |
118 |
} |
} |
119 |
} |
} |
120 |
|
|
121 |
void pop(boolean global) |
void pop(int type) |
122 |
{ |
{ |
123 |
if (global) |
switch (type) |
124 |
{ |
{ |
125 |
|
case VARIABLE: |
126 |
variables.removeFirst(); |
variables.removeFirst(); |
127 |
} |
break; |
128 |
else |
case PARAM: |
|
{ |
|
129 |
parameters.removeFirst(); |
parameters.removeFirst(); |
130 |
|
break; |
131 |
|
case WITH_PARAM: |
132 |
|
withParameters.removeFirst(); |
133 |
|
break; |
134 |
} |
} |
135 |
} |
} |
136 |
|
|
137 |
public boolean containsKey(String name, boolean global) |
public boolean containsKey(QName name, int type) |
138 |
{ |
{ |
139 |
Iterator i = global ? variables.iterator() : parameters.iterator(); |
Iterator i = null; |
140 |
while (i.hasNext()) |
switch (type) |
141 |
{ |
{ |
142 |
Map ctx = (Map) i.next(); |
case VARIABLE: |
143 |
if (ctx.containsKey(name)) |
i = variables.iterator(); |
144 |
|
break; |
145 |
|
case PARAM: |
146 |
|
i = parameters.iterator(); |
147 |
|
break; |
148 |
|
case WITH_PARAM: |
149 |
|
Map ctx = (Map) withParameters.getFirst(); |
150 |
|
return ctx.containsKey(name); |
151 |
|
} |
152 |
|
if (i != null) |
153 |
|
{ |
154 |
|
while (i.hasNext()) |
155 |
{ |
{ |
156 |
return true; |
Map ctx = (Map) i.next(); |
157 |
|
if (ctx.containsKey(name)) |
158 |
|
{ |
159 |
|
return true; |
160 |
|
} |
161 |
} |
} |
162 |
} |
} |
163 |
return false; |
return false; |
164 |
} |
} |
165 |
|
|
166 |
public Object get(String name, Node context, int pos, int len) |
public Object get(QName name, Node context, int pos, int len) |
167 |
{ |
{ |
168 |
//System.err.println("bindings.get: "+name); |
//System.err.println("bindings.get: "+name); |
169 |
//System.err.println("\t"+toString()); |
//System.err.println("\t"+toString()); |
170 |
Object ret = null; |
Object ret = null; |
171 |
for (Iterator i = variables.iterator(); i.hasNext() && ret == null; ) |
//if (parameters.size() > 1 && containsKey(name, PARAM)) |
172 |
|
// check that template defines parameter |
173 |
{ |
{ |
174 |
Map vctx = (Map) i.next(); |
Map cwp = (Map) withParameters.getFirst(); |
175 |
ret = vctx.get(name); |
ret = cwp.get(name); |
176 |
|
//System.err.println("\twith-param: ret="+ret); |
177 |
|
} |
178 |
|
if (ret == null) |
179 |
|
{ |
180 |
|
for (Iterator i = variables.iterator(); i.hasNext() && ret == null; ) |
181 |
|
{ |
182 |
|
Map vctx = (Map) i.next(); |
183 |
|
ret = vctx.get(name); |
184 |
|
} |
185 |
|
//System.err.println("\tvariable: ret="+ret); |
186 |
} |
} |
187 |
if (ret == null) |
if (ret == null) |
188 |
{ |
{ |
191 |
Map pctx = (Map) i.next(); |
Map pctx = (Map) i.next(); |
192 |
ret = pctx.get(name); |
ret = pctx.get(name); |
193 |
} |
} |
194 |
|
//System.err.println("\tparam: ret="+ret); |
195 |
} |
} |
196 |
/*if (ret instanceof Expr && context != null) |
/*if (ret instanceof Expr && context != null) |
197 |
{ |
{ |
210 |
return ret; |
return ret; |
211 |
} |
} |
212 |
|
|
213 |
void set(String name, Object value, boolean global) |
void set(QName name, Object value, int type) |
214 |
{ |
{ |
215 |
if (global) |
switch (type) |
|
{ |
|
|
Map context = (Map) variables.getFirst(); |
|
|
context.put(name, value); |
|
|
} |
|
|
else |
|
216 |
{ |
{ |
217 |
Map context = (Map) parameters.getFirst(); |
case VARIABLE: |
218 |
context.put(name, value); |
Map vctx = (Map) variables.getFirst(); |
219 |
|
vctx.put(name, value); |
220 |
|
break; |
221 |
|
case PARAM: |
222 |
|
Map pctx = (Map) parameters.getFirst(); |
223 |
|
pctx.put(name, value); |
224 |
|
break; |
225 |
|
case WITH_PARAM: |
226 |
|
Map wctx = (Map) withParameters.getFirst(); |
227 |
|
wctx.put(name, value); |
228 |
|
break; |
229 |
} |
} |
230 |
|
//System.err.println("Set "+name+"="+value); |
231 |
} |
} |
232 |
|
|
233 |
public Object resolveVariable(QName qName) |
public Object resolveVariable(QName qName) |
234 |
{ |
{ |
235 |
return get(qName.toString(), null, 1, 1); |
return get(qName, null, 1, 1); |
236 |
} |
} |
237 |
|
|
238 |
public String toString() |
public String toString() |
240 |
StringBuffer buf = new StringBuffer(); |
StringBuffer buf = new StringBuffer(); |
241 |
boolean next = false; |
boolean next = false; |
242 |
Collection seen = new HashSet(); |
Collection seen = new HashSet(); |
243 |
|
Map wctx = (Map) withParameters.getFirst(); |
244 |
|
buf.append('('); |
245 |
|
for (Iterator i = wctx.entrySet().iterator(); i.hasNext(); ) |
246 |
|
{ |
247 |
|
if (next) |
248 |
|
{ |
249 |
|
buf.append(','); |
250 |
|
} |
251 |
|
else |
252 |
|
{ |
253 |
|
next = true; |
254 |
|
} |
255 |
|
Map.Entry entry = (Map.Entry) i.next(); |
256 |
|
Object key = entry.getKey(); |
257 |
|
if (!seen.contains(key)) |
258 |
|
{ |
259 |
|
buf.append(key); |
260 |
|
buf.append('='); |
261 |
|
buf.append(entry.getValue()); |
262 |
|
seen.add(key); |
263 |
|
} |
264 |
|
} |
265 |
|
buf.append(')'); |
266 |
|
next = false; |
267 |
|
seen.clear(); |
268 |
buf.append('{'); |
buf.append('{'); |
269 |
for (Iterator i = variables.iterator(); i.hasNext(); ) |
for (Iterator i = variables.iterator(); i.hasNext(); ) |
270 |
{ |
{ |
290 |
} |
} |
291 |
} |
} |
292 |
} |
} |
293 |
|
buf.append('}'); |
294 |
|
next = false; |
295 |
|
seen.clear(); |
296 |
|
buf.append('['); |
297 |
for (Iterator i = parameters.iterator(); i.hasNext(); ) |
for (Iterator i = parameters.iterator(); i.hasNext(); ) |
298 |
{ |
{ |
299 |
Map ctx = (Map) i.next(); |
Map ctx = (Map) i.next(); |
318 |
} |
} |
319 |
} |
} |
320 |
} |
} |
321 |
buf.append('}'); |
buf.append(']'); |
322 |
return buf.toString(); |
return buf.toString(); |
323 |
} |
} |
324 |
|
|
325 |
} |
} |