Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.lib / src / main / java / org / gvsig / tools / dynobject / impl / SimpleDynObjectEncoder.java @ 1349

History | View | Annotate | Download (5.46 KB)

1

    
2
package org.gvsig.tools.dynobject.impl;
3

    
4
import java.io.UnsupportedEncodingException;
5
import java.net.URLDecoder;
6
import java.net.URLEncoder;
7
import java.util.List;
8
import java.util.Map;
9
import java.util.Set;
10
import org.gvsig.tools.ToolsLocator;
11
import org.gvsig.tools.dataTypes.DataTypes;
12
import org.gvsig.tools.dynobject.DynClass;
13
import org.gvsig.tools.dynobject.DynField;
14
import org.gvsig.tools.dynobject.DynObject;
15
import org.gvsig.tools.dynobject.DynObjectEncoder;
16

    
17

    
18
public class SimpleDynObjectEncoder implements DynObjectEncoder {
19

    
20
    @Override
21
    public String encode(DynObject value) {
22
        return this.encode(value, "UTF-8");
23
    }
24

    
25
    @Override
26
    public String encode(DynObject value, String charset) {
27
        DynClass definition = value.getDynClass();
28
        StringBuilder builder = new StringBuilder();
29
        builder.append(this.encodePair("_entity_", definition.getFullName(), charset));
30
        for (DynField field : definition.getDynFields()) {
31
            String name = field.getName();
32
            Object v0 = value.getDynValue(name);
33
            builder.append(",");
34
            builder.append(this.encodePair(name, v0, charset));
35
        }
36
        return builder.toString();    
37
    }
38

    
39
    @Override
40
    public DynObject decode(String value) {
41
        String[] entries = value.split(",");
42
        if( entries==null || entries.length<1 ) {
43
            return null;
44
        }
45
        // first entry is _entity_
46
        String[] entryEntity = entries[0].split(":");
47
        DynObject output = ToolsLocator.getDynObjectManager().createDynObject(entryEntity[1].trim());
48
        return this.decode(value, output, entries, "UTF-8");
49
    }
50

    
51
    @Override
52
    public DynObject decode(String value, DynObject output) {
53
        return this.decode(value, output, "UTF-8");
54
    }
55

    
56
    @Override
57
    public DynObject decode(String value, DynObject output, String charset) {
58
        String[] entries = value.split(",");
59
        if( entries==null || entries.length<1 ) {
60
            return null;
61
        }
62
        return this.decode(value, output, entries, "UTF-8");
63
    }
64

    
65
    protected DynObject decode(String value, DynObject output, String[] entries, String charset) {
66
        DynClass definition = output.getDynClass();
67
        for (String entry : entries) {
68
            String[] entryPair = entry.split(":");
69
            DynField field = definition.getDynField(entryPair[0]);
70
            if( field!=null ) {
71
                String name = entryPair[0];
72
                String v0 = entryPair[1];
73
                switch(field.getType()) {
74
                    case DataTypes.DYNOBJECT:
75
                        DynObject v1 = this.decode( this.decodeValue(v0, charset));
76
                        output.setDynValue(name, v0);
77
                        break;
78
                    case DataTypes.ARRAY:
79
                        // TODO: encode array not implemented
80
                        break;
81
                    case DataTypes.LIST:
82
                        // TODO: encode array not implemented
83
                        break;
84
                    case DataTypes.SET:
85
                        // TODO: encode array not implemented
86
                        break;
87
                    case DataTypes.MAP:
88
                        // TODO: encode array not implemented
89
                        break;
90
                    case DataTypes.OBJECT:
91
                        // TODO: encode array not implemented
92
                        break;
93
                    default:
94
                        output.setDynValue(name, this.decodeValue(v0, charset) );
95
                        break;
96
                }
97
            }
98
        }
99
        return output;
100
    }
101

    
102
    @Override
103
    public String encodePair(String name, Object value) {
104
        return this.encodePair(name, value, "UTF-8");
105
    }
106
    
107
    @Override
108
    public String encodePair(String name, Object value, String charset) {
109
        if( value == null ) {
110
            return name + ":";
111
            
112
        } else if( value instanceof DynObject ) {
113
            return name + ":" + this.encodeValue(this.encode((DynObject) value, charset));
114

    
115
        } else if( value instanceof List ) {
116
            // TODO: encode of List not implemented
117
            return name + ":";
118
            
119
        } else if( value instanceof Map ) {
120
            // TODO: encode of Map not implemented
121
            return name + ":";
122
            
123
        } else if( value instanceof Set ) {
124
            // TODO: encode of Set not implemented
125
            return name + ":";
126
            
127
        } else if( value.getClass().isArray() ) {
128
            // TODO: encode of array not implemented
129
            return name + ":";
130
            
131
        } else {
132
            return name + ":" + this.encodeValue(value.toString(), charset);
133
        }        
134
    }
135
    
136
    @Override
137
    public String encodeValue(String value) {
138
        return this.encodeValue(value, "UTF-8");
139
    }
140

    
141
    @Override
142
    public String encodeValue(String value, String charset) {
143
        try {
144
            return URLEncoder.encode(value, charset);
145
        } catch (UnsupportedEncodingException ex) {
146
            // Do nothing
147
        }
148
        return value.replace(",", "%2C");
149
    }
150

    
151
    @Override
152
    public String decodeValue(String value) {
153
        return this.decodeValue(value,"UTF-8");
154
    }
155

    
156
    @Override
157
    public String decodeValue(String value, String charset) {
158
        try {
159
            return URLDecoder.decode(value,charset);
160
        } catch (UnsupportedEncodingException ex) {
161
            // Do nothing
162
        }
163
        return value.replace("%2C",",");
164
    }
165
    
166
}