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 / CodeBlockFunction.java @ 47734

History | View | Annotate | Download (3.25 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.Code;
6
import org.gvsig.expressionevaluator.Codes;
7
import org.gvsig.expressionevaluator.Formatter;
8
import org.gvsig.expressionevaluator.Function;
9
import org.gvsig.expressionevaluator.Interpreter;
10
import org.gvsig.expressionevaluator.PrettyFormatter;
11
import org.gvsig.expressionevaluator.impl.DefaultInterpreter;
12
import org.gvsig.expressionevaluator.impl.HostExpressionUtils;
13
import org.gvsig.expressionevaluator.impl.function.programming.BreakFunction.BreakException;
14
import org.gvsig.expressionevaluator.impl.function.programming.ReturnFunction.ReturnException;
15
import org.gvsig.expressionevaluator.spi.AbstractFunction;
16

    
17
@SuppressWarnings("UseSpecificCatch")
18
public class CodeBlockFunction extends AbstractFunction {
19

    
20
    public static final String NAME = "BLOCK";
21

    
22
    public CodeBlockFunction() {
23
        super(Function.GROUP_PROGRAMMING,
24
                NAME,
25
                Range.between(1, Integer.MAX_VALUE),
26
                "Evaluate each of the arguments sequentially.",
27
                "BEGIN\n  {{sentence}};\nEXCEPT\n  PASS\nEND\n",
28
                null,
29
                "Object",
30
                false
31
        );
32
    }
33

    
34
    @Override
35
    public boolean isHidden() {
36
        return true;
37
    }
38

    
39
    @Override
40
    public boolean useArgumentsInsteadObjects() {
41
        return true;
42
    }
43

    
44
    @Override
45
    public boolean allowConstantFolding() {
46
        return false;
47
    }
48

    
49
    @Override
50
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
51
        throw new UnsupportedOperationException("Not supported yet.");
52
    }
53

    
54
    @Override
55
    public Object call(Interpreter interpreter, Codes args) throws Exception {
56
        Object value = null;
57
        int argn = 0;
58
        for (Code statement : args) {
59
            // LLamamos a runCode para que no atrape los returns.
60
            try {
61
                statement = HostExpressionUtils.resolveHostExpressions(statement, interpreter);
62
                value = ((DefaultInterpreter) interpreter).runCode(statement);
63
            } catch(BreakException|ReturnException ex) {
64
                throw ex;
65
            } catch(Exception ex) {
66
                String stmt = "unknown";
67
                try {
68
                    stmt = Objects.toString(statement);
69
                } catch(Exception ex2) {
70
                    
71
                }
72
                LOGGER.warn("Error in block function calling arg "+ argn + ", "+ stmt, ex);
73
                throw ex;
74
            }
75
            argn++;
76
        }
77
        return value;
78
    }
79

    
80
    @Override
81
    public String toString(Codes args, Formatter<Code> formatter) {
82
        PrettyFormatter builder = PrettyFormatter.get(formatter);
83
        try {
84
            builder.push();
85
            builder.append("BEGIN ");
86
            builder.indent();
87
            for (Code statement : args) {
88
                builder.nl();
89
                builder.append(statement.toString(formatter));
90
                builder.append("; ");
91
            }
92
            builder.unindent();
93
            builder.nl();
94
            builder.append("END ");
95
            return builder.build();
96
        } finally {
97
            builder.pop();
98
        }
99
    }
100

    
101
    
102
}