Skip to content

Commit

Permalink
First fix attempt
Browse files Browse the repository at this point in the history
  • Loading branch information
velo committed Jan 6, 2024
1 parent 91faacf commit cac2efb
Show file tree
Hide file tree
Showing 20 changed files with 392 additions and 44 deletions.
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,7 @@
<exclude>org.slf4j:slf4j-api:*:*:compile</exclude>
<exclude>org.slf4j:slf4j-log4j12:*:*:compile</exclude>
<exclude>junit:junit:*:*:*</exclude>
<exclude>javax.annotation:javax.annotation-api:*:*:*</exclude>
</excludes>
<searchTransitive>false</searchTransitive>
</bannedDependencies>
Expand Down
13 changes: 13 additions & 0 deletions querydsl-apt/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,19 @@
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>com.google.testing.compile</groupId>
<artifactId>compile-testing</artifactId>
<version>0.21.0</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,9 @@ private Property toProperty(
inits = Arrays.asList(annotations.getAnnotation(QueryInit.class).value());
}

return new Property(entityType, name, propertyType, inits);
Property props = new Property(entityType, name, propertyType, inits);
Arrays.stream(annotations.getAnnotations()).forEach(props::addAnnotation);
return props;
}

public EntityType handleProjectionType(TypeElement e, boolean onlyAnnotatedConstructors) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,39 +39,39 @@ public static class BinaryFile {

@Test
public void binaryFile_contentPart() {
assertThat(binaryFile.contentPart.getClass()).isEqualTo(ArrayPath.class);
assertThat(binaryFile.contentPart).isInstanceOf(ArrayPath.class);
assertThat(binaryFile.contentPart.getType()).isEqualTo(byte[].class);
}

@Test
public void binaryFile_list() {
assertThat(binaryFile.list.getClass()).isEqualTo(ListPath.class);
assertThat(binaryFile.list).isInstanceOf(ListPath.class);
assertThat(binaryFile.list.getType()).isEqualTo(List.class);
assertThat(binaryFile.list.getParameter(0)).isEqualTo(byte[].class);

assertThat(binaryFile.list.get(0).getClass()).isEqualTo(SimplePath.class);
assertThat(binaryFile.list.get(0)).isInstanceOf(SimplePath.class);
assertThat(binaryFile.list.get(0).getType()).isEqualTo(byte[].class);
}

@Test
public void binaryFile_map1() {
assertThat(binaryFile.map1.getClass()).isEqualTo(MapPath.class);
assertThat(binaryFile.map1).isInstanceOf(MapPath.class);
assertThat(binaryFile.map1.getType()).isEqualTo(Map.class);
assertThat(binaryFile.map1.getParameter(0)).isEqualTo(String.class);
assertThat(binaryFile.map1.getParameter(1)).isEqualTo(byte[].class);

assertThat(binaryFile.map1.get("").getClass()).isEqualTo(SimplePath.class);
assertThat(binaryFile.map1.get("")).isInstanceOf(SimplePath.class);
assertThat(binaryFile.map1.get("").getType()).isEqualTo(byte[].class);
}

@Test
public void binaryFile_map2() {
assertThat(binaryFile.map2.getClass()).isEqualTo(MapPath.class);
assertThat(binaryFile.map2).isInstanceOf(MapPath.class);
assertThat(binaryFile.map2.getType()).isEqualTo(Map.class);
assertThat(binaryFile.map2.getParameter(0)).isEqualTo(byte[].class);
assertThat(binaryFile.map2.getParameter(1)).isEqualTo(String.class);

assertThat(binaryFile.map2.get(new byte[0]).getClass()).isEqualTo(StringPath.class);
assertThat(binaryFile.map2.get(new byte[0])).isInstanceOf(StringPath.class);
assertThat(binaryFile.map2.get(new byte[0]).getType()).isEqualTo(String.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,16 +81,16 @@ public void test() {
// assertEquals(Object.class,
// QMapWithUndefinedValueTest_Person.person.appData.getParameter(1));

assertThat(QCollectionTest_Classes.classes.map1.getClass()).isEqualTo(MapPath.class);
assertThat(QCollectionTest_Classes.classes.map2.getClass()).isEqualTo(MapPath.class);
assertThat(QCollectionTest_Classes.classes.map3.getClass()).isEqualTo(MapPath.class);
assertThat(QCollectionTest_Classes.classes.map1).isInstanceOf(MapPath.class);
assertThat(QCollectionTest_Classes.classes.map2).isInstanceOf(MapPath.class);
assertThat(QCollectionTest_Classes.classes.map3).isInstanceOf(MapPath.class);

assertThat(QCollectionTest_Classes.classes.list1.getClass()).isEqualTo(ListPath.class);
assertThat(QCollectionTest_Classes.classes.list2.getClass()).isEqualTo(ListPath.class);
assertThat(QCollectionTest_Classes.classes.list3.getClass()).isEqualTo(ListPath.class);
assertThat(QCollectionTest_Classes.classes.list1).isInstanceOf(ListPath.class);
assertThat(QCollectionTest_Classes.classes.list2).isInstanceOf(ListPath.class);
assertThat(QCollectionTest_Classes.classes.list3).isInstanceOf(ListPath.class);

assertThat(QCollectionTest_Classes.classes.set1.getClass()).isEqualTo(SetPath.class);
assertThat(QCollectionTest_Classes.classes.set2.getClass()).isEqualTo(SetPath.class);
assertThat(QCollectionTest_Classes.classes.set3.getClass()).isEqualTo(SetPath.class);
assertThat(QCollectionTest_Classes.classes.set1).isInstanceOf(SetPath.class);
assertThat(QCollectionTest_Classes.classes.set2).isInstanceOf(SetPath.class);
assertThat(QCollectionTest_Classes.classes.set3).isInstanceOf(SetPath.class);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
/*
* Copyright 2015, The Querydsl Team (http://www.querydsl.com/team)
*
* 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.querydsl.apt.domain;

import static com.google.testing.compile.CompilationSubject.assertThat;
import static com.google.testing.compile.Compiler.javac;
import static org.assertj.core.api.Assertions.assertThat;

import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;
import com.querydsl.apt.jpa.JPAAnnotationProcessor;
import com.querydsl.core.types.dsl.ElementCollectionPath;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import java.io.File;
import java.util.Collection;
import org.junit.Test;

public class ElementCollectionTest {

@Entity
public static class EntityClass {

@ElementCollection Collection<String> collectionOfElements;
}

private final File main = new File("src/test/java/").getAbsoluteFile();

@Test
public void properties() {
assertThat(QElementCollectionTest_EntityClass.entityClass.collectionOfElements).isNotNull();
assertThat(QElementCollectionTest_EntityClass.entityClass.collectionOfElements)
.isInstanceOf(ElementCollectionPath.class);
}

@Test
public void test() throws Exception {
final Compilation compilation =
javac()
.withProcessors(new JPAAnnotationProcessor())
.withClasspathFrom(this.getClass().getClassLoader())
.compile(
JavaFileObjects.forResource(
new File(main, "com/querydsl/apt/domain/ElementCollectionTest.java")
.toURI()
.toURL()));
assertThat(compilation).succeeded();
assertThat(compilation)
.generatedSourceFile("com.querydsl.apt.domain.QElementCollectionTest_EntityClass")
.contentsAsUtf8String()
.contains("createElementCollection(\"collectionOfElements\"");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,18 @@
*/
package com.querydsl.apt.domain;

import static com.google.testing.compile.CompilationSubject.assertThat;
import static com.google.testing.compile.Compiler.javac;
import static org.assertj.core.api.Assertions.assertThat;

import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;
import com.querydsl.apt.jpa.JPAAnnotationProcessor;
import com.querydsl.core.types.dsl.ElementCollectionPath;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Embeddable;
import jakarta.persistence.Entity;
import java.io.File;
import java.util.Collection;
import org.junit.Test;

Expand Down Expand Up @@ -47,13 +54,35 @@ public String getName() {

@Test
public void type() {
assertThat(QEmbeddableInterfaceTest_EntityClass.entityClass.children.any().getClass())
.isEqualTo(QEmbeddableInterfaceTest_EmbeddableInterface.class);
assertThat(QEmbeddableInterfaceTest_EntityClass.entityClass.children.any())
.isInstanceOf(QEmbeddableInterfaceTest_EmbeddableInterface.class);
assertThat(QEmbeddableInterfaceTest_EntityClass.entityClass.children)
.isInstanceOf(ElementCollectionPath.class);
}

@Test
public void properties() {
assertThat(QEmbeddableInterfaceTest_EmbeddableInterface.embeddableInterface.name).isNotNull();
assertThat(QEmbeddableInterfaceTest_EmbeddableClass.embeddableClass.name).isNotNull();
}

private final File main = new File("src/test/java/").getAbsoluteFile();

@Test
public void test() throws Exception {
final Compilation compilation =
javac()
.withProcessors(new JPAAnnotationProcessor())
.withClasspathFrom(this.getClass().getClassLoader())
.compile(
JavaFileObjects.forResource(
new File(main, "com/querydsl/apt/domain/EmbeddableInterfaceTest.java")
.toURI()
.toURL()));
assertThat(compilation).succeeded();
assertThat(compilation)
.generatedSourceFile("com.querydsl.apt.domain.QEmbeddableInterfaceTest_EntityClass")
.contentsAsUtf8String()
.contains("createElementCollection(\"children\"");
}
}
6 changes: 3 additions & 3 deletions querydsl-codegen/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,10 @@
<type>test-jar</type>
<scope>test</scope>
</dependency>

<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import com.querydsl.core.types.dsl.*;
import jakarta.inject.Inject;
import jakarta.inject.Named;
import jakarta.persistence.ElementCollection;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.*;
Expand Down Expand Up @@ -900,6 +901,9 @@ protected void serializeProperties(EntityType model, SerializerConfig config, Co
localRawName = writer.getRawName(property.getParameter(0));
queryType = typeMappings.getPathType(property.getParameter(0), model, true);

String createCollection =
isElementCollection(property) ? "createElementCollection" : "createCollection";

serialize(
model,
property,
Expand All @@ -910,7 +914,8 @@ CollectionPath.class, getRaw(property.getParameter(0)), genericQueryType),
+ genericKey
+ COMMA
+ writer.getGenericName(true, genericQueryType)
+ ">createCollection",
+ ">"
+ createCollection,
writer.getClassConstant(localRawName),
writer.getClassConstant(writer.getRawName(queryType)),
inits);
Expand All @@ -923,6 +928,8 @@ CollectionPath.class, getRaw(property.getParameter(0)), genericQueryType),
localRawName = writer.getRawName(property.getParameter(0));
queryType = typeMappings.getPathType(property.getParameter(0), model, true);

String createSet = isElementCollection(property) ? "createElementSet" : "createSet";

serialize(
model,
property,
Expand All @@ -932,7 +939,8 @@ CollectionPath.class, getRaw(property.getParameter(0)), genericQueryType),
+ genericKey
+ COMMA
+ writer.getGenericName(true, genericQueryType)
+ ">createSet",
+ ">"
+ createSet,
writer.getClassConstant(localRawName),
writer.getClassConstant(writer.getRawName(queryType)),
inits);
Expand All @@ -945,6 +953,8 @@ CollectionPath.class, getRaw(property.getParameter(0)), genericQueryType),
localRawName = writer.getRawName(property.getParameter(0));
queryType = typeMappings.getPathType(property.getParameter(0), model, true);

String createList = isElementCollection(property) ? "createElementList" : "createList";

serialize(
model,
property,
Expand All @@ -954,7 +964,8 @@ CollectionPath.class, getRaw(property.getParameter(0)), genericQueryType),
+ genericKey
+ COMMA
+ writer.getGenericName(true, genericQueryType)
+ ">createList",
+ ">"
+ createList,
writer.getClassConstant(localRawName),
writer.getClassConstant(writer.getRawName(queryType)),
inits);
Expand Down Expand Up @@ -997,6 +1008,15 @@ CollectionPath.class, getRaw(property.getParameter(0)), genericQueryType),
}
}

private boolean isElementCollection(Property property) {
try {
Class.forName("jakarta.persistence.ElementCollection");
return property.getAnnotation(ElementCollection.class) == null;
} catch (ClassNotFoundException e) {
return false;
}
}

private String getInits(Property property) {
if (!property.getInits().isEmpty()) {
return "INITS.get(\"" + property.getName() + "\")";
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.querydsl.codegen;

import jakarta.persistence.ElementCollection;
import jakarta.persistence.FetchType;
import java.lang.annotation.Annotation;

public class ElementCollectionImpl implements ElementCollection {

@Override
public Class<? extends Annotation> annotationType() {
return ElementCollection.class;
}

@Override
public Class targetClass() {
return null;
}

@Override
public FetchType fetch() {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import java.util.Collections;
import java.util.Date;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;

Expand Down Expand Up @@ -183,6 +184,14 @@ public void properties() throws IOException {
new Property(entityType, "s", new ClassType(TypeCategory.STRING, String.class)));
entityType.addProperty(
new Property(entityType, "t", new ClassType(TypeCategory.TIME, Time.class)));
Property property =
new Property(
entityType,
"cl",
new ClassType(TypeCategory.LIST, List.class, new ClassType(String.class)));
property.addAnnotation(new ElementCollectionImpl());
entityType.addProperty(property);

typeMappings.register(entityType, queryTypeFactory.create(entityType));

serializer.serialize(entityType, SimpleSerializerConfig.DEFAULT, new JavaWriter(writer));
Expand Down

0 comments on commit cac2efb

Please sign in to comment.