Statistics
| Revision:

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

History | View | Annotate | Download (2.61 KB)

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

    
3
import org.gvsig.tools.dynobject.DynClass;
4
import org.gvsig.tools.dynobject.DynFieldNotFoundException;
5
import org.gvsig.tools.dynobject.DynObject;
6
import org.gvsig.tools.dynobject.impl.DefaultDynClass.FieldAndIndex;
7

    
8
public class DefaultDynObject implements DynObject {
9

    
10
        private DefaultDynClass dynClass;
11
        private Object[] values;
12
        private DynObject[] delegateds;
13

    
14
        public DefaultDynObject(DynClass dynClass) {
15
                this.dynClass = (DefaultDynClass) dynClass;
16
//                this.values = null;
17
                this.delegateds = null;
18
                this.values = this.dynClass.createValues(null);
19
        }
20

    
21
        public void implement(DynClass dynClass) {
22
                this.dynClass = (DefaultDynClass) ((DefaultDynObjectManager) ((DefaultDynClass) dynClass)
23
                .getManager()).get(new DynClass[] { this.dynClass, dynClass });
24
                this.values = this.dynClass.createValues(this.values);
25
        }
26

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

    
48
        public void setDynValue(String name, Object value) throws DynFieldNotFoundException {
49
//                if( this.values == null ) {
50
//                        this.values = this.dynClass.createValues(null);
51
//                }
52
                values[dynClass.getFieldIndex(name)] = value;
53
        }
54

    
55
        public boolean instanceOf(DynClass dynClass) {
56
                return dynClass.isInstance(this);
57
        }
58

    
59
        public DynClass getDynClass() {
60
                return this.dynClass;
61
        }
62

    
63
        public boolean hasDynValue(String name) {
64
//                if( this.values == null ) {
65
//                        this.values = this.dynClass.createValues(null);
66
//                }
67
                int index = dynClass.getFieldIndex(name);
68
                if( this.values[index] == null ) {
69
                        return false;
70
                }
71
                return true;
72
        }
73

    
74
        public void delegate(DynObject[] dynObjects) {
75
                if( delegateds == null ) {
76
                        this.delegateds = new DynObject[ dynObjects.length];
77
                        System.arraycopy(dynObjects, 0, this.delegateds, 0, dynObjects.length);
78
                        return ;
79
                }
80
                DynObject[] newValues = new DynObject[ this.delegateds.length+dynObjects.length];
81
                System.arraycopy(delegateds, 0, newValues, 0, delegateds.length);
82
                System.arraycopy(dynObjects, delegateds.length, newValues, delegateds.length, dynObjects.length);
83
                // TODO, seguro que me he ido en algun +-1 en algun lado del arraycopy.
84
        }
85

    
86
}