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();