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

Reply via email to