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

History | View | Annotate | Download (3.8 KB)

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

    
3
import org.apache.commons.lang3.Range;
4
import org.gvsig.expressionevaluator.Code;
5
import org.gvsig.expressionevaluator.Codes;
6
import org.gvsig.expressionevaluator.ExpressionBuilder;
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.spi.AbstractFunction;
12

    
13
public class IFFunction extends AbstractFunction {
14
    
15
    public IFFunction() {
16
        super(Function.GROUP_BOOLEAN, 
17
                ExpressionBuilder.FUNCTION_IF, 
18
                Range.between(2,3),
19
                ExpressionBuilder.FUNCTION_IF+"() function tests a specified numeric expression and returns one of two values, based on whether the expression tested was true or false.",
20
                "IF {{condition}} THEN\n  PASS\nELSE\n  PASS;\nEND IF\n",
21
                null,
22
                "Object",
23
                true
24
        );
25
    }
26

    
27
    @Override
28
    public boolean useArgumentsInsteadObjects() {
29
        return true;
30
    }
31

    
32
    @Override
33
    public boolean allowConstantFolding() {
34
        return false;
35
    }
36
    
37
    @Override
38
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
39
         throw new UnsupportedOperationException("Not supported yet."); 
40
    }
41
    
42
    @Override
43
    public Object call(Interpreter interpreter, Codes args) throws Exception {
44
        Object value;
45
        boolean condition = getBoolean(interpreter, args, 0);
46
        if( condition ) {
47
            value = getObject(interpreter, args, 1);
48
        } else {
49
            if( args.size()>2 && args.get(2)!=null ) {
50
                value = getObject(interpreter, args, 2);
51
            } else {
52
                value = null;
53
            }
54
        }
55
        return value;
56
    }
57

    
58
    @Override
59
    public String toString(Codes args, Formatter<Code> formatter) {
60
        Code codeCondition = args.get(0);
61
        Code codeIfTrue = args.get(1);
62
        Code codeIfFalse = (args.size() > 2)? args.get(2):null;
63
        
64
        PrettyFormatter builder = PrettyFormatter.get(formatter);
65
        try {
66
            builder.push();
67
            
68
            builder.append("IF ");
69
            builder.append(codeCondition.toString(formatter));
70
            builder.append(" THEN ");
71
            builder.indent();
72
            if( Code.isFunction(codeIfTrue,"BLOCK") ) {
73
                Code.Callable block = (Code.Callable)codeIfTrue;
74
                for (Code parameter : block.parameters()) {
75
                    builder.nl();
76
                    builder.append(parameter.toString(formatter));
77
                    builder.append("; ");
78
                }
79
            } else {
80
                builder.nl();
81
                builder.append(codeIfTrue.toString(formatter));
82
                builder.append("; ");
83
            }            
84
            builder.unindent();
85
            if( codeIfFalse!=null ) {
86
                builder.nl();
87
                builder.append("ELSE ");
88
                builder.indent();
89
                if( Code.isFunction(codeIfTrue,"BLOCK") ) {
90
                    Code.Callable block = (Code.Callable)codeIfFalse;
91
                    for (Code parameter : block.parameters()) {
92
                        builder.nl();
93
                        builder.append(parameter.toString(formatter));
94
                        builder.append("; ");
95
                    }
96
                } else {
97
                    builder.nl();
98
                    builder.append(codeIfFalse.toString(formatter));
99
                    builder.append("; ");
100
                }            
101
            }
102
            builder.nl();
103
            builder.append("END IF");
104
            return builder.build();
105
        } finally {
106
            builder.pop();
107
        }
108
    }
109
    
110
    
111
}