Revision 1349

View differences:

org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/DynObjectManager.java
71 71
     */
72 72
    public DynClass createDynClass(String name, String description);
73 73

  
74
    public DynObjectEncoder createSimpleDynObjectEncoder();
75
    
74 76
    /**
75 77
     * Create a instance of DynClass with the name and description
76 78
     * Indicated as parameters.
......
432 434
    public Object getAttributeValue(Object obj, String name);
433 435

  
434 436
    public void setAttributeValue(Object obj, String name, Object value);
437
    
438
    public void copy(DynObject source, DynObject target);
439
    
440
    public void clear(DynObject obj);
435 441

  
436 442
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/impl/SimpleDynObjectEncoder.java
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
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/impl/DefaultDynObjectManager.java
28 28
import java.io.IOException;
29 29
import java.io.InputStream;
30 30
import java.io.OutputStream;
31
import java.io.UnsupportedEncodingException;
32
import java.net.URLEncoder;
31 33
import java.util.ArrayList;
32 34
import java.util.Arrays;
33 35
import java.util.Collections;
......
39 41
import java.util.Set;
40 42

  
41 43
import org.gvsig.tools.ToolsLocator;
44
import org.gvsig.tools.dynobject.DelegatedDynObject;
42 45
import org.gvsig.tools.dynobject.DynClass;
43 46
import org.gvsig.tools.dynobject.DynClassName;
47
import org.gvsig.tools.dynobject.DynField;
44 48
import org.gvsig.tools.dynobject.DynField_LabelAttribute;
45 49
import org.gvsig.tools.dynobject.DynField_v2;
46 50
import org.gvsig.tools.dynobject.DynMethod;
47 51
import org.gvsig.tools.dynobject.DynObject;
52
import org.gvsig.tools.dynobject.DynObjectEncoder;
48 53
import org.gvsig.tools.dynobject.DynObjectManager;
49 54
import org.gvsig.tools.dynobject.DynObjectPagingHelper;
50 55
import org.gvsig.tools.dynobject.DynObjectRuntimeException;
51 56
import org.gvsig.tools.dynobject.DynObjectSet;
52 57
import org.gvsig.tools.dynobject.DynStruct;
53 58
import org.gvsig.tools.dynobject.exception.DuplicateDynClassException;
59
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
54 60
import org.gvsig.tools.dynobject.exception.DynMethodException;
55 61
import org.gvsig.tools.dynobject.exception.DynMethodIllegalCodeException;
56 62
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
......
730 736
            }
731 737
    	}
732 738
    }
739

  
740
    @Override
741
    public DynObjectEncoder createSimpleDynObjectEncoder() {
742
        return new SimpleDynObjectEncoder();
743
    }
744

  
745
    @Override
746
    public void copy(DynObject source, DynObject target) {
747
        for (DynField field : target.getDynClass().getDynFields() ) {
748
            String name = field.getName();
749
            try {
750
                Object value = source.getDynValue(name);
751
                target.setDynValue(name, value);
752
            } catch(DynFieldNotFoundException | DefaultDynObject.CoerceValueException ex) {
753
                // if field not found in source or types are inconsistent, ignore it.
754
            }
755
        }
756
    }
757
    
758
    public void clear(DynObject obj) {
759
        for (DynField field : obj.getDynClass().getDynFields() ) {
760
            String name = field.getName();
761
            try {
762
                Object value = field.getDefaultValue();
763
                obj.setDynValue(name, value);
764
            } catch(DefaultDynObject.CoerceValueException ex) {
765
                // if types are inconsistent, ignore it.
766
            }
767
        }        
768
    }
733 769
}
org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/DynObjectEncoder.java
1
package org.gvsig.tools.dynobject;
2

  
3

  
4
public interface DynObjectEncoder {
5
    
6
    public String encode(DynObject value);
7
    
8
    public String encode(DynObject value, String charset);
9
    
10
    public DynObject decode(String value);
11
    
12
    public DynObject decode(String value, DynObject output);
13
    
14
    public DynObject decode(String value, DynObject output, String charset);
15

  
16
    public String encodePair(String name, Object value);
17

  
18
    public String encodePair(String name, Object value, String charset);
19
    
20
    public String encodeValue(String value);
21
    
22
    public String encodeValue(String value, String charset);
23

  
24
    public String decodeValue(String value);
25

  
26
    public String decodeValue(String value, String charset);
27
}

Also available in: Unified diff