Statistics
| Revision:

svn-gvsig-desktop / 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 / function / programming / ForEachFunction.java @ 47017

History | View | Annotate | Download (2.98 KB)

1
package org.gvsig.expressionevaluator.impl.function.programming;
2

    
3
import java.util.Objects;
4
import org.apache.commons.lang3.Range;
5
import org.gvsig.expressionevaluator.Codes;
6
import org.gvsig.expressionevaluator.Function;
7
import org.gvsig.expressionevaluator.Interpreter;
8
import org.gvsig.expressionevaluator.spi.AbstractFunction;
9
import org.gvsig.expressionevaluator.ExpressionRuntimeException;
10
import org.gvsig.expressionevaluator.MutableSymbolTable;
11
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction.BreakException;
12
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction.ReturnException;
13

    
14
public class ForEachFunction extends AbstractFunction {
15
    
16
    public static final String NAME = "FOREACH";
17

    
18
    public ForEachFunction() {
19
        super(Function.GROUP_PROGRAMMING, 
20
                NAME, 
21
                Range.is(3),
22
                "The foreach() function evaluate body for every element of the iterable.",
23
                "FOR n IN {{expression}}\n  BEGIN\n  PASS;\nEND FOR\n",
24
                null,
25
                "Object",
26
                false
27
        );
28
    }
29

    
30
    @Override
31
    public boolean isHidden() {
32
      return true;
33
    }
34
    
35
    @Override
36
    public boolean useArgumentsInsteadObjects() {
37
        return true;
38
    }
39

    
40
    @Override
41
    public boolean allowConstantFolding() {
42
        return false;
43
    }
44
    
45
    @Override
46
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
47
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
48
    }
49
    
50
    @Override
51
    public Object call(Interpreter interpreter, Codes args) throws Exception {
52
        if ( getObject(interpreter, args, 1)==null) {
53
            return null;
54
        }
55
        if( !(interpreter.getSymbolTable() instanceof MutableSymbolTable) ) {
56
            throw new ExpressionRuntimeException("The use of forech loops require a mutable symbol table.");
57
        }
58
        MutableSymbolTable symbolTable = (MutableSymbolTable) interpreter.getSymbolTable();
59
        
60
        Object body = null;
61
        String varname = getObject(interpreter, args, 0).toString();
62
        int argn = 1;
63
        Iterable iterable = (Iterable) getObject(interpreter, args, 1);
64
        for (Object value : iterable) {
65
            symbolTable.setVar(varname, value);
66
            try {
67
                Object x = getObject(interpreter, args, 2);
68
                body = x;
69
            } catch(BreakException ex) {
70
                break;
71
            } catch(ReturnException ex) {
72
                throw ex;
73
            } catch(Exception ex) {
74
                String stmt = "unknown";
75
                try {
76
                    stmt = Objects.toString(args);
77
                } catch(Exception ex2) {
78
                    
79
                }
80
                LOGGER.warn("Error in foreach function calling arg "+ argn + ", "+ stmt, ex);
81
                throw ex;
82
            }
83
            argn++;
84
        }
85
        return body;
86
    }
87
    
88
}