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 |
} |