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

View differences:

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