Revision 146 org.gvsig.tools/library/trunk/org.gvsig.tools/org.gvsig.tools.lib/src/main/java/org/gvsig/tools/dynobject/impl/DefaultDynObject.java

View differences:

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