From fb3a00147c66192075a716176f5d1e56e0f1e8bc Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Fri, 31 Oct 2014 10:31:30 +0100 Subject: [PATCH 1/3] JDO uses field names in queries Fixes #1023 --- .../com/mysema/query/apt/jdo/JDOAnnotationProcessor.java | 6 +++++- .../src/test/java/com/mysema/query/domain/JDOTest.java | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java index bd42ffcd0..3fd924adc 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java @@ -46,7 +46,11 @@ public class JDOAnnotationProcessor extends AbstractQuerydslProcessor { Class embeddable = EmbeddedOnly.class; Class embedded = QueryEmbedded.class; Class skip = NotPersistent.class; - return new DefaultConfiguration(roundEnv, processingEnv.getOptions(), Keywords.JDO, + DefaultConfiguration configuration = new DefaultConfiguration( + roundEnv, processingEnv.getOptions(), Keywords.JDO, entities, entity, superType, embeddable, embedded, skip); + + configuration.setUseGetters(false); + return configuration; } } diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java b/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java index c74a9b3f2..218208cd7 100644 --- a/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java @@ -42,6 +42,10 @@ public class JDOTest extends AbstractTest { private String stringField2; + public String getStringfield1() { + return stringField1; + } + public String getStringField2() { return stringField2; } @@ -56,6 +60,7 @@ public class JDOTest extends AbstractTest { cl = QJDOTest_JDOEntity2.class; match(StringPath.class, "stringField1"); + assertMissing("stringfield1"); match(StringPath.class, "stringField2"); } From d39b2c388446f3a923c7a512eb07b42cbe5c5ba4 Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Sun, 2 Nov 2014 20:47:55 +0100 Subject: [PATCH 2/3] Enable customizable defaultConfiguration in APT --- .../src/main/java/com/mysema/query/apt/VisitorConfig.java | 8 +++++--- .../java/com/mysema/query/apt/jpa/JPAConfiguration.java | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/VisitorConfig.java b/querydsl-apt/src/main/java/com/mysema/query/apt/VisitorConfig.java index 48994e6d9..d74567d90 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/VisitorConfig.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/VisitorConfig.java @@ -42,13 +42,15 @@ public enum VisitorConfig { private final boolean visitFieldProperties, visitMethodProperties, visitConstructors; - public static VisitorConfig get(boolean fields, boolean methods) { - if (fields && !methods) { + public static VisitorConfig get(boolean fields, boolean methods, VisitorConfig defaultConfig) { + if (fields && methods) { + return VisitorConfig.ALL; + } else if (fields && !methods) { return VisitorConfig.FIELDS_ONLY; } else if (methods && !fields) { return VisitorConfig.METHODS_ONLY; } else { - return VisitorConfig.ALL; + return defaultConfig; } } 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 98b2928c2..f74f46421 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 @@ -86,7 +86,7 @@ public class JPAConfiguration extends DefaultConfiguration { methods |= element.getKind().equals(ElementKind.METHOD); } } - return VisitorConfig.get(fields, methods); + return VisitorConfig.get(fields, methods, VisitorConfig.ALL); } @Override From b40cadfcce558b71bf2999d9fa7ae25d4b88b62d Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Sun, 2 Nov 2014 21:44:20 +0100 Subject: [PATCH 3/3] Added JDOConfiguration with JDO specific annotation configuration --- .../query/apt/jdo/JDOAnnotationProcessor.java | 8 +- .../query/apt/jdo/JDOConfiguration.java | 77 +++++++++++++++++++ .../java/com/mysema/query/domain/JDOTest.java | 30 +++++++- 3 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOConfiguration.java diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java index 3fd924adc..c3f079c52 100644 --- a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOAnnotationProcessor.java @@ -25,8 +25,6 @@ import com.mysema.query.annotations.QueryEntities; import com.mysema.query.annotations.QuerySupertype; import com.mysema.query.apt.AbstractQuerydslProcessor; import com.mysema.query.apt.Configuration; -import com.mysema.query.apt.DefaultConfiguration; -import com.mysema.query.codegen.Keywords; /** * AnnotationProcessor for JDO which takes {@link PersistenceCapable}, {@link EmbeddedOnly} and @@ -46,11 +44,7 @@ public class JDOAnnotationProcessor extends AbstractQuerydslProcessor { Class embeddable = EmbeddedOnly.class; Class embedded = QueryEmbedded.class; Class skip = NotPersistent.class; - DefaultConfiguration configuration = new DefaultConfiguration( - roundEnv, processingEnv.getOptions(), Keywords.JDO, + return new JDOConfiguration(roundEnv, processingEnv.getOptions(), entities, entity, superType, embeddable, embedded, skip); - - configuration.setUseGetters(false); - return configuration; } } diff --git a/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOConfiguration.java b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOConfiguration.java new file mode 100644 index 000000000..854dda06d --- /dev/null +++ b/querydsl-apt/src/main/java/com/mysema/query/apt/jdo/JDOConfiguration.java @@ -0,0 +1,77 @@ +/* + * Copyright 2014 Timo Westkämper + * + * 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 com.mysema.query.apt.jdo; + +import java.lang.annotation.Annotation; +import java.util.List; +import java.util.Map; + +import javax.annotation.processing.RoundEnvironment; +import javax.jdo.annotations.*; +import javax.lang.model.element.Element; +import javax.lang.model.element.ElementKind; +import javax.lang.model.element.TypeElement; + +import com.google.common.collect.ImmutableSet; +import com.mysema.query.apt.DefaultConfiguration; +import com.mysema.query.apt.VisitorConfig; +import com.mysema.query.codegen.Keywords; + +public class JDOConfiguration extends DefaultConfiguration { + + @SuppressWarnings("unchecked") + private static final Iterable> relevantAnnotations + = ImmutableSet.of( + Cacheable.class, Column.class, Columns.class, + javax.jdo.annotations.Element.class, Embedded.class, + Extension.class, Extensions.class, ForeignKey.class, + Index.class, Join.class, Key.class, NotPersistent.class, + Order.class, Persistent.class, PrimaryKey.class, + Serialized.class, Transactional.class, Unique.class, Value.class); + + public JDOConfiguration(RoundEnvironment roundEnv, + Map options, + Class entitiesAnn, + Class entityAnn, + Class superTypeAnn, + Class embeddableAnn, + Class embeddedAnn, Class skipAnn) { + super(roundEnv, options, Keywords.JDO, entitiesAnn, entityAnn, superTypeAnn, + embeddableAnn, embeddedAnn, skipAnn); + } + + @Override + public VisitorConfig getConfig(TypeElement e, List elements) { + boolean fields = false, methods = false; + for (Element element : elements) { + if (hasRelevantAnnotation(element)) { + fields |= element.getKind().equals(ElementKind.FIELD); + methods |= element.getKind().equals(ElementKind.METHOD); + } + } + return VisitorConfig.get(fields, methods, VisitorConfig.FIELDS_ONLY); + } + + private boolean hasRelevantAnnotation(Element element) { + for (Class relevantAnnotation : relevantAnnotations) { + if (element.getAnnotation(relevantAnnotation) != null) { + return true; + } + } + return false; + } + +} diff --git a/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java b/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java index 218208cd7..8505964ea 100644 --- a/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java +++ b/querydsl-apt/src/test/java/com/mysema/query/domain/JDOTest.java @@ -15,11 +15,14 @@ package com.mysema.query.domain; import javax.jdo.annotations.NotPersistent; import javax.jdo.annotations.PersistenceCapable; +import javax.jdo.annotations.Persistent; +import javax.jdo.annotations.PrimaryKey; + +import com.mysema.query.types.path.NumberPath; +import com.mysema.query.types.path.StringPath; import org.junit.Test; -import com.mysema.query.types.path.StringPath; - public class JDOTest extends AbstractTest { @PersistenceCapable @@ -37,7 +40,6 @@ public class JDOTest extends AbstractTest { @PersistenceCapable public static class JDOEntity2 { - @SuppressWarnings("unused") private String stringField1; private String stringField2; @@ -51,6 +53,24 @@ public class JDOTest extends AbstractTest { } } + @PersistenceCapable + public static class JDOEntity3 { + + private Integer integerField; + + private String stringField; + + @PrimaryKey + public Integer getId() { + return integerField; + } + + @Persistent + public String getName() { + return stringField; + } + } + @Test public void test() throws SecurityException, NoSuchFieldException { cl = QJDOTest_JDOEntity.class; @@ -62,6 +82,10 @@ public class JDOTest extends AbstractTest { match(StringPath.class, "stringField1"); assertMissing("stringfield1"); match(StringPath.class, "stringField2"); + + cl = QJDOTest_JDOEntity3.class; + match(NumberPath.class, "id"); + match(StringPath.class, "name"); } }