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
36 package groovy.lang;
37
38
39 import org.codehaus.groovy.runtime.InvokerHelper;
40 import java.lang.reflect.Field;
41 import java.security.AccessController;
42 import java.security.PrivilegedExceptionAction;
43
44 /***
45 * Represents a property on a bean which may have a getter and/or a setter
46 *
47 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
48 * @version $Revision: 1.4 $
49 */
50 public class MetaFieldProperty extends MetaProperty {
51
52 private Field field;
53
54 public MetaFieldProperty(Field field) {
55 super(field.getName(), field.getType());
56 this.field = field;
57 }
58
59 /***
60 * @return the property of the given object
61 * @throws Exception if the property could not be evaluated
62 */
63 public Object getProperty(Object object) throws Exception {
64 final Field field1 = field;
65 final Object object1 = object;
66 Object value = (Object) AccessController.doPrivileged(new PrivilegedExceptionAction() {
67 public Object run() throws IllegalAccessException {
68 field1.setAccessible(true);
69 return field1.get(object1);
70 }
71 });
72 return value;
73 }
74
75 /***
76 * Sets the property on the given object to the new value
77 *
78 * @param object on which to set the property
79 * @param newValue the new value of the property
80 * @throws Exception if the property could not be set
81 */
82 public void setProperty(Object object, Object newValue) {
83 final Field field1 = field;
84 final Object object1 = object;
85 final Object newValue1 = newValue;
86 try {
87 AccessController.doPrivileged(new PrivilegedExceptionAction() {
88 public Object run() throws IllegalAccessException, TypeMismatchException, GroovyRuntimeException {
89 try {
90 field1.set(object1, newValue1);
91 return newValue1;
92 }
93 catch (IllegalArgumentException e) {
94 try {
95 Object newValue2 = InvokerHelper.asType(newValue1, field1.getType());
96 field1.set(object1, newValue2);
97 return newValue2;
98 }
99 catch (Exception ex) {
100 throw new TypeMismatchException( "'" + toName(object1.getClass()) + "." + field1.getName()
101 + "' can not refer to the value '"
102 + newValue1 + "' (type " + toName(newValue1.getClass())
103 + "), because it is of the type " + toName(field1.getType()) );
104 }
105 }
106 catch (Exception ex) {
107 throw new GroovyRuntimeException("Cannot set the property '" + name + "'.", ex);
108 }
109 }
110 });
111 }
112 catch (TypeMismatchException ex) {
113 throw ex;
114 }
115 catch (Exception ex) {
116 throw new GroovyRuntimeException("Cannot set the property '" + name + "'.", ex);
117 }
118 }
119
120 private String toName(Class c) {
121 String s = c.toString();
122 if (s.startsWith("class ") && s.length() > 6)
123 return s.substring(6);
124 else
125 return s;
126 }
127 }