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 @ 1415

History | View | Annotate | Download (5.65 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
        String entityName = this.decodeValue(entryEntity[1].trim());
48
        DynObject output = ToolsLocator.getDynObjectManager().createDynObject(entityName);
49
        return this.decode(value, output, entries, "UTF-8");
50
    }
51

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

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

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

    
108
    @Override
109
    public String encodePair(String name, Object value) {
110
        return this.encodePair(name, value, "UTF-8");
111
    }
112
    
113
    @Override
114
    public String encodePair(String name, Object value, String charset) {
115
        if( value == null ) {
116
            return name + ":";
117
            
118
        } else if( value instanceof DynObject ) {
119
            return name + ":" + this.encodeValue(this.encode((DynObject) value, charset));
120

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

    
147
    @Override
148
    public String encodeValue(String value, String charset) {
149
        try {
150
            return URLEncoder.encode(value, charset);
151
        } catch (UnsupportedEncodingException ex) {
152
            // Do nothing
153
        }
154
        return value.replace(",", "%2C");
155
    }
156

    
157
    @Override
158
    public String decodeValue(String value) {
159
        return this.decodeValue(value,"UTF-8");
160
    }
161

    
162
    @Override
163
    public String decodeValue(String value, String charset) {
164
        try {
165
            return URLDecoder.decode(value,charset);
166
        } catch (UnsupportedEncodingException ex) {
167
            // Do nothing
168
        }
169
        return value.replace("%2C",",");
170
    }
171
    
172
}