[hibernate-commits] Hibernate SVN: r18607 - 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 22 13:38:53 EST 2010
Author: epbernard
Date: 2010-01-22 13:38:53 -0500 (Fri, 22 Jan 2010)
New Revision: 18607
Added:
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/A.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/B.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/RawTypesTest.java
Modified:
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java
jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java
jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java
Log:
METAGEN-20 support raw collections and honor targetEntity
Modified: jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java
===================================================================
--- jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java 2010-01-22 12:35:15 UTC (rev 18606)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/TypeUtils.java 2010-01-22 18:38:53 UTC (rev 18607)
@@ -79,8 +79,7 @@
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 Types types = context.getProcessingEnvironment().getTypeUtils();
final List<? extends TypeMirror> upperBounds = types.directSupertypes( compositeUpperBound );
if (upperBounds.size() == 0) {
return compositeUpperBound.toString();
@@ -89,7 +88,6 @@
//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-22 12:35:15 UTC (rev 18606)
+++ jpamodelgen/trunk/src/main/java/org/hibernate/jpamodelgen/annotation/AnnotationMetaEntity.java 2010-01-22 18:38:53 UTC (rev 18607)
@@ -22,8 +22,10 @@
import java.util.List;
import java.util.Map;
import javax.lang.model.element.AnnotationMirror;
+import javax.lang.model.element.AnnotationValue;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
+import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.Name;
import javax.lang.model.element.PackageElement;
@@ -43,7 +45,11 @@
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Id;
+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 javax.tools.Diagnostic;
@@ -348,8 +354,11 @@
String fqElementName = returnedElement.getQualifiedName()
.toString(); // WARNING: .toString() is necessary here since Name equals does not compare to String
String collection = COLLECTIONS.get( fqElementName );
+ final List<? extends AnnotationMirror> annotations = element.getAnnotationMirrors();
+ String targetEntity = getTargetEntity( annotations );
if ( collection != null ) {
- if ( element.getAnnotation( ElementCollection.class ) != null ) {
+ if ( containsAnnotation( annotations, ElementCollection.class ) ) {
+ //FIXME I don't understand why this code is different between Elementcollection and a regular collection but it needs to take targetClass into account
TypeMirror collectionElementType = getCollectionElementType( t, fqElementName );
final TypeElement collectionElement = ( TypeElement ) context.getProcessingEnvironment()
.getTypeUtils()
@@ -361,11 +370,12 @@
}
if ( collection.equals( "javax.persistence.metamodel.MapAttribute" ) ) {
return new AnnotationMetaMap(
- parent, element, collection, getKeyType( t ), getElementType( t )
+ //FIXME support targetEntity for map's key @MapKeyClass
+ parent, element, collection, getKeyType( t ), getElementType( t, targetEntity )
);
}
else {
- return new AnnotationMetaCollection( parent, element, collection, getElementType( t ) );
+ return new AnnotationMetaCollection( parent, element, collection, getElementType( t, targetEntity ) );
}
}
else {
@@ -414,6 +424,63 @@
}
}
+ private boolean containsAnnotation(List<? extends AnnotationMirror> annotations, Class<?> annotation) {
+ String annString = annotation.getName();
+ for ( AnnotationMirror mirror : annotations ) {
+ if ( annString.equals( mirror.getAnnotationType().toString() ) ) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Returns targetEntity or null if no targetEntity is here or if equals to void
+ */
+ private String getTargetEntity(List<? extends AnnotationMirror> annotations) {
+ final String elementCollection = ElementCollection.class.getName();
+
+ for ( AnnotationMirror mirror : annotations ) {
+ final String annotation = mirror.getAnnotationType().toString();
+ if ( elementCollection.equals( annotation ) ) {
+ final String targetEntity = getTargetEntity( mirror );
+ if (targetEntity != null) return targetEntity;
+ }
+ else if ( OneToMany.class.getName().equals( annotation ) ) {
+ final String targetEntity = getTargetEntity( mirror );
+ if (targetEntity != null) return targetEntity;
+ }
+ else if ( ManyToMany.class.getName().equals( annotation ) ) {
+ final String targetEntity = getTargetEntity( mirror );
+ if (targetEntity != null) return targetEntity;
+ }
+ else if ( ManyToOne.class.getName().equals( annotation ) ) {
+ final String targetEntity = getTargetEntity( mirror );
+ if (targetEntity != null) return targetEntity;
+ }
+ else if ( OneToOne.class.getName().equals( annotation ) ) {
+ final String targetEntity = getTargetEntity( mirror );
+ if (targetEntity != null) return targetEntity;
+ }
+ }
+ return null;
+ }
+
+ private String getTargetEntity(AnnotationMirror mirror) {
+ String targetEntity = null;
+ final Map<? extends ExecutableElement, ? extends AnnotationValue> attributes = mirror.getElementValues();
+ for ( Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : attributes.entrySet() ) {
+ final String simpleName = entry.getKey().getSimpleName().toString();
+ if ( "targetEntity".equals( simpleName ) ) {
+ targetEntity = entry.getValue().toString();
+ break;
+ }
+ }
+ targetEntity = ( "void.class".equals( targetEntity ) ) ? null : targetEntity;
+ return targetEntity != null && targetEntity.endsWith( ".class" ) ?
+ targetEntity.substring( 0, targetEntity.length() - 6 ) : null;
+ }
+
public String generateImports() {
return importContext.generateImports();
}
@@ -438,13 +505,23 @@
return TypeUtils.extractClosestRealTypeAsString( t.getTypeArguments().get( 0 ), context );
}
- private String getElementType(DeclaredType declaredType) {
- if ( declaredType.getTypeArguments().size() == 1 ) {
- final TypeMirror type = declaredType.getTypeArguments().get( 0 );
+ private String getElementType(DeclaredType declaredType, String targetEntity) {
+ if (targetEntity != null) return targetEntity;
+ final List<? extends TypeMirror> mirrors = declaredType.getTypeArguments();
+ if ( mirrors.size() == 1 ) {
+ final TypeMirror type = mirrors.get( 0 );
return TypeUtils.extractClosestRealTypeAsString( type, context );
}
+ else if ( mirrors.size() == 2 ) {
+ return TypeUtils.extractClosestRealTypeAsString( mirrors.get( 1 ), context );
+ }
else {
- return TypeUtils.extractClosestRealTypeAsString( declaredType.getTypeArguments().get( 1 ), context );
+ //for 0 or many
+ //0 is expected, many is not
+ if ( mirrors.size() > 2) {
+ context.logMessage( Diagnostic.Kind.WARNING, "Unable to find the closest solid type" + declaredType );
+ }
+ return "?";
}
}
Modified: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java 2010-01-22 12:35:15 UTC (rev 18606)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/Parent.java 2010-01-22 18:38:53 UTC (rev 18607)
@@ -56,7 +56,7 @@
this.name = name;
}
- @OneToMany
+ @OneToMany(targetEntity = void.class)
@JoinColumn(name="parent_fk", nullable = false)
public Set<Child> getChildren() {
return children;
Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/A.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/A.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/A.java 2010-01-22 18:38:53 UTC (rev 18607)
@@ -0,0 +1,68 @@
+package org.hibernate.jpamodelgen.test.rawTypes;
+
+import java.util.Collection;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class A implements java.io.Serializable {
+
+ @Id
+ protected String id;
+
+ @Basic
+ protected String name;
+
+ @Basic
+ protected int value;
+
+
+ public A() {
+ }
+
+ @ManyToMany(targetEntity = B.class, cascade = CascadeType.ALL)
+ @JoinTable(name = "tbl_A_B",
+ joinColumns =
+ @JoinColumn(
+ name = "A_FK", referencedColumnName = "ID"),
+ inverseJoinColumns =
+ @JoinColumn(
+ name = "B_FK", referencedColumnName = "ID")
+ )
+ protected Collection bCol = new java.util.ArrayList();
+
+
+ public Collection getBCol() {
+ return bCol;
+ }
+
+ public void setBCol(Collection bCol) {
+ this.bCol = bCol;
+ }
+
+ public String getAId() {
+ return id;
+ }
+
+ public String getAName() {
+ return name;
+ }
+
+ public void setAName(String aName) {
+ this.name = aName;
+ }
+
+
+ public int getAValue() {
+ return value;
+ }
+}
\ No newline at end of file
Added: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/B.java
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/B.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/B.java 2010-01-22 18:38:53 UTC (rev 18607)
@@ -0,0 +1,54 @@
+package org.hibernate.jpamodelgen.test.rawTypes;
+
+import java.util.Collection;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class B implements java.io.Serializable {
+
+ @Id
+ protected String id;
+
+ @Basic
+ protected String name;
+
+ @Basic
+ protected int value;
+
+
+ @ManyToMany(targetEntity = A.class, mappedBy = "bCol", cascade = CascadeType.ALL)
+ protected Collection aCol = new java.util.ArrayList();
+
+
+ public B() {
+ }
+
+
+ public Collection getACol() {
+ return aCol;
+ }
+
+ public void setACol(Collection aCol) {
+ this.aCol = aCol;
+ }
+
+ public String getBId() {
+ return id;
+ }
+
+ public String getBName() {
+ return name;
+ }
+
+ public int getBValue() {
+ return value;
+ }
+}
Copied: jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/RawTypesTest.java (from rev 18565, jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/generics/GenericsTest.java)
===================================================================
--- jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/RawTypesTest.java (rev 0)
+++ jpamodelgen/trunk/src/test/java/org/hibernate/jpamodelgen/test/rawTypes/RawTypesTest.java 2010-01-22 18:38:53 UTC (rev 18607)
@@ -0,0 +1,41 @@
+// $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.rawTypes;
+
+import org.testng.annotations.Test;
+
+import org.hibernate.jpamodelgen.test.util.CompilationTest;
+
+import static org.hibernate.jpamodelgen.test.util.TestUtil.assertClassGenerated;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class RawTypesTest extends CompilationTest {
+
+ @Test
+ public void testGenerics() {
+ assertClassGenerated( A.class.getName() + "_" );
+ assertClassGenerated( B.class.getName() + "_" );
+ }
+
+ @Override
+ protected String getTestPackage() {
+ return A.class.getPackage().getName();
+ }
+}
\ No newline at end of file
More information about the hibernate-commits
mailing list