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 / GetattrFunction.java @ 46010

History | View | Annotate | Download (3.18 KB)

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

    
3
import java.lang.reflect.Field;
4
import org.apache.commons.lang3.Range;
5
import org.gvsig.expressionevaluator.AttributeHandler;
6
import org.gvsig.expressionevaluator.Code;
7
import org.gvsig.expressionevaluator.Codes;
8
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_GETATTR;
9
import org.gvsig.expressionevaluator.Formatter;
10
import org.gvsig.expressionevaluator.Function;
11
import org.gvsig.expressionevaluator.Interpreter;
12
import org.gvsig.expressionevaluator.spi.AbstractFunction;
13
import org.gvsig.tools.dynobject.DynObject;
14
import org.gvsig.tools.util.GetItemByKey;
15

    
16
public class GetattrFunction extends AbstractFunction {
17

    
18
    public GetattrFunction() {
19
        super(
20
                Function.GROUP_PROGRAMMING, 
21
                FUNCTION_GETATTR, 
22
                Range.is(2),
23
                null,
24
                "GETATTR({{object}}, attribute_name_as_string)",
25
                null,
26
                null,
27
                true
28
        );
29
    }
30
    
31
    @Override
32
    public boolean allowConstantFolding() {
33
        return false;
34
    }
35
    
36
    @Override
37
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
38
        Object obj = getObject(args, 0);
39
        String attrname = getStr(args,1);
40
        if( attrname == null ) {
41
            throw new NullPointerException("A attribute name was expected and a null was received");
42
        }
43
        if( obj==null ) {
44
            return null;
45
            //throw new NullPointerException("An object pointer was expected to access attribute "+attrname+" and a null was received");
46
        }
47
        Object value;
48
        if( obj instanceof DynObject ) {
49
            value = ((DynObject) obj).getDynValue(attrname);
50
        } else if( obj instanceof AttributeHandler ) {
51
            value = ((AttributeHandler) obj).get(attrname);
52
        } else if( obj instanceof GetItemByKey ) {
53
            value = ((GetItemByKey) obj).get(attrname);
54
        } else {
55
            Class<?> theClass = obj.getClass();
56
            Field field = theClass.getField(attrname);
57
            value = field.get(obj);
58
        }
59
        return value;
60
    }
61

    
62
    @Override
63
    public String toString(Codes args, Formatter<Code> formatter) {
64
        StringBuilder builder = new StringBuilder();
65
        Code arg0 = args.get(0);
66
        Code arg1 = args.get(1);
67
//        if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Identifier ) {
68
//          builder.append(arg0.toString(formatter));
69
//          builder.append("->");
70
//          builder.append(arg1.toString());
71
//        } else 
72
        if( arg0 instanceof Code.Identifier && arg1 instanceof Code.Constant && ((Code.Constant)arg1).value() instanceof CharSequence ) {
73
          builder.append(arg0.toString(formatter));
74
          builder.append(".\"");
75
          builder.append(((Code.Constant)arg1).value().toString());
76
          builder.append("\"");
77
        } else {
78
          builder.append(this.name());
79
          builder.append("(");
80
          builder.append(arg0.toString(formatter));
81
          builder.append(", ");
82
          builder.append(arg1.toString(formatter));
83
          builder.append(")");
84
        }
85
        return builder.toString();
86
    }
87
    
88
}