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

History | View | Annotate | Download (5.47 KB)

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

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

    
13
public class DefaultDynObject implements DelegatedDynObject {
14

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

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

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

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

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

    
60
        public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
61
                //                if( this.values == null ) {
62
                //                        this.values = this.dynClass.createValues(null);
63
                //                }
64
                
65
                FieldAndIndex x = dynClass.getDynFieldAndIndex(name);
66
                if (x == null) {
67
                        throw new DynFieldNotFoundException(name,this.getDynClass().getName());
68
                }
69
                values[x.getIndex()] = x.getDynField().coerce(value);
70
        }
71

    
72
        public boolean instanceOf(DynClass dynClass) {
73
                return dynClass.isInstance(this);
74
        }
75

    
76
        public DynClass getDynClass() {
77
                return this.dynClass;
78
        }
79

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

    
99
        public void delegate(DynObject dynObjects) {
100
                if( delegateds == null ) {
101
                        this.delegateds = new DynObject[1];
102
                        this.delegateds[0] = dynObjects;
103
                        return ;
104
                }
105
                DynObject[] newValues = new DynObject[this.delegateds.length + 1];
106
                System.arraycopy(delegateds, 0, newValues, 0, delegateds.length);
107
                newValues[delegateds.length] = dynObjects;
108
                this.delegateds = newValues;
109
        }
110

    
111
        public Object invokeDynMethod(String name, DynObject context) throws DynMethodException {
112
                throw new IllegalArgumentException("self required");
113
        }
114

    
115
        public Object invokeDynMethod(int code, DynObject context) throws DynMethodException {
116
                throw new IllegalArgumentException("self required");
117
        }
118

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

    
133
                        }
134
                        throw new DynMethodNotSupportedException(methodName, self
135
                                        .getClass().getName());
136

    
137
                }
138
                return method.invoke(self, context);
139
        }
140

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

    
156
                        } else {
157
                                throw new DynMethodNotSupportedException(methodCode, self
158
                                                .getClass().getName());
159
                        }
160
                }
161
                return this.dynClass.manager.invokeDynMethod(self, methodCode, context);
162
        }
163

    
164
        public void clear() {
165
                DynField[] fields = getDynClass().getDeclaredDynFields();
166

    
167
                for (int i = 0; i < fields.length; i++) {
168
                        this.setDynValue(fields[i].getName(), fields[i].getDefaultValue());
169
                }
170
        }
171

    
172
        public String toString() {
173
                StringBuffer buffer = new StringBuffer();
174

    
175
                DynClass dynClass = getDynClass();
176
                buffer.append("DynClass name: ").append(dynClass.getName()).append(
177
                                "\nFields:");
178

    
179
                DynField[] fields = dynClass.getDeclaredDynFields();
180

    
181
                for (int i = 0; i < fields.length; i++) {
182
                        buffer.append("\n\t").append(fields[i].getName()).append(" = ")
183
                                        .append(getDynValue(fields[i].getName()));
184
                }
185

    
186
                return buffer.toString();
187
        }
188
}