1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 package groovy.lang;
36
37 /***
38 * Represents a property on a bean which may have a getter and/or a setter
39 *
40 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
41 * @author Kim Pilho
42 * @version $Revision: 1.3 $
43 */
44 public class MetaBeanProperty extends MetaProperty {
45
46 private MetaMethod getter;
47 private MetaMethod setter;
48
49 public MetaBeanProperty(String name, Class type, MetaMethod getter, MetaMethod setter) {
50 super(name, type);
51 this.getter = getter;
52 this.setter = setter;
53 }
54
55 /***
56 * @return the property of the given object
57 * @throws Exception if the property could not be evaluated
58 */
59 public Object getProperty(Object object) throws Exception {
60 if (getter == null) {
61
62 throw new GroovyRuntimeException("Cannot read write-only property: " + name);
63 }
64 return getter.invoke(object, MetaClass.EMPTY_ARRAY);
65 }
66
67 /***
68 * Sets the property on the given object to the new value
69 *
70 * @param object on which to set the property
71 * @param newValue the new value of the property
72 * @throws Exception if the property could not be set
73 */
74 public void setProperty(Object object, Object newValue) {
75 if(setter == null) {
76 throw new GroovyRuntimeException("Cannot set read-only property: " + name);
77 }
78
79 try {
80
81 if(getType() == String.class && !(newValue instanceof String))
82 newValue = newValue.toString();
83
84
85 if (newValue instanceof java.math.BigDecimal) {
86 if (getType() == Double.class)
87 newValue = new Double(((java.math.BigDecimal) newValue).doubleValue());
88 else if (getType() == Float.class)
89 newValue = new Float(((java.math.BigDecimal) newValue).floatValue());
90 else if (getType() == Long.class)
91 newValue = new Long(((java.math.BigDecimal) newValue).longValue());
92 else if (getType() == Integer.class)
93 newValue = new Integer(((java.math.BigDecimal) newValue).intValue());
94 else if (getType() == Short.class)
95 newValue = new Short((short) ((java.math.BigDecimal) newValue).intValue());
96 else if (getType() == Byte.class)
97 newValue = new Byte((byte) ((java.math.BigDecimal) newValue).intValue());
98 else if (getType() == Character.class)
99 newValue = new Character((char) ((java.math.BigDecimal) newValue).intValue());
100 }
101 else if (newValue instanceof java.math.BigInteger) {
102 if (getType() == Long.class)
103 newValue = new Long(((java.math.BigInteger) newValue).longValue());
104 else if (getType() == Integer.class)
105 newValue = new Integer(((java.math.BigInteger) newValue).intValue());
106 else if (getType() == Short.class)
107 newValue = new Short((short) ((java.math.BigInteger) newValue).intValue());
108 else if (getType() == Byte.class)
109 newValue = new Byte((byte) ((java.math.BigInteger) newValue).intValue());
110 else if (getType() == Character.class)
111 newValue = new Character((char) ((java.math.BigInteger) newValue).intValue());
112 }
113 else if (newValue instanceof java.lang.Long) {
114 if (getType() == Integer.class)
115 newValue = new Integer(((Long) newValue).intValue());
116 else if (getType() == Short.class)
117 newValue = new Short(((Long) newValue).shortValue());
118 else if (getType() == Byte.class)
119 newValue = new Byte(((Long) newValue).byteValue());
120 else if (getType() == Character.class)
121 newValue = new Character((char) ((Long) newValue).intValue());
122 }
123 else if (newValue instanceof java.lang.Integer) {
124 if (getType() == Short.class)
125 newValue = new Short(((Integer) newValue).shortValue());
126 else if (getType() == Byte.class)
127 newValue = new Byte(((Integer) newValue).byteValue());
128 else if (getType() == Character.class)
129 newValue = new Character((char) ((Integer) newValue).intValue());
130 }
131
132 setter.invoke(object, new Object[] { newValue });
133 }
134 catch(Exception e) {
135 throw new GroovyRuntimeException("Cannot set property: " + name +
136 " reason: " + e.getMessage(), e);
137 }
138 }
139
140 public MetaMethod getGetter() {
141 return getter;
142 }
143
144 public MetaMethod getSetter() {
145 return setter;
146 }
147
148 /***
149 * this is for MetaClass to patch up the object later when looking for get*() methods
150 */
151 void setGetter(MetaMethod getter) {
152 this.getter = getter;
153 }
154
155 /***
156 * this is for MetaClass to patch up the object later when looking for set*() methods
157 */
158 void setSetter(MetaMethod setter) {
159 this.setter = setter;
160 }
161 }