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 / VarFunction.java @ 47165

History | View | Annotate | Download (3.44 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.ExpressionBuilder;
8
import org.gvsig.expressionevaluator.Formatter;
9
import org.gvsig.expressionevaluator.Function;
10
import org.gvsig.expressionevaluator.Interpreter;
11
import org.gvsig.expressionevaluator.MutableSymbolTable;
12
import org.gvsig.expressionevaluator.SymbolTable;
13
import org.gvsig.expressionevaluator.spi.AbstractFunction;
14

    
15
public class VarFunction extends AbstractFunction {
16
    
17
    public static final String NAME="VAR";
18

    
19
    public VarFunction() {
20
        super(Function.GROUP_PROGRAMMING, 
21
                NAME, 
22
            Range.between(1,2),
23
            "Declare a variable.\nExample:\n  VAR x DEFAULT 0\n",
24
            NAME+" {{identifier}} DEFAULT default_value",
25
            new String[]{
26
                "identifier_name - Name of the variable",
27
                "default_value - Value to assign to the variable if have to create it."
28
            },
29
            "NULL",
30
            false
31
        );
32
    }
33
    
34
    @Override
35
    public boolean allowConstantFolding() {
36
        return false;
37
    }
38
    
39
    @Override
40
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
41
//        String name = getStr(args,0);
42
//        if( name == null ) {
43
//            throw new NullPointerException("A string with a variable name was expected and a null was received");
44
//        }
45
//        Object value = null;
46
//        if( args.length==2 ) {
47
//            value = getObject(args, 1);
48
//        }
49
//        SymbolTable symbolTable = interpreter.getSymbolTable();
50
//        if( symbolTable instanceof MutableSymbolTable ) {
51
//            if( !symbolTable.exists(name)) {
52
//                ((MutableSymbolTable)symbolTable).setVar(name, value);
53
//            }
54
//        } else {
55
//            throw new RuntimeException("A MutableSymbolTable is required for use VAR function.");
56
//        }
57
        return null;
58
    }
59

    
60
    @Override
61
    public Object call(Interpreter interpreter, Codes args) throws Exception {
62
        Code varNameCode = args.get(0);
63
        if(varNameCode.code() != Code.IDENTIFIER){
64
            throw new RuntimeException("First argument must be a identifier.");
65
        }
66
        String name = ((Code.Identifier)varNameCode).name();
67
        Object value = null;
68
        if(args.size() == 2){
69
            value = interpreter.run(args.get(1));
70
        }
71
        SymbolTable symbolTable = interpreter.getSymbolTable();
72
        if( symbolTable instanceof MutableSymbolTable ) {
73
            if( symbolTable.exists(name)) {
74
                value = symbolTable.value(name);
75
            } else {
76
                ((MutableSymbolTable)symbolTable).setVar(name, value);
77
            }
78
        } else {
79
            throw new RuntimeException("A MutableSymbolTable is required for use VAR function.");
80
        }
81
        return value;
82
    }
83

    
84
    @Override
85
    public boolean useArgumentsInsteadObjects() {
86
        return true;
87
    }
88

    
89
    @Override
90
    public String toString(Codes args, Formatter<Code> formatter) {
91
        StringBuilder builder = new StringBuilder();
92
        builder.append("VAR \"");
93
        builder.append(Objects.toString(((Code.Identifier)args.get(0)).name()));
94
        builder.append("\" DEFAULT ");
95
        builder.append(args.get(1).toString(formatter));
96
        return builder.toString();
97
    }
98
    
99
}