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.doPrivileged(new PrivilegedExceptionAction() { 068 public Object run() throws IllegalAccessException { 069 field.setAccessible(true); 070 return field.get(object); 071 } 072 }); 073 return value; 074 } catch (PrivilegedActionException pe) { 075 throw new GroovyRuntimeException("Cannot get the property '" + name + "'.", pe.getException()); 076 } 077 } 078 079 /** 080 * Sets the property on the given object to the new value 081 * 082 * @param object on which to set the property 083 * @param newValue the new value of the property 084 * @throws RuntimeException if the property could not be set 085 */ 086 public void setProperty(final Object object, Object newValue) { 087 final Object goalValue = DefaultTypeTransformation.castToType(newValue, field.getType()); 088 try { 089 AccessController.doPrivileged(new PrivilegedExceptionAction() { 090 public Object run() throws IllegalAccessException, GroovyRuntimeException { 091 field.setAccessible(true); 092 field.set(object, goalValue); 093 return null; 094 } 095 }); 096 } catch (PrivilegedActionException ex) { 097 throw new GroovyRuntimeException("Cannot set the property '" + name + "'.", ex.getException()); 098 } 099 } 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 }