Revision 146 org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/impl/DefaultDynObject.java
DefaultDynObject.java | ||
---|---|---|
6 | 6 |
import org.gvsig.tools.dynobject.DynField; |
7 | 7 |
import org.gvsig.tools.dynobject.DynMethod; |
8 | 8 |
import org.gvsig.tools.dynobject.DynObject; |
9 |
import org.gvsig.tools.dynobject.DynObjectRuntimeException; |
|
9 | 10 |
import org.gvsig.tools.dynobject.DynStruct; |
10 | 11 |
import org.gvsig.tools.dynobject.exception.DynFieldNotFoundException; |
11 | 12 |
import org.gvsig.tools.dynobject.exception.DynMethodException; |
... | ... | |
32 | 33 |
} |
33 | 34 |
|
34 | 35 |
public Object getDynValue(String name) throws DynFieldNotFoundException { |
35 |
// if( this.values == null ) { |
|
36 |
// this.values = this.dynClass.createValues(null); |
|
37 |
// return null; |
|
38 |
// } |
|
39 |
FieldAndIndex x = dynClass.getDynFieldAndIndex(name); |
|
40 |
if (x != null) { |
|
41 |
|
|
42 |
Object value = values[x.getIndex()]; |
|
43 |
if (value != null) { |
|
44 |
// return x.getDynField().coerce(value); |
|
36 |
boolean defined = false; |
|
37 |
Object defaultValue = null; |
|
38 |
FieldAndIndex fieldAndIndex = dynClass.getDynFieldAndIndex(name); |
|
39 |
if (fieldAndIndex != null ) { |
|
40 |
Object value = this.values[fieldAndIndex.getIndex()]; |
|
41 |
if( value != null) { |
|
45 | 42 |
return value; |
46 | 43 |
} |
44 |
defined = true; |
|
45 |
defaultValue = fieldAndIndex.getDynField().getDefaultValue(); |
|
47 | 46 |
} |
48 |
if( delegateds != null ) {
|
|
49 |
for( int i=0; i<delegateds.length; i++) {
|
|
47 |
if (delegateds != null) {
|
|
48 |
for (int i = 0; i < delegateds.length; i++) {
|
|
50 | 49 |
DynObject dynObj = delegateds[i]; |
51 |
if( dynObj.hasDynValue(name) ) { |
|
52 |
return dynObj.getDynValue(name); |
|
50 |
try { |
|
51 |
if (dynObj.hasDynValue(name)) { |
|
52 |
return dynObj.getDynValue(name); |
|
53 |
} else { |
|
54 |
defined = true; |
|
55 |
defaultValue = dynObj.getDynValue(name); |
|
56 |
} |
|
57 |
} catch(DynFieldNotFoundException ex) { |
|
58 |
; |
|
53 | 59 |
} |
54 | 60 |
} |
61 |
} |
|
62 |
if( defined ) { |
|
63 |
return defaultValue; |
|
55 | 64 |
} |
56 |
if (x == null) { |
|
57 |
throw new DynFieldNotFoundException(name, dynClass.getName()); |
|
58 |
} |
|
59 |
return x.getDynField().getDefaultValue(); |
|
65 |
throw new DynFieldNotFoundException(name, dynClass.getName()); |
|
60 | 66 |
} |
61 | 67 |
|
62 | 68 |
public void setDynValue(String name, Object value) throws DynFieldNotFoundException { |
... | ... | |
71 | 77 |
try { |
72 | 78 |
values[x.getIndex()] = x.getDynField().coerce(value); |
73 | 79 |
} catch (CoercionException e) { |
74 |
// FIXME: Need throw specific exception |
|
75 |
throw new DynFieldNotFoundException(name, this.dynClass.getFullName()); |
|
80 |
throw new CoerceValueException(this.dynClass, name, value, e); |
|
76 | 81 |
} |
77 | 82 |
} |
83 |
|
|
84 |
public class CoerceValueException extends DynObjectRuntimeException { |
|
78 | 85 |
|
86 |
/** |
|
87 |
* |
|
88 |
*/ |
|
89 |
private static final long serialVersionUID = 8974502669097158348L; |
|
90 |
|
|
91 |
public CoerceValueException(DynStruct dynStruct, String fieldName, Object value, Throwable cause) { |
|
92 |
super( |
|
93 |
"Can't convert value %(value) for field %(field) of class %(class).", |
|
94 |
cause, |
|
95 |
"Cant_convert_value_XvalueX_for_field_XfieldX_of_class_XclassX", |
|
96 |
serialVersionUID |
|
97 |
); |
|
98 |
setValue("field",fieldName); |
|
99 |
setValue("class",dynStruct.getFullName()); |
|
100 |
try { |
|
101 |
setValue("value",value.toString()); |
|
102 |
} catch(Exception e1) { |
|
103 |
setValue("value","???"); |
|
104 |
} |
|
105 |
} |
|
106 |
|
|
107 |
} |
|
108 |
|
|
79 | 109 |
public boolean instanceOf(DynClass dynClass) { |
80 | 110 |
return dynClass.isInstance(this); |
81 | 111 |
} |
... | ... | |
84 | 114 |
return this.dynClass; |
85 | 115 |
} |
86 | 116 |
|
87 |
public boolean hasDynValue(String name) { |
|
88 |
// if( this.values == null ) { |
|
89 |
// this.values = this.dynClass.createValues(null); |
|
90 |
// } |
|
117 |
public boolean hasDynValue(String name)throws DynFieldNotFoundException { |
|
118 |
boolean defined = false; |
|
91 | 119 |
int index = dynClass.getFieldIndex(name); |
92 |
if (index < 0 || this.values[index] == null) { |
|
93 |
if (delegateds != null) { |
|
94 |
for (int i = 0; i < delegateds.length; i++) { |
|
95 |
DynObject dynObj = delegateds[i]; |
|
120 |
if (index >= 0 ) { |
|
121 |
if( this.values[index] != null) { |
|
122 |
return true; |
|
123 |
} |
|
124 |
defined = true; |
|
125 |
} |
|
126 |
if (delegateds != null) { |
|
127 |
for (int i = 0; i < delegateds.length; i++) { |
|
128 |
DynObject dynObj = delegateds[i]; |
|
129 |
try { |
|
96 | 130 |
if (dynObj.hasDynValue(name)) { |
97 | 131 |
return true; |
132 |
} else { |
|
133 |
defined = true; |
|
98 | 134 |
} |
135 |
} catch(DynFieldNotFoundException ex) { |
|
136 |
; |
|
99 | 137 |
} |
100 | 138 |
} |
139 |
} |
|
140 |
if( defined ) { |
|
101 | 141 |
return false; |
102 | 142 |
} |
103 |
return true;
|
|
143 |
throw new DynFieldNotFoundException(name, dynClass.getName());
|
|
104 | 144 |
} |
105 | 145 |
|
106 | 146 |
public void delegate(DynObject dynObjects) { |
Also available in: Unified diff