From d3163bfa7a96f973650ed6833154f8a7935386f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Timo=20Westk=C3=A4mper?= Date: Mon, 27 Feb 2012 20:51:03 +0200 Subject: [PATCH] #104 fixed QueryEmbedded handling --- .../query/apt/AbstractQuerydslProcessor.java | 84 ++++++++++++++----- .../mysema/query/apt/TypeElementHandler.java | 3 +- .../com/mysema/query/domain/Subclass.java | 19 +++++ .../query/codegen/GenericExporterTest.java | 11 ++- .../com/mysema/query/domain/IdNamePair.java | 27 ++++++ .../com/mysema/query/domain/QIdNamePair.java | 40 +++++++++ .../com/mysema/query/domain/QSuperclass.java | 36 ++++++++ .../com/mysema/query/domain/Superclass.java | 24 ++++++ 8 files changed, 220 insertions(+), 24 deletions(-) create mode 100644 querydsl-apt/src/test/java/com/mysema/query/domain/Subclass.java create mode 100644 querydsl-core/src/test/java/com/mysema/query/domain/IdNamePair.java create mode 100644 querydsl-core/src/test/java/com/mysema/query/domain/QIdNamePair.java create mode 100644 querydsl-core/src/test/java/com/mysema/query/domain/QSuperclass.java create mode 100644 querydsl-core/src/test/java/com/mysema/query/domain/Superclass.java diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/AbstractQuerydslProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/AbstractQuerydslProcessor.java index 78f0021de..374cc4a9c 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/AbstractQuerydslProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/AbstractQuerydslProcessor.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import javax.annotation.Nullable; import javax.annotation.processing.AbstractProcessor; import javax.annotation.processing.RoundEnvironment; import javax.lang.model.SourceVersion; @@ -222,6 +223,41 @@ public abstract class AbstractQuerydslProcessor extends AbstractProcessor { // from annotation less supertypes elements.addAll(getAnnotationlessSupertypes(elements)); + + // register possible embedded types of non-tracked supertypes + if (conf.getEmbeddedAnnotation() != null) { + Class embedded = conf.getEmbeddedAnnotation(); + Set embeddedElements = new HashSet(); + for (Element element : elements) { + TypeMirror superTypeMirror = ((TypeElement)element).getSuperclass(); + while (superTypeMirror != null) { + TypeElement superTypeElement = (TypeElement) processingEnv.getTypeUtils().asElement(superTypeMirror); + if (superTypeElement != null) { + List enclosed = superTypeElement.getEnclosedElements(); + for (Element child : enclosed) { + if (child.getAnnotation(embedded) != null) { + handleEmbeddedType(child, embeddedElements); + } + } + superTypeMirror = superTypeElement.getSuperclass(); + if (superTypeMirror instanceof NoType) { + superTypeMirror = null; + } + } else { + superTypeMirror = null; + } + } + } + + // register found elements + for (Element element : embeddedElements) { + if (!elements.contains(element)) { + elementHandler.handleEntityType((TypeElement)element); + } + } + } + + return elements; } @@ -274,31 +310,35 @@ public abstract class AbstractQuerydslProcessor extends AbstractProcessor { // only creation for (Element element : getElements(conf.getEmbeddedAnnotation())) { - TypeMirror type = element.asType(); - if (element.getKind() == ElementKind.METHOD){ - type = ((ExecutableElement)element).getReturnType(); - } - String typeName = type.toString(); - - if (typeName.startsWith(Collection.class.getName()) - || typeName.startsWith(List.class.getName()) - || typeName.startsWith(Set.class.getName())) { - type = ((DeclaredType)type).getTypeArguments().get(0); - - } else if (typeName.startsWith(Map.class.getName())){ - type = ((DeclaredType)type).getTypeArguments().get(1); - } - - TypeElement typeElement = typeExtractor.visit(type); - - if (typeElement != null && !TypeUtils.hasAnnotationOfType(typeElement, conf.getEntityAnnotations())) { - if (!typeElement.getQualifiedName().toString().startsWith("java.")) { - elements.add(typeElement); - } - } + handleEmbeddedType(element, elements); } return elements; + } + + private void handleEmbeddedType(Element element, Set elements) { + TypeMirror type = element.asType(); + if (element.getKind() == ElementKind.METHOD){ + type = ((ExecutableElement)element).getReturnType(); + } + String typeName = type.toString(); + + if (typeName.startsWith(Collection.class.getName()) + || typeName.startsWith(List.class.getName()) + || typeName.startsWith(Set.class.getName())) { + type = ((DeclaredType)type).getTypeArguments().get(0); + + } else if (typeName.startsWith(Map.class.getName())){ + type = ((DeclaredType)type).getTypeArguments().get(1); + } + + TypeElement typeElement = typeExtractor.visit(type); + + if (typeElement != null && !TypeUtils.hasAnnotationOfType(typeElement, conf.getEntityAnnotations())) { + if (!typeElement.getQualifiedName().toString().startsWith("java.")) { + elements.add(typeElement); + } + } } private Set getTypeFromProperties(Set parents) { 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 6da2ce99c..235c307c3 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 @@ -135,6 +135,7 @@ public final class TypeElementHandler { return entityType; } + private Property toProperty(EntityType entityType, String name, TypeMirror type, Annotations annotations) { @@ -146,7 +147,7 @@ public final class TypeElementHandler { return null; } propertyType = propertyType.as(typeCategory); - } + } // inits String[] inits = new String[0]; diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/Subclass.java b/querydsl-apt/src/test/java/com/mysema/query/domain/Subclass.java new file mode 100644 index 000000000..a779d0b6d --- /dev/null +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/Subclass.java @@ -0,0 +1,19 @@ +package com.mysema.query.domain; + +import com.mysema.query.annotations.QueryEntity; + +@QueryEntity +public class Subclass extends com.mysema.query.domain.Superclass { + + private int number; + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + +} \ No newline at end of file diff --git a/querydsl-core/src/test/java/com/mysema/query/codegen/GenericExporterTest.java b/querydsl-core/src/test/java/com/mysema/query/codegen/GenericExporterTest.java index 1aab936bc..176e0b5d8 100644 --- a/querydsl-core/src/test/java/com/mysema/query/codegen/GenericExporterTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/codegen/GenericExporterTest.java @@ -22,6 +22,8 @@ import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; +import com.mysema.query.domain.Cat; + public class GenericExporterTest { private GenericExporter exporter; @@ -39,7 +41,7 @@ public class GenericExporterTest { String str = FileUtils.readFileToString(new File("target/gen1-jpa/com/mysema/query/codegen/QGroup.java")); assertTrue(str.contains("QGroup group = new QGroup(\"group1\");")); } - + @Test public void Export() { exporter.setTargetFolder(new File("target/gen1")); @@ -98,5 +100,12 @@ public class GenericExporterTest { exporter.export(getClass().getPackage()); assertTrue(new File("target/gen5/com/mysema/query/codegen/QExampleEmbeddable.java").exists()); } + + @Test + public void Export_Domain_Package() { + exporter.setTargetFolder(new File("target/gen6")); + exporter.export(Cat.class.getPackage()); + } + } diff --git a/querydsl-core/src/test/java/com/mysema/query/domain/IdNamePair.java b/querydsl-core/src/test/java/com/mysema/query/domain/IdNamePair.java new file mode 100644 index 000000000..ca3035095 --- /dev/null +++ b/querydsl-core/src/test/java/com/mysema/query/domain/IdNamePair.java @@ -0,0 +1,27 @@ +package com.mysema.query.domain; + +public class IdNamePair { + + private String id; + + private Type name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Type getName() { + return name; + } + + public void setName(Type name) { + this.name = name; + } + + + +} diff --git a/querydsl-core/src/test/java/com/mysema/query/domain/QIdNamePair.java b/querydsl-core/src/test/java/com/mysema/query/domain/QIdNamePair.java new file mode 100644 index 000000000..709d9f8b0 --- /dev/null +++ b/querydsl-core/src/test/java/com/mysema/query/domain/QIdNamePair.java @@ -0,0 +1,40 @@ +package com.mysema.query.domain; + +import static com.mysema.query.types.PathMetadataFactory.*; + +import com.mysema.query.types.*; +import com.mysema.query.types.path.*; + +import javax.annotation.Generated; + + +/** + * QIdNamePair is a Querydsl query type for IdNamePair + */ +@Generated("com.mysema.query.codegen.EmbeddableSerializer") +public class QIdNamePair extends BeanPath> { + + private static final long serialVersionUID = -1491444395; + + public static final QIdNamePair idNamePair = new QIdNamePair("idNamePair"); + + public final StringPath id = createString("id"); + + public final SimplePath name = createSimple("name", Object.class); + + @SuppressWarnings("unchecked") + public QIdNamePair(String variable) { + super((Class)IdNamePair.class, forVariable(variable)); + } + + public QIdNamePair(Path> entity) { + super(entity.getType(), entity.getMetadata()); + } + + @SuppressWarnings("unchecked") + public QIdNamePair(PathMetadata metadata) { + super((Class)IdNamePair.class, metadata); + } + +} + diff --git a/querydsl-core/src/test/java/com/mysema/query/domain/QSuperclass.java b/querydsl-core/src/test/java/com/mysema/query/domain/QSuperclass.java new file mode 100644 index 000000000..f77747cc8 --- /dev/null +++ b/querydsl-core/src/test/java/com/mysema/query/domain/QSuperclass.java @@ -0,0 +1,36 @@ +package com.mysema.query.domain; + +import static com.mysema.query.types.PathMetadataFactory.*; + +import com.mysema.query.types.*; +import com.mysema.query.types.path.*; + +import javax.annotation.Generated; + + +/** + * QSuperclass is a Querydsl query type for Superclass + */ +@Generated("com.mysema.query.codegen.EntitySerializer") +public class QSuperclass extends EntityPathBase { + + private static final long serialVersionUID = -1300377102; + + public static final QSuperclass superclass = new QSuperclass("superclass"); + + public final ListPath, QIdNamePair> fooOfSuperclass = this., QIdNamePair>createList("fooOfSuperclass", IdNamePair.class, QIdNamePair.class); + + public QSuperclass(String variable) { + super(Superclass.class, forVariable(variable)); + } + + public QSuperclass(Path entity) { + super(entity.getType(), entity.getMetadata()); + } + + public QSuperclass(PathMetadata metadata) { + super(Superclass.class, metadata); + } + +} + diff --git a/querydsl-core/src/test/java/com/mysema/query/domain/Superclass.java b/querydsl-core/src/test/java/com/mysema/query/domain/Superclass.java new file mode 100644 index 000000000..71d2c8d4d --- /dev/null +++ b/querydsl-core/src/test/java/com/mysema/query/domain/Superclass.java @@ -0,0 +1,24 @@ +package com.mysema.query.domain; + +import java.util.ArrayList; +import java.util.List; + +import com.mysema.query.annotations.QueryEmbedded; +import com.mysema.query.annotations.QueryEntity; + +@QueryEntity +public class Superclass { + + @QueryEmbedded + private List> fooOfSuperclass = new ArrayList>(); + + public List> getFooOfSuperclass() { + return fooOfSuperclass; + } + + public void setFooOfSuperclass(List> fooOfSuperclass) { + this.fooOfSuperclass = fooOfSuperclass; + } + + +} \ No newline at end of file