You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@labs.apache.org by si...@apache.org on 2009/04/23 01:56:05 UTC

svn commit: r767730 - in /labs/magma/trunk/foundation-beans/src: main/java/org/apache/magma/beans/ main/java/org/apache/magma/conversion/ test/java/org/apache/magma/beans/ test/java/org/apache/magma/conversion/

Author: simoneg
Date: Wed Apr 22 23:56:04 2009
New Revision: 767730

URL: http://svn.apache.org/viewvc?rev=767730&view=rev
Log:
LABS-351 : @Consider interface working

Modified:
    labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/BeanHandler.java
    labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/Consider.java
    labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/PropertyInfo.java
    labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java
    labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/BeanDataTest.java
    labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/TestBean.java
    labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConversionTestBean.java
    labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConvertersOnBeanTest.java

Modified: labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/BeanHandler.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/BeanHandler.java?rev=767730&r1=767729&r2=767730&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/BeanHandler.java (original)
+++ labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/BeanHandler.java Wed Apr 22 23:56:04 2009
@@ -110,6 +110,7 @@
 			Object val =  null;
 			try {
 				val = PropertyUtils.getProperty(bean, field);
+				val = property.fromUnderlying(val);
 			} catch (Exception e) {
 				throw new MagmaException(e, "Error while fecthing property {0} from {1}", field, bean.getClass().getName());
 			}
@@ -132,6 +133,7 @@
 				Object val = null;
 				try {
 					val = PropertyUtils.getProperty(bean, name);
+					val = property.fromUnderlying(val);
 				} catch (Exception e) {
 					throw new MagmaException(e, "Error while fecthing property {0} from {1}", name, bean.getClass().getName());
 				}
@@ -151,7 +153,9 @@
 			PropertyInfo property = data.getProperty(name);
 			if (property.isWriteable()) {
 				try {
-					PropertyUtils.setProperty(bean, name, values.get(name));
+					Object val = values.get(name);
+					val = property.toUnderlying(val);
+					PropertyUtils.setProperty(bean, name, val);
 					iterator.remove();
 				} catch (Exception e) {
 					throw new MagmaException(e, "Error while setting property {0} on {1}", name, bean.getClass().getName());
@@ -171,6 +175,7 @@
 			Object val = null;
 			try {
 				val = PropertyUtils.getProperty(bean, name);
+				val = property.fromUnderlying(val);
 			} catch (Exception e) {
 				throw new MagmaException(e, "Error while fecthing property {0} from {1}", name, bean.getClass().getName());
 			}

Modified: labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/Consider.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/Consider.java?rev=767730&r1=767729&r2=767730&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/Consider.java (original)
+++ labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/beans/Consider.java Wed Apr 22 23:56:04 2009
@@ -1,5 +1,12 @@
 package org.apache.magma.beans;
 
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
 public @interface Consider {
 
 	Class<?> value();

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=767730&r1=767729&r2=767730&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 Wed Apr 22 23:56:04 2009
@@ -25,8 +25,11 @@
 import java.util.List;
 import java.util.Set;
 
+import org.apache.magma.basics.MagmaException;
 import org.apache.magma.basics.utils.GenericClass;
 import org.apache.magma.basics.utils.GenericClass.MethodDef;
+import org.apache.magma.conversion.Converters;
+import org.apache.magma.conversion.GenericConverter;
 
 /**
  * Holds informations about a property of a bean.
@@ -50,6 +53,16 @@
 	private Class type;
 	
 	/**
+	 * When {@link Consider} is used, this is the underlying type
+	 */
+	private Class underlyingType;
+	
+	/**
+	 * When {@link Consider} is used, this is the underlying converter
+	 */
+	private GenericConverter underlyingConverter;
+	
+	/**
 	 * Class of the bean this property is found on
 	 */
 	private Class beanClass;
@@ -148,14 +161,16 @@
 		if (readMethod != null) consider = readMethod.getAnnotation(Consider.class);
 		if (consider == null && writeMethod != null) consider = writeMethod.getAnnotation(Consider.class);
 		if (consider != null) {
-			
+			this.underlyingType = descriptor.getPropertyType();			
 			this.type = consider.value();
+			this.underlyingConverter = Converters.getConverterFor(this.type, this.underlyingType);
+			if (this.underlyingConverter == null) throw new MagmaException("Cannot find generic converter to convert {0} to and from {1}", this.type, this.underlyingType);
 		} else {
 			this.type = descriptor.getPropertyType();
 		}
 		
-		this.readable = descriptor.getReadMethod() != null;
-		this.writeable = descriptor.getWriteMethod() != null;
+		this.readable = readMethod != null;
+		this.writeable = writeMethod != null;
 		if (this.type != null) {
 			this.isCollection = Collection.class.isAssignableFrom(this.type);
 			if (!this.isCollection) {
@@ -165,8 +180,8 @@
 					this.type.getName().startsWith("java.math") ||
 					Date.class.isAssignableFrom(this.type);
 				 
-			} else if (descriptor.getReadMethod() != null) {
-				GenericClass returnType = GenericClass.forReturnType(descriptor.getReadMethod());
+			} else if (readable) {
+				GenericClass returnType = GenericClass.forReturnType(readMethod);
 				// It must have an add method
 				List<MethodDef> methods = returnType.findMethods("add", new Class<?>[] {null});
 				// It must have a single parameter of the type of the collection
@@ -274,4 +289,26 @@
 	public String toUser(Object value) {
 		return toString(value);
 	}
+	
+	/**
+	 * Converts the given value to the underlying type when {@link Consider} is in place.
+	 * 
+	 * @param value The value, it must be of the type specified in the {@link Consider} annotation.
+	 * @return The value converted to the underlying real bean type if {@link Consider} is used, or the same unconverted value otherwise.
+	 */
+	public Object toUnderlying(Object value) {
+		if (underlyingType == null) return value;
+		return underlyingConverter.to(value);
+	}
+	
+	/**
+	 * Converts the given value from the underlying type to the type specified in {@link Consider}, when it is used.
+	 * 
+	 * @param value The value, it must be of the type defined in the bean, the real type.
+	 * @return The value converted to the type specified in the {@link Consider} anotation, if used, or the same unconverted value otherwise.
+	 */
+	public Object fromUnderlying(Object value) {
+		if (underlyingType == null) return value;
+		return underlyingConverter.from(value);
+	}
 }

Modified: labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java?rev=767730&r1=767729&r2=767730&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java (original)
+++ labs/magma/trunk/foundation-beans/src/main/java/org/apache/magma/conversion/Converters.java Wed Apr 22 23:56:04 2009
@@ -37,6 +37,19 @@
 		//	if (converter.converts(simpletype)) return converter.build(type);
 		//}
 		return null;
+	}
+
+	public static GenericConverter getConverterFor(Class type, Class underlyingType) {
+		Class simpletype = MethodUtils.toNonPrimitiveClass(type);
+		Iterator providers = Service.providers(GenericConverter.class);
+		while (providers.hasNext()) {
+			GenericConverter converter = (GenericConverter) providers.next();
+			if (converter.converts(simpletype,underlyingType)) return converter.build(type, underlyingType);
+		}
+		if (underlyingType.equals(String.class)) {
+			return getConverterFor(type);
+		}
+		return null;
 	}	
 	
 }

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=767730&r1=767729&r2=767730&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 Wed Apr 22 23:56:04 2009
@@ -18,6 +18,7 @@
 
 import static org.junit.Assert.*;
 
+import java.util.Date;
 import java.util.Set;
 
 import org.junit.Before;
@@ -45,7 +46,7 @@
 		
 		assertTrue(propertyNames.contains("privString"));
 		assertTrue(propertyNames.contains("class"));
-		assertEquals(5, propertyNames.size());
+		assertEquals(6, propertyNames.size());
 	}
 
 	@Test
@@ -70,4 +71,9 @@
 		assertEquals(String.class, property.getCollectionClass());
 	}
 
+	@Test
+	public void consider() throws Exception {
+		PropertyInfo property = bd.getProperty("maskedDate");
+		assertEquals(Date.class, property.getType());
+	}
 }

Modified: labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/TestBean.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/TestBean.java?rev=767730&r1=767729&r2=767730&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/TestBean.java (original)
+++ labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/beans/TestBean.java Wed Apr 22 23:56:04 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.magma.beans;
 
+import java.util.Date;
 import java.util.List;
 
 import org.junit.Ignore;
@@ -26,6 +27,7 @@
 
 	private String privString;
 	private List<String> aList;
+	private String maskedDate;
 	
 	public String getPrivString() {
 		return privString;
@@ -47,4 +49,12 @@
 		aList = list;
 	}
 	
+	@Consider(Date.class)
+	public String getMaskedDate() {
+		return maskedDate;
+	}
+	public void setMaskedDate(String maskedDate) {
+		this.maskedDate = maskedDate;
+	}
+	
 }

Modified: labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConversionTestBean.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConversionTestBean.java?rev=767730&r1=767729&r2=767730&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConversionTestBean.java (original)
+++ labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConversionTestBean.java Wed Apr 22 23:56:04 2009
@@ -16,8 +16,11 @@
  */
 package org.apache.magma.conversion;
 
+import java.util.Date;
+
 import org.junit.Ignore;
 
+import org.apache.magma.beans.Consider;
 import org.apache.magma.beans.MagmaBean;
 
 @Ignore("This is not a test class")
@@ -29,6 +32,8 @@
 	private String stringField = "test";
 	private String nullField = null;
 	
+	private String maskedDate = null;
+	
 	public enum TestEnum {
 		VALA,
 		VALB,
@@ -68,4 +73,12 @@
 		this.enumField = enumField;
 	}
 	
+	@Consider(Date.class)
+	public String getMaskedDate() {
+		return maskedDate;
+	}
+	public void setMaskedDate(String maskedDate) {
+		this.maskedDate = maskedDate;
+	}
+	
 }

Modified: labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConvertersOnBeanTest.java
URL: http://svn.apache.org/viewvc/labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConvertersOnBeanTest.java?rev=767730&r1=767729&r2=767730&view=diff
==============================================================================
--- labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConvertersOnBeanTest.java (original)
+++ labs/magma/trunk/foundation-beans/src/test/java/org/apache/magma/conversion/ConvertersOnBeanTest.java Wed Apr 22 23:56:04 2009
@@ -16,11 +16,13 @@
  */
 package org.apache.magma.conversion;
 
+import static org.junit.Assert.*;
 import static org.junit.Assert.assertEquals;
 import org.apache.magma.beans.BeanData;
 import org.apache.magma.beans.BeanHandler;
 import org.apache.magma.beans.PropertyInfo;
 import org.apache.magma.conversion.ConversionTestBean.TestEnum;
+import org.apache.magma.conversion.string.DateConverter;
 import org.apache.magma.conversion.string.IntegerConverter;
 
 import org.junit.Before;
@@ -48,6 +50,12 @@
 	}
 	
 	@Test
+	public void consider() throws Exception {
+		PropertyInfo property = beanData.getProperty("maskedDate");
+		assertEquals(DateConverter.class.getName(), property.getConverter().getClass().getName());
+	}
+	
+	@Test
 	public void handlingConversion() throws Exception {
 		BeanHandler handler = bean.handler();
 		assertEquals("0", handler.getStringValue("intField"));



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@labs.apache.org
For additional commands, e-mail: commits-help@labs.apache.org