This is an automated email from the ASF dual-hosted git repository.
dbalek pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new 397927f84c Dbalek/micronaut class generator fixes (#6107)
397927f84c is described below
commit 397927f84cfc6af8bf0774ee3bf2239bd4601f3b
Author: Dusan Balek <[email protected]>
AuthorDate: Wed Jun 28 08:35:15 2023 +0200
Dbalek/micronaut class generator fixes (#6107)
* Primitive types should not be used as type parameters.
* Support for generating entities with PK classes.
---
.../modules/micronaut/db/Bundle.properties | 3 +
.../modules/micronaut/db/MicronautEntity.java | 219 ++++++++++++++++++---
.../modules/micronaut/db/MicronautRepository.java | 25 ++-
.../org/netbeans/modules/micronaut/db/Utils.java | 12 ++
4 files changed, 222 insertions(+), 37 deletions(-)
diff --git
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Bundle.properties
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Bundle.properties
index 823142b222..9363d7ff68 100644
---
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Bundle.properties
+++
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Bundle.properties
@@ -24,6 +24,9 @@ Templates/Micronaut/Repository=Micronaut Data Repository
Interfaces from Entitie
TXT_GeneratingClass=Generating the {0} entity class
# {0} = entity class name
MSG_Entity_Class=Entity class {0}\n
+# {0} = PK class name
+# {1} = entity class name
+MSG_PK_Class=Primary Key class {0} for entity class {1}\n
USG_PERSISTENCE_ENTITY_DB_CREATED={0} entity classes was generated from db
diff --git
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
index 95c224b8bc..264d8d6413 100644
---
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
+++
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautEntity.java
@@ -23,6 +23,7 @@ import com.sun.source.tree.ClassTree;
import com.sun.source.tree.ExpressionTree;
import com.sun.source.tree.MethodTree;
import com.sun.source.tree.Tree;
+import com.sun.source.tree.TypeParameterTree;
import com.sun.source.tree.VariableTree;
import java.io.IOException;
import java.sql.Connection;
@@ -33,6 +34,7 @@ import java.util.Collections;
import java.util.EnumSet;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -194,6 +196,7 @@ public class MicronautEntity extends RelatedCMPWizard {
private static class Generator extends JavaPersistenceGenerator {
private final Set<FileObject> generatedEntityFOs = new HashSet<>();
+ private final Set<FileObject> generatedFOs = new HashSet<>();
private final Map<String, String> replacedNames = new HashMap<>();
private final Map<String, String> replacedTypeNames = new HashMap<>();
private final Map<String, EntityClass> beanMap = new HashMap<>();
@@ -209,7 +212,7 @@ public class MicronautEntity extends RelatedCMPWizard {
doGenerateBeans(progressPanel, helper, progressContributor);
} catch (IOException e) {
Logger.getLogger(Generator.class.getName()).log(Level.INFO,
"IOException, remove generated."); //NOI18N
- for (FileObject generatedFO : generatedEntityFOs) {
+ for (FileObject generatedFO : generatedFOs) {
try {
generatedFO.delete();
} catch (IOException ioe) {}
@@ -224,6 +227,7 @@ public class MicronautEntity extends RelatedCMPWizard {
}
final boolean jpaSupported =
Utils.isJPASupported(helper.getLocation());
+ final boolean jakartaSupported =
Utils.isJakartaSupported(helper.getLocation());
final boolean beanValidationSupported =
isBeanValidationSupported(helper.getLocation());
EntityClass[] entityClasses = helper.getBeans();
@@ -236,6 +240,9 @@ public class MicronautEntity extends RelatedCMPWizard {
for (int i = 0; i < entityClasses.length; i++) {
final EntityClass entityClass = entityClasses[i];
+ if (entityClass.isForTable() && !entityClass.isUsePkField() &&
!jpaSupported && !jakartaSupported) {
+ throw new IOException("Cannot generate " +
entityClass.getClassName() + " class unless 'jakarta.persistence' or
'javax.persistence' is on the project classpath. Update the classpath and
invoke again.");
+ }
String entityClassName = entityClass.getClassName();
FileObject packageFileObject =
entityClass.getPackageFileObject();
beanMap.put(entityClassName, entityClass);
@@ -258,13 +265,30 @@ public class MicronautEntity extends RelatedCMPWizard {
FileObject oldPackage =
entityClass.getRootFolder().getFileObject(rel);
entity = oldPackage.getFileObject(entityClassName,
"java");
}
+ // NO PK classes for views
+ if (entityClass.isForTable() &&
!entityClass.isUsePkField()) {
+ String pkClassName =
createPKClassName(entityClassName);
+ FileObject pkFO =
packageFileObject.getFileObject(pkClassName, "java");
+ if (pkFO == null) { // NOI18N
+ String fqn =
this.getFQClassName(entityClass.getTableName());
+ int ind = fqn.lastIndexOf('.');
+ String pkg = ind > -1 ? fqn.substring(0, ind)
: "";
+ String rel = pkg.replaceAll("\\.", "/");
+ FileObject oldPackage =
entityClass.getRootFolder().getFileObject(rel);
+ pkFO = oldPackage.getFileObject(pkClassName,
"java");
+ }
+ if (pkFO != null) {
+ pkFO.delete();
+ }
+ }
entity.delete();
entity = null;
//fall through is expected
case NEW:
generatedEntityClasses.add(entityClassName);
try {
- String newName = entityClassName;
+ String pkMemberName = getPkMemberName(entityClass);
+ String newName = pkMemberName != null ?
Character.toUpperCase(pkMemberName.charAt(0)) + pkMemberName.substring(1) :
entityClassName;
int count = 1;
while (packageFileObject.getFileObject(newName,
"java") != null && count < 1000) {
newName = entityClassName + "_" + count;
@@ -285,7 +309,16 @@ public class MicronautEntity extends RelatedCMPWizard {
throw ex;
}
generatedEntityFOs.add(entity);
+ generatedFOs.add(entity);
generationPackageFOs.add(packageFileObject);
+ // NO PK classes for views
+ if (entityClass.isForTable() &&
!entityClass.isUsePkField()) {
+ String pkClassName =
createPKClassName(entityClassName);
+ if (packageFileObject.getFileObject(pkClassName,
"java") == null) { // NOI18N
+ FileObject pkClass =
GenerationUtils.createClass(packageFileObject, pkClassName,
NbBundle.getMessage(Generator.class, "MSG_PK_Class", pkClassName,
entityClassName));
+ generatedFOs.add(pkClass);
+ }
+ }
}
}
@@ -312,12 +345,23 @@ public class MicronautEntity extends RelatedCMPWizard {
if (progressPanel != null) {
progressPanel.setText(progressMsg);
}
- FileObject entityClassPackageFO =
entityClass.getPackageFileObject();
- FileObject entityClassFO = entityClassPackageFO.getFileObject(
entityClassName, "java"); // NOI18N
+ final FileObject entityClassPackageFO =
entityClass.getPackageFileObject();
+ final FileObject entityClassFO =
entityClassPackageFO.getFileObject( entityClassName, "java"); // NOI18N
+ final FileObject pkClassFO = (entityClass.isForTable() &&
!entityClass.isUsePkField()) ?
entityClassPackageFO.getFileObject(createPKClassName(entityClassName), "java")
: null; // NOI18N
try {
- JavaSource javaSource =
JavaSource.create(cpHelper.createClasspathInfo(), entityClassFO);
+ JavaSource javaSource = (pkClassFO != null &&
entityClass.getUpdateType() != UpdateType.UPDATE)
+ ?
JavaSource.create(cpHelper.createClasspathInfo(), entityClassFO, pkClassFO)
+ :
JavaSource.create(cpHelper.createClasspathInfo(), entityClassFO);
javaSource.runModificationTask(copy -> {
- new EntityClassGenerator(copy, entityClass,
jpaSupported, beanValidationSupported).run();
+ if (copy.getFileObject().equals(entityClassFO)) {
+ new EntityClassGenerator(copy, entityClass,
jpaSupported, jakartaSupported, beanValidationSupported).run();
+ } else {
+ if (entityClass.getUpdateType() !=
UpdateType.UPDATE) {
+ new PKClassGenerator(copy, entityClass,
jpaSupported, jakartaSupported, beanValidationSupported).run();
+ } else {
+
Logger.getLogger(Generator.class.getName()).log(Level.INFO, "PK Class update
isn't supported"); //NOI18N
+ }
+ }
}).commit();
} catch (IOException e) {
String message = e.getMessage();
@@ -332,6 +376,23 @@ public class MicronautEntity extends RelatedCMPWizard {
PersistenceUtils.logUsage(Generator.class,
"USG_PERSISTENCE_ENTITY_DB_CREATED", new Integer[]{entityClasses.length});
}
+ private static String getPkMemberName(EntityClass entityClass) {
+ if (entityClass != null) {
+ List<EntityMember> pks =
entityClass.getFields().stream().filter(f ->
f.isPrimaryKey()).collect(Collectors.toList());
+ if (pks.size() == 1) {
+ String memberName = pks.get(0).getMemberName();
+ if (memberName.length() > 2 && memberName.endsWith("Id")) {
+ return memberName.substring(0, memberName.length() -
2);
+ }
+ }
+ }
+ return null;
+ }
+
+ private static String createPKClassName(String entityClassName) {
+ return entityClassName + "PK"; // NOI18N
+ }
+
private String getClassName(EntityClass entityClass) {
return replacedNames.containsKey(entityClass.getClassName()) ?
replacedNames.get(entityClass.getClassName()) : entityClass.getClassName();
}
@@ -367,6 +428,12 @@ public class MicronautEntity extends RelatedCMPWizard {
protected final EntityClass entityClass;
// the mapping of the entity class to the database
protected final CMPMappingModel dbMappings;
+ // true if a primary key class needs to be generated along with
the entity class
+ protected final boolean needsPKClass;
+ // the simple class name of the primary key class
+ protected final String pkClassName;
+ // the fully-qualified name of the primary key class
+ protected final String pkFQClassName;
// generated properties
protected final List<Property> properties = new ArrayList<>();
// generated methods
@@ -383,18 +450,20 @@ public class MicronautEntity extends RelatedCMPWizard {
protected TypeElement typeElement;
// classTree's module
protected ModuleElement moduleElement;
- // the generating type like New, Update etc
- protected UpdateType updateType;
protected final boolean generateJPA;
+ protected final boolean jakartaSupported;
protected final boolean generateValidationConstraints;
- private ClassGenerator(WorkingCopy copy, EntityClass entityClass,
boolean jpaSupported, boolean beanValidationSupported) throws IOException {
+ private ClassGenerator(WorkingCopy copy, EntityClass entityClass,
boolean jpaSupported, boolean jakartaSupported, boolean
beanValidationSupported) throws IOException {
copy.toPhase(JavaSource.Phase.RESOLVED);
this.copy = copy;
this.entityClass = entityClass;
- this.updateType = entityClass.getUpdateType();
dbMappings = entityClass.getCMPMapping();
+ // NO PK for views
+ needsPKClass = entityClass.isForTable() &&
!entityClass.isUsePkField();
+ pkClassName = needsPKClass ?
createPKClassName(entityClass.getClassName()) : null;
+ pkFQClassName = entityClass.getPackage() + "." + pkClassName;
// NOI18N
typeElement = SourceUtils.getPublicTopLevelElement(copy);
if (typeElement == null) {
throw new IllegalStateException("Cannot find a public
top-level class named " + entityClass.getClassName() + // NOI18N
@@ -406,6 +475,7 @@ public class MicronautEntity extends RelatedCMPWizard {
newClassTree = originalClassTree;
genUtils = GenerationUtils.newInstance(copy);
generateJPA = jpaSupported;
+ this.jakartaSupported = jakartaSupported;
generateValidationConstraints = beanValidationSupported;
}
@@ -433,7 +503,7 @@ public class MicronautEntity extends RelatedCMPWizard {
List<AnnotationTree> annotations = new ArrayList<>();
//add @Id() only if not in an embeddable PK class
- if (isPKMember) {
+ if (isPKMember && !needsPKClass) {
annotations.add(genUtils.createAnnotation(generateJPA ?
"javax.persistence.Id" : "io.micronaut.data.annotation.Id")); // NOI18N
if (m.isAutoIncrement()) {
annotations.add(genUtils.createAnnotation(generateJPA
? "javax.persistence.GeneratedValue" :
"io.micronaut.data.annotation.GeneratedValue")); //NOI18N
@@ -473,8 +543,13 @@ public class MicronautEntity extends RelatedCMPWizard {
}
}
- if (!columnAnnArguments.isEmpty() && generateJPA) {
-
annotations.add(genUtils.createAnnotation("javax.persistence.Column",
columnAnnArguments)); //NOI18N
+ if (!columnAnnArguments.isEmpty()) {
+ if (generateJPA) {
+
annotations.add(genUtils.createAnnotation("javax.persistence.Column",
columnAnnArguments)); //NOI18N
+ }
+ if (isPKMember && needsPKClass && jakartaSupported) {
+
annotations.add(genUtils.createAnnotation("jakarta.persistence.Column",
columnAnnArguments)); //NOI18N
+ }
}
String temporalType = getMemberTemporalType(m);
@@ -486,6 +561,10 @@ public class MicronautEntity extends RelatedCMPWizard {
return new Property(Modifier.PRIVATE, annotations, memberType,
memberName);
}
+ protected VariableTree createVariable(EntityMember m) {
+ return genUtils.createVariable(typeElement, m.getMemberName(),
getMemberType(m));
+ }
+
String getMemberType(EntityMember m) {
String memberType = m.getMemberType();
if ("java.sql.Date".equals(memberType)) { //NOI18N
@@ -628,17 +707,29 @@ public class MicronautEntity extends RelatedCMPWizard {
private final List<Property> nonNullableProps = new ArrayList<>();
// the names of the primary key columns
private final List<String> pkColumnNames = new ArrayList<>();
+ // variables correspoding to the fields in the primary key classs
(or empty if no primary key class)
+ private final List<VariableTree> pkClassVariables = new
ArrayList<>();
private Property pkProperty;
private boolean pkGenerated;
- public EntityClassGenerator(WorkingCopy copy, EntityClass
entityClass, boolean jpaSupported, boolean beanValidationSupported) throws
IOException {
- super(copy, entityClass, jpaSupported,
beanValidationSupported);
+ public EntityClassGenerator(WorkingCopy copy, EntityClass
entityClass, boolean jpaSupported, boolean jakartaSupported, boolean
beanValidationSupported) throws IOException {
+ super(copy, entityClass, jpaSupported, jakartaSupported,
beanValidationSupported);
entityClassName = getClassName(entityClass);
assert
typeElement.getSimpleName().contentEquals(entityClassName);
}
@Override
protected void initialize() throws IOException {
+ newClassTree = genUtils.ensureNoArgConstructor(newClassTree);
+ if (needsPKClass) {
+ String pkFieldName = createFieldName(pkClassName);
+ pkProperty = new Property(
+ Modifier.PROTECTED,
+
Collections.singletonList(genUtils.createAnnotation(generateJPA ?
"javax.persistence.EmbeddedId" : "io.micronaut.data.annotation.EmbeddedId")),
// NOI18N
+ pkFQClassName,
+ pkFieldName);
+ properties.add(pkProperty);
+ }
if (generateJPA) {
newClassTree = genUtils.addAnnotation(newClassTree,
genUtils.createAnnotation("javax.persistence.Entity")); //NOI18N
if (dbMappings.getTableName() != null &&
!entityClassName.equalsIgnoreCase(dbMappings.getTableName())) {
@@ -658,9 +749,13 @@ public class MicronautEntity extends RelatedCMPWizard {
//skip generating already exist members for UPDATE type
String memberName = m.getMemberName();
boolean isPKMember = m.isPrimaryKey();
- Property property;
+ Property property = null;
if (isPKMember) {
- pkProperty = property = createProperty(m);
+ if (needsPKClass) {
+ pkClassVariables.add(createVariable(m));
+ } else {
+ pkProperty = property = createProperty(m);
+ }
String pkColumnName =
dbMappings.getCMPFieldMapping().get(memberName);
pkColumnNames.add(pkColumnName);
pkGenerated = m.isAutoIncrement();
@@ -670,15 +765,20 @@ public class MicronautEntity extends RelatedCMPWizard {
nonNullableProps.add(property);
}
}
- properties.add(property);
+ assert (property != null) || (property == null && isPKMember
&& needsPKClass);
+ if (property != null) {
+ properties.add(property);
+ }
}
@Override
protected void generateRelationship(RelationshipRole role) throws
IOException {
String memberName = role.getFieldName();
- if (memberName.endsWith("Collection")) { // NOI18N
- memberName = memberName.substring(0, memberName.length() -
10);
- memberName += memberName.endsWith("s") ? "es" : "s"; //
NOI18N
+ if (role.isMany() && !role.isToMany()) {
+ String pkMemberName =
getPkMemberName(beanMap.get(role.getParent().getRoleB().getEntityName()));
+ if (pkMemberName != null) {
+ memberName = pkMemberName;
+ }
}
String typeName = getRelationshipFieldType(role,
entityClass.getPackage());
if(replacedTypeNames.containsKey(typeName)) {
@@ -776,17 +876,41 @@ public class MicronautEntity extends RelatedCMPWizard {
@Override
protected void finish() {
- // create a constructor which takes all non-nullable
non-relationship fields as args
- if (nonNullableProps.size() > 0) {
- List<VariableTree> nonNullableParams = new
ArrayList<>(nonNullableProps.size() + 1);
- if (pkProperty != null && !pkGenerated) {
- VariableTree pkFieldParam =
genUtils.removeModifiers(pkProperty.getField());
+ if (pkProperty != null && !pkGenerated) {
+ // create a constructor which takes the primary key field
as argument
+ VariableTree pkFieldParam =
genUtils.removeModifiers(pkProperty.getField());
+ List<VariableTree> pkFieldParams =
Collections.singletonList(pkFieldParam);
+
constructors.add(genUtils.createAssignmentConstructor(genUtils.createModifiers(Modifier.PUBLIC),
entityClassName, pkFieldParams));
+
+ // if different than pk fields constructor, add constructor
+ // which takes all non-nullable non-relationship fields as
args
+ if (!nonNullableProps.isEmpty()) {
+ List<VariableTree> nonNullableParams = new
ArrayList<>(nonNullableProps.size() + 1);
nonNullableParams.add(pkFieldParam);
+ for (Property property : nonNullableProps) {
+
nonNullableParams.add(genUtils.removeModifiers(property.getField()));
+ }
+
constructors.add(genUtils.createAssignmentConstructor(genUtils.createModifiers(Modifier.PUBLIC),
entityClassName, nonNullableParams));
}
- for (Property property : nonNullableProps) {
-
nonNullableParams.add(genUtils.removeModifiers(property.getField()));
+
+ // create a constructor which takes the fields of the
primary key class as arguments
+ if (!pkClassVariables.isEmpty()) {
+ StringBuilder body = new StringBuilder(30 + 30 *
pkClassVariables.size());
+ body.append("{"); // NOI18N
+ body.append("this." + pkProperty.getField().getName()
+ " = new " + pkClassName + "("); // NOI18N
+ for (Iterator<VariableTree> i =
pkClassVariables.iterator(); i.hasNext();) {
+ body.append(i.next().getName());
+ body.append(i.hasNext() ? ", " : ");"); // NOI18N
+ }
+ body.append("}"); // NOI18N
+ TreeMaker make = copy.getTreeMaker();
+ constructors.add(make.Constructor(
+ make.Modifiers(EnumSet.of(Modifier.PUBLIC),
Collections.<AnnotationTree>emptyList()),
+ Collections.<TypeParameterTree>emptyList(),
+ pkClassVariables,
+ Collections.<ExpressionTree>emptyList(),
+ body.toString()));
}
-
constructors.add(genUtils.createAssignmentConstructor(genUtils.createModifiers(Modifier.PUBLIC),
entityClassName, nonNullableParams));
}
}
@@ -827,5 +951,42 @@ public class MicronautEntity extends RelatedCMPWizard {
}
}
}
+
+ private final class PKClassGenerator extends ClassGenerator {
+
+ public PKClassGenerator(WorkingCopy copy, EntityClass entityClass,
boolean jpaSupported, boolean jakartaSupported, boolean
beanValidationSupported) throws IOException {
+ super(copy, entityClass, jpaSupported, jakartaSupported,
beanValidationSupported);
+ }
+
+ @Override
+ protected void initialize() throws IOException {
+ newClassTree = genUtils.ensureNoArgConstructor(newClassTree);
+ newClassTree = genUtils.addAnnotation(newClassTree,
genUtils.createAnnotation(generateJPA ? "javax.persistence.Embeddable" :
"io.micronaut.data.annotation.Embeddable")); // NOI18N
+ }
+
+ @Override
+ protected void generateMember(EntityMember m) throws IOException {
+ if (!m.isPrimaryKey()) {
+ return;
+ }
+ Property property = createProperty(m);
+ properties.add(property);
+ }
+
+ @Override
+ protected void generateRelationship(RelationshipRole relationship)
{
+ }
+
+ @Override
+ protected void finish() {
+ // add a constructor which takes the fields of the primary key
class as arguments
+ List<VariableTree> parameters = new
ArrayList<>(properties.size());
+ for (Property property : properties) {
+
parameters.add(genUtils.removeModifiers(property.getField()));
+ }
+
constructors.add(genUtils.createAssignmentConstructor(genUtils.createModifiers(Modifier.PUBLIC),
pkClassName, parameters));
+ }
+ }
+
}
}
diff --git
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautRepository.java
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautRepository.java
index 3bb9c8ce1e..4f3c6b6797 100644
---
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautRepository.java
+++
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/MicronautRepository.java
@@ -27,6 +27,7 @@ import com.sun.source.tree.ParameterizedTypeTree;
import com.sun.source.tree.Tree;
import com.sun.source.tree.TypeParameterTree;
import com.sun.source.tree.VariableTree;
+import com.sun.source.util.TreePath;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
@@ -43,6 +44,8 @@ import java.util.Set;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
+import javax.lang.model.type.PrimitiveType;
+import javax.lang.model.type.TypeMirror;
import javax.lang.model.util.ElementFilter;
import javax.swing.event.ChangeListener;
import org.netbeans.api.db.explorer.ConnectionManager;
@@ -244,7 +247,10 @@ public class MicronautRepository implements
TemplateWizard.Iterator {
js.runWhenScanFinished(cc -> {
TypeElement typeElement =
cc.getElements().getTypeElement(jpaSupported ? "javax.persistence.Entity" :
"io.micronaut.data.annotation.MappedEntity"); //NOI18N
if (typeElement != null) {
- TypeElement idTypeElement =
cc.getElements().getTypeElement(jpaSupported ? "javax.persistence.Id" :
"io.micronaut.data.annotation.Id"); //NOI18N
+ TypeElement[] idTypeElements = new TypeElement[] {
+ cc.getElements().getTypeElement(jpaSupported ?
"javax.persistence.Id" : "io.micronaut.data.annotation.Id"), //NOI18N
+ cc.getElements().getTypeElement(jpaSupported ?
"javax.persistence.EmbeddedId" : "io.micronaut.data.annotation.EmbeddedId")
//NOI18N
+ };
Set<ElementHandle<TypeElement>> elementHandles =
cc.getClasspathInfo().getClassIndex().getElements(ElementHandle.create(typeElement),
EnumSet.of(ClassIndex.SearchKind.TYPE_REFERENCES),
EnumSet.of(ClassIndex.SearchScope.SOURCE));
for (ElementHandle<TypeElement> elementHandle :
elementHandles) {
TypeElement type = elementHandle.resolve(cc);
@@ -257,12 +263,14 @@ public class MicronautRepository implements
TemplateWizard.Iterator {
}
}
if (fqn != null) {
- if (idTypeElement != null) {
- for (VariableElement field :
ElementFilter.fieldsIn(type.getEnclosedElements())) {
- if (idType == null) {
- for (AnnotationMirror
annotationMirror : field.getAnnotationMirrors()) {
- if (idType == null &&
idTypeElement == annotationMirror.getAnnotationType().asElement()) {
- idType =
cc.getTypeUtilities().getTypeName(field.asType(),
TypeUtilities.TypeNameOptions.PRINT_FQN).toString();
+ for (TypeElement idTypeElement :
idTypeElements) {
+ if (idTypeElement != null) {
+ for (VariableElement field :
ElementFilter.fieldsIn(type.getEnclosedElements())) {
+ if (idType == null) {
+ for (AnnotationMirror
annotationMirror : field.getAnnotationMirrors()) {
+ if (idType == null &&
idTypeElement == annotationMirror.getAnnotationType().asElement()) {
+ idType =
cc.getTypeUtilities().getTypeName(field.asType(),
TypeUtilities.TypeNameOptions.PRINT_FQN).toString();
+ }
}
}
}
@@ -328,7 +336,8 @@ public class MicronautRepository implements
TemplateWizard.Iterator {
if (origTree.getKind() == Tree.Kind.INTERFACE) {
GenerationUtils gu =
GenerationUtils.newInstance(copy);
TreeMaker tm = copy.getTreeMaker();
- List<ExpressionTree> args =
Arrays.asList(tm.QualIdent(entityFQN), tm.QualIdent(entityIdType));
+ TypeMirror entityIdTM =
copy.getTreeUtilities().parseType(entityIdType, (TypeElement)
copy.getTrees().getElement(new TreePath(new
TreePath(copy.getCompilationUnit()), origTree)));
+ List<ExpressionTree> args =
Arrays.asList(tm.QualIdent(entityFQN), entityIdTM != null &&
entityIdTM.getKind().isPrimitive() ?
tm.QualIdent(copy.getTypes().boxedClass((PrimitiveType) entityIdTM)) :
tm.QualIdent(entityIdType));
ParameterizedTypeTree type =
tm.ParameterizedType(tm.QualIdent("io.micronaut.data.repository.CrudRepository"),
args); //NOI18N
ClassTree cls =
tm.addClassImplementsClause((ClassTree) origTree, type);
if (dialect == null) {
diff --git
a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Utils.java
b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Utils.java
index 4e3e08fbd7..773b7b2627 100644
--- a/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Utils.java
+++ b/enterprise/micronaut/src/org/netbeans/modules/micronaut/db/Utils.java
@@ -38,4 +38,16 @@ public class Utils {
final String notNullAnnotation =
"io.micronaut.data.jpa.repository.JpaRepository"; //NOI18N
return compile.findResource(notNullAnnotation.replace('.', '/') +
".class") != null; //NOI18N
}
+
+ public static boolean isJakartaSupported(SourceGroup sg) {
+ if (sg == null) {
+ return false;
+ }
+ ClassPath compile = ClassPath.getClassPath(sg.getRootFolder(),
ClassPath.COMPILE);
+ if (compile == null) {
+ return false;
+ }
+ final String notNullAnnotation = "jakarta.persistence.Persistence";
//NOI18N
+ return compile.findResource(notNullAnnotation.replace('.', '/') +
".class") != null; //NOI18N
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists