From 795f2831148f3804be7572c4c4ed3198f4813ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Bl=C3=A4sing?= Date: Fri, 16 Feb 2024 22:09:28 +0100 Subject: [PATCH] Fix detection of support for generation session beans from entity classes and support jakarta package names Closes: #7066 --- .../jpa/dao/AppServerValidationPanel.java | 4 +- .../jpa/dao/EjbFacadeWizardIterator.java | 33 +++- .../wizard/jpa/dao/EjbFacadeWizardPanel2.java | 19 +- .../ejb/action/AbstractAddMethodStrategy.java | 44 +++-- .../ejb/action/AddBusinessMethodStrategy.java | 2 +- .../ejb/action/AddCreateMethodStrategy.java | 4 +- .../ejb/action/AddFinderMethodStrategy.java | 8 +- .../ejb/action/AddHomeMethodStrategy.java | 2 +- .../ejb/action/AddSelectMethodStrategy.java | 4 +- .../ejb/shared/ComponentMethodModel.java | 6 +- .../ui/logicalview/ejb/shared/MethodNode.java | 6 +- .../ContainerManagedJTAInjectableInWeb.java | 2 +- ...ntityManagerGenerationStrategySupport.java | 184 +++++++++++++++--- 13 files changed, 238 insertions(+), 80 deletions(-) diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/AppServerValidationPanel.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/AppServerValidationPanel.java index e6ff0b5e7272..8939f597c6a1 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/AppServerValidationPanel.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/AppServerValidationPanel.java @@ -89,10 +89,10 @@ private static boolean isSessionBeanCodeGenerationAlowed(Project project) { ClassPath classpath = ClassPath.getClassPath(project.getProjectDirectory(), ClassPath.COMPILE); return !(classpath.findResource("jakarta/ejb/Stateless.class") == null //NOI18N || classpath.findResource("jakarta/ejb/Stateful.class") == null //NOI18N - || classpath.findResource("jakarta/ejb/Singleton.class") == null //NOI18N + || classpath.findResource("jakarta/ejb/Singleton.class") == null) //NOI18N || //NOI18N !(classpath.findResource("javax/ejb/Stateless.class") == null //NOI18N || classpath.findResource("javax/ejb/Stateful.class") == null //NOI18N - || classpath.findResource("javax/ejb/Singleton.class") == null)); //NOI18N + || classpath.findResource("javax/ejb/Singleton.class") == null); //NOI18N } } diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardIterator.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardIterator.java index 0758eaf6dbb1..85d87cf97cb8 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardIterator.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardIterator.java @@ -117,8 +117,11 @@ public final class EjbFacadeWizardIterator implements WizardDescriptor.ProgressI private static final String FACADE_REMOTE_SUFFIX = FACADE_SUFFIX + "Remote"; //NOI18N private static final String FACADE_LOCAL_SUFFIX = FACADE_SUFFIX + "Local"; //NOI18N private static final String EJB_LOCAL = "javax.ejb.Local"; //NOI18N + private static final String EJB_LOCAL_JAKARTA = "jakarta.ejb.Local"; //NOI18N private static final String EJB_REMOTE = "javax.ejb.Remote"; //NOI18N + private static final String EJB_REMOTE_JAKARTA = "jakarta.ejb.Remote"; //NOI18N protected static final String EJB_STATELESS = "javax.ejb.Stateless"; //NOI18N + protected static final String EJB_STATELESS_JAKARTA = "jakarta.ejb.Stateless"; //NOI18N private int index; private WizardDescriptor wizard; @@ -232,6 +235,16 @@ Set generate(final Project project, final FileObject targetFolder, f final String entitySimpleName = JavaIdentifiers.unqualify(entityFQN); final String variableName = entitySimpleName.toLowerCase().charAt(0) + entitySimpleName.substring(1); + final boolean jakartaVariant; + final ClassPath targetClassPath = ClassPath.getClassPath(targetFolder, ClassPath.COMPILE); + if (targetClassPath != null) { + final FileObject javaxStatelessFo = targetClassPath.findResource(EJB_STATELESS.replace(".", "/") + ".class"); + final FileObject jakartaStatelessFo = targetClassPath.findResource(EJB_STATELESS_JAKARTA.replace(".", "/") + ".class"); + jakartaVariant = javaxStatelessFo == null || jakartaStatelessFo != null; + } else { + jakartaVariant = true; + } + //create the abstract facade class Task waiter = null; final String afName = pkg.isEmpty() ? FACADE_ABSTRACT : pkg + "." + FACADE_ABSTRACT; //NOI18N @@ -253,7 +266,7 @@ public void run(WorkingCopy workingCopy) throws Exception { TypeElement classElement = (TypeElement)workingCopy.getTrees().getElement(classTreePath); String genericsTypeName = "T"; //NOI18N - List methodOptions = getAbstractFacadeMethodOptions(genericsTypeName, "entity"); //NOI18N + List methodOptions = getAbstractFacadeMethodOptions(genericsTypeName, "entity", jakartaVariant); //NOI18N List members = new ArrayList(); String entityClassVar = "entityClass"; //NOI18N Tree classObjectTree = genUtils.createType("java.lang.Class<" + genericsTypeName + ">", classElement); //NOI18N @@ -333,7 +346,7 @@ public void run(CompilationController cc) throws Exception { // generate methods for the facade EntityManagerGenerator generator = new EntityManagerGenerator(facade, entityFQN); - List methodOptions = getMethodOptions(entityFQN, variableName); + List methodOptions = getMethodOptions(entityFQN, variableName, jakartaVariant); for (GenerationOptions each : methodOptions){ generator.generate(each, strategyClass); } @@ -342,12 +355,12 @@ public void run(CompilationController cc) throws Exception { final String localInterfaceFQN = pkg + "." + getUniqueClassName(entitySimpleName + FACADE_LOCAL_SUFFIX, targetFolder); final String remoteInterfaceFQN = pkg + "." + getUniqueClassName(entitySimpleName + FACADE_REMOTE_SUFFIX, targetFolder); - List intfOptions = getAbstractFacadeMethodOptions(entityFQN, variableName); + List intfOptions = getAbstractFacadeMethodOptions(entityFQN, variableName, jakartaVariant); if (hasLocal) { final SourceGroup[] groups = ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); String simpleName = JavaIdentifiers.unqualify(localInterfaceFQN); if (!interfaceExists(groups, pkg, simpleName)) { - FileObject local = createInterface(simpleName, EJB_LOCAL, targetFolder); + FileObject local = createInterface(simpleName, jakartaVariant ? EJB_LOCAL_JAKARTA : EJB_LOCAL, targetFolder); addMethodToInterface(intfOptions, local); createdFiles.add(local); } @@ -357,7 +370,7 @@ public void run(CompilationController cc) throws Exception { String simpleName = JavaIdentifiers.unqualify(remoteInterfaceFQN); if (!interfaceExists(groups, pkg, simpleName)) { FileObject remotePackage = SessionGenerator.createRemoteInterfacePackage(remoteProject, pkg, targetFolder); - FileObject remote = createInterface(simpleName, EJB_REMOTE, remotePackage); + FileObject remote = createInterface(simpleName, jakartaVariant ? EJB_REMOTE_JAKARTA : EJB_REMOTE, remotePackage); addMethodToInterface(intfOptions, remote); createdFiles.add(remote); if (entityProject != null && !entityProject.getProjectDirectory().equals(remoteProject.getProjectDirectory())) { @@ -434,7 +447,7 @@ public void run(WorkingCopy wc) throws Exception { DeclaredType declaredType = wc.getTypes().getDeclaredType(abstactFacadeElement, entityElement.asType()); Tree extendsClause = maker.Type(declaredType); ClassTree newClassTree = maker.Class( - maker.addModifiersAnnotation(classTree.getModifiers(), genUtils.createAnnotation(EJB_STATELESS)), + maker.addModifiersAnnotation(classTree.getModifiers(), genUtils.createAnnotation(jakartaVariant ? EJB_STATELESS_JAKARTA : EJB_STATELESS)), classTree.getSimpleName(), classTree.getTypeParameters(), extendsClause, @@ -476,24 +489,24 @@ public void run(WorkingCopy wc) throws Exception { * @return the options representing the methods for a facade, i.e. create/edit/ * find/remove/findAll. */ - private List getMethodOptions(String entityFQN, String variableName){ + private List getMethodOptions(String entityFQN, String variableName, boolean jakartaVariant){ GenerationOptions getEMOptions = new GenerationOptions(); getEMOptions.setAnnotation("java.lang.Override"); //NOI18N getEMOptions.setMethodName("getEntityManager"); //NOI18N getEMOptions.setOperation(GenerationOptions.Operation.GET_EM); - getEMOptions.setReturnType("javax.persistence.EntityManager");//NOI18N + getEMOptions.setReturnType(jakartaVariant ? "jakarta.persistence.EntityManager" : "javax.persistence.EntityManager");//NOI18N getEMOptions.setModifiers(EnumSet.of(Modifier.PROTECTED)); return Arrays.asList(getEMOptions); } - private List getAbstractFacadeMethodOptions(String entityFQN, String variableName){ + private List getAbstractFacadeMethodOptions(String entityFQN, String variableName, boolean jakartaVariant){ //abstract methods GenerationOptions getEMOptions = new GenerationOptions(); getEMOptions.setMethodName("getEntityManager"); //NOI18N - getEMOptions.setReturnType("javax.persistence.EntityManager");//NOI18N + getEMOptions.setReturnType(jakartaVariant ? "jakarta.persistence.EntityManager" : "javax.persistence.EntityManager");//NOI18N getEMOptions.setModifiers(EnumSet.of(Modifier.PROTECTED, Modifier.ABSTRACT)); //implemented methods diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardPanel2.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardPanel2.java index 4cd7cda32307..0d178cda0c6b 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardPanel2.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ejb/wizard/jpa/dao/EjbFacadeWizardPanel2.java @@ -45,6 +45,9 @@ import org.openide.util.NbBundle; import org.openide.util.Utilities; +import static org.netbeans.modules.j2ee.ejbcore.ejb.wizard.jpa.dao.EjbFacadeWizardIterator.EJB_STATELESS; +import static org.netbeans.modules.j2ee.ejbcore.ejb.wizard.jpa.dao.EjbFacadeWizardIterator.EJB_STATELESS_JAKARTA; + public class EjbFacadeWizardPanel2 implements WizardDescriptor.Panel, ChangeListener { /** @@ -120,8 +123,11 @@ public boolean isValid() { } if (!statelessIfaceOnProjectCP()) { wizardDescriptor.putProperty(WizardDescriptor.PROP_ERROR_MESSAGE, - NbBundle.getMessage(EjbFacadeWizardPanel2.class, "ERR_SessionIfaceNotOnProjectClasspath", //NOI18N - EjbFacadeWizardIterator.EJB_STATELESS)); + NbBundle.getMessage( + EjbFacadeWizardPanel2.class, + "ERR_SessionIfaceNotOnProjectClasspath", //NOI18N + EJB_STATELESS_JAKARTA + "/" + EJB_STATELESS_JAKARTA //NOI18N + )); return false; } @@ -231,13 +237,12 @@ public Project getEntityProject() { private boolean statelessIfaceOnProjectCP() { ClassPath cp = ClassPath.getClassPath(project.getProjectDirectory(), ClassPath.COMPILE); - ClassLoader cl = cp.getClassLoader(true); - try { - Class.forName(EjbFacadeWizardIterator.EJB_STATELESS, false, cl); - } catch (ClassNotFoundException cnfe) { + if(cp == null) { return false; } - return true; + FileObject javaxStatelessFo = cp.findResource(EJB_STATELESS.replace(".", "/") + ".class"); + FileObject jakartaStatelessFo = cp.findResource(EJB_STATELESS_JAKARTA.replace(".", "/") + ".class"); + return javaxStatelessFo != null || jakartaStatelessFo != null; } private static boolean isValidPackageName(String str) { diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AbstractAddMethodStrategy.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AbstractAddMethodStrategy.java index 75a810fdd759..e04a4dc86a10 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AbstractAddMethodStrategy.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AbstractAddMethodStrategy.java @@ -21,6 +21,7 @@ import java.io.IOException; import javax.lang.model.element.TypeElement; +import org.netbeans.api.java.classpath.ClassPath; import org.netbeans.api.java.source.CompilationController; import org.netbeans.api.java.source.ui.ScanDialog; import org.netbeans.modules.j2ee.api.ejbjar.EjbJar; @@ -49,7 +50,7 @@ public AbstractAddMethodStrategy(String name) { this.name = name; } - protected abstract MethodModel getPrototypeMethod(); + protected abstract MethodModel getPrototypeMethod(boolean jakartaVariant); /** Describes method type handled by this action. */ public abstract MethodType.Kind getPrototypeMethodKind(); @@ -69,7 +70,14 @@ public void addMethod(final FileObject fileObject, final String className) throw if (className == null) { return; } - final MethodModel methodModel = getPrototypeMethod(); + + boolean jakartaVariant = true; + ClassPath cp = ClassPath.getClassPath(fileObject, ClassPath.COMPILE); + if (cp != null) { + jakartaVariant = cp.findResource("javax/ejb/Stateless.class") == null // NOI18N + || cp.findResource("jakarta/ejb/Stateless.class") != null; // NOI18N + } + final MethodModel methodModel = getPrototypeMethod(jakartaVariant); ScanDialog.runWhenScanFinished(new Runnable() { @Override public void run() { @@ -106,18 +114,16 @@ protected static MethodsNode getMethodsNode() { * Gets whether the type of given {@code TypeElement} is Entity bean. * @param compilationController compilationController * @param typeElement examined element - * @return {@code true} if the element is subtype of {@code javax.ejb.EntityBean}, {@code false} otherwise + * @return {@code true} if the element is subtype of {@code jakarta.ejb.EntityBean} or {@code javax.ejb.EntityBean}, {@code false} otherwise */ protected static boolean isEntity(CompilationController compilationController, TypeElement typeElement) { Parameters.notNull("compilationController", compilationController); Parameters.notNull("typeElement", typeElement); TypeElement entity = compilationController.getElements().getTypeElement("javax.ejb.EntityBean"); - if (entity != null) { - typeElement.getKind().getDeclaringClass().isAssignableFrom(entity.getKind().getDeclaringClass()); - return (compilationController.getTypes().isSubtype(typeElement.asType(), entity.asType())); - } - return false; + TypeElement entityJakarta = compilationController.getElements().getTypeElement("jakarta.ejb.EntityBean"); + return (entity != null && (compilationController.getTypes().isSubtype(typeElement.asType(), entity.asType()))) + || (entityJakarta != null && (compilationController.getTypes().isSubtype(typeElement.asType(), entityJakarta.asType()))); } /** @@ -134,12 +140,15 @@ protected static boolean isSession(CompilationController compilationController, TypeElement stateless = compilationController.getElements().getTypeElement("javax.ejb.Stateless"); TypeElement stateful = compilationController.getElements().getTypeElement("javax.ejb.Stateful"); TypeElement singleton = compilationController.getElements().getTypeElement("javax.ejb.Singleton"); - if (stateful != null && stateless != null && singleton != null) { - return (compilationController.getTypes().isSubtype(typeElement.asType(), stateless.asType()) - || compilationController.getTypes().isSubtype(typeElement.asType(), stateful.asType()) - || compilationController.getTypes().isSubtype(typeElement.asType(), singleton.asType())); - } - return false; + TypeElement statelessJakarta = compilationController.getElements().getTypeElement("jakarta.ejb.Stateless"); + TypeElement statefulJakarta = compilationController.getElements().getTypeElement("jakarta.ejb.Stateful"); + TypeElement singletonJakarta = compilationController.getElements().getTypeElement("jakarta.ejb.Singleton"); + return (stateless != null && compilationController.getTypes().isSubtype(typeElement.asType(), stateless.asType())) + || (stateful != null && compilationController.getTypes().isSubtype(typeElement.asType(), stateful.asType())) + || (singleton != null && compilationController.getTypes().isSubtype(typeElement.asType(), singleton.asType())) + || (statelessJakarta != null && compilationController.getTypes().isSubtype(typeElement.asType(), statelessJakarta.asType())) + || (statefulJakarta != null && compilationController.getTypes().isSubtype(typeElement.asType(), statefulJakarta.asType())) + || (singletonJakarta != null && compilationController.getTypes().isSubtype(typeElement.asType(), singletonJakarta.asType())); } /** @@ -153,10 +162,9 @@ protected static boolean isStateful(CompilationController compilationController, Parameters.notNull("typeElement", typeElement); TypeElement stateful = compilationController.getElements().getTypeElement("javax.ejb.Stateful"); - if (stateful != null) { - return (compilationController.getTypes().isSubtype(typeElement.asType(), stateful.asType())); - } - return false; + TypeElement statefulJakarta = compilationController.getElements().getTypeElement("jakarta.ejb.Stateful"); + return (stateful != null && compilationController.getTypes().isSubtype(typeElement.asType(), stateful.asType())) + || (statefulJakarta != null && compilationController.getTypes().isSubtype(typeElement.asType(), statefulJakarta.asType())); } } diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddBusinessMethodStrategy.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddBusinessMethodStrategy.java index 9768b57269e4..a1c56997b439 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddBusinessMethodStrategy.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddBusinessMethodStrategy.java @@ -65,7 +65,7 @@ public AddBusinessMethodStrategy() { super(NbBundle.getMessage(AddBusinessMethodStrategy.class, "LBL_AddBusinessMethodAction")); } - protected MethodModel getPrototypeMethod() { + protected MethodModel getPrototypeMethod(boolean jakartaVariant) { return MethodModel.create( "businessMethod", "void", diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddCreateMethodStrategy.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddCreateMethodStrategy.java index 5ca03870f358..2e582dfbcee5 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddCreateMethodStrategy.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddCreateMethodStrategy.java @@ -64,13 +64,13 @@ public AddCreateMethodStrategy() { super(NbBundle.getMessage(AddCreateMethodStrategy.class, "LBL_AddCreateMethodAction")); } - protected MethodModel getPrototypeMethod() { + protected MethodModel getPrototypeMethod(boolean jakartaVariant) { return MethodModel.create( "create", "void", "", Collections.emptyList(), - Collections.singletonList("javax.ejb.CreateException"), + Collections.singletonList(jakartaVariant ? "jakarta.ejb.CreateException" : "javax.ejb.CreateException"), Collections.emptySet() ); } diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddFinderMethodStrategy.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddFinderMethodStrategy.java index 28e67efd7b4a..2bfedd3b76a2 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddFinderMethodStrategy.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddFinderMethodStrategy.java @@ -62,8 +62,8 @@ public AddFinderMethodStrategy () { super (NbBundle.getMessage(AddFinderMethodStrategy.class, "LBL_AddFinderMethodAction")); } - protected MethodModel getPrototypeMethod() { - return getFinderPrototypeMethod(); + protected MethodModel getPrototypeMethod(boolean jakartaVariant) { + return getFinderPrototypeMethod(jakartaVariant); } protected MethodCustomizer createDialog(FileObject fileObject, final MethodModel methodModel) throws IOException { @@ -127,13 +127,13 @@ public void run(CompilationController cc) throws Exception { return isEntity.get(); } - private static MethodModel getFinderPrototypeMethod() { + private static MethodModel getFinderPrototypeMethod(boolean jakartaVariant) { return MethodModel.create( "findBy", "void", "", Collections.emptyList(), - Collections.singletonList("javax.ejb.FinderException"), + Collections.singletonList(jakartaVariant ? "jakarta.ejb.FinderException" : "javax.ejb.FinderException"), Collections.emptySet() ); } diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddHomeMethodStrategy.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddHomeMethodStrategy.java index a9f0edb03779..919dac90239a 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddHomeMethodStrategy.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddHomeMethodStrategy.java @@ -63,7 +63,7 @@ public AddHomeMethodStrategy () { super(NbBundle.getMessage(AddHomeMethodStrategy.class, "LBL_AddHomeMethodAction")); } - protected MethodModel getPrototypeMethod() { + protected MethodModel getPrototypeMethod(boolean jakartaVariant) { return MethodModel.create( "homeMethod", "void", diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddSelectMethodStrategy.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddSelectMethodStrategy.java index 26bfd414a3f0..bee3d175862b 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddSelectMethodStrategy.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/action/AddSelectMethodStrategy.java @@ -65,14 +65,14 @@ public AddSelectMethodStrategy(String name) { } @Override - public MethodModel getPrototypeMethod() { + public MethodModel getPrototypeMethod(boolean jakartaVariant) { Set modifiers = EnumSet.of(Modifier.PUBLIC, Modifier.ABSTRACT); return MethodModel.create( "ejbSelectBy", "int", "", Collections.emptyList(), - Collections.singletonList("javax.ejb.FinderException"), + Collections.singletonList(jakartaVariant ? "jakarta.ejb.FinderException" : "javax.ejb.FinderException"), modifiers ); } diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/ComponentMethodModel.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/ComponentMethodModel.java index 02811af3e0fe..4f9be5145a1b 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/ComponentMethodModel.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/ComponentMethodModel.java @@ -121,7 +121,8 @@ public boolean accept(Element e, TypeMirror type) { TypeElement parent = elementUtilities.enclosingTypeElement(e); boolean isInInterface = ElementKind.INTERFACE == parent.getKind(); boolean isFromJavaxEjb = parent.getQualifiedName().toString().startsWith("javax.ejb."); // NOI18N - return isInInterface && !isFromJavaxEjb && ElementKind.METHOD == e.getKind(); + boolean isFromJakartaEjb = parent.getQualifiedName().toString().startsWith("jakarta.ejb."); // NOI18N + return isInInterface && !isFromJavaxEjb && !isFromJakartaEjb && ElementKind.METHOD == e.getKind(); } }); for (Element method : methods) { @@ -164,7 +165,8 @@ public Boolean run(EjbJarMetadata metadata) throws Exception { String ifaceFqn = typeMirror.toString(); if (!ifaceFqn.equals("java.io.Serializable") //NOI18N && !ifaceFqn.equals("java.io.Externalizable") //NOI18N - && !ifaceFqn.startsWith("javax.ejb.")) { //NOI18N + && !ifaceFqn.startsWith("javax.ejb.") //NOI18N + && !ifaceFqn.startsWith("jakarta.ejb.")) { //NOI18N return false; } } diff --git a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/MethodNode.java b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/MethodNode.java index 70be43e2f927..c6d3464a6078 100644 --- a/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/MethodNode.java +++ b/enterprise/j2ee.ejbcore/src/org/netbeans/modules/j2ee/ejbcore/ui/logicalview/ejb/shared/MethodNode.java @@ -152,9 +152,13 @@ public void run(CompilationController controller) throws IOException { controller.toPhase(JavaSource.Phase.ELEMENTS_RESOLVED); Elements elements = controller.getElements(); TypeElement entityBean = elements.getTypeElement("javax.ejb.EntityBean"); // NOI18N + TypeElement entityBeanJakarta = elements.getTypeElement("jakarta.ejb.EntityBean"); // NOI18N TypeElement implBeanElement = elements.getTypeElement(implBean); if (implBeanElement != null && entityBean != null) { - result[0] = controller.getTypes().isSubtype(implBeanElement.asType(), entityBean.asType()); + result[0] |= controller.getTypes().isSubtype(implBeanElement.asType(), entityBean.asType()); + } + if (implBeanElement != null && entityBeanJakarta != null) { + result[0] |= controller.getTypes().isSubtype(implBeanElement.asType(), entityBeanJakarta.asType()); } } }, true); diff --git a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/ContainerManagedJTAInjectableInWeb.java b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/ContainerManagedJTAInjectableInWeb.java index 425d0899cead..7b8dbd6d5f78 100644 --- a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/ContainerManagedJTAInjectableInWeb.java +++ b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/ContainerManagedJTAInjectableInWeb.java @@ -68,7 +68,7 @@ public ClassTree generate() { List attribs = new ArrayList<>(); attribs.add(getGenUtils().createAnnotationArgument("name", "persistence/LogicalName")); //NOI18N attribs.add(getGenUtils().createAnnotationArgument("unitName", getPersistenceUnitName())); //NOI18N - modifiedClazz = getGenUtils().addAnnotation(modifiedClazz, getGenUtils().createAnnotation(PERSISTENCE_CONTEXT_FQN, attribs)); + modifiedClazz = getGenUtils().addAnnotation(modifiedClazz, getGenUtils().createAnnotation(getPersistenceContextFqn(), attribs)); } boolean simple = GenerationOptions.Operation.GET_EM.equals(getGenerationOptions().getOperation());//if simple (or with return etc) - no transactions diff --git a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/EntityManagerGenerationStrategySupport.java b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/EntityManagerGenerationStrategySupport.java index 05dbeb2a1ced..1927e1a33e7e 100644 --- a/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/EntityManagerGenerationStrategySupport.java +++ b/java/j2ee.persistence/src/org/netbeans/modules/j2ee/persistence/spi/entitymanagergenerator/EntityManagerGenerationStrategySupport.java @@ -39,12 +39,15 @@ import javax.lang.model.element.TypeElement; import javax.lang.model.type.TypeKind; import javax.lang.model.util.ElementFilter; +import org.netbeans.api.java.classpath.ClassPath; +import org.netbeans.api.java.source.ClasspathInfo; import org.netbeans.api.java.source.GeneratorUtilities; import org.netbeans.api.java.source.TreeMaker; import org.netbeans.api.java.source.WorkingCopy; import org.netbeans.modules.j2ee.core.api.support.java.GenerationUtils; import org.netbeans.modules.j2ee.persistence.dd.common.Persistence; import org.netbeans.modules.j2ee.persistence.dd.common.PersistenceUnit; +import org.openide.filesystems.FileObject; import org.openide.util.Parameters; /** @@ -53,15 +56,22 @@ * @author Erno Mononen */ public abstract class EntityManagerGenerationStrategySupport implements EntityManagerGenerationStrategy{ - protected static final String ENTITY_MANAGER_FQN = "javax.persistence.EntityManager"; //NOI18N + private static final String ENTITY_MANAGER_JAKARTA_FQN = "jakarta.persistence.EntityManager"; //NOI18N protected static final String ENTITY_MANAGER_FACTORY_FQN = "javax.persistence.EntityManagerFactory"; //NOI18N + private static final String ENTITY_MANAGER_FACTORY_JAKARTA_FQN = "jakarta.persistence.EntityManagerFactory"; //NOI18N protected static final String USER_TX_FQN = "javax.transaction.UserTransaction"; //NOI18N + private static final String USER_TX_JAKARTA_FQN = "jakarta.transaction.UserTransaction"; //NOI18N protected static final String PERSISTENCE_CONTEXT_FQN = "javax.persistence.PersistenceContext"; //NOI18N + private static final String PERSISTENCE_CONTEXT_JAKARTA_FQN = "jakarta.persistence.PersistenceContext"; //NOI18N protected static final String PERSISTENCE_UNIT_FQN = "javax.persistence.PersistenceUnit"; //NOI18N + private static final String PERSISTENCE_UNIT_JAKARTA_FQN = "jakarta.persistence.PersistenceUnit"; //NOI18N protected static final String POST_CONSTRUCT_FQN = "javax.annotation.PostConstruct"; //NOI18N + private static final String POST_CONSTRUCT_JAKARTA_FQN = "jakarta.annotation.PostConstruct"; //NOI18N protected static final String PRE_DESTROY_FQN = "javax.annotation.PreDestroy"; //NOI18N + private static final String PRE_DESTROY_JAKARTA_FQN = "jakarta.annotation.PreDestroy"; //NOI18N protected static final String RESOURCE_FQN = "javax.annotation.Resource"; //NOI18N + private static final String RESOURCE_JAKARTA_FQN = "jakarta.annotation.Resource"; //NOI18N protected static final String ENTITY_MANAGER_DEFAULT_NAME = "em"; //NOI18N protected static final String ENTITY_MANAGER_FACTORY_DEFAULT_NAME = "emf"; //NOI18N @@ -132,7 +142,7 @@ private String makeUnique(String methodName){ } FieldInfo getEntityManagerFactoryFieldInfo(){ - VariableTree existing = getField(ENTITY_MANAGER_FACTORY_FQN); + VariableTree existing = getField(getEntityManagerFactoryFqn()); if (existing != null){ return new FieldInfo(existing.getName().toString(), true); } @@ -140,7 +150,7 @@ FieldInfo getEntityManagerFactoryFieldInfo(){ } FieldInfo getEntityManagerFieldInfo(){ - VariableTree existing = getField(ENTITY_MANAGER_FQN); + VariableTree existing = getField(getEntityManagerFqn()); if (existing != null){ return new FieldInfo(existing.getName().toString(), true); } @@ -240,34 +250,22 @@ protected String getEmInitCode(FieldInfo em, FieldInfo emf){ * @param emName the name of the entity manager */ protected String generateCallLines(String emName) { - String version = Persistence.VERSION_1_0; - if(persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_3_1.PersistenceUnit) {// we have persistence unit with specific version, should use it - version = Persistence.VERSION_3_1; - } else if(persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_3_0.PersistenceUnit) {// we have persistence unit with specific version, should use it - version = Persistence.VERSION_3_0; - } else if(persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_2.PersistenceUnit) {// we have persistence unit with specific version, should use it - version = Persistence.VERSION_2_2; - } else if(persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_1.PersistenceUnit) {// we have persistence unit with specific version, should use it - version = Persistence.VERSION_2_1; - } else if(persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_0.PersistenceUnit) {// we have persistence unit with specific version, should use it - version = Persistence.VERSION_2_0; - } - return MessageFormat.format(getGenerationOptions().getOperation().getBody(version), new Object[] { + return MessageFormat.format(getGenerationOptions().getOperation().getBody(getPersistenceVersion()), new Object[] { emName, getGenerationOptions().getParameterName(), getGenerationOptions().getParameterType(), getGenerationOptions().getReturnType(), getGenerationOptions().getQueryAttribute()}); } - + protected VariableTree createUserTransaction(){ VariableTree result = getTreeMaker().Variable( getTreeMaker().Modifiers( Collections.singleton(Modifier.PRIVATE), - Collections.singletonList(getGenUtils().createAnnotation(RESOURCE_FQN)) + Collections.singletonList(getGenUtils().createAnnotation(getResourceFqn())) ), "utx", //NOI18N - getTreeMaker().Identifier(USER_TX_FQN), + getTreeMaker().Identifier(getUserTxFqn()), null); result = (VariableTree) importFQNs(result); return result; @@ -277,7 +275,7 @@ protected VariableTree createEntityManagerFactory(String name){ return getTreeMaker().Variable(getTreeMaker().Modifiers( Collections.emptySet(), Collections.emptyList()), name, - getTypeTree(ENTITY_MANAGER_FACTORY_FQN), + getTypeTree(getEntityManagerFactoryFqn()), getTreeMaker().MethodInvocation( Collections.emptyList(), getTreeMaker().MemberSelect( @@ -308,25 +306,25 @@ protected ClassTree createEntityManager(Initialization init){ switch(init){ case INJECT : - anns.add(getGenUtils().createAnnotation(PERSISTENCE_CONTEXT_FQN, Collections.singletonList(getGenUtils().createAnnotationArgument("unitName", getPersistenceUnitName()))));//NOI18N + anns.add(getGenUtils().createAnnotation(getPersistenceContextFqn(), Collections.singletonList(getGenUtils().createAnnotationArgument("unitName", getPersistenceUnitName()))));//NOI18N break; case EMF: - existingEmf = getField(ENTITY_MANAGER_FACTORY_FQN); + existingEmf = getField(getEntityManagerFactoryFqn()); assert existingEmf != null : "EntityManagerFactory does not exist in the class"; expressionTree = getTreeMaker().Literal(existingEmf.getName().toString() + ".createEntityManager();"); //NOI18N break; case INIT: - existingEmf = getField(ENTITY_MANAGER_FACTORY_FQN); + existingEmf = getField(getEntityManagerFactoryFqn()); if (existingEmf != null){ emfName = existingEmf.getName().toString(); } else { needsEmf = true; } - AnnotationTree postConstruct = getGenUtils().createAnnotation(POST_CONSTRUCT_FQN); + AnnotationTree postConstruct = getGenUtils().createAnnotation(getPostConstructFqn()); MethodTree initMethod = getTreeMaker().Method( getTreeMaker().Modifiers(Collections.singleton(Modifier.PUBLIC), Collections.singletonList(postConstruct)), makeUnique("init"), @@ -340,7 +338,7 @@ protected ClassTree createEntityManager(Initialization init){ result = getTreeMaker().addClassMember(getClassTree(), initMethod); - AnnotationTree preDestroy = getGenUtils().createAnnotation(PRE_DESTROY_FQN); + AnnotationTree preDestroy = getGenUtils().createAnnotation(getPreDestroyFqn()); MethodTree destroyMethod = getTreeMaker().Method( getTreeMaker().Modifiers(Collections.singleton(Modifier.PUBLIC), Collections.singletonList(preDestroy)), makeUnique("destroy"), @@ -356,14 +354,14 @@ protected ClassTree createEntityManager(Initialization init){ if(needsEmf){ ExpressionTree annArgument = getGenUtils().createAnnotationArgument("name", getPersistenceUnitName());//NOI18N - AnnotationTree puAnn = getGenUtils().createAnnotation(PERSISTENCE_UNIT_FQN, Collections.singletonList(annArgument)); + AnnotationTree puAnn = getGenUtils().createAnnotation(getPersistenceUnitFqn(), Collections.singletonList(annArgument)); VariableTree emf = getTreeMaker().Variable( getTreeMaker().Modifiers( Collections.singleton(Modifier.PRIVATE), Collections.singletonList(puAnn) ), emfName, - getTypeTree(ENTITY_MANAGER_FACTORY_FQN), + getTypeTree(getEntityManagerFactoryFqn()), null); result = getTreeMaker().insertClassMember(result, getIndexForField(result), emf); } @@ -377,7 +375,7 @@ protected ClassTree createEntityManager(Initialization init){ anns ), ENTITY_MANAGER_DEFAULT_NAME, - getTypeTree(ENTITY_MANAGER_FQN), + getTypeTree(getEntityManagerFqn()), expressionTree); return getTreeMaker().insertClassMember(result, getIndexForField(result), entityManager); @@ -450,7 +448,135 @@ protected GenerationOptions getGenerationOptions() { public void setGenerationOptions(GenerationOptions generationOptions) { this.generationOptions = generationOptions; } - + + private String getPersistenceVersion() { + ClassPath cp = workingCopy.getClasspathInfo().getClassPath(ClasspathInfo.PathKind.COMPILE); + FileObject javaxEntityManagerFo = cp == null ? null : cp.findResource("javax/persistence/EntityManager.class"); + FileObject jakartaEntityManagerFo = cp == null ? null : cp.findResource("jakarta/persistence/EntityManager.class"); + String version; + if(jakartaEntityManagerFo != null || javaxEntityManagerFo == null) { + version = Persistence.VERSION_3_0; + } else { + version = Persistence.VERSION_1_0; + } + if (persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_3_1.PersistenceUnit) {// we have persistence unit with specific version, should use it + version = Persistence.VERSION_3_1; + } else if (persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_3_0.PersistenceUnit) {// we have persistence unit with specific version, should use it + version = Persistence.VERSION_3_0; + } else if (persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_2.PersistenceUnit) {// we have persistence unit with specific version, should use it + version = Persistence.VERSION_2_2; + } else if (persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_1.PersistenceUnit) {// we have persistence unit with specific version, should use it + version = Persistence.VERSION_2_1; + } else if (persistenceUnit instanceof org.netbeans.modules.j2ee.persistence.dd.persistence.model_2_0.PersistenceUnit) {// we have persistence unit with specific version, should use it + version = Persistence.VERSION_2_0; + } + return version; + } + + protected String getEntityManagerFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return ENTITY_MANAGER_FQN; + default: + return ENTITY_MANAGER_JAKARTA_FQN; + } + } + + protected String getEntityManagerFactoryFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return ENTITY_MANAGER_FACTORY_FQN; + default: + return ENTITY_MANAGER_FACTORY_JAKARTA_FQN; + } + } + + protected String getUserTxFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return USER_TX_FQN; + default: + return USER_TX_JAKARTA_FQN; + } + } + + protected String getPersistenceContextFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return PERSISTENCE_CONTEXT_FQN; + default: + return PERSISTENCE_CONTEXT_JAKARTA_FQN; + } + } + + protected String getPersistenceUnitFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return PERSISTENCE_UNIT_FQN; + default: + return PERSISTENCE_UNIT_JAKARTA_FQN; + } + } + + protected String getPostConstructFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return POST_CONSTRUCT_FQN; + default: + return POST_CONSTRUCT_JAKARTA_FQN; + } + } + + protected String getPreDestroyFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return PRE_DESTROY_FQN; + default: + return PRE_DESTROY_JAKARTA_FQN; + } + } + + protected String getResourceFqn() { + String version = getPersistenceVersion(); + switch(version) { + case Persistence.VERSION_1_0: + case Persistence.VERSION_2_0: + case Persistence.VERSION_2_1: + case Persistence.VERSION_2_2: + return RESOURCE_FQN; + default: + return RESOURCE_JAKARTA_FQN; + } + } + /** * Encapsulates info of a field. */