You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/11/17 22:16:24 UTC

svn commit: r881529 - in /openjpa/trunk/openjpa-persistence/src/main: java/org/apache/openjpa/persistence/meta/ resources/org/apache/openjpa/persistence/meta/

Author: ppoddar
Date: Tue Nov 17 21:16:23 2009
New Revision: 881529

URL: http://svn.apache.org/viewvc?rev=881529&view=rev
Log:
OPENJPA-1391: Handle untyped collection

Modified:
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java
    openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java?rev=881529&r1=881528&r2=881529&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AbstractManagedType.java Tue Nov 17 21:16:23 2009
@@ -58,7 +58,7 @@
 public abstract class AbstractManagedType<X> extends Types.BaseType<X> 
     implements ManagedType<X> {
     
-    private static final Localizer _loc = Localizer.forPackage(Types.class);
+    private static final Localizer _loc = Localizer.forPackage(AbstractManagedType.class);
     public final MetamodelImpl model;
     public final ClassMetaData meta;
 
@@ -248,7 +248,7 @@
                 new AttributeTypeFilter<X, Y>(type), 
                 singularAttributeFilter);
         if (result == null)
-            notFoundException("attr-not-found-single",name, type);
+            notFoundException("attr-not-found-single", name, type);
          
         return (SingularAttribute<? super X, Y>) result;
     }
@@ -317,7 +317,7 @@
                 new ElementTypeFilter<X, E>(elementType),
                 new AttributeNameFilter<X>(name));
         if (result == null)
-            notFoundException("attr-not-found-coll",name, elementType);
+            notFoundException("attr-not-found-coll", name, elementType);
 
         return (CollectionAttribute<? super X, E>) result;
     }
@@ -729,12 +729,14 @@
     // Exception handling
     // -------------------------------------------------------------------------
     private void notFoundException(String msg, String name, Class<?> t1) {
-        throw new IllegalArgumentException(msg + " Attribute " + name + " of type " + 
-                (t1 == null ? "any" : t1.getName()) + " not found in " + meta);
+        throw new IllegalArgumentException(
+            _loc.get(msg, name, (t1 == null ? "any" : t1.getName()), meta).getMessage());
     }
     
     private void notFoundException(String msg, String name, Class<?> t1, Class<?> t2) {
-        throw new IllegalArgumentException("Attribute " + name + " not found");
+        throw new IllegalArgumentException(
+            _loc.get(msg, new Object[]{name, (t1 == null ? "any" : t1.getName()), 
+                    (t2 == null ? "any" : t1.getName()), meta}).getMessage());
     }
     // --------------------------------------------------------------------------
     // Attribute filtering

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java?rev=881529&r1=881528&r2=881529&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/AnnotationProcessor6.java Tue Nov 17 21:16:23 2009
@@ -244,12 +244,10 @@
             Set<? extends Element> members = handler.getPersistentMembers(e);
             
             for (Element m : members) {
-                TypeMirror decl = handler.getDeclaredType(m);
-                decl.getKind();
+                TypeMirror decl  = handler.getDeclaredType(m);
                 String fieldName = handler.getPersistentMemberName(m);
                 String fieldType = handler.getDeclaredTypeName(decl);
-                TypeCategory typeCategory = toMetaModelTypeCategory(decl, 
-                        fieldType);
+                TypeCategory typeCategory = toMetaModelTypeCategory(decl, fieldType);
                 String metaModelType = typeCategory.getMetaModelType();
                 SourceCode.Field modelField = null;
                 switch (typeCategory) {
@@ -261,15 +259,15 @@
                 case COLLECTION:
                 case LIST:
                 case SET:
-                    TypeMirror param = handler.getTypeParameter(decl, 0);
+                    TypeMirror param   = handler.getTypeParameter(m, decl, 0, true);
                     String elementType = handler.getDeclaredTypeName(param);
                     modelField = modelClass.addField(fieldName, metaModelType);
                     modelField.addParameter(originalSimpleClass)
                               .addParameter(elementType);
                     break;
                 case MAP:
-                    TypeMirror key = handler.getTypeParameter(decl, 0);
-                    TypeMirror value = handler.getTypeParameter(decl, 1);
+                    TypeMirror key   = handler.getTypeParameter(m, decl, 0, false);
+                    TypeMirror value = handler.getTypeParameter(m, decl, 1, true);
                     String keyType = handler.getDeclaredTypeName(key);
                     String valueType = handler.getDeclaredTypeName(value);
                     modelField = modelClass.addField(fieldName, metaModelType);

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java?rev=881529&r1=881528&r2=881529&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/SourceAnnotationHandler.java Tue Nov 17 21:16:23 2009
@@ -47,7 +47,11 @@
 
 import javax.persistence.Embeddable;
 import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
 import javax.persistence.MappedSuperclass;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
 import javax.persistence.Transient;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.meta.AccessCode;
@@ -65,6 +69,7 @@
     implements MetadataProcessor<TypeElement, Element> {
 	
 	private final ProcessingEnvironment processingEnv;
+	private final Types typeUtility;
 	private final CompileTimeLogger logger;
 	/**
      * Set of Inclusion Filters based on member type, access type or transient
@@ -81,8 +86,14 @@
     protected GetterFilter getterFilter = new GetterFilter();
     protected SetterFilter setterFilter = new SetterFilter();
     
-    private static Localizer _loc = Localizer.forPackage(
-    		SourceAnnotationHandler.class);
+    protected static List<Class<? extends Annotation>> mappingAnnos = new ArrayList<Class<? extends Annotation>>();
+    static {
+        mappingAnnos.add(OneToOne.class);
+        mappingAnnos.add(OneToMany.class);
+        mappingAnnos.add(ManyToOne.class);
+        mappingAnnos.add(ManyToMany.class);
+    }
+    private static Localizer _loc = Localizer.forPackage(SourceAnnotationHandler.class);
     
 	/**
 	 * Construct with JDK6 annotation processing environment.
@@ -92,6 +103,7 @@
         CompileTimeLogger logger) {
 		super();
 		this.processingEnv = processingEnv;
+		this.typeUtility   = processingEnv.getTypeUtils();
 		this.logger = logger;
 	}
 
@@ -187,15 +199,12 @@
     
     private int getImplicitAccessType(TypeElement type) {
         List<? extends Element> allMembers = type.getEnclosedElements();
-        Set<VariableElement> allFields = (Set<VariableElement>) 
-           filter(allMembers, fieldFilter, nonTransientFilter);
-        Set<ExecutableElement> allMethods = (Set<ExecutableElement>) 
-          filter(allMembers, methodFilter, nonTransientFilter);
+        Set<VariableElement> allFields = (Set<VariableElement>) filter(allMembers, fieldFilter, nonTransientFilter);
+        Set<ExecutableElement> allMethods = (Set<ExecutableElement>) filter(allMembers, methodFilter, 
+                nonTransientFilter);
 
-        Set<VariableElement> annotatedFields = filter(allFields, 
-            annotatedFilter);
-        Set<ExecutableElement> getters = filter(allMethods, getterFilter, 
-            annotatedFilter);
+        Set<VariableElement> annotatedFields = filter(allFields, annotatedFilter);
+        Set<ExecutableElement> getters = filter(allMethods, getterFilter, annotatedFilter);
         Set<ExecutableElement> setters = filter(allMethods, setterFilter);
         getters = matchGetterAndSetter(getters, setters);
         
@@ -242,9 +251,7 @@
      */
     private Set<ExecutableElement> matchGetterAndSetter(
         Set<ExecutableElement> getters,  Set<ExecutableElement> setters) {
-        Collection<ExecutableElement> unmatched =
-            new ArrayList<ExecutableElement>();
-        Types typeUtils = processingEnv.getTypeUtils();
+        Collection<ExecutableElement> unmatched =  new ArrayList<ExecutableElement>();
         
         for (ExecutableElement getter : getters) {
             String getterName = getter.getSimpleName().toString();
@@ -257,13 +264,12 @@
                                      .iterator().next().asType();
                 String actualSetterName = setter.getSimpleName().toString();
                 matched = actualSetterName.equals(expectedSetterName)
-                    && typeUtils.isSameType(setterArgType, getterReturnType);
+                       && typeUtility.isSameType(setterArgType, getterReturnType);
                 if (matched)
                     break;
             }
             if (!matched) {
-                logger.warn(_loc.get("getter-unmatched", getter, 
-                    getter.getEnclosingElement()));
+                logger.warn(_loc.get("getter-unmatched", getter, getter.getEnclosingElement()));
                 unmatched.add(getter);
             }
 
@@ -524,6 +530,17 @@
         }
     }
     
+    TypeMirror getTargetEntityType(Element e) {
+        for (Class<? extends Annotation> anno : mappingAnnos) {
+            Object target = getAnnotationValue(e, anno, "targetEntity");
+            if (target != null) {
+                return (TypeMirror)target;
+            }
+            
+        };
+        return null;
+    }
+    
     String getDeclaredTypeName(TypeMirror mirror) {
     	return getDeclaredTypeName(mirror, true);
     }
@@ -537,6 +554,8 @@
      * return <code>java.util.Set</code>.
      */
     String getDeclaredTypeName(TypeMirror mirror, boolean box) {
+        if (mirror == null || mirror.getKind() == TypeKind.NULL || mirror.getKind() == TypeKind.WILDCARD)
+            return "java.lang.Object";
     	if (mirror.getKind() == TypeKind.ARRAY) {
     		TypeMirror comp = ((ArrayType)mirror).getComponentType();
     		return getDeclaredTypeName(comp, false);
@@ -544,7 +563,7 @@
     	mirror = box ? box(mirror) : mirror;
     	if (isPrimitive(mirror))
     		return ((PrimitiveType)mirror).toString();
-    	Element elem = processingEnv.getTypeUtils().asElement(mirror);
+    	Element elem = typeUtility.asElement(mirror);
     	if (elem == null)
     	    throw new RuntimeException(_loc.get("mmg-no-type", mirror).getMessage());
         return elem.toString();
@@ -600,15 +619,23 @@
      * @return if the given type represents a parameterized type, then the
      *         indexed parameter type argument. Otherwise null.
      */
-    TypeMirror getTypeParameter(TypeMirror mirror, int index) {
+    TypeMirror getTypeParameter(Element e, TypeMirror mirror, int index, boolean checkTarget) {
         if (mirror.getKind() == TypeKind.ARRAY)
             return ((ArrayType)mirror).getComponentType();
     	if (mirror.getKind() != TypeKind.DECLARED)
     		return null;
-        List<? extends TypeMirror> params = ((DeclaredType)mirror)
-        	.getTypeArguments();
-        return (params == null || params.size() < index+1) 
-            ? null : params.get(index);
+    	if (checkTarget) {
+    	    TypeMirror target = getTargetEntityType(e);
+    	    if (target != null)
+    	        return target;
+    	}
+        List<? extends TypeMirror> params = ((DeclaredType)mirror).getTypeArguments();
+        TypeMirror param = (params == null || params.size() < index+1) 
+            ? typeUtility.getNullType() : params.get(index);
+        if (param.getKind() == TypeKind.NULL || param.getKind() == TypeKind.WILDCARD) {
+            logger.warn(_loc.get("generic-type-param", e, getDeclaredType(e), e.getEnclosingElement()));
+        }
+        return param;
     }
 
     public TypeElement getPersistentSupertype(TypeElement cls) {

Modified: openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties?rev=881529&r1=881528&r2=881529&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties (original)
+++ openjpa/trunk/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/meta/localizer.properties Tue Nov 17 21:16:23 2009
@@ -79,4 +79,6 @@
 attr-not-found-map: Map attribute "{0}" of {1} key type and {2} value type not found in {3}
 attr-not-found-decl-map: Declared Map attribute "{0}" of {1} key type and {2} value type not found in {3}
 decl-version-not-found: Declared version attribute of {1} type not found in {2} 
-version-not-found: Version attribute of {1} type not found in {2}
\ No newline at end of file
+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.
\ No newline at end of file