View Javadoc

1   /*
2    * $Id: MetaFieldProperty.java 4287 2006-12-01 13:00:13Z blackdrag $
3    *
4    * Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
5    *
6    * Redistribution and use of this software and associated documentation
7    * ("Software"), with or without modification, are permitted provided that the
8    * following conditions are met:
9    *  1. Redistributions of source code must retain copyright statements and
10   * notices. Redistributions must also contain a copy of this document.
11   *  2. Redistributions in binary form must reproduce the above copyright
12   * notice, this list of conditions and the following disclaimer in the
13   * documentation and/or other materials provided with the distribution.
14   *  3. The name "groovy" must not be used to endorse or promote products
15   * derived from this Software without prior written permission of The Codehaus.
16   * For written permission, please contact info@codehaus.org.
17   *  4. Products derived from this Software may not be called "groovy" nor may
18   * "groovy" appear in their names without prior written permission of The
19   * Codehaus. "groovy" is a registered trademark of The Codehaus.
20   *  5. Due credit should be given to The Codehaus - http://groovy.codehaus.org/
21   *
22   * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
23   * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25   * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
26   * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29   * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
32   * DAMAGE.
33   *
34   */
35   
36  package groovy.lang;
37  
38  import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
39  
40  import java.lang.reflect.Field;
41  import java.lang.reflect.Modifier;
42  import java.security.AccessController;
43  import java.security.PrivilegedActionException;
44  import java.security.PrivilegedExceptionAction;
45  
46  /***
47   * Represents a property on a bean which may have a getter and/or a setter
48   * 
49   * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
50   * @version $Revision: 4287 $
51   */
52  public class MetaFieldProperty extends MetaProperty {
53  
54      private Field field;
55  
56      public MetaFieldProperty(Field field) {
57          super(field.getName(), field.getType());
58          this.field = field;
59      }
60  
61      /***
62       * @return the property of the given object
63       * @throws Exception if the property could not be evaluated
64       */
65      public Object getProperty(final Object object) {
66          try {
67              Object value = (Object) AccessController.doPrivileged(new PrivilegedExceptionAction() {
68                  public Object run() throws IllegalAccessException {   
69                      field.setAccessible(true);
70                      return field.get(object);
71                  }
72              });
73              return value;
74          } catch (PrivilegedActionException pe) {
75              throw new GroovyRuntimeException("Cannot get the property '" + name + "'.", pe.getException());
76          }
77      }
78  
79      /***
80       * Sets the property on the given object to the new value
81       * 
82       * @param object on which to set the property
83       * @param newValue the new value of the property
84       * @throws RuntimeException if the property could not be set
85       */
86      public void setProperty(final Object object, Object newValue) {
87          final Object goalValue = DefaultTypeTransformation.castToType(newValue, field.getType());
88          try {
89              AccessController.doPrivileged(new PrivilegedExceptionAction() {
90                  public Object run() throws IllegalAccessException, GroovyRuntimeException {
91                      field.setAccessible(true);
92                      field.set(object, goalValue);
93                      return null;
94                  }
95              });
96          } catch (PrivilegedActionException ex) {
97              throw new GroovyRuntimeException("Cannot set the property '" + name + "'.", ex.getException());
98          }
99      }
100 
101     private String toName(Class c) {
102         String s = c.toString();
103         if (s.startsWith("class ") && s.length() > 6)
104             return s.substring(6);
105         else
106             return s;
107     }
108     
109     public int getModifiers() {
110         return field.getModifiers();
111     }
112     
113     public boolean isStatic() {
114         return Modifier.isStatic(field.getModifiers());
115     }
116 }