From c144266b85b4c2bfbc150641fbf17c26d7924efa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 23 Jan 2012 22:23:56 +0200 Subject: [PATCH] #82 improved handling of ManyToOne relations --- .../com/mysema/query/apt/Configuration.java | 13 +++++++++ .../query/apt/DefaultConfiguration.java | 9 ++++++ .../mysema/query/apt/TypeElementHandler.java | 13 ++++++++- .../java/com/mysema/query/apt/TypeUtils.java | 4 +-- .../query/apt/jpa/JPAConfiguration.java | 29 ++++++++++++++++++- .../query/domain/InterfaceType2Test.java | 6 +++- querydsl-apt/template.mf | 4 ++- 7 files changed, 72 insertions(+), 6 deletions(-) diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java index d5bfec7f0..774075b22 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/Configuration.java @@ -23,6 +23,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; import com.mysema.query.codegen.EntityType; import com.mysema.query.codegen.QueryTypeFactory; @@ -203,4 +204,16 @@ public interface Configuration { */ boolean isExcludedClass(String className); + /** + * @param method + * @return + */ + TypeMirror getRealType(ExecutableElement method); + + /** + * @param field + * @return + */ + TypeMirror getRealType(VariableElement field); + } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/DefaultConfiguration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/DefaultConfiguration.java index dc82cf2fe..9a3e91b8c 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/DefaultConfiguration.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/DefaultConfiguration.java @@ -41,6 +41,7 @@ import javax.lang.model.element.Modifier; import javax.lang.model.element.PackageElement; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; import org.apache.commons.lang3.StringUtils; @@ -412,6 +413,14 @@ public class DefaultConfiguration implements Configuration { this.unknownAsEmbedded = unknownAsEmbedded; } + @Override + public TypeMirror getRealType(ExecutableElement method) { + return null; + } + @Override + public TypeMirror getRealType(VariableElement field) { + return null; + } } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/TypeElementHandler.java b/querydsl-apt/src/main/java/com/mysema/query/apt/TypeElementHandler.java index ad3b3357c..09e443a97 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/TypeElementHandler.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/TypeElementHandler.java @@ -75,8 +75,9 @@ public final class TypeElementHandler { VisitorConfig config = configuration.getConfig(e, elements); Set blockedProperties = new HashSet(); Map propertyTypes = new HashMap(); + Map fixedTypes = new HashMap(); Map propertyAnnotations = new HashMap(); - + // constructors if (config.visitConstructors()) { handleConstructors(entityType, elements); @@ -94,6 +95,10 @@ public final class TypeElementHandler { annotations.addAnnotation(field.getAnnotation(QueryInit.class)); propertyAnnotations.put(name, annotations); propertyTypes.put(name, field.asType()); + TypeMirror fixedType = configuration.getRealType(field); + if (fixedType != null) { + fixedTypes.put(name, fixedType); + } } } } @@ -121,10 +126,16 @@ public final class TypeElementHandler { annotations.addAnnotation(method.getAnnotation(QueryType.class)); annotations.addAnnotation(method.getAnnotation(QueryInit.class)); propertyTypes.put(name, method.getReturnType()); + TypeMirror fixedType = configuration.getRealType(method); + if (fixedType != null) { + fixedTypes.put(name, fixedType); + } } } } + // fixed types override property types + propertyTypes.putAll(fixedTypes); for (Map.Entry entry : propertyAnnotations.entrySet()) { Property property = toProperty(entityType, entry.getKey(), propertyTypes.get(entry.getKey()), entry.getValue()); if (property != null) { diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/TypeUtils.java b/querydsl-apt/src/main/java/com/mysema/query/apt/TypeUtils.java index 9a0f3d72e..85917d70e 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/TypeUtils.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/TypeUtils.java @@ -66,7 +66,7 @@ public final class TypeUtils { public static Set getAnnotationValuesAsElements(AnnotationMirror mirror, String method) { Set elements = new HashSet(); for (Map.Entry entry : mirror.getElementValues().entrySet()) { - if (entry.getKey().getSimpleName().toString().equals("value")) { + if (entry.getKey().getSimpleName().toString().equals(method)) { List values = ((List) entry.getValue().getValue()); for (AnnotationValue value : values) { DeclaredType type = (DeclaredType) value.getValue(); @@ -79,7 +79,7 @@ public final class TypeUtils { public static TypeMirror getAnnotationValueAsTypeMirror(AnnotationMirror mirror, String method) { for (Map.Entry entry : mirror.getElementValues().entrySet()) { - if (entry.getKey().getSimpleName().toString().equals("value")) { + if (entry.getKey().getSimpleName().toString().equals(method)) { return (TypeMirror) entry.getValue().getValue(); } } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java index 33abbfd43..92acfe54f 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jpa/JPAConfiguration.java @@ -19,9 +19,13 @@ import java.util.List; import java.util.Map; import javax.annotation.processing.RoundEnvironment; +import javax.lang.model.element.AnnotationMirror; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; +import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; +import javax.lang.model.element.VariableElement; +import javax.lang.model.type.TypeMirror; import javax.persistence.Column; import javax.persistence.Embedded; import javax.persistence.EmbeddedId; @@ -36,6 +40,7 @@ import javax.persistence.Version; import com.mysema.query.annotations.QueryTransient; import com.mysema.query.annotations.QueryType; import com.mysema.query.apt.DefaultConfiguration; +import com.mysema.query.apt.TypeUtils; import com.mysema.query.apt.VisitorConfig; /** @@ -54,7 +59,8 @@ public class JPAConfiguration extends DefaultConfiguration { Class embeddableAnn, Class embeddedAnn, Class skipAnn) { - super(roundEnv, options, Keywords.keywords, null, entityAnn, superTypeAnn, embeddableAnn, embeddedAnn, skipAnn); + super(roundEnv, options, Keywords.keywords, null, entityAnn, superTypeAnn, + embeddableAnn, embeddedAnn, skipAnn); this.annotations = getAnnotations(); } @@ -76,6 +82,27 @@ public class JPAConfiguration extends DefaultConfiguration { } return VisitorConfig.get(fields, methods); } + + @Override + public TypeMirror getRealType(ExecutableElement method) { + return getManyToOneType(method); + } + + @Override + public TypeMirror getRealType(VariableElement field) { + return getManyToOneType(field); + } + + private TypeMirror getManyToOneType(Element element) { + AnnotationMirror mirror = TypeUtils.getAnnotationMirrorOfType(element, ManyToOne.class); + if (mirror != null) { + return TypeUtils.getAnnotationValueAsTypeMirror(mirror, "targetEntity"); + } else { + return null; + } + } + + private boolean hasRelevantAnnotation(Element element){ for (Class annotation : annotations) { diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/InterfaceType2Test.java b/querydsl-apt/src/test/java/com/mysema/query/domain/InterfaceType2Test.java index 582b70fd7..f6cebda2f 100644 --- a/querydsl-apt/src/test/java/com/mysema/query/domain/InterfaceType2Test.java +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/InterfaceType2Test.java @@ -1,5 +1,7 @@ package com.mysema.query.domain; +import static org.junit.Assert.*; + import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; @@ -86,7 +88,9 @@ public class InterfaceType2Test { @Test public void test() { - + assertEquals( + QInterfaceType2Test_PartyImpl.class, + QInterfaceType2Test_UserImpl.userImpl.party.getClass()); } diff --git a/querydsl-apt/template.mf b/querydsl-apt/template.mf index 6b8f08bf8..385870c28 100644 --- a/querydsl-apt/template.mf +++ b/querydsl-apt/template.mf @@ -16,4 +16,6 @@ Import-Template: org.apache.commons.lang3.*;version="${commons.lang.version}" Excluded-Imports: edu.umd.cs.findbugs.annotations.*, - net.jcip.annotations.* \ No newline at end of file + net.jcip.annotations.*, + javax.persistence.*;version="[2.0.0,2.1.0)", + javax.jdo.*;version="[2.0.0,3.0.0)" \ No newline at end of file