Author: hthomann
Date: Thu Apr 18 17:33:41 2013
New Revision: 1469488

URL: http://svn.apache.org/r1469488
Log:
OPENJPA-2070: Error processing while populating Metamodel classes needs 
improvement.  Back-ported to 2.1.x Kevin Sutter's trunk changes.

Modified:
    
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
    
openjpa/branches/2.1.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties

Modified: 
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java?rev=1469488&r1=1469487&r2=1469488&view=diff
==============================================================================
--- 
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
 (original)
+++ 
openjpa/branches/2.1.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
 Thu Apr 18 17:33:41 2013
@@ -21,8 +21,7 @@ package org.apache.openjpa.persistence.m
 import static javax.persistence.metamodel.Type.PersistenceType.BASIC;
 import static javax.persistence.metamodel.Type.PersistenceType.EMBEDDABLE;
 import static javax.persistence.metamodel.Type.PersistenceType.ENTITY;
-import static 
- javax.persistence.metamodel.Type.PersistenceType.MAPPED_SUPERCLASS;
+import static 
javax.persistence.metamodel.Type.PersistenceType.MAPPED_SUPERCLASS;
 
 import java.lang.reflect.Field;
 import java.lang.reflect.GenericArrayType;
@@ -41,7 +40,6 @@ import javax.persistence.metamodel.Manag
 import javax.persistence.metamodel.MappedSuperclassType;
 import javax.persistence.metamodel.Attribute;
 import javax.persistence.metamodel.Metamodel;
-import javax.persistence.metamodel.PluralAttribute;
 import javax.persistence.metamodel.Type;
 import javax.persistence.metamodel.StaticMetamodel;
 import javax.persistence.metamodel.PluralAttribute.CollectionType;
@@ -290,52 +288,47 @@ public class MetamodelImpl implements Me
      * Populate the static fields of the canonical type.
      */
     public <X> void populate(AbstractManagedType<X> type) {
-               Class<X> cls = type.getJavaType();
-               Class<?> mcls = repos.getMetaModel(cls, true);
-               if (mcls == null)
-                   return;
+        Class<X> cls = type.getJavaType();
+        Class<?> mcls = repos.getMetaModel(cls, true);
+        if (mcls == null){
+            return;
+        }
         StaticMetamodel anno = mcls.getAnnotation(StaticMetamodel.class);
-               if (anno == null)
+        if (anno == null)
             throw new IllegalArgumentException(_loc.get("meta-class-no-anno", 
-               mcls.getName(), cls.getName(), 
StaticMetamodel.class.getName()).getMessage());
-               
+                    mcls.getName(), cls.getName(), 
StaticMetamodel.class.getName()).getMessage());
+
         if (cls != anno.value()) {
             throw new IllegalStateException(_loc.get("meta-class-mismatch",
-            mcls.getName(), cls.getName(), anno.value()).getMessage());
+                    mcls.getName(), cls.getName(), anno.value()).getMessage());
         }
         
+        ParameterizedType mfType = null;
+        Attribute<? super X, ?> f = null;
         Field[] mfields = 
AccessController.doPrivileged(J2DoPrivHelper.getDeclaredFieldsAction(mcls));
        for (Field mf : mfields) {
             try {
-                ParameterizedType mfType = getParameterziedType(mf);
-               Attribute<? super X, ?> f = type.getAttribute(mf.getName());
-               Class<?> fClass = f.getJavaType();
-              java.lang.reflect.Type[] args = mfType.getActualTypeArguments();
-              if (args.length < 2)
-                  throw new IllegalStateException(
-                      _loc.get("meta-field-no-para", mf).getMessage());
-              java.lang.reflect.Type ftype = args[1];
-              if (fClass.isPrimitive() 
-               || Collection.class.isAssignableFrom(fClass) 
-               || Map.class.isAssignableFrom(fClass)) {
-               ;
-           } else if (ftype != args[1]) {
-               throw new RuntimeException(_loc.get("meta-field-mismatch", 
-                   new Object[]{mf.getName(), mcls.getName(), 
-                       toTypeName(mfType), toTypeName(ftype)}).getMessage());
-           }
-            mf.set(null, f);
-       } catch (Exception e) {
-           e.printStackTrace();
-               throw new RuntimeException(mf.toString());
-       }
+                mfType = getParameterizedType(mf); // metamodel type
+                if (mfType == null) {
+                    continue;
+                }
+
+                f = type.getAttribute(mf.getName()); // persistent type
+
+                // populate the static field with persistent type information
+                mf.set(null, f);
+            } catch (Exception e) {
+                throw new RuntimeException(_loc.get("meta-field-mismatch",
+                        new Object[] { mf.getName(), mcls.getName(), 
toTypeName(mfType), f.getJavaType().toString() })
+                        .getMessage(), e);
+            }
         }
     }
     
     /**
      * Gets the parameterized type of the given field after validating. 
      */
-    ParameterizedType getParameterziedType(Field mf) {
+    ParameterizedType getParameterizedType(Field mf) {
         java.lang.reflect.Type t = mf.getGenericType();
         if (t instanceof ParameterizedType == false) {
             throw new IllegalStateException(_loc.get("meta-field-not-param", 
@@ -347,7 +340,7 @@ public class MetamodelImpl implements Me
             throw new IllegalStateException(_loc.get("meta-field-less-param", 
             mf.getDeclaringClass(), mf.getName(), toTypeName(t)).getMessage());
         }
-        
+
         return mfType;
     }
     
@@ -387,7 +380,6 @@ public class MetamodelImpl implements Me
     }
     
     <X,Y> void validate(Field mField, Member<X, Y> member) {
-        Class<?> fType = member.getJavaType();
         if (!ParameterizedType.class.isInstance(mField.getGenericType())) {
             throw new IllegalArgumentException(_loc.get("meta-bad-field", 
                 mField).getMessage());
@@ -398,9 +390,6 @@ public class MetamodelImpl implements Me
         if (member.getDeclaringType().getJavaType() != owner)
             throw new 
IllegalArgumentException(_loc.get("meta-bad-field-owner", 
                     mField, owner).getMessage());
-        java.lang.reflect.Type elementType = args[1];
-        if (fType.isPrimitive())
-            return;
     }
 
     public Class classForName(String name, String[] imports) {

Modified: 
openjpa/branches/2.1.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.1.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties?rev=1469488&r1=1469487&r2=1469488&view=diff
==============================================================================
--- 
openjpa/branches/2.1.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties
 (original)
+++ 
openjpa/branches/2.1.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties
 Thu Apr 18 17:33:41 2013
@@ -82,3 +82,9 @@ decl-version-not-found: Declared version
 version-not-found: Version attribute of {1} type not found in {2}
 generic-type-param: Can not determine generic type parameter for field {0} of 
type {1} in {2}. \
        Using java.lang.Object.
+meta-class-mismatch: Value provided for the StaticMetamodel annotation "{2}" \
+       in Meta class "{0}" does not match the expected Entity class "{1}".
+meta-field-less-param: Encountered field "{2} {1}" in "{0}". This field has \
+       less than two parameters and is not recognized as a canonical field.
+        
+        


Reply via email to