Statistics
| Revision:

gvsig-tools / org.gvsig.tools / library / trunk / org.gvsig.tools / org.gvsig.tools.lib / src / main / java / org / gvsig / tools / dynobject / impl / DefaultDynObject.java @ 146

History | View | Annotate | Download (6.73 KB)

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

    
3
import org.gvsig.tools.dataTypes.CoercionException;
4
import org.gvsig.tools.dynobject.DelegatedDynObject;
5
import org.gvsig.tools.dynobject.DynClass;
6
import org.gvsig.tools.dynobject.DynField;
7
import org.gvsig.tools.dynobject.DynMethod;
8
import org.gvsig.tools.dynobject.DynObject;
9
import org.gvsig.tools.dynobject.DynObjectRuntimeException;
10
import org.gvsig.tools.dynobject.DynStruct;
11
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
12
import org.gvsig.tools.dynobject.exception.DynMethodException;
13
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
14
import org.gvsig.tools.dynobject.impl.DefaultDynClass.FieldAndIndex;
15

    
16
public class DefaultDynObject implements DelegatedDynObject {
17

    
18
        protected DefaultDynClass dynClass;
19
        protected Object[] values;
20
        protected DynObject[] delegateds;
21

    
22
        public DefaultDynObject(DynStruct dynClass) {
23
                this.dynClass = (DefaultDynClass) dynClass;
24
                //                this.values = null;
25
                this.delegateds = null;
26
                this.values = this.dynClass.createValues(null);
27
        }
28

    
29
        public void implement(DynClass dynClass) {
30
                this.dynClass = (DefaultDynClass) ((DefaultDynObjectManager) ((DefaultDynClass) dynClass)
31
                                .getManager()).get(new DynClass[] { this.dynClass, dynClass });
32
                this.values = this.dynClass.createValues(this.values);
33
        }
34

    
35
        public Object getDynValue(String name) throws DynFieldNotFoundException {
36
                boolean defined = false;
37
                Object defaultValue = null;
38
                FieldAndIndex fieldAndIndex = dynClass.getDynFieldAndIndex(name);
39
                if (fieldAndIndex != null  ) {
40
                        Object value = this.values[fieldAndIndex.getIndex()];
41
                        if( value != null) {
42
                                return value;
43
                        }
44
                        defined = true;
45
                        defaultValue = fieldAndIndex.getDynField().getDefaultValue(); 
46
                }
47
        if (delegateds != null) {
48
                        for (int i = 0; i < delegateds.length; i++) {
49
                                DynObject dynObj = delegateds[i];
50
                                try {
51
                                        if (dynObj.hasDynValue(name)) {
52
                                                return dynObj.getDynValue(name);
53
                                        } else {
54
                                                defined = true;
55
                                                defaultValue = dynObj.getDynValue(name);
56
                                        }
57
                                } catch(DynFieldNotFoundException ex) {
58
                                        ;
59
                                }
60
                        }
61
        }
62
                if( defined ) {
63
                        return defaultValue;
64
                }
65
                throw new DynFieldNotFoundException(name, dynClass.getName());
66
        }
67

    
68
        public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
69
                //                if( this.values == null ) {
70
                //                        this.values = this.dynClass.createValues(null);
71
                //                }
72
                
73
                FieldAndIndex x = dynClass.getDynFieldAndIndex(name);
74
                if (x == null) {
75
                        throw new DynFieldNotFoundException(name,this.getDynClass().getName());
76
                }
77
                try {
78
                        values[x.getIndex()] = x.getDynField().coerce(value);
79
                } catch (CoercionException e) {
80
                        throw new CoerceValueException(this.dynClass, name, value, e);
81
                }
82
        }
83
        
84
        public class CoerceValueException extends DynObjectRuntimeException {
85

    
86
                /**
87
                 * 
88
                 */
89
                private static final long serialVersionUID = 8974502669097158348L;
90

    
91
                public CoerceValueException(DynStruct dynStruct, String fieldName, Object value, Throwable cause) {
92
                        super(
93
                                "Can't convert value %(value) for field %(field) of class %(class).",
94
                                cause,
95
                                "Cant_convert_value_XvalueX_for_field_XfieldX_of_class_XclassX",
96
                                serialVersionUID
97
                        );
98
                        setValue("field",fieldName);
99
                        setValue("class",dynStruct.getFullName());
100
                        try {
101
                                setValue("value",value.toString());
102
                        } catch(Exception e1) {
103
                                setValue("value","???");
104
                        }                        
105
                }
106
                
107
        }
108

    
109
        public boolean instanceOf(DynClass dynClass) {
110
                return dynClass.isInstance(this);
111
        }
112

    
113
        public DynClass getDynClass() {
114
                return this.dynClass;
115
        }
116

    
117
        public boolean hasDynValue(String name)throws DynFieldNotFoundException {
118
                boolean defined = false;
119
                int index = dynClass.getFieldIndex(name);
120
                if (index >= 0 ) {
121
                        if( this.values[index] != null) {
122
                                return true;
123
                        }
124
                        defined = true;
125
                }
126
        if (delegateds != null) {
127
                        for (int i = 0; i < delegateds.length; i++) {
128
                                DynObject dynObj = delegateds[i];
129
                                try {
130
                                        if (dynObj.hasDynValue(name)) {
131
                                                return true;
132
                                        } else {
133
                                                defined = true;
134
                                        }
135
                                } catch(DynFieldNotFoundException ex) {
136
                                        ;
137
                                }
138
                        }
139
        }
140
                if( defined ) {
141
                        return false;
142
                }
143
                throw new DynFieldNotFoundException(name, dynClass.getName());
144
        }
145

    
146
        public void delegate(DynObject dynObjects) {
147
                if( delegateds == null ) {
148
                        this.delegateds = new DynObject[1];
149
                        this.delegateds[0] = dynObjects;
150
                        return ;
151
                }
152
                DynObject[] newValues = new DynObject[this.delegateds.length + 1];
153
                System.arraycopy(delegateds, 0, newValues, 0, delegateds.length);
154
                newValues[delegateds.length] = dynObjects;
155
                this.delegateds = newValues;
156
        }
157

    
158
        public Object invokeDynMethod(String name, DynObject context) throws DynMethodException {
159
                throw new IllegalArgumentException("self required");
160
        }
161

    
162
        public Object invokeDynMethod(int code, DynObject context) throws DynMethodException {
163
                throw new IllegalArgumentException("self required");
164
        }
165

    
166
        public Object invokeDynMethod(Object self, String methodName,
167
                        DynObject context)throws DynMethodException {
168
                DynMethod method = this.dynClass.getDynMethod(methodName);
169
                if (method == null) {
170
                        if (delegateds != null) {
171
                                for (int i = 0; i < delegateds.length; i++) {
172
                                        try {
173
                                                return delegateds[i].invokeDynMethod(methodName,
174
                                                                context);
175
                                        } catch (DynMethodNotSupportedException e) {
176
                                                // continue next delegated
177
                                        }
178
                                }
179

    
180
                        }
181
                        throw new DynMethodNotSupportedException(methodName, self
182
                                        .getClass().getName());
183

    
184
                }
185
                return method.invoke(self, context);
186
        }
187

    
188
        public Object invokeDynMethod(Object self, int methodCode, DynObject context) throws DynMethodException {
189
                DynMethod method = this.dynClass.getDynMethod(methodCode);
190
                if (method == null) {
191
                        if (delegateds != null) {
192
                                for (int i = 0; i < delegateds.length; i++) {
193
                                        try {
194
                                                return delegateds[i].invokeDynMethod(methodCode,
195
                                                                context);
196
                                        } catch (DynMethodNotSupportedException e) {
197
                                                // continue next delegated
198
                                        }
199
                                }
200
                                throw new DynMethodNotSupportedException(methodCode, self
201
                                                .getClass().getName());
202

    
203
                        } else {
204
                                throw new DynMethodNotSupportedException(methodCode, self
205
                                                .getClass().getName());
206
                        }
207
                }
208
                return this.dynClass.manager.invokeDynMethod(self, methodCode, context);
209
        }
210

    
211
        public void clear() {
212
                DynField[] fields = getDynClass().getDeclaredDynFields();
213

    
214
                for (int i = 0; i < fields.length; i++) {
215
                        this.setDynValue(fields[i].getName(), fields[i].getDefaultValue());
216
                }
217
        }
218

    
219
        public String toString() {
220
                StringBuffer buffer = new StringBuffer();
221

    
222
                DynClass dynClass = getDynClass();
223
                buffer.append("DynClass name: ").append(dynClass.getName()).append(
224
                                "\nFields:");
225

    
226
                DynField[] fields = dynClass.getDeclaredDynFields();
227

    
228
                for (int i = 0; i < fields.length; i++) {
229
                        buffer.append("\n\t").append(fields[i].getName()).append(" = ")
230
                                        .append(getDynValue(fields[i].getName()));
231
                }
232

    
233
                return buffer.toString();
234
        }
235
}