[hibernate-commits] Hibernate SVN: r18565 - in jpamodelgen/trunk/src: main/java/org/hibernate/jpamodelgen/annotation and 3 other directories.

hibernate-commits at lists.jboss.org hibernate-commits at lists.jboss.org
Fri Jan 15 12:58:19 EST 2010


Author: epbernard
Date: 2010-01-15 12:58:18 -0500 (Fri, 15 Jan 2010)
New Revision: 18565

Added:
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Child.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java
   jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java
Modified:
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/MetaAttribute.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
   jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
Log:
METAGEN-15 use the first upper bound when the type to be exported is a generic.

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/ClassWriter.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -62,7 +62,7 @@
 		}
 		catch ( FilerException filerEx ) {
 			context.logMessage(
-					Diagnostic.Kind.ERROR, "Problem with Processing Environment Filer: " + filerEx.getMessage()
+					Diagnostic.Kind.WARNING, "Problem with Processing Environment Filer: " + filerEx.getMessage()
 			);
 		}
 		catch ( IOException ioEx ) {

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/Context.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -110,6 +110,7 @@
 			return;
 		}
 		ClassWriter.writeFile( new AnnotationMetaEntity( element, this, defaultAccessTypeForHierarchy ), this );
+		TypeUtils.extractClosestRealTypeAsString( element.asType(), this );
 		elementsAlreadyProcessed.add( element.getQualifiedName().toString() );
 	}
 

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/JPAMetaModelEntityProcessor.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -226,7 +226,8 @@
 			}
 
 			XmlMetaEntity metaEntity = new XmlMetaEntity(
-					entity, packageName, getXmlMappedType( fullyQualifiedClassName )
+					entity, packageName, getXmlMappedType( fullyQualifiedClassName ),
+					context
 			);
 
 			if ( context.getMetaEntitiesToProcess().containsKey( fullyQualifiedClassName ) ) {
@@ -264,7 +265,8 @@
 			}
 
 			XmlMetaEntity metaEntity = new XmlMetaEntity(
-					embeddable, packageName, getXmlMappedType( fullyQualifiedClassName )
+					embeddable, packageName, getXmlMappedType( fullyQualifiedClassName ),
+					context
 			);
 
 			if ( context.getMetaSuperclassAndEmbeddableToProcess().containsKey( fullyQualifiedClassName ) ) {
@@ -292,7 +294,8 @@
 			}
 
 			XmlMetaEntity metaEntity = new XmlMetaEntity(
-					mappedSuperClass, packageName, getXmlMappedType( fullyQualifiedClassName )
+					mappedSuperClass, packageName, getXmlMappedType( fullyQualifiedClassName ),
+					context
 			);
 
 			if ( context.getMetaSuperclassAndEmbeddableToProcess().containsKey( fullyQualifiedClassName ) ) {

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/MetaAttribute.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/MetaAttribute.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/MetaAttribute.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -21,11 +21,11 @@
  * @author Hardy Ferentschik
  */
 public interface MetaAttribute {
-    String getDeclarationString();
+	String getDeclarationString();
 
-    String getMetaType();
+	String getMetaType();
 
-    String getPropertyName();
+	String getPropertyName();
 
-   String getTypeDeclaration(); 
+	String getTypeDeclaration();
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -18,6 +18,7 @@
 package org.hibernate.jpamodelgen;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 import javax.lang.model.type.TypeMirror;
@@ -25,6 +26,8 @@
 import javax.lang.model.type.DeclaredType;
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.element.Element;
+import javax.lang.model.type.TypeVariable;
+import javax.lang.model.util.Types;
 
 /**
  * Utility class.
@@ -72,4 +75,24 @@
 			return null;
 		}
 	}
+
+	public static String extractClosestRealTypeAsString(TypeMirror type, Context context) {
+		if ( type instanceof TypeVariable ) {
+			final TypeMirror compositeUpperBound = ( ( TypeVariable ) type ).getUpperBound();
+			final Types types = context.getProcessingEnvironment()
+					.getTypeUtils();
+			final List<? extends TypeMirror> upperBounds = types.directSupertypes( compositeUpperBound );
+			if (upperBounds.size() == 0) {
+				return compositeUpperBound.toString();
+			}
+			else {
+				//take the first one
+				return extractClosestRealTypeAsString( upperBounds.get( 0 ), context );
+			}
+
+		}
+		else {
+			return type.toString();
+		}
+	}
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -435,15 +435,18 @@
 	}
 
 	private String getKeyType(DeclaredType t) {
-		return t.getTypeArguments().get( 0 ).toString();
+		return TypeUtils.extractClosestRealTypeAsString( t.getTypeArguments().get( 0 ), context );
 	}
 
 	private String getElementType(DeclaredType declaredType) {
 		if ( declaredType.getTypeArguments().size() == 1 ) {
-			return declaredType.getTypeArguments().get( 0 ).toString();
+			final TypeMirror type = declaredType.getTypeArguments().get( 0 );
+			return TypeUtils.extractClosestRealTypeAsString( type, context );
 		}
 		else {
-			return declaredType.getTypeArguments().get( 1 ).toString();
+			return TypeUtils.extractClosestRealTypeAsString( declaredType.getTypeArguments().get( 1 ), context );
 		}
 	}
+
+
 }

Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java	2010-01-15 15:24:50 UTC (rev 18564)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/xml/XmlMetaEntity.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -26,10 +26,12 @@
 import javax.lang.model.element.TypeElement;
 import javax.lang.model.type.DeclaredType;
 
+import org.hibernate.jpamodelgen.Context;
 import org.hibernate.jpamodelgen.MetaAttribute;
 import org.hibernate.jpamodelgen.ImportContextImpl;
 import org.hibernate.jpamodelgen.MetaEntity;
 import org.hibernate.jpamodelgen.ImportContext;
+import org.hibernate.jpamodelgen.TypeUtils;
 import org.hibernate.jpamodelgen.xml.jaxb.Attributes;
 import org.hibernate.jpamodelgen.xml.jaxb.Basic;
 import org.hibernate.jpamodelgen.xml.jaxb.ElementCollection;
@@ -65,31 +67,35 @@
 	final private List<MetaAttribute> members = new ArrayList<MetaAttribute>();
 
 	private TypeElement element;
+	private Context context;
 
-	public XmlMetaEntity(Entity ormEntity, String packageName, TypeElement element) {
+	public XmlMetaEntity(Entity ormEntity, String packageName, TypeElement element, Context context) {
 		this.clazzName = ormEntity.getClazz();
 		this.packageName = packageName;
-		importContext = new ImportContextImpl( getPackageName() );
+		this.context = context;
+		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
 		Attributes attributes = ormEntity.getAttributes();
 
 		parseAttributes( attributes );
 	}
 
-	public XmlMetaEntity(MappedSuperclass mappedSuperclass, String packageName, TypeElement element) {
+	public XmlMetaEntity(MappedSuperclass mappedSuperclass, String packageName, TypeElement element, Context context) {
 		this.clazzName = mappedSuperclass.getClazz();
 		this.packageName = packageName;
-		importContext = new ImportContextImpl( getPackageName() );
+		this.context = context;
+		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
 		Attributes attributes = mappedSuperclass.getAttributes();
 
 		parseAttributes( attributes );
 	}
 
-	public XmlMetaEntity(Embeddable embeddable, String packageName, TypeElement element) {
+	public XmlMetaEntity(Embeddable embeddable, String packageName, TypeElement element, Context context) {
 		this.clazzName = embeddable.getClazz();
 		this.packageName = packageName;
-		importContext = new ImportContextImpl( getPackageName() );
+		this.context = context;
+		this.importContext = new ImportContextImpl( getPackageName() );
 		this.element = element;
 		EmbeddableAttributes attributes = embeddable.getAttributes();
 
@@ -164,7 +170,7 @@
 		for ( Element elem : element.getEnclosedElements() ) {
 			if ( elem.getSimpleName().toString().equals( propertyName ) ) {
 				DeclaredType type = ( ( DeclaredType ) elem.asType() );
-				types[0] = type.getTypeArguments().get( 0 ).toString();
+				types[0] = TypeUtils.extractClosestRealTypeAsString(type.getTypeArguments().get( 0 ), context);
 				types[1] = COLLECTIONS.get( type.asElement().toString() );
 			}
 		}

Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Child.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Child.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Child.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -0,0 +1,35 @@
+package org.hibernate.jpamodelgen.test.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="ejb_child")
+public class Child {
+	private Integer id;
+	private String name;
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+}
+

Copied: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java (from rev 18541, jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/elementcollection/ElementCollectionTest.java)
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -0,0 +1,43 @@
+// $Id$
+/*
+* JBoss, Home of Professional Open Source
+* Copyright 2008, Red Hat Middleware LLC, and individual contributors
+* by the @authors tag. See the copyright.txt in the distribution for a
+* full listing of individual contributors.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+* http://www.apache.org/licenses/LICENSE-2.0
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+package org.hibernate.jpamodelgen.test.generics;
+
+import org.testng.annotations.Test;
+
+import org.hibernate.jpamodelgen.test.elementcollection.House;
+import org.hibernate.jpamodelgen.test.util.CompilationTest;
+
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertClassGenerated;
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertNoGeneratedSourceFile;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GenericsTest extends CompilationTest {
+
+	@Test
+	public void testGenerics() {
+		assertClassGenerated( Parent.class.getName() + "_" );
+		assertClassGenerated( Child.class.getName() + "_" );
+	}
+
+	@Override
+	protected String getTestPackage() {
+		return Parent.class.getPackage().getName();
+	}
+}
\ No newline at end of file

Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java	                        (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java	2010-01-15 17:58:18 UTC (rev 18565)
@@ -0,0 +1,77 @@
+package org.hibernate.jpamodelgen.test.generics;
+
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="ejb_parent")
+public class Parent {
+
+	@Embeddable
+	public static class Relatives<T> {
+		private Set<T> siblings;
+
+		@OneToMany
+		@JoinColumn(name="siblings_fk")
+		public Set<T> getSiblings() {
+			return siblings;
+		}
+
+		public void setSiblings(Set<T> siblings) {
+			this.siblings = siblings;
+		}
+	}
+
+	private Integer id;
+	private String name;
+	private Set<Child> children;
+	private Relatives<Child> siblings;
+
+
+	@Id
+	@GeneratedValue
+	public Integer getId() {
+		return id;
+	}
+
+	public void setId(Integer id) {
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	@OneToMany
+	@JoinColumn(name="parent_fk", nullable = false)
+	public Set<Child> getChildren() {
+		return children;
+	}
+
+	public void setChildren(Set<Child> children) {
+		this.children = children;
+	}
+
+	@Embedded
+	public Relatives<Child> getSiblings() {
+		return siblings;
+	}
+
+	public void setSiblings(Relatives<Child> siblings) {
+		this.siblings = siblings;
+	}
+}



More information about the hibernate-commits mailing list