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 / typeconversion / ToStrFunction.java @ 45739

History | View | Annotate | Download (2.83 KB)

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

    
3
import java.util.Iterator;
4
import java.util.List;
5
import java.util.logging.Level;
6
import java.util.logging.Logger;
7
import org.apache.commons.lang3.Range;
8
import org.apache.commons.lang3.StringUtils;
9
import static org.gvsig.expressionevaluator.ExpressionBuilder.FUNCTION_TOSTR;
10
import org.gvsig.expressionevaluator.Interpreter;
11
import org.gvsig.expressionevaluator.spi.AbstractFunction;
12
import org.gvsig.tools.ToolsLocator;
13
import org.gvsig.tools.dataTypes.DataTypes;
14
import org.gvsig.tools.dataTypes.Coercion;
15
import org.gvsig.tools.dataTypes.CoercionException;
16
import org.gvsig.tools.util.GetItem;
17
import org.gvsig.tools.util.Size;
18

    
19
public class ToStrFunction extends AbstractFunction {
20

    
21
    @SuppressWarnings("OverridableMethodCallInConstructor")
22
    public ToStrFunction() {
23
        super(GROUP_CONVERSION, FUNCTION_TOSTR, Range.is(1));
24
        this.addAlias("STR");
25
        this.addAlias("toString");
26
    }
27

    
28
    @Override
29
    public boolean allowConstantFolding() {
30
        return true;
31
    }
32
    
33
    @Override
34
    public Object call(Interpreter interpreter, Object[] args) throws Exception {
35
        Object obj = this.getObject(args, 0);
36
        StringBuilder builder = new StringBuilder(); 
37
        join(builder, obj, ", ");
38
        return builder.toString();
39
    }
40

    
41
    private void join(StringBuilder builder, Object obj, String separator) {
42
        Coercion toStr = ToolsLocator.getDataTypesManager().getCoercion(DataTypes.STRING);
43
        if( obj instanceof Iterable ) {
44
            builder.append("[");
45
            join(builder, ((Iterable) obj).iterator(), separator);
46
            builder.append("]");
47
        } else if( obj instanceof GetItem && obj instanceof Size ) {
48
            Iterator it = new Iterator() {
49
                int i=0;
50
                
51
                @Override
52
                public boolean hasNext() {
53
                    return i<((Size)obj).size();
54
                }
55

    
56
                @Override
57
                public Object next() {
58
                    return ((GetItem)obj).get(i++);
59
                }
60
            };
61
            builder.append("[");
62
            join(builder, ((Iterable) obj).iterator(), separator);
63
            builder.append("]");
64
        } else {
65
            try {
66
                Object value = toStr.coerce(obj);
67
                builder.append(value);
68
            } catch (CoercionException ex) {
69
                builder.append(obj);
70
            }
71
        }
72
    }
73
    
74
    private void join(StringBuilder builder, Iterator it, String separator) {
75
        boolean needseparator = false;
76
        while( it.hasNext() ) {
77
            if( needseparator ) {
78
                builder.append(separator);
79
            } else {
80
                needseparator = true;
81
            }
82
            Object item = it.next();
83
            join(builder, item, separator);
84
        }
85
    }
86
}