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

History | View | Annotate | Download (5.69 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.exception.DynFieldNotFoundException;
10
import org.gvsig.tools.dynobject.exception.DynMethodException;
11
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
12
import org.gvsig.tools.dynobject.impl.DefaultDynClass.FieldAndIndex;
13

    
14
public class DefaultDynObject implements DelegatedDynObject {
15

    
16
        protected DefaultDynClass dynClass;
17
        protected Object[] values;
18
        protected DynObject[] delegateds;
19

    
20
        public DefaultDynObject(DynClass dynClass) {
21
                this.dynClass = (DefaultDynClass) dynClass;
22
                //                this.values = null;
23
                this.delegateds = null;
24
                this.values = this.dynClass.createValues(null);
25
        }
26

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

    
33
        public Object getDynValue(String name) throws DynFieldNotFoundException {
34
                //                if( this.values == null ) {
35
                //                        this.values = this.dynClass.createValues(null);
36
                //                        return null;
37
                //                }
38
                FieldAndIndex x = dynClass.getDynFieldAndIndex(name);
39
                if (x != null) {
40

    
41
                        Object value = values[x.getIndex()];
42
                        if (value != null) {
43
//                                return x.getDynField().coerce(value);
44
                                return value;
45
                        }
46
                }
47
                if( delegateds != null ) {
48
                        for( int i=0; i<delegateds.length; i++) {
49
                                DynObject dynObj = delegateds[i];
50
                                if( dynObj.hasDynValue(name) ) {
51
                                        return dynObj.getDynValue(name);
52
                                }
53
                        }
54
                }
55
                if (x == null) {
56
                        throw new DynFieldNotFoundException(name, dynClass.getName());
57
                }
58
                return x.getDynField().getDefaultValue();
59
        }
60

    
61
        public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
62
                //                if( this.values == null ) {
63
                //                        this.values = this.dynClass.createValues(null);
64
                //                }
65
                
66
                FieldAndIndex x = dynClass.getDynFieldAndIndex(name);
67
                if (x == null) {
68
                        throw new DynFieldNotFoundException(name,this.getDynClass().getName());
69
                }
70
                try {
71
                        values[x.getIndex()] = x.getDynField().coerce(value);
72
                } catch (CoercionException e) {
73
                        // FIXME: Need throw specific exception
74
                        throw new DynFieldNotFoundException(name, this.dynClass.getFullName());
75
                }
76
        }
77

    
78
        public boolean instanceOf(DynClass dynClass) {
79
                return dynClass.isInstance(this);
80
        }
81

    
82
        public DynClass getDynClass() {
83
                return this.dynClass;
84
        }
85

    
86
        public boolean hasDynValue(String name) {
87
                //                if( this.values == null ) {
88
                //                        this.values = this.dynClass.createValues(null);
89
                //                }
90
                int index = dynClass.getFieldIndex(name);
91
                if (index < 0 || this.values[index] == null) {
92
                        if (delegateds != null) {
93
                                for (int i = 0; i < delegateds.length; i++) {
94
                                        DynObject dynObj = delegateds[i];
95
                                        if (dynObj.hasDynValue(name)) {
96
                                                return true;
97
                                        }
98
                                }
99
                        }
100
                        return false;
101
                }
102
                return true;
103
        }
104

    
105
        public void delegate(DynObject dynObjects) {
106
                if( delegateds == null ) {
107
                        this.delegateds = new DynObject[1];
108
                        this.delegateds[0] = dynObjects;
109
                        return ;
110
                }
111
                DynObject[] newValues = new DynObject[this.delegateds.length + 1];
112
                System.arraycopy(delegateds, 0, newValues, 0, delegateds.length);
113
                newValues[delegateds.length] = dynObjects;
114
                this.delegateds = newValues;
115
        }
116

    
117
        public Object invokeDynMethod(String name, DynObject context) throws DynMethodException {
118
                throw new IllegalArgumentException("self required");
119
        }
120

    
121
        public Object invokeDynMethod(int code, DynObject context) throws DynMethodException {
122
                throw new IllegalArgumentException("self required");
123
        }
124

    
125
        public Object invokeDynMethod(Object self, String methodName,
126
                        DynObject context)throws DynMethodException {
127
                DynMethod method = this.dynClass.getDynMethod(methodName);
128
                if (method == null) {
129
                        if (delegateds != null) {
130
                                for (int i = 0; i < delegateds.length; i++) {
131
                                        try {
132
                                                return delegateds[i].invokeDynMethod(methodName,
133
                                                                context);
134
                                        } catch (DynMethodNotSupportedException e) {
135
                                                // continue next delegated
136
                                        }
137
                                }
138

    
139
                        }
140
                        throw new DynMethodNotSupportedException(methodName, self
141
                                        .getClass().getName());
142

    
143
                }
144
                return method.invoke(self, context);
145
        }
146

    
147
        public Object invokeDynMethod(Object self, int methodCode, DynObject context) throws DynMethodException {
148
                DynMethod method = this.dynClass.getDynMethod(methodCode);
149
                if (method == null) {
150
                        if (delegateds != null) {
151
                                for (int i = 0; i < delegateds.length; i++) {
152
                                        try {
153
                                                return delegateds[i].invokeDynMethod(methodCode,
154
                                                                context);
155
                                        } catch (DynMethodNotSupportedException e) {
156
                                                // continue next delegated
157
                                        }
158
                                }
159
                                throw new DynMethodNotSupportedException(methodCode, self
160
                                                .getClass().getName());
161

    
162
                        } else {
163
                                throw new DynMethodNotSupportedException(methodCode, self
164
                                                .getClass().getName());
165
                        }
166
                }
167
                return this.dynClass.manager.invokeDynMethod(self, methodCode, context);
168
        }
169

    
170
        public void clear() {
171
                DynField[] fields = getDynClass().getDeclaredDynFields();
172

    
173
                for (int i = 0; i < fields.length; i++) {
174
                        this.setDynValue(fields[i].getName(), fields[i].getDefaultValue());
175
                }
176
        }
177

    
178
        public String toString() {
179
                StringBuffer buffer = new StringBuffer();
180

    
181
                DynClass dynClass = getDynClass();
182
                buffer.append("DynClass name: ").append(dynClass.getName()).append(
183
                                "\nFields:");
184

    
185
                DynField[] fields = dynClass.getDeclaredDynFields();
186

    
187
                for (int i = 0; i < fields.length; i++) {
188
                        buffer.append("\n\t").append(fields[i].getName()).append(" = ")
189
                                        .append(getDynValue(fields[i].getName()));
190
                }
191

    
192
                return buffer.toString();
193
        }
194
}