Author: simoneg
Date: Tue Jun  7 16:35:51 2011
New Revision: 1133087

URL: http://svn.apache.org/viewvc?rev=1133087&view=rev
Log:
Access to underlying property, not modified by magma specific interpretations 
like MagreadOnly or Consider

Modified:
    
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/PropertyInfo.java
    
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/BeanDataTest.java

Modified: 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/PropertyInfo.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/PropertyInfo.java?rev=1133087&r1=1133086&r2=1133087&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/PropertyInfo.java
 (original)
+++ 
labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/PropertyInfo.java
 Tue Jun  7 16:35:51 2011
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.magma.basics.MagmaException;
 import org.apache.magma.basics.utils.GenericClass;
 import org.apache.magma.basics.utils.GenericClass.MethodDef;
@@ -78,9 +79,14 @@ public class PropertyInfo implements Clo
        private boolean readable;
        
        /**
-        * Whether the property is writable 
+        * Whether the property is to be considered writable 
         */
        private boolean writeable;
+
+       /**
+        * Whether the property is really writable or not 
+        */
+       private boolean underlyingWriteable;
        
        /**
         * Whether the property represents a collection (this includes {@link 
List}, {@link Set} and arrays, but not maps or tables).
@@ -118,6 +124,26 @@ public class PropertyInfo implements Clo
         * If the type is a basic type, that is a primitive type, a wrapper, 
one of java.math numbers, or Date.
         */
        private boolean isBasicType;
+
+       /**
+        * If the type is an enum.
+        */
+       private boolean isEnum;
+       
+       /**
+        * Another PropertyInfo representing the underlying property, without 
conversion or hiding. Could be the same instance
+        * if there is no conversion nor hiding to handle.
+        */
+       private PropertyInfo underlyingProperty = null;
+       
+       /**
+        * true is this instance is already an underlying representation.
+        */
+       private boolean isUnderlying = false;
+
+       
+       private Method readMethod;
+       private Method writeMethod;
        
        /**
         * @return true if this property is readable from the bean, false 
otherwise
@@ -133,18 +159,18 @@ public class PropertyInfo implements Clo
        }
 
        /**
-        * @return true if this property is writable to the bean, false 
otherwise
+        * @return true if this property is to be considered writable to the 
bean, false otherwise
         */     
        public boolean isWriteable() {
                return writeable;
        }
        /**
-        * @param writeable true if this property is writable to the bean, 
false otherwise
+        * @param writeable true if this property is to be considered writable 
to the bean, false otherwise
         */     
        public void setWriteable(boolean writeable) {
                this.writeable = writeable;
        }
-       
+
        /**
         * @return the name of the property.
         */             
@@ -166,6 +192,13 @@ public class PropertyInfo implements Clo
        public boolean isBasicType() {
                return this.isBasicType;
        }
+
+       /**
+        * @return true if the type is an {@link Enum}.
+        */
+       public boolean isEnum() {
+               return this.isEnum;
+       }
        
        /**
         * Initializes this class, parsing the {@link PropertyDescriptor} and 
eventually annotations found on the getter or setter methods.
@@ -179,14 +212,8 @@ public class PropertyInfo implements Clo
        public void init(PropertyDescriptor descriptor, Class beanClass) {
                this.beanClass = beanClass;
                this.name = descriptor.getName();
-               Method readMethod = descriptor.getReadMethod();
-               Method writeMethod = descriptor.getWriteMethod();
-               
-               if ((readMethod != null && 
readMethod.isAnnotationPresent(MagReadOnly.class)) || 
-                               (writeMethod != null && 
writeMethod.isAnnotationPresent(MagReadOnly.class)) ||
-                               
beanClass.isAnnotationPresent(MagReadOnly.class)) {
-                       writeMethod = null;
-               }
+               readMethod = descriptor.getReadMethod();
+               writeMethod = descriptor.getWriteMethod();
                
                Consider consider = null;
                if (readMethod != null) consider = 
readMethod.getAnnotation(Consider.class);
@@ -224,6 +251,16 @@ public class PropertyInfo implements Clo
                
                this.readable = readMethod != null;
                this.writeable = writeMethod != null;
+               this.underlyingWriteable = this.writeable;
+               if ((readMethod != null && 
readMethod.isAnnotationPresent(MagReadOnly.class)) || 
+                               (writeMethod != null && 
writeMethod.isAnnotationPresent(MagReadOnly.class)) ||
+                               
beanClass.isAnnotationPresent(MagReadOnly.class)) {
+                       this.writeable = false;
+               }
+               initType();
+       }
+       
+       private void initType() {
                if (this.type != null) {
                        this.isCollection = 
Collection.class.isAssignableFrom(this.type);
                        this.isMap = Map.class.isAssignableFrom(this.type);
@@ -256,8 +293,19 @@ public class PropertyInfo implements Clo
                                        
this.type.getName().startsWith("java.lang") ||
                                        
this.type.getName().startsWith("java.math") ||
                                        Date.class.isAssignableFrom(this.type);
+                               this.isEnum = 
Enum.class.isAssignableFrom(this.type);
                        } 
-               }
+               }               
+       }
+       
+       protected void initAsUnderlying(PropertyInfo sup) {
+               this.isUnderlying = true;
+               this.name = sup.name;
+               this.beanClass = sup.beanClass;
+               this.readable = sup.readable;
+               this.type = sup.underlyingType;
+               this.writeable = sup.underlyingWriteable;
+               this.initType();
        }
        
        /**
@@ -362,11 +410,7 @@ public class PropertyInfo implements Clo
         * @return the string human friendly representation of value.
         */     
        public String toUser(Object value) {
-               if (underlyingType != null && value != null) {
-                       if (underlyingType.isInstance(value)) {
-                               value = fromUnderlying(value);
-                       }
-               }
+               value = fromUnderlying(value);
                String ret = toString(value);
                if (ret == null) return "";
                ret = ret.trim();
@@ -382,6 +426,7 @@ public class PropertyInfo implements Clo
        @SuppressWarnings("unchecked")
        public Object toUnderlying(Object value) {
                if (underlyingType == null) return value;
+               if (underlyingType.isInstance(value)) return value;             
                return underlyingConverter.to(value);
        }
        
@@ -394,6 +439,7 @@ public class PropertyInfo implements Clo
        @SuppressWarnings("unchecked")
        public Object fromUnderlying(Object value) {
                if (underlyingType == null) return value;
+               if (type.isInstance(value)) return value;               
                return underlyingConverter.from(value);
        }
        
@@ -418,4 +464,54 @@ public class PropertyInfo implements Clo
                return mapValueClass;
        }
        
+       /**
+        * Set the given value for this property on the given bean. Value will 
be converted to underlying if applicable.
+        * @param bean The bean to set the property to
+        * @param val The value to set, it will be converted to the underlying 
type.
+        */
+       public void set(Object bean, Object val) {
+               try {
+                       val = toUnderlying(val);
+                       PropertyUtils.setProperty(bean, name, val);
+               } catch (Exception e) {
+                       throw new MagmaException("Error setting value {0} on 
property {1}.{2}", val, this.beanClass, this.name);
+               }
+       }
+       
+       /**
+        * Get the value of this property on the given bean. The returned value 
will be converted from underlying type if applicable.
+        * @param bean The bean to get the property from.
+        * @return The value, eventually converted from the unserlying type.
+        */
+       public Object get(Object bean) {
+               try {
+                       Object val = PropertyUtils.getProperty(bean, name);
+                       val = fromUnderlying(val);
+                       return val;
+               } catch (Exception e) {
+                       throw new MagmaException("Error getting property 
{0}.{1}", this.beanClass, this.name);
+               }
+       }
+       
+       /**
+        * Gives access to the underlying property. The underlying property is 
the raw property, without
+        * underlying type conversion given by {@link Consider} nor hiding by 
{@link MagReadOnly} or other
+        * view specific contrains.  
+        * @return A {@link PropertyInfo} giving access to the raw underlying 
property, which could be this same
+        *              instance if it has no special view annotations on it.
+        */
+       public PropertyInfo getUnderlying() {
+               if (this.isUnderlying) return this;
+               if (this.underlyingProperty == null) {
+                       if (this.underlyingType == null && 
this.underlyingWriteable == this.writeable) {
+                               this.underlyingProperty = this;
+                       } else {
+                               PropertyInfo np = new PropertyInfo();
+                               np.initAsUnderlying(this);
+                               this.underlyingProperty = np;
+                       }
+               }
+               return this.underlyingProperty;
+       }
+       
 }

Modified: 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/BeanDataTest.java
URL: 
http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/BeanDataTest.java?rev=1133087&r1=1133086&r2=1133087&view=diff
==============================================================================
--- 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/BeanDataTest.java
 (original)
+++ 
labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/BeanDataTest.java
 Tue Jun  7 16:35:51 2011
@@ -17,6 +17,7 @@
 package org.apache.magma.beans;
 
 import static org.junit.Assert.*;
+import static org.hamcrest.CoreMatchers.*;
 
 import java.util.Date;
 import java.util.Set;
@@ -86,6 +87,12 @@ public class BeanDataTest {
        public void consider() throws Exception {
                PropertyInfo property = bd.getProperty("maskedDate");
                assertEquals(Date.class, property.getType());
+               
+               PropertyInfo und = property.getUnderlying();
+               assertThat(und, notNullValue());
+               assertThat(und, not(sameInstance(property)));
+               assertThat(und.getType(), equalTo(String.class));
+               
        }
        
        @Test
@@ -93,6 +100,11 @@ public class BeanDataTest {
                PropertyInfo property = bd.getProperty("roProp");
                assertTrue(property.isReadable());
                assertFalse(property.isWriteable());
+               
+               PropertyInfo und = property.getUnderlying();
+               assertThat(und, notNullValue());
+               assertThat(und, not(sameInstance(property)));
+               assertThat(und.isWriteable(), equalTo(true));
        }
        
        @Test



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to