Hi Matt,

as I remember, I tried to implement this quite a long time ago in agimatec-validation (the former name of the project), but because it caused more complications, than initially expected, i did a rollback afterwards. Your changes look good and I think, we could also solve the freemarker problem. +1 from my side to commit this. I think, the base metadata framework (=> MetaBean, MetaProperty) should support generic type, if the performance and memory overhead does not increase significally as a reasult of it.

Thanks for the work!

regards,
Roman

Am 03.09.10 01:13, schrieb Matt Benson:
Guys,
   I wanted to draw everyone's attention to this change:  A MetaBean only knows 
its raw type, but I can't see any reason a MetaProperty shouldn't know its 
generic type, and the class is defined such that it has a Type, rather than 
just a Class.  All things considered, I think this change is fine:  The json 
freemarker template was the only thing that broke as a result of this.  Since 
I'm the new guy to the project, I wanted to make sure there is every 
opportunity to do the R part of CTR.  My next change, which includes a bugfix, 
depends on this one.

Thanks,
Matt

On Sep 2, 2010, at 6:03 PM, [email protected] wrote:

Author: mbenson
Date: Thu Sep  2 23:03:55 2010
New Revision: 992148

URL: http://svn.apache.org/viewvc?rev=992148&view=rev
Log:
MetaProperty.type is a type; typeClass still returns a class

Modified:
    incubator/bval/sandbox/lang3-work/   (props changed)
    incubator/bval/sandbox/lang3-work/bval-core/pom.xml
    
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/IntrospectorMetaBeanFactory.java
    
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java
    
incubator/bval/sandbox/lang3-work/bval-json/src/main/resources/org/apache/bval/json/bean-infos-json.ftl
    incubator/bval/sandbox/lang3-work/bval-jsr303/pom.xml
    
incubator/bval/sandbox/lang3-work/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java
    incubator/bval/sandbox/lang3-work/pom.xml

Propchange: incubator/bval/sandbox/lang3-work/
------------------------------------------------------------------------------
    svn:mergeinfo = /incubator/bval/trunk:992143

Modified: incubator/bval/sandbox/lang3-work/bval-core/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-core/pom.xml?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- incubator/bval/sandbox/lang3-work/bval-core/pom.xml (original)
+++ incubator/bval/sandbox/lang3-work/bval-core/pom.xml Thu Sep  2 23:03:55 2010
@@ -42,6 +42,10 @@
             <artifactId>commons-lang</artifactId>
         </dependency>
         <dependency>
+<groupId>org.apache.commons</groupId>
+<artifactId>commons-lang3</artifactId>
+</dependency>
+<dependency>
             <groupId>commons-logging</groupId>
             <artifactId>commons-logging</artifactId>
         </dependency>

Modified: 
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/IntrospectorMetaBeanFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/IntrospectorMetaBeanFactory.java?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- 
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/IntrospectorMetaBeanFactory.java
 (original)
+++ 
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/IntrospectorMetaBeanFactory.java
 Thu Sep  2 23:03:55 2010
@@ -22,6 +22,8 @@ import org.apache.bval.model.MetaPropert
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
import java.util.Enumeration;

import static org.apache.bval.model.Features.Property.*;
@@ -61,7 +63,7 @@ public final class IntrospectorMetaBeanF
     protected MetaProperty buildMetaProperty(PropertyDescriptor pd) {
         MetaProperty meta = new MetaProperty();
         meta.setName(pd.getName());
-        meta.setType(pd.getPropertyType());
+        meta.setType(determineGenericPropertyType(pd));
         if (pd.isHidden()) meta.putFeature(HIDDEN, Boolean.TRUE);
         if (pd.isPreferred()) meta.putFeature(PREFERRED, Boolean.TRUE);
         if (pd.isConstrained()) meta.putFeature(READONLY, Boolean.TRUE);
@@ -74,4 +76,16 @@ public final class IntrospectorMetaBeanF
         }
         return meta;
     }
+
+    private Type determineGenericPropertyType(PropertyDescriptor pd) {
+        Method m = pd.getReadMethod();
+        if (m != null) {
+            return m.getGenericReturnType();
+        }
+        m = pd.getWriteMethod();
+        if (m != null&&  m.getParameterTypes().length == 1) {
+            return m.getGenericParameterTypes()[0];
+        }
+        return pd.getPropertyType();
+    }
}

Modified: 
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- 
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java
 (original)
+++ 
incubator/bval/sandbox/lang3-work/bval-core/src/main/java/org/apache/bval/model/MetaProperty.java
 Thu Sep  2 23:03:55 2010
@@ -16,9 +16,10 @@
  */
package org.apache.bval.model;

-import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

+import org.apache.commons.lang3.reflect.TypeUtils;
+
/**
  * Description: the meta description of a property of a bean. It supports a map
  * of features and multiple validations.<br/>
@@ -104,20 +105,14 @@ public class MetaProperty extends Featur
      * @return Class,<code>null</code>  if cannot be determined
      */
     public Class<?>  getTypeClass() {
-        return getTypeClass(type);
-    }
-
-    //TODO can this handle variables?  Perhaps move TypeUtils up from 
bval-jsr303
-    private static Class<?>  getTypeClass(Type rawType) {
-        if (rawType instanceof Class<?>) {
-            return (Class<?>) rawType;
-        } else if (rawType instanceof ParameterizedType) {
-            return getTypeClass(((ParameterizedType) rawType).getRawType()); 
// recursion!
-        } else if(rawType instanceof DynaType) {
-            return getTypeClass(((DynaType)rawType).getRawType()); // recursion
-        } else {
-            return null; // class cannot be determined!
+        Type targetType = type instanceof DynaType ? ((DynaType) type)
+                .getRawType() : type;
+        if (targetType == null) {
+            return null;
         }
+        Type assigningType = getParentMetaBean() == null ? null
+                : getParentMetaBean().getBeanClass();
+        return TypeUtils.getRawType(targetType, assigningType);
     }

     /**
@@ -177,4 +172,5 @@ public class MetaProperty extends Featur
     public String toString() {
         return "MetaProperty{" + "name='" + name + '\'' + ", type=" + type + 
'}';
     }
+
}

Modified: 
incubator/bval/sandbox/lang3-work/bval-json/src/main/resources/org/apache/bval/json/bean-infos-json.ftl
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-json/src/main/resources/org/apache/bval/json/bean-infos-json.ftl?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- 
incubator/bval/sandbox/lang3-work/bval-json/src/main/resources/org/apache/bval/json/bean-infos-json.ftl
 (original)
+++ 
incubator/bval/sandbox/lang3-work/bval-json/src/main/resources/org/apache/bval/json/bean-infos-json.ftl
 Thu Sep  2 23:03:55 2010
@@ -48,9 +48,10 @@ var metaBean${var} = {
    <#list metaBean.properties as property>
      "${property.name}":{
        "name" : "${property.name}",
-<#if property.type??>"type" : "${property.type.name}",</#if>
+<#if property.type??>"type" : "${property.type}",</#if>
+<#if property.typeClass??>"typeClass" : "${property.typeClass.name}",</#if>
        "features" : {<#if property.type??&&
-       property.type.enum>"enum" : {<#list property.type.enumConstants as enum>"${enum.name()}": "${enum.name()}"<#if 
enum_has_next>,</#if></#list>}<#if property.features?size&gt; 0>,</#if></#if><#list
+       property.type.enum!false>"enum" : {<#list property.type.enumConstants as enum>"${enum.name()}": 
"${enum.name()}"<#if enum_has_next>,</#if></#list>}<#if property.features?size&gt; 0>,</#if></#if><#list
        property.features?keys as featureKey>
        <#assign value = property.features[featureKey]>
        "${featureKey}" :<#rt/><#if

Modified: incubator/bval/sandbox/lang3-work/bval-jsr303/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-jsr303/pom.xml?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- incubator/bval/sandbox/lang3-work/bval-jsr303/pom.xml (original)
+++ incubator/bval/sandbox/lang3-work/bval-jsr303/pom.xml Thu Sep  2 23:03:55 
2010
@@ -108,6 +108,10 @@
             <artifactId>commons-logging</artifactId>
         </dependency>
         <dependency>
+<groupId>org.apache.commons</groupId>
+<artifactId>commons-lang3</artifactId>
+</dependency>
+<dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>

Modified: 
incubator/bval/sandbox/lang3-work/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- 
incubator/bval/sandbox/lang3-work/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java
 (original)
+++ 
incubator/bval/sandbox/lang3-work/bval-jsr303/src/main/java/org/apache/bval/jsr303/Jsr303MetaBeanFactory.java
 Thu Sep  2 23:03:55 2010
@@ -129,7 +129,7 @@ public class Jsr303MetaBeanFactory imple
             if (!factoryContext.getFactory().getAnnotationIgnores()
                   .isIgnoreAnnotations(field)) {
                 if (metaProperty == null) {
-                    metaProperty = addMetaProperty(metabean, field.getName(), 
field.getType());
+                    metaProperty = addMetaProperty(metabean, field.getName(), 
field.getGenericType());
                     processAnnotations(metaProperty, beanClass, field,
                           new FieldAccess(field),
                           new AppendValidationToMeta(metaProperty));//) {
@@ -154,7 +154,7 @@ public class Jsr303MetaBeanFactory imple
                     // create a property for those methods for which there is 
not yet a MetaProperty
                     if (metaProperty == null) {
                         metaProperty =
-                              addMetaProperty(metabean, propName, 
method.getReturnType());
+                              addMetaProperty(metabean, propName, 
method.getGenericReturnType());
                         processAnnotations(metaProperty, beanClass, method,
                               new MethodAccess(propName, method),
                               new AppendValidationToMeta(metaProperty));//) {

Modified: incubator/bval/sandbox/lang3-work/pom.xml
URL: 
http://svn.apache.org/viewvc/incubator/bval/sandbox/lang3-work/pom.xml?rev=992148&r1=992147&r2=992148&view=diff
==============================================================================
--- incubator/bval/sandbox/lang3-work/pom.xml (original)
+++ incubator/bval/sandbox/lang3-work/pom.xml Thu Sep  2 23:03:55 2010
@@ -308,6 +308,11 @@
                 <version>2.4</version>
             </dependency>
             <dependency>
+<groupId>org.apache.commons</groupId>
+<artifactId>commons-lang3</artifactId>
+<version>3.0-SNAPSHOT</version>
+</dependency>
+<dependency>
                 <groupId>commons-logging</groupId>
                 <artifactId>commons-logging</artifactId>
                 <version>1.1.1</version>



Reply via email to