Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libTools / src / org / gvsig / tools / dynobject / impl / DefaultDynObject.java @ 25791

History | View | Annotate | Download (3.69 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.DynMethod;
6
import org.gvsig.tools.dynobject.DynObject;
7
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException;
8
import org.gvsig.tools.dynobject.exception.DynMethodException;
9
import org.gvsig.tools.dynobject.exception.DynMethodNotSupportedException;
10
import org.gvsig.tools.dynobject.impl.DefaultDynClass.FieldAndIndex;
11

    
12
public class DefaultDynObject implements DelegatedDynObject {
13

    
14
        private DefaultDynClass dynClass;
15
        private Object[] values;
16
        private DynObject[] delegateds;
17

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

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

    
31
        public Object getDynValue(String name) throws DynFieldNotFoundException {
32
//                if( this.values == null ) {
33
//                        this.values = this.dynClass.createValues(null);
34
//                        return null;
35
//                }
36
                FieldAndIndex x = dynClass.getDynFieldAndIndex(name);
37
                Object value = values[ x.getIndex() ];
38
                if( value != null ) {
39
                        return x.getDynField().coerce( value );
40
                }
41
                if( delegateds != null ) {
42
                        for( int i=0; i<delegateds.length; i++) {
43
                                DynObject dynObj = delegateds[i];
44
                                if( dynObj.hasDynValue(name) ) {
45
                                        return dynObj.getDynValue(name);
46
                                }
47
                        }
48
                }
49
                return x.getDynField().getDefaultValue();
50
        }
51

    
52
        public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
53
//                if( this.values == null ) {
54
//                        this.values = this.dynClass.createValues(null);
55
//                }
56
                int pos = dynClass.getFieldIndex(name);
57
                if (pos < 0 || pos >= values.length) {
58
                        throw new DynFieldNotFoundException(name,this.getDynClass().getName());
59
                }
60
                values[pos] = value;
61
        }
62

    
63
        public boolean instanceOf(DynClass dynClass) {
64
                return dynClass.isInstance(this);
65
        }
66

    
67
        public DynClass getDynClass() {
68
                return this.dynClass;
69
        }
70

    
71
        public boolean hasDynValue(String name) {
72
//                if( this.values == null ) {
73
//                        this.values = this.dynClass.createValues(null);
74
//                }
75
                int index = dynClass.getFieldIndex(name);
76
                if( this.values[index] == null ) {
77
                        return false;
78
                }
79
                return true;
80
        }
81

    
82
        public void delegate(DynObject dynObjects) {
83
                if( delegateds == null ) {
84
                        this.delegateds = new DynObject[1];
85
                        this.delegateds[0] = dynObjects;
86
                        return ;
87
                }
88
                DynObject[] newValues = new DynObject[this.delegateds.length + 1];
89
                System.arraycopy(delegateds, 0, newValues, 0, delegateds.length);
90
                newValues[delegateds.length] = dynObjects;
91
                this.delegateds = newValues;
92
        }
93

    
94
        public Object invokeDynMethod(String name, DynObject context) throws DynMethodException {
95
                throw new IllegalArgumentException("self required");
96
        }
97

    
98
        public Object invokeDynMethod(int code, DynObject context) throws DynMethodException {
99
                throw new IllegalArgumentException("self required");
100
        }
101

    
102
        public Object invokeDynMethod(Object self, String methodName,
103
                        DynObject context)throws DynMethodException {
104
                DynMethod method = this.dynClass.getDynMethod(methodName);
105
                if (method == null) {
106
                        // FIXME
107
                        //                        throw new DynMethodNotSupportedException(getDynClass().getName(),
108
                        //                                        methodName);
109
                        throw new DynMethodNotSupportedException(
110
                                        0);
111

    
112
                }
113
                return method.invoke(self, context);
114
        }
115

    
116
        public Object invokeDynMethod(Object self, int methodCode, DynObject context) throws DynMethodException {
117
                return this.dynClass.manager.invokeDynMethod(self, methodCode, context);
118
        }
119
}