From 3f674257274701e27bdadfd074fe186cf9625a48 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Wed, 29 Nov 2023 00:46:56 +1300 Subject: [PATCH] QueryBean generation - conditionally fully qualify the property types If there is an entity bean short name clash like PString, PLong, etc then fully qualify all the property types in the generated code, otherwise use imports for the property types. --- .../test/java/org/example/domain/PFile.java | 12 +++++++ .../test/java/org/example/domain/PLong.java | 12 +++++++ .../java/org/example/domain/Pinstant.java | 12 +++++++ .../generator/ProcessingContext.java | 4 +++ .../querybean/generator/PropertyMeta.java | 12 +++---- .../querybean/generator/PropertyType.java | 33 ++++++++++++++----- .../generator/PropertyTypeArray.java | 12 +++---- .../generator/PropertyTypeAssoc.java | 4 +-- .../querybean/generator/PropertyTypeEnum.java | 12 +++---- .../querybean/generator/PropertyTypeMap.java | 21 +++++++----- .../generator/PropertyTypeScalar.java | 13 ++++---- .../generator/SimpleQueryBeanWriter.java | 10 +++--- 12 files changed, 108 insertions(+), 49 deletions(-) create mode 100644 ebean-querybean/src/test/java/org/example/domain/PFile.java create mode 100644 ebean-querybean/src/test/java/org/example/domain/PLong.java create mode 100644 ebean-querybean/src/test/java/org/example/domain/Pinstant.java diff --git a/ebean-querybean/src/test/java/org/example/domain/PFile.java b/ebean-querybean/src/test/java/org/example/domain/PFile.java new file mode 100644 index 000000000..63b5ef1bf --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/PFile.java @@ -0,0 +1,12 @@ +package org.example.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class PFile { + + @Id + long id; + String name; +} diff --git a/ebean-querybean/src/test/java/org/example/domain/PLong.java b/ebean-querybean/src/test/java/org/example/domain/PLong.java new file mode 100644 index 000000000..7df62ba00 --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/PLong.java @@ -0,0 +1,12 @@ +package org.example.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class PLong { + + @Id + long id; + String name; +} diff --git a/ebean-querybean/src/test/java/org/example/domain/Pinstant.java b/ebean-querybean/src/test/java/org/example/domain/Pinstant.java new file mode 100644 index 000000000..0f4b210fa --- /dev/null +++ b/ebean-querybean/src/test/java/org/example/domain/Pinstant.java @@ -0,0 +1,12 @@ +package org.example.domain; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class Pinstant { + + @Id + long id; + String name; +} diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java index 250323f5e..9a5bfb2cb 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/ProcessingContext.java @@ -547,4 +547,8 @@ class ProcessingContext implements Constants { Element asElement(TypeMirror mirror) { return typeUtils.asElement(mirror); } + + boolean isNameClash(String shortName) { + return propertyTypeMap.isNameClash(shortName); + } } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyMeta.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyMeta.java index 33ae06697..4596fcd5c 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyMeta.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyMeta.java @@ -26,19 +26,19 @@ class PropertyMeta { /** * Return the type definition given the type short name and flag indicating if it is an associated bean type. */ - private String getTypeDefn(String shortName, boolean assoc) { - return type.getTypeDefn(shortName, assoc); + private String getTypeDefn(String shortName, boolean assoc, boolean fullyQualify) { + return type.getTypeDefn(shortName, assoc, fullyQualify); } - void writeFieldDefn(Append writer, String shortName, boolean assoc) { + void writeFieldDefn(Append writer, String shortName, boolean assoc, boolean fullyQualify) { writer.append(" public "); - writer.append(getTypeDefn(shortName, assoc)); + writer.append(getTypeDefn(shortName, assoc, fullyQualify)); writer.append(" ").append(name).append(";"); } - void writeFieldAliasDefn(Append writer, String shortName) { + void writeFieldAliasDefn(Append writer, String shortName, boolean fullyQualify) { writer.append(" public static "); - writer.append(getTypeDefn(shortName, false)); + writer.append(getTypeDefn(shortName, false, fullyQualify)); writer.append(" ").append(name).append(" = _alias.").append(name).append(";"); } } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyType.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyType.java index f22595187..0073903c4 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyType.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyType.java @@ -11,12 +11,23 @@ class PropertyType { * The property type className or primitive short name. */ final String propertyType; + final String pkg; /** * Construct with a className of primitive name for the type. */ PropertyType(String propertyType) { this.propertyType = propertyType; + this.pkg = "io.ebean.typequery."; + } + + PropertyType(String propertyType, String pkg) { + this.propertyType = propertyType; + this.pkg = pkg; + } + + String propertyType() { + return propertyType; } @Override @@ -27,24 +38,28 @@ class PropertyType { /** * Return the type definition for this property. * - * @param shortName The short name of the property type - * @param assoc flag set to true if the property is on an association bean + * @param shortName The short name of the property type + * @param assoc flag set to true if the property is on an association bean + * @param fullyQualify flag set to fully qualify the type */ - String getTypeDefn(String shortName, boolean assoc) { + String getTypeDefn(String shortName, boolean assoc, boolean fullyQualify) { + String q = fullyQualify ? pkg : ""; if (assoc) { - // PLong - return propertyType + ""; + // PLong + return q + propertyType + ""; } else { - // PLong - return propertyType + ""; + // PLong + return q + propertyType + ""; } } /** * Add any required imports for this property to the allImports set. */ - void addImports(Set allImports) { - allImports.add("io.ebean.typequery." + propertyType); + void addImports(Set allImports, boolean fullyQualify) { + if (!fullyQualify) { + allImports.add(pkg + propertyType); + } } } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeArray.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeArray.java index 3b9b29095..5eb83a251 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeArray.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeArray.java @@ -19,18 +19,18 @@ class PropertyTypeArray extends PropertyType { } @Override - String getTypeDefn(String shortName, boolean assoc) { + String getTypeDefn(String shortName, boolean assoc, boolean fullyQualify) { + String q = fullyQualify ? pkg : ""; if (assoc) { - return "PArray"; - + return q + "PArray"; } else { - return "PArray"; + return q + "PArray"; } } @Override - void addImports(Set allImports) { - super.addImports(allImports); + void addImports(Set allImports, boolean fullyQualify) { + super.addImports(allImports, fullyQualify); allImports.add(elementClass); } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeAssoc.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeAssoc.java index 321ba40e4..a6695f34f 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeAssoc.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeAssoc.java @@ -16,7 +16,7 @@ class PropertyTypeAssoc extends PropertyType { * @param importName the import for the Assoc bean. */ PropertyTypeAssoc(String qAssocTypeName, String importName) { - super(qAssocTypeName); + super(qAssocTypeName, ""); this.importName = importName; } @@ -24,7 +24,7 @@ class PropertyTypeAssoc extends PropertyType { * All required imports to the allImports set. */ @Override - void addImports(Set allImports) { + void addImports(Set allImports, boolean fullyQualify) { allImports.add(importName); } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeEnum.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeEnum.java index 63753e35f..c9f527c63 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeEnum.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeEnum.java @@ -19,18 +19,18 @@ class PropertyTypeEnum extends PropertyType { } @Override - String getTypeDefn(String shortName, boolean assoc) { + String getTypeDefn(String shortName, boolean assoc, boolean fullyQualify) { + String q = fullyQualify ? pkg : ""; if (assoc) { - return "PEnum"; - + return q + "PEnum"; } else { - return "PEnum"; + return q + "PEnum"; } } @Override - void addImports(Set allImports) { - super.addImports(allImports); + void addImports(Set allImports, boolean fullyQualify) { + super.addImports(allImports, fullyQualify); allImports.add(enumClass); } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java index 848f37791..74bdb9547 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeMap.java @@ -7,13 +7,8 @@ import java.net.InetAddress; import java.net.URI; import java.net.URL; import java.sql.Timestamp; -import java.util.Calendar; -import java.util.Currency; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.TimeZone; -import java.util.UUID; +import java.util.*; +import java.util.stream.Collectors; /** * Holds the Property types and how they match to class types. @@ -25,7 +20,9 @@ class PropertyTypeMap { */ private final PropertyType dbJsonType = new PropertyType("PJson"); - private final Map map = new HashMap<>(); + private final Map map = new HashMap<>(); + + private final Set propertyNames; PropertyTypeMap() { map.put("boolean", new PropertyType("PBoolean")); @@ -64,11 +61,17 @@ class PropertyTypeMap { map.put("io.ebean.types.Cidr", new PropertyType("PCidr")); addJava8Types(); addJodaTypes(); + + propertyNames = map.values().stream().map(PropertyType::propertyType).collect(Collectors.toSet()); + } + + boolean isNameClash(String name) { + return propertyNames.contains(name); } private void addType(Class cls) { String simpleName = cls.getSimpleName(); - map.put(cls.getName(), new PropertyType("P"+simpleName)); + map.put(cls.getName(), new PropertyType("P" + simpleName)); } private void addJava8Types() { diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeScalar.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeScalar.java index dac7ea671..87bccd705 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeScalar.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/PropertyTypeScalar.java @@ -24,21 +24,20 @@ class PropertyTypeScalar extends PropertyType { protected PropertyTypeScalar(String propertyType, String attributeClass) { super(propertyType); - final Entry> signature = Split.genericsSplit(attributeClass); - this.attributeCompleteSignature = signature.getKey(); this.assocImports = signature.getValue(); } @Override - String getTypeDefn(String shortName, boolean assoc) { + String getTypeDefn(String shortName, boolean assoc, boolean fullyQualify) { + String q = fullyQualify ? pkg : ""; if (assoc) { // PScalarType - return propertyType + ""; + return q + propertyType + ""; } else { // PScalarType - return propertyType + ""; + return q + propertyType + ""; } } @@ -46,8 +45,8 @@ class PropertyTypeScalar extends PropertyType { * All required imports to the allImports set. */ @Override - void addImports(Set allImports) { - super.addImports(allImports); + void addImports(Set allImports, boolean fullyQualify) { + super.addImports(allImports, fullyQualify); allImports.addAll(assocImports); } } diff --git a/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java b/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java index 3ccd4db0e..91d5b906e 100644 --- a/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java +++ b/querybean-generator/src/main/java/io/ebean/querybean/generator/SimpleQueryBeanWriter.java @@ -33,6 +33,7 @@ class SimpleQueryBeanWriter { private String shortName; private final String shortInnerName; private final String origShortName; + private final boolean fullyQualify; private Append writer; SimpleQueryBeanWriter(TypeElement element, ProcessingContext processingContext) { @@ -49,6 +50,7 @@ class SimpleQueryBeanWriter { this.embeddable = processingContext.isEmbeddable(element); this.dbName = findDbName(); this.implementsInterface = initInterface(element); + this.fullyQualify = processingContext.isNameClash(shortName); } private TypeElement initInterface(TypeElement element) { @@ -97,7 +99,7 @@ class SimpleQueryBeanWriter { for (VariableElement field : processingContext.allFields(element)) { PropertyType type = processingContext.getPropertyType(field); if (type != null) { - type.addImports(importTypes); + type.addImports(importTypes, fullyQualify); properties.add(new PropertyMeta(field.getSimpleName().toString(), type)); } } @@ -206,7 +208,7 @@ class SimpleQueryBeanWriter { */ private void writeFields() { for (PropertyMeta property : properties) { - property.writeFieldDefn(writer, shortName, false); + property.writeFieldDefn(writer, shortName, false, fullyQualify); writer.eol(); } writer.eol(); @@ -250,7 +252,7 @@ class SimpleQueryBeanWriter { writer.append(" ").append(Constants.AT_GENERATED).eol(); writer.append(" public static final class Alias {").eol(); for (PropertyMeta property : properties) { - property.writeFieldAliasDefn(writer, shortName); + property.writeFieldAliasDefn(writer, shortName, fullyQualify); writer.eol(); } writer.append(" }").eol(); @@ -268,7 +270,7 @@ class SimpleQueryBeanWriter { } for (PropertyMeta property : properties) { writer.append(" "); - property.writeFieldDefn(writer, shortName, true); + property.writeFieldDefn(writer, shortName, true, fullyQualify); writer.eol(); } writer.eol();