001: /*
002: * $Id: MetaFieldProperty.java 4287 2006-12-01 13:00:13Z blackdrag $
003: *
004: * Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005: *
006: * Redistribution and use of this software and associated documentation
007: * ("Software"), with or without modification, are permitted provided that the
008: * following conditions are met:
009: * 1. Redistributions of source code must retain copyright statements and
010: * notices. Redistributions must also contain a copy of this document.
011: * 2. Redistributions in binary form must reproduce the above copyright
012: * notice, this list of conditions and the following disclaimer in the
013: * documentation and/or other materials provided with the distribution.
014: * 3. The name "groovy" must not be used to endorse or promote products
015: * derived from this Software without prior written permission of The Codehaus.
016: * For written permission, please contact info@codehaus.org.
017: * 4. Products derived from this Software may not be called "groovy" nor may
018: * "groovy" appear in their names without prior written permission of The
019: * Codehaus. "groovy" is a registered trademark of The Codehaus.
020: * 5. Due credit should be given to The Codehaus - http://groovy.codehaus.org/
021: *
022: * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
023: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
024: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
025: * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
026: * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
027: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
028: * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
029: * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
030: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
031: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
032: * DAMAGE.
033: *
034: */
035:
036: package groovy.lang;
037:
038: import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation;
039:
040: import java.lang.reflect.Field;
041: import java.lang.reflect.Modifier;
042: import java.security.AccessController;
043: import java.security.PrivilegedActionException;
044: import java.security.PrivilegedExceptionAction;
045:
046: /**
047: * Represents a property on a bean which may have a getter and/or a setter
048: *
049: * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
050: * @version $Revision: 4287 $
051: */
052: public class MetaFieldProperty extends MetaProperty {
053:
054: private Field field;
055:
056: public MetaFieldProperty(Field field) {
057: super (field.getName(), field.getType());
058: this .field = field;
059: }
060:
061: /**
062: * @return the property of the given object
063: * @throws Exception if the property could not be evaluated
064: */
065: public Object getProperty(final Object object) {
066: try {
067: Object value = (Object) AccessController
068: .doPrivileged(new PrivilegedExceptionAction() {
069: public Object run()
070: throws IllegalAccessException {
071: field.setAccessible(true);
072: return field.get(object);
073: }
074: });
075: return value;
076: } catch (PrivilegedActionException pe) {
077: throw new GroovyRuntimeException(
078: "Cannot get the property '" + name + "'.", pe
079: .getException());
080: }
081: }
082:
083: /**
084: * Sets the property on the given object to the new value
085: *
086: * @param object on which to set the property
087: * @param newValue the new value of the property
088: * @throws RuntimeException if the property could not be set
089: */
090: public void setProperty(final Object object, Object newValue) {
091: final Object goalValue = DefaultTypeTransformation.castToType(
092: newValue, field.getType());
093: try {
094: AccessController
095: .doPrivileged(new PrivilegedExceptionAction() {
096: public Object run()
097: throws IllegalAccessException,
098: GroovyRuntimeException {
099: field.setAccessible(true);
100: field.set(object, goalValue);
101: return null;
102: }
103: });
104: } catch (PrivilegedActionException ex) {
105: throw new GroovyRuntimeException(
106: "Cannot set the property '" + name + "'.", ex
107: .getException());
108: }
109: }
110:
111: private String toName(Class c) {
112: String s = c.toString();
113: if (s.startsWith("class ") && s.length() > 6)
114: return s.substring(6);
115: else
116: return s;
117: }
118:
119: public int getModifiers() {
120: return field.getModifiers();
121: }
122:
123: public boolean isStatic() {
124: return Modifier.isStatic(field.getModifiers());
125: }
126: }
|