Revision 44738 trunk/org.gvsig.desktop/org.gvsig.desktop.library/org.gvsig.expressionevaluator/org.gvsig.expressionevaluator.lib/org.gvsig.expressionevaluator.lib.impl/src/main/java/org/gvsig/expressionevaluator/impl/DefaultCodeBuilder.java
DefaultCodeBuilder.java | ||
---|---|---|
5 | 5 |
import java.util.Iterator; |
6 | 6 |
import java.util.List; |
7 | 7 |
import org.apache.commons.lang3.StringUtils; |
8 |
import org.apache.commons.lang3.tuple.ImmutablePair; |
|
9 |
import org.apache.commons.lang3.tuple.Pair; |
|
8 | 10 |
import org.gvsig.expressionevaluator.Code; |
9 | 11 |
import static org.gvsig.expressionevaluator.Code.CALLER; |
10 | 12 |
import static org.gvsig.expressionevaluator.Code.CONSTANT; |
... | ... | |
90 | 92 |
} |
91 | 93 |
if( caller.parameters() != null ) { |
92 | 94 |
for( Code arg : caller.parameters() ) { |
93 |
arg.link(symbolTable); |
|
95 |
if( arg!=null ) { |
|
96 |
arg.link(symbolTable); |
|
97 |
} |
|
94 | 98 |
} |
95 | 99 |
} |
96 | 100 |
} |
... | ... | |
236 | 240 |
|
237 | 241 |
public class BaseCodes implements Codes { |
238 | 242 |
|
239 |
private final List<Code> codes; |
|
243 |
private final List<Pair<String,Code>> codes; |
|
244 |
private boolean useNames; |
|
240 | 245 |
|
241 | 246 |
public BaseCodes() { |
242 | 247 |
this.codes = new ArrayList<>(); |
248 |
this.useNames = false; |
|
243 | 249 |
} |
244 | 250 |
|
245 | 251 |
@Override |
252 |
public boolean useArgNames() { |
|
253 |
return this.useNames; |
|
254 |
} |
|
255 |
|
|
256 |
@Override |
|
257 |
public boolean useArgNames(boolean useNames) { |
|
258 |
this.useNames = useNames; |
|
259 |
return this.useNames; |
|
260 |
} |
|
261 |
|
|
262 |
@Override |
|
246 | 263 |
public int code() { |
247 | 264 |
return CODES; |
248 | 265 |
} |
... | ... | |
255 | 272 |
return this.codes.size(); |
256 | 273 |
} |
257 | 274 |
|
275 |
public void add(String name, Code arg) { |
|
276 |
this.codes.add(new ImmutablePair<>(name, arg)); |
|
277 |
} |
|
278 |
|
|
258 | 279 |
public void add(Code arg) { |
259 |
this.codes.add(arg);
|
|
280 |
this.codes.add(new ImmutablePair<>(null, arg));
|
|
260 | 281 |
} |
261 | 282 |
|
262 | 283 |
public void insert(int pos, Code arg) { |
263 |
this.codes.add(pos, arg);
|
|
284 |
this.codes.add(pos, new ImmutablePair<>(null, arg));
|
|
264 | 285 |
} |
265 | 286 |
|
266 | 287 |
@Override |
288 |
public boolean contains(String name, int index) { |
|
289 |
String argNameX = name + String.valueOf(index).trim(); |
|
290 |
for (Pair<String, Code> arg : this.codes) { |
|
291 |
if( StringUtils.equalsIgnoreCase(arg.getKey(), argNameX) ) { |
|
292 |
return true; |
|
293 |
} |
|
294 |
} |
|
295 |
return false; |
|
296 |
} |
|
297 |
|
|
298 |
@Override |
|
267 | 299 |
public Iterator<Code> iterator() { |
268 |
return this.codes.iterator(); |
|
300 |
final Iterator<Pair<String, Code>> it = this.codes.iterator(); |
|
301 |
return new Iterator<Code>() { |
|
302 |
@Override |
|
303 |
public boolean hasNext() { |
|
304 |
return it.hasNext(); |
|
305 |
} |
|
306 |
|
|
307 |
@Override |
|
308 |
public Code next() { |
|
309 |
Pair<String, Code> arg = it.next(); |
|
310 |
return arg.getValue(); |
|
311 |
} |
|
312 |
}; |
|
269 | 313 |
} |
270 | 314 |
|
271 | 315 |
@Override |
272 | 316 |
public Code get(int n) { |
273 |
return this.codes.get(n); |
|
317 |
return this.codes.get(n).getValue();
|
|
274 | 318 |
} |
275 | 319 |
|
276 | 320 |
@Override |
321 |
public Code get(String name) { |
|
322 |
for (Pair<String, Code> arg : this.codes) { |
|
323 |
if( StringUtils.equalsIgnoreCase(name, arg.getKey()) ) { |
|
324 |
return arg.getValue(); |
|
325 |
} |
|
326 |
} |
|
327 |
return null; |
|
328 |
} |
|
329 |
|
|
330 |
public String getName(int n) { |
|
331 |
return this.codes.get(n).getKey(); |
|
332 |
} |
|
333 |
|
|
334 |
@Override |
|
277 | 335 |
public boolean isEmpty() { |
278 | 336 |
return this.codes.isEmpty(); |
279 | 337 |
} |
280 | 338 |
|
281 | 339 |
@Override |
282 | 340 |
public List<Code> toList() { |
283 |
return Collections.unmodifiableList(this.codes); |
|
341 |
List<Code> l = new ArrayList<>(); |
|
342 |
for (Pair<String, Code> arg : this.codes) { |
|
343 |
l.add(arg.getValue()); |
|
344 |
} |
|
345 |
return Collections.unmodifiableList(l); |
|
284 | 346 |
} |
285 | 347 |
|
286 | 348 |
@Override |
287 | 349 |
public void accept(Visitor visitor) throws BaseException { |
288 |
for( Code arg : this.codes ) {
|
|
289 |
arg.accept(visitor); |
|
350 |
for( Pair<String,Code> arg : this.codes ) {
|
|
351 |
arg.getValue().accept(visitor);
|
|
290 | 352 |
} |
291 | 353 |
} |
292 | 354 |
|
... | ... | |
313 | 375 |
if( codes != null ) { |
314 | 376 |
StringBuilder builder = new StringBuilder(); |
315 | 377 |
boolean skipcoma = true; |
316 |
for( Code code : codes ) { |
|
378 |
for( Pair<String, Code> arg : codes ) { |
|
379 |
if( arg == null ) { |
|
380 |
continue; |
|
381 |
} |
|
382 |
String name = arg.getKey(); |
|
383 |
Code code = arg.getValue(); |
|
317 | 384 |
if( code == null ) { |
318 | 385 |
continue; |
319 | 386 |
} |
... | ... | |
322 | 389 |
} else { |
323 | 390 |
builder.append(", "); |
324 | 391 |
} |
325 |
builder.append(code.toString(formatter)); |
|
392 |
if( name==null || !useNames ) { |
|
393 |
builder.append(code.toString(formatter)); |
|
394 |
} else { |
|
395 |
builder.append(name); |
|
396 |
builder.append(":"); |
|
397 |
builder.append(code.toString(formatter)); |
|
398 |
} |
|
326 | 399 |
} |
327 | 400 |
return builder.toString(); |
328 | 401 |
} |
... | ... | |
331 | 404 |
|
332 | 405 |
@Override |
333 | 406 |
public void link(SymbolTable symbolTable) { |
334 |
for (Code code : this.codes) {
|
|
335 |
code.link(symbolTable);
|
|
407 |
for (Pair<String,Code> arg : this.codes) {
|
|
408 |
arg.getValue().link(symbolTable);
|
|
336 | 409 |
} |
337 | 410 |
} |
338 | 411 |
|
... | ... | |
377 | 450 |
@Override |
378 | 451 |
public Function function(Function function) { |
379 | 452 |
this.function = function; |
453 |
if( this.args!=null && this.function!=null ) { |
|
454 |
this.args.useArgNames(this.function.allowArgNames()); |
|
455 |
} |
|
380 | 456 |
return this.function; |
381 | 457 |
} |
382 | 458 |
|
... | ... | |
472 | 548 |
break; |
473 | 549 |
case FUNCTION: |
474 | 550 |
default: |
475 |
builder.append(this.name()); |
|
476 |
builder.append("("); |
|
477 |
if( this.parameters()!=null ) { |
|
478 |
builder.append(this.parameters().toString(formatter)); |
|
551 |
if( StringUtils.equalsIgnoreCase(this.name(),GetattrFunction.NAME) ) { |
|
552 |
Code arg0 = this.parameters().get(0); |
|
553 |
Code arg1 = this.parameters().get(1); |
|
554 |
if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Constant ) { |
|
555 |
builder.append(arg0.toString(formatter)); |
|
556 |
builder.append(".\""); |
|
557 |
builder.append(((Code.Constant)arg1).value()); |
|
558 |
builder.append("\""); |
|
559 |
} else { |
|
560 |
builder.append(this.name()); |
|
561 |
builder.append("("); |
|
562 |
builder.append(arg0.toString(formatter)); |
|
563 |
builder.append(", "); |
|
564 |
builder.append(arg1.toString(formatter)); |
|
565 |
builder.append(")"); |
|
566 |
} |
|
567 |
} else { |
|
568 |
builder.append(this.name()); |
|
569 |
builder.append("("); |
|
570 |
if( this.parameters()!=null ) { |
|
571 |
builder.append(this.parameters().toString(formatter)); |
|
572 |
} |
|
573 |
builder.append(")"); |
|
479 | 574 |
} |
480 |
builder.append(")"); |
|
481 | 575 |
} |
482 | 576 |
return builder.toString(); |
483 | 577 |
} |
Also available in: Unified diff