From 1aa38f4d2c29bc93c693dd2afb3f119110d9f42f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 10 Feb 2025 14:00:10 -0600 Subject: [PATCH 01/21] -Add support for Jakarta EE 9/10 plugins for metro, jax-ws, and maven-war-plugin -Add support for jakarta namespaces for Jakarta EE 9 and later -Change jax-ws group id to 'com.sun.xml.ws' -Add instance variables to 'JaxWsClientCreator' that will help with the new logic to support jakarta namespaces and reduce method calls -Use constants when possible -Use diamond inference -Use try-with-resources -Increase array size --- .../modules/maven/jaxws/MavenModelUtils.java | 115 ++++++++++---- .../netbeans/modules/maven/jaxws/WSUtils.java | 150 ++++++++---------- .../jaxws/wizards/JaxWsClientCreator.java | 14 +- .../jaxws/wizards/JaxWsServiceCreator.java | 104 ++++++++---- 4 files changed, 228 insertions(+), 155 deletions(-) diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java index fc53f436c49e..006e1e072ae0 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java @@ -24,8 +24,6 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; import org.apache.maven.artifact.Artifact; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.netbeans.api.java.classpath.ClassPath; @@ -38,10 +36,10 @@ import org.netbeans.modules.maven.model.ModelOperation; import org.netbeans.modules.maven.model.Utilities; import org.netbeans.modules.maven.model.pom.Dependency; -import org.netbeans.modules.maven.model.pom.Repository; import org.openide.filesystems.FileObject; import javax.xml.namespace.QName; import org.apache.maven.project.MavenProject; +import org.netbeans.api.j2ee.core.Profile; import org.netbeans.modules.javaee.specs.support.api.JaxWs; import org.netbeans.modules.maven.model.pom.Build; import org.netbeans.modules.maven.model.pom.Configuration; @@ -51,6 +49,7 @@ import org.netbeans.modules.maven.model.pom.Plugin; import org.netbeans.modules.maven.model.pom.PluginExecution; import org.netbeans.modules.maven.model.pom.Resource; +import org.netbeans.modules.web.api.webmodule.WebModule; import org.netbeans.modules.websvc.wsstack.api.WSStack; /** @@ -59,14 +58,28 @@ */ public final class MavenModelUtils { + private static Profile profile; private static final String WSIPMORT_GENERATE_PREFIX = "wsimport-generate-"; //NOI18N private static final String STALE_FILE_DIRECTORY = "${project.build.directory}/jaxws/stale/"; //NOI18N private static final String STALE_FILE_EXTENSION = ".stale"; //NOI18N - public static final String JAXWS_GROUP_ID = "org.jvnet.jax-ws-commons"; //NOI18N + public static final String JAXWS_GROUP_ID = "com.sun.xml.ws"; //NOI18N public static final String JAXWS_ARTIFACT_ID = "jaxws-maven-plugin"; //NOI18N public static final String JAXWS_PLUGIN_KEY = JAXWS_GROUP_ID+":"+JAXWS_ARTIFACT_ID; //NOI18N private static final String JAXWS_CATALOG = "jax-ws-catalog.xml"; //NOI18N - public static final String JAX_WS_PLUGIN_VERSION = "2.3"; //NOI18N + public static final String JAXWS_JAKARTAEE_8_PLUGIN_VERSION = "2.3.7"; //NOI18N + public static final String JAXWS_JAKARTAEE_9_PLUGIN_VERSION = "3.0.2"; //NOI18N + public static final String JAXWS_JAKARTAEE_10_PLUGIN_VERSION = "4.0.3"; //NOI18N + + public static final String WEBSERVICES_METRO_GROUP_ID = "org.glassfish.metro"; //NOI18N + public static final String WEBSERVICES_API_ARTIFACT_ID = "webservices-api"; //NOI18N + public static final String WEBSERVICES_RT_ARTIFACT_ID = "webservices-rt"; //NOI18N + public static final String WEBSERVICES_API_JAKARTAEE_8_VERSION = "2.4.10"; //NOI18N + public static final String WEBSERVICES_API_JAKARTAEE_9_VERISON = "3.0.3"; //NOI18N + public static final String WEBSERVICES_API_JAKARTAEE_10_VERISON = "4.0.4"; //NOI18N + + public static final String MAVEN_PLUGINS_GROUP_ID = "org.apache.maven.plugins"; //NOI18N + public static final String WAR_PLUGIN_ARTIFACT_ID = "maven-war-plugin"; //NOI18N + public static final String WAR_PLUGIN_VERSION = "2.3.4"; //NOI18N /** * adds jaxws plugin, requires the model to have a transaction started, @@ -100,7 +113,7 @@ public static Plugin addJaxWSPlugin(POMModel model, String jaxWsVersion) { plugin = model.getFactory().createPlugin(); plugin.setGroupId(JAXWS_GROUP_ID); plugin.setArtifactId(JAXWS_ARTIFACT_ID); - plugin.setVersion(JAX_WS_PLUGIN_VERSION); + plugin.setVersion(getJaxWsVersion(profile)); bld.addPlugin(plugin); // setup global configuration @@ -118,9 +131,9 @@ public static Plugin addJaxWSPlugin(POMModel model, String jaxWsVersion) { config.setSimpleParameter("target", jaxWsVersion); //NOI18N } Dependency webservicesDep = model.getFactory().createDependency(); - webservicesDep.setGroupId("javax.xml"); //NOI18N - webservicesDep.setArtifactId("webservices-api"); //NOI18N - webservicesDep.setVersion("2.0"); //NOI18N + webservicesDep.setGroupId(WEBSERVICES_METRO_GROUP_ID); + webservicesDep.setArtifactId(WEBSERVICES_API_ARTIFACT_ID); + webservicesDep.setVersion(getMetroVersion(profile)); plugin.addDependency(webservicesDep); return plugin; } @@ -137,12 +150,12 @@ public static Plugin addWarPlugin(POMModel model, boolean client) { bld = model.getFactory().createBuild(); model.getProject().setBuild(bld); } - Plugin plugin = bld.findPluginById("org.apache.maven.plugins", "maven-war-plugin"); //NOI18N + Plugin plugin = bld.findPluginById(MAVEN_PLUGINS_GROUP_ID, WAR_PLUGIN_ARTIFACT_ID); if (plugin == null) { plugin = model.getFactory().createPlugin(); - plugin.setGroupId("org.apache.maven.plugins"); //NOI18N - plugin.setArtifactId("maven-war-plugin"); //NOI18N - plugin.setVersion("2.0.2"); //NOI18N + plugin.setGroupId(MAVEN_PLUGINS_GROUP_ID); + plugin.setArtifactId(WAR_PLUGIN_ARTIFACT_ID); + plugin.setVersion(WAR_PLUGIN_VERSION); bld.addPlugin(plugin); } @@ -158,7 +171,7 @@ public static Plugin addWarPlugin(POMModel model, boolean client) { config.addExtensibilityElement(webResources); } //check for resource containing jax-ws-catalog.xml - List includes = new ArrayList(2); + List includes = new ArrayList<>(4); Collections.addAll(includes, JAXWS_CATALOG, "wsdl/**"); // NOI18N if (!hasResource(webResources, JAXWS_CATALOG, "WEB-INF")) { // NOI18N addResource(model, webResources, "WEB-INF", includes); // NOI18N @@ -173,7 +186,6 @@ public static Plugin addWarPlugin(POMModel model, boolean client) { * * @param handle ModelHandle object */ - public static void addWsdlResources(POMModel model) { assert model.isIntransaction(); Build bld = model.getProject().getBuild(); @@ -199,7 +211,7 @@ else if ( "src/main/resources".equals(resource.getDirectory())){ Resource res = model.getFactory().createResource(); res.setTargetPath("META-INF"); //NOI18N res.setDirectory("src"); //NOI18N - res.addInclude("jax-ws-catalog.xml"); //NOI18N + res.addInclude(JAXWS_CATALOG); res.addInclude("wsdl/**"); //NOI18N bld.addResource(res); } @@ -211,8 +223,6 @@ else if ( "src/main/resources".equals(resource.getDirectory())){ } - - private static POMExtensibilityElement findChild(List elems, String name) { for (POMExtensibilityElement e : elems) { if (name.equals(e.getQName().getLocalPart())) { @@ -404,26 +414,36 @@ public static void addMetroLibrary(Project project) { scope = Artifact.SCOPE_PROVIDED; } ModelUtils.addDependency(project.getProjectDirectory().getFileObject("pom.xml"), - "org.glassfish.metro", - "webservices-rt", - "2.3", + WEBSERVICES_METRO_GROUP_ID, + WEBSERVICES_RT_ARTIFACT_ID, + getMetroVersion(profile), null, scope, null, false); } /** Detect JAX-WS Library in project. * * @param project Project + * @param isJakartaEENameSpace Project is at least Jakarta EE 9 * @return true if library was detected */ - public static boolean hasJaxWsAPI(Project project) { + public static boolean hasJaxWsAPI(Project project, boolean isJakartaEENameSpace) { SourceGroup[] srcGroups = ProjectUtils.getSources(project).getSourceGroups( JavaProjectConstants.SOURCES_TYPE_JAVA); + + final boolean isWeb = WSUtils.isWeb(project); + if(isWeb) { + WebModule wm = WebModule.getWebModule(project.getProjectDirectory()); + profile = wm.getJ2eeProfile(); + } + // TODO: Add support for EJB modules + if (srcGroups.length > 0) { ClassPath classPath = ClassPath.getClassPath(srcGroups[0].getRootFolder(), ClassPath.BOOT); - FileObject wsFeature = classPath.findResource("javax/xml/ws/WebServiceFeature.class"); // NOI18N + final String wsfClazz = isJakartaEENameSpace ? "jakarta/xml/ws/WebServiceFeature.class" : "javax/xml/ws/WebServiceFeature.class"; // NOI18N + FileObject wsFeature = classPath.findResource(wsfClazz); if (wsFeature == null) { classPath = ClassPath.getClassPath(srcGroups[0].getRootFolder(), ClassPath.COMPILE); - wsFeature = classPath.findResource("javax/xml/ws/WebServiceFeature.class"); // NOI18N + wsFeature = classPath.findResource(wsfClazz); if (wsFeature == null) { return false; } @@ -452,7 +472,7 @@ static List getWsdlFiles(Project project) { assert mavenProject != null; @SuppressWarnings("unchecked") List plugins = mavenProject.getBuildPlugins(); - List wsdlList = new ArrayList(); + List wsdlList = new ArrayList<>(); for (org.apache.maven.model.Plugin plg : plugins) { if (JAXWS_PLUGIN_KEY.equalsIgnoreCase(plg.getKey())) { @SuppressWarnings("unchecked") @@ -503,7 +523,7 @@ private static String findHandler(Xpp3Dom parent) { private static void updateLibraryScope(POMModel model, String groupId, String targetScope) { assert model.isIntransaction() : "need to call model modifications under transaction."; //NOI18N - Dependency wsDep = model.getProject().findDependencyById(groupId, "webservices-rt", null); //NOI18N + Dependency wsDep = model.getProject().findDependencyById(groupId, WEBSERVICES_RT_ARTIFACT_ID, null); if (wsDep != null) { wsDep.setScope(targetScope); } @@ -521,17 +541,17 @@ static void reactOnServerChanges(final Project prj) { boolean foundMetroDep = false; String groupId = null; for (org.apache.maven.model.Dependency dep:deps) { - if ("com.sun.xml.ws".equals(dep.getGroupId()) && "webservices-rt".equals(dep.getArtifactId())) { //NOI18N + if (JAXWS_GROUP_ID.equals(dep.getGroupId()) && WEBSERVICES_RT_ARTIFACT_ID.equals(dep.getArtifactId())) { String scope = dep.getScope(); metroScope = scope == null ? "compile" : scope; //NOI18N foundMetroDep = true; - groupId = "com.sun.xml.ws"; + groupId = JAXWS_GROUP_ID; break; - } else if ("org.glassfish.metro".equals(dep.getGroupId()) && "webservices-rt".equals(dep.getArtifactId())) { //NOI18N + } else if (WEBSERVICES_METRO_GROUP_ID.equals(dep.getGroupId()) && WEBSERVICES_RT_ARTIFACT_ID.equals(dep.getArtifactId())) { String scope = dep.getScope(); metroScope = scope == null ? "compile" : scope; //NOI18N foundMetroDep = true; - groupId = "org.glassfish.metro"; + groupId = WEBSERVICES_METRO_GROUP_ID; break; } } @@ -622,7 +642,7 @@ public static String getUniqueId(Plugin plugin, String id) { String result = id; List executions = plugin.getExecutions(); if (executions != null) { - Set execIdSet = new HashSet(); + Set execIdSet = new HashSet<>(); for (PluginExecution ex : executions) { String execId = ex.getId(); if (execId != null) { @@ -641,4 +661,37 @@ public static String getUniqueId(Plugin plugin, String id) { } return result; } + + /** + * Metro webservices-api/webservices-rt version to use e.g. + * {@code Profile.JAKARTA_EE_10_WEB} will return Metro version 4.0.x + * @param profile Jakarta EE profile + * @return Metro webservices-api/webservices-rt version + */ + private static String getMetroVersion(Profile profile) { + if (profile.isAtLeast(Profile.JAKARTA_EE_10_WEB)) { + return WEBSERVICES_API_JAKARTAEE_10_VERISON; + } else if (profile.isAtLeast(Profile.JAKARTA_EE_9_WEB)) { + return WEBSERVICES_API_JAKARTAEE_9_VERISON; + } else { + return WEBSERVICES_API_JAKARTAEE_8_VERSION; + } + } + + /** + * JAX-WS Plugin to use e.g. {@code Profile.JAKARTA_EE_10_WEB} + * will return plugin version 4.0.X + * @param profile Jakarta EE profile + * @return JAX-WS Plugin version + */ + private static String getJaxWsVersion(Profile profile) { + if (profile.isAtLeast(Profile.JAKARTA_EE_10_WEB)) { + return JAXWS_JAKARTAEE_10_PLUGIN_VERSION; + } else if (profile.isAtLeast(Profile.JAKARTA_EE_9_WEB)) { + return JAXWS_JAKARTAEE_9_PLUGIN_VERSION; + } else { + return JAXWS_JAKARTAEE_8_PLUGIN_VERSION; + } + } + } diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java index 2e7b43e0a994..d51c5949cf88 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java @@ -39,11 +39,13 @@ import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.Preferences; +import org.netbeans.api.j2ee.core.Profile; import org.netbeans.api.java.project.JavaProjectConstants; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.SourceGroup; import org.netbeans.api.project.Sources; +import org.netbeans.modules.j2ee.api.ejbjar.EjbJar; import org.netbeans.modules.j2ee.common.dd.DDHelper; import org.netbeans.modules.j2ee.dd.api.common.NameAlreadyUsedException; import org.netbeans.modules.j2ee.dd.api.web.DDProvider; @@ -93,7 +95,8 @@ public class WSUtils { /** downloads XML resources from source URI to target folder * (USAGE : this method can download a wsdl file and all wsdl/XML schemas, * that are recursively imported by this wsdl) - * @param targetFolder A folder inside a NB project (ONLY) to which the retrieved resource will be copied to. All retrieved imported/included resources will be copied relative to this directory. + * @param targetFolder A folder inside a NB project (ONLY) to which the retrieved resource will be copied to. + * All retrieved imported/included resources will be copied relative to this directory. * @param source URI of the XML resource that will be retrieved into the project * @return FileObject of the retrieved resource in the local file system */ @@ -137,24 +140,10 @@ public static void generateSunJaxwsFile(final FileObject targetDir) throws IOExc @Override public void run() throws IOException { FileObject sunJaxwsFo = FileUtil.createData(targetDir, "sun-jaxws.xml");//NOI18N - FileLock lock = sunJaxwsFo.lock(); - BufferedWriter bw = null; - OutputStream os = null; - OutputStreamWriter osw = null; - try { - os = sunJaxwsFo.getOutputStream(lock); - osw = new OutputStreamWriter(os, StandardCharsets.UTF_8); - bw = new BufferedWriter(osw); + try (FileLock lock = sunJaxwsFo.lock(); OutputStream os = sunJaxwsFo.getOutputStream(lock); + OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8); + BufferedWriter bw = new BufferedWriter(osw)) { bw.write(sunJaxwsContent); - } finally { - if(bw != null) - bw.close(); - if(os != null) - os.close(); - if(osw != null) - osw.close(); - if(lock != null) - lock.releaseLock(); } } }); @@ -168,14 +157,14 @@ private static String readResource(InputStream is) throws IOException { // read the config from resource first StringBuffer sb = new StringBuffer(); String lineSep = System.getProperty("line.separator");//NOI18N - BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); - String line = br.readLine(); - while (line != null) { - sb.append(line); - sb.append(lineSep); - line = br.readLine(); + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String line = br.readLine(); + while (line != null) { + sb.append(line); + sb.append(lineSep); + line = br.readLine(); + } } - br.close(); return sb.toString(); } @@ -206,24 +195,22 @@ public void run() { } private static void deleteFile(FileObject f) { - FileLock lock = null; try { DataObject dObj = DataObject.find(f); if (dObj != null) { SaveCookie save = dObj.getCookie(SaveCookie.class); - if (save!=null) save.save(); + if (save!=null) { + save.save(); + } + } + try (FileLock lock = f.lock()) { + f.delete(lock); } - lock = f.lock(); - f.delete(lock); } catch(java.io.IOException e) { NotifyDescriptor ndd = new NotifyDescriptor.Message(NbBundle.getMessage(WSUtils.class, "MSG_Unable_Delete_File", f.getNameExt()), NotifyDescriptor.ERROR_MESSAGE); DialogDisplayer.getDefault().notify(ndd); - } finally { - if(lock != null) { - lock.releaseLock(); - } } } @@ -257,8 +244,8 @@ private static String getPackageNameFromNamespace(String ns) { } StringTokenizer tokens = new StringTokenizer(base,"/"); //NOI18N if (tokens.countTokens() > 0) { - List packageParts = new ArrayList(); - List nsParts = new ArrayList(); + List packageParts = new ArrayList<>(); + List nsParts = new ArrayList<>(); while (tokens.hasMoreTokens()) { String part = tokens.nextToken(); if (part.length() >= 0) { @@ -269,7 +256,7 @@ private static String getPackageNameFromNamespace(String ns) { StringTokenizer tokens1 = new StringTokenizer(nsParts.get(0),"."); //NOI18N int countTokens = tokens1.countTokens(); if (countTokens > 0) { - List list = new ArrayList(); + List list = new ArrayList<>(); while(tokens1.hasMoreTokens()) { list.add(tokens1.nextToken()); } @@ -308,7 +295,6 @@ public static boolean isProjectReferenceable(Project sourceProject, Project targ } } - public static boolean isEJB(Project project) { J2eeModuleProvider j2eeModuleProvider = project.getLookup().lookup(J2eeModuleProvider.class); if (j2eeModuleProvider != null) { @@ -331,6 +317,32 @@ public static boolean isWeb(Project project) { return false; } + /** + * Check if this project is at least Jakarta EE 9 and will use the + * {@code jakarta.*} namespace. + * @param project + * @return True if this project use jakarta namespace {@code false} otherwise + */ + public static boolean isJakartaEENameSpace(Project project) { + J2eeModuleProvider j2eeModuleProvider = project.getLookup().lookup(J2eeModuleProvider.class); + if (j2eeModuleProvider != null) { + J2eeModule.Type moduleType = j2eeModuleProvider.getJ2eeModule().getType(); + FileObject projectDirectory = project.getProjectDirectory(); + if (J2eeModule.Type.WAR.equals(moduleType)) { + WebModule wm = WebModule.getWebModule(projectDirectory); + Profile profile = wm.getJ2eeProfile(); + boolean isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); + return isJakarta; + } else if (J2eeModule.Type.WAR.equals(moduleType)) { + EjbJar ejbm = EjbJar.getEjbJar(projectDirectory); + Profile profile = ejbm.getJ2eeProfile(); + boolean isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); + return isJakarta; + } + } + return false; + } + public static void updateClients(final Project prj, final JAXWSLightSupport jaxWsSupport) { Runnable runnable = new Runnable() { @@ -370,8 +382,8 @@ public void run() { private static void doUpdateClients(Project prj, JAXWSLightSupport jaxWsSupport) { // get old clients - List oldClients = new ArrayList(); - Set oldNames = new HashSet(); + List oldClients = new ArrayList<>(); + Set oldNames = new HashSet<>(); for (JaxWsService s : jaxWsSupport.getServices()) { if (!s.isServiceProvider()) { oldClients.add(s); @@ -381,7 +393,7 @@ private static void doUpdateClients(Project prj, JAXWSLightSupport jaxWsSupport) FileObject wsdlFolder = jaxWsSupport.getWsdlFolder(false); if (wsdlFolder != null) { List newClients = getJaxWsClients(prj); - Set commonNames = new HashSet(); + Set commonNames = new HashSet<>(); for (JaxWsService client : newClients) { String id = client.getId(); if (oldNames.contains(id)) { @@ -412,7 +424,7 @@ private static void doUpdateClients(Project prj, JAXWSLightSupport jaxWsSupport) private static List getJaxWsClients(Project prj) { List candidates = MavenModelUtils.getWsdlFiles(prj); - List clients = new ArrayList(); + List clients = new ArrayList<>(); for (WsimportPomInfo candidate : candidates) { if (isClient(prj, candidate)) { String wsdlPath = candidate.getWsdlPath(); @@ -532,19 +544,10 @@ public static Endpoint addSunJaxWsEntry(FileObject ddFolder, JaxWsService servic endpoints.findEndpointByImplementation(service.getImplementationClass()); if (oldEndpoint == null) { Endpoint newEndpoint = addService(endpoints, service); - FileLock lock = null; - OutputStream os = null; synchronized (sunjaxwsFile) { - try { - lock = sunjaxwsFile.lock(); - os = sunjaxwsFile.getOutputStream(lock); + try (FileLock lock = sunjaxwsFile.lock(); + OutputStream os = sunjaxwsFile.getOutputStream(lock);) { endpoints.write(os); - } finally{ - if (lock != null) - lock.releaseLock(); - - if(os != null) - os.close(); } } return newEndpoint; @@ -564,19 +567,10 @@ private static void addJaxWsEntries(FileObject ddFolder, JAXWSLightSupport jaxWs addService(endpoints, service); } } - FileLock lock = null; - OutputStream os = null; synchronized (sunjaxwsFile) { - try { - lock = sunjaxwsFile.lock(); - os = sunjaxwsFile.getOutputStream(lock); + try (FileLock lock = sunjaxwsFile.lock(); + OutputStream os = sunjaxwsFile.getOutputStream(lock)) { endpoints.write(os); - } finally{ - if (lock != null) - lock.releaseLock(); - - if(os != null) - os.close(); } } } @@ -598,20 +592,10 @@ public static void removeSunJaxWsEntry(FileObject ddFolder, JaxWsService service Endpoint endpoint = endpoints.findEndpointByName(service.getServiceName()); if (endpoint != null) { endpoints.removeEndpoint(endpoint); - FileLock lock = null; - OutputStream os = null; synchronized (sunjaxwsFile) { - try { - lock = sunjaxwsFile.lock(); - os = sunjaxwsFile.getOutputStream(lock); + try (FileLock lock = sunjaxwsFile.lock(); + OutputStream os = sunjaxwsFile.getOutputStream(lock)) { endpoints.write(os); - } finally { - if (lock != null) { - lock.releaseLock(); - } - if (os != null) { - os.close(); - } } } } @@ -636,20 +620,10 @@ public static void replaceSunJaxWsEntries(FileObject ddFolder, String oldService if (endpoint != null) { endpoint.setEndpointName(newServiceName); endpoint.setUrlPattern("/" + newServiceName); - FileLock lock = null; - OutputStream os = null; synchronized (sunjaxwsFile) { - try { - lock = sunjaxwsFile.lock(); - os = sunjaxwsFile.getOutputStream(lock); + try (FileLock lock = sunjaxwsFile.lock(); + OutputStream os = sunjaxwsFile.getOutputStream(lock)) { endpoints.write(os); - } finally { - if (lock != null) { - lock.releaseLock(); - } - if (os != null) { - os.close(); - } } } } @@ -1041,7 +1015,7 @@ public static void checkNonJSR109Entries(Project prj) { public static String getUniqueId(String id, List services) { String result = id; - Set serviceIdSet = new HashSet(); + Set serviceIdSet = new HashSet<>(); for (JaxWsService s : services) { String serviceId = s.getId(); if (serviceId != null) { diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java index 75bae39d298d..b0efe57cbcba 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java @@ -59,6 +59,9 @@ public class JaxWsClientCreator implements ClientCreator { private Project project; private WizardDescriptor wiz; + private boolean isWeb; + private boolean isEJB; + private boolean isJakartaEENameSpace; /** * Creates a new instance of WebServiceClientCreator @@ -66,6 +69,9 @@ public class JaxWsClientCreator implements ClientCreator { public JaxWsClientCreator(Project project, WizardDescriptor wiz) { this.project = project; this.wiz = wiz; + this.isWeb = WSUtils.isWeb(project); + this.isEJB = WSUtils.isEJB(project); + this.isJakartaEENameSpace = WSUtils.isJakartaEENameSpace(project); } @Override @@ -92,7 +98,7 @@ public void createClient() throws IOException { FileObject wsdlFo = retrieveWsdl(wsdlUrl, localWsdlFolder, hasSrcFolder); if (wsdlFo != null) { - final boolean isJaxWsLibrary = MavenModelUtils.hasJaxWsAPI(project); + final boolean isJaxWsLibrary = MavenModelUtils.hasJaxWsAPI(project, isJakartaEENameSpace); final String relativePath = FileUtil.getRelativePath(localWsdlFolder, wsdlFo); final String clientName = wsdlFo.getName(); @@ -109,7 +115,7 @@ public void createClient() throws IOException { } catch (Exception ex) { Logger.getLogger( JaxWsClientCreator.class.getName()).log( - Level.INFO, "Cannot add Metro libbrary to pom file", ex); //NOI18N + Level.INFO, "Cannot add Metro library to pom file", ex); //NOI18N } } @@ -120,13 +126,13 @@ public void performOperation(POMModel model) { String packageName = (String) wiz.getProperty(WizardProperties.WSDL_PACKAGE_NAME); org.netbeans.modules.maven.model.pom.Plugin plugin = - WSUtils.isEJB(project) ? + isEJB ? MavenModelUtils.addJaxWSPlugin(model, "2.0") : //NOI18N MavenModelUtils.addJaxWSPlugin(model); MavenModelUtils.addWsimportExecution(plugin, clientName, relativePath,wsdlLocation, packageName); - if (WSUtils.isWeb(project)) { // expecting web project + if (isEJB) { // expecting web project MavenModelUtils.addWarPlugin(model, true); } else { // J2SE Project MavenModelUtils.addWsdlResources(model); diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java index 018d36e17547..e8c65dfdcb0b 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java @@ -114,14 +114,19 @@ public class JaxWsServiceCreator implements ServiceCreator { private static final String SOAP_BINDING_TYPE = "javax.xml.ws.soap.SOAPBinding"; //NOI18N private static final String BINDING_TYPE_ANNOTATION = "javax.xml.ws.BindingType"; //NOI18N + private static final String JAKARTAEE_SOAP_BINDING_TYPE = "jakarta.xml.ws.soap.SOAPBinding"; //NOI18N + private static final String JAKARTAEE_BINDING_TYPE_ANNOTATION = "jakarta.xml.ws.BindingType"; //NOI18N private static final String SOAP12_HTTP_BINDING = "SOAP12HTTP_BINDING"; //NOI18N private Project project; private WizardDescriptor wiz; - private boolean addJaxWsLib; + private final boolean addJaxWsLib; + private final boolean isWeb; + private final boolean isEJB; + private final boolean isJakartaEENameSpace; private int serviceType; - private static final Logger LOG = Logger.getLogger( JaxWsServiceCreator.class.getCanonicalName()); + private static final Logger LOG = Logger.getLogger(JaxWsServiceCreator.class.getCanonicalName()); /** * Creates a new instance of WebServiceClientCreator @@ -130,6 +135,9 @@ public JaxWsServiceCreator(Project project, WizardDescriptor wiz, boolean addJax this.project = project; this.wiz = wiz; this.addJaxWsLib = addJaxWsLib; + this.isWeb = WSUtils.isWeb(project); + this.isEJB = WSUtils.isEJB(project); + this.isJakartaEENameSpace = WSUtils.isJakartaEENameSpace(project); } @Override @@ -201,11 +209,11 @@ private void generateWebService(ProgressHandle handle) throws IOException { if (serviceType == WizardProperties.FROM_SCRATCH) { handle.progress(NbBundle.getMessage(JaxWsServiceCreator.class, "MSG_GEN_WS"), 50); //NOI18N - //add the JAXWS 2.0 library, if not already added + //add the JAX-WS library, if not already added if (addJaxWsLib) { MavenModelUtils.addMetroLibrary(project); } - generateJaxWSImplFromTemplate(pkg, WSUtils.isEJB(project), false, false); + generateJaxWSImplFromTemplate(pkg, isEJB, false, false); handle.finish(); } else if (serviceType == WizardProperties.ENCAPSULATE_SESSION_BEAN) { String wsName = Templates.getTargetName(wiz); @@ -279,7 +287,7 @@ private void generateWsFromWsdl15(final ProgressHandle handle) throws IOExceptio handle.finish(); } } else { - final boolean isJaxWsLibrary = MavenModelUtils.hasJaxWsAPI(project); + final boolean isJaxWsLibrary = MavenModelUtils.hasJaxWsAPI(project, isJakartaEENameSpace); final String relativePath = FileUtil.getRelativePath(localWsdlFolder, wsdlFo); final String serviceName = wsdlFo.getName(); @@ -304,12 +312,12 @@ private void generateWsFromWsdl15(final ProgressHandle handle) throws IOExceptio @Override public void performOperation(POMModel model) { org.netbeans.modules.maven.model.pom.Plugin plugin = - WSUtils.isEJB(project) ? + isEJB ? MavenModelUtils.addJaxWSPlugin(model, "2.0") : //NOI18N MavenModelUtils.addJaxWSPlugin(model); MavenModelUtils.addWsimportExecution(plugin, serviceName, relativePath,null ); - if (WSUtils.isWeb(project)) { // expecting web project + if (isWeb) { // expecting web project MavenModelUtils.addWarPlugin(model, false); } else { // J2SE Project MavenModelUtils.addWsdlResources(model); @@ -340,8 +348,8 @@ public void performOperation(POMModel model) { } try { - String wsdlLocationPrefix = WSUtils.isWeb(project) ? "WEB-INF/wsdl/" : "META-INF/wsdl/"; //NOI18N - generateJaxWsImplClass(targetFile, wsdlService, wsdlPort, wsdlLocationPrefix+relativePath, useProvider); //NOI18N + String wsdlLocationPrefix = isWeb ? "WEB-INF/wsdl/" : "META-INF/wsdl/"; //NOI18N + generateJaxWsImplClass(targetFile, wsdlService, wsdlPort, wsdlLocationPrefix+relativePath, useProvider); DataObject targetDo = DataObject.find(targetFile); if (targetDo != null) { SaveCookie save = targetDo.getCookie(SaveCookie.class); @@ -421,7 +429,9 @@ public void run() { } } - private void generateJaxWsImplClass(FileObject targetFile, final WsdlService service, final WsdlPort port, final String wsdlLocation, final boolean useProvider) throws IOException { + private void generateJaxWsImplClass(FileObject targetFile, + final WsdlService service, final WsdlPort port, + final String wsdlLocation, final boolean useProvider) throws IOException { final JavaSource targetSource = JavaSource.forFileObject(targetFile); final boolean[] isIncomplete = new boolean[1]; @@ -436,7 +446,7 @@ public void run(WorkingCopy workingCopy) throws java.io.IOException { GenerationUtils genUtils = GenerationUtils.newInstance(workingCopy); //add @WebService annotation - List attrs = new ArrayList(); + List attrs = new ArrayList<>(); attrs.add( make.Assignment(make.Identifier("serviceName"), make.Literal(service.getName()))); //NOI18N @@ -456,23 +466,39 @@ public void run(WorkingCopy workingCopy) throws java.io.IOException { make.Assignment(make.Identifier("wsdlLocation"), make.Literal(wsdlLocation))); //NOI18N + final String wspClazz = isJakartaEENameSpace ? + "jakarta.xml.ws.WebServiceProvider" : "javax.xml.ws.WebServiceProvider"; //NOI18N + final String wsClazz = isJakartaEENameSpace ? + "jakarta.jws.WebService" : "javax.jws.WebService"; //NOI18N AnnotationTree WSAnnotation = make.Annotation( useProvider ? - make.QualIdent("javax.xml.ws.WebServiceProvider") : make.QualIdent("javax.jws.WebService"), //NOI18N - attrs); + make.QualIdent(wspClazz) : make.QualIdent(wsClazz), attrs); + ClassTree modifiedClass = genUtils.addAnnotation(javaClass, WSAnnotation); if (WsdlPort.SOAP_VERSION_12.equals(port.getSOAPVersion())) { //if SOAP 1.2 binding, add BindingType annotation - TypeElement bindingElement = workingCopy.getElements(). - getTypeElement(BINDING_TYPE_ANNOTATION); + TypeElement bindingElement; + if (isJakartaEENameSpace) { + bindingElement = workingCopy.getElements(). + getTypeElement(JAKARTAEE_BINDING_TYPE_ANNOTATION); + } else { + bindingElement = workingCopy.getElements(). + getTypeElement(BINDING_TYPE_ANNOTATION); + } if (bindingElement == null) { isIncomplete[0] = true; } else { - TypeElement soapBindingElement = workingCopy. - getElements().getTypeElement(SOAP_BINDING_TYPE); + TypeElement soapBindingElement; + if (isJakartaEENameSpace) { + soapBindingElement = workingCopy. + getElements().getTypeElement(JAKARTAEE_SOAP_BINDING_TYPE); + } else { + soapBindingElement = workingCopy. + getElements().getTypeElement(SOAP_BINDING_TYPE); + } ExpressionTree exp = make.MemberSelect( make.QualIdent(soapBindingElement), SOAP12_HTTP_BINDING); @@ -487,9 +513,11 @@ public void run(WorkingCopy workingCopy) throws java.io.IOException { if (!useProvider) { // add @Stateless annotation - if (WSUtils.isEJB(project)) { + if (isEJB) { + final String statelessClazz = isJakartaEENameSpace ? + "jakarta.ejb.Stateless" : "javax.ejb.Stateless"; //NOI18N TypeElement statelessAn = workingCopy.getElements(). - getTypeElement("javax.ejb.Stateless"); //NOI18N + getTypeElement(statelessClazz); if (statelessAn != null) { AnnotationTree StatelessAnnotation = make.Annotation( make.QualIdent(statelessAn), @@ -510,7 +538,7 @@ public void run(WorkingCopy workingCopy) throws java.io.IOException { // create parameters List parameters = operation.getParameters(); - List params = new ArrayList(); + List params = new ArrayList<>(); for (WsdlParameter parameter : parameters) { // create parameter: // final ObjectOutput arg0 @@ -526,7 +554,7 @@ public void run(WorkingCopy workingCopy) throws java.io.IOException { // create exceptions Iterator exceptions = operation.getExceptions(); - List exc = new ArrayList(); + List exc = new ArrayList<>(); while (exceptions.hasNext()) { String exception = exceptions.next(); TypeElement excEl = workingCopy.getElements().getTypeElement(exception); @@ -631,7 +659,9 @@ private void generateWebServiceFromEJB(String wsName, FileObject pkg, Node[] nod ClassPath classPath = getClassPathForFile(project, createdFile); if (classPath != null) { - if (classPath.findResource("javax/ejb/EJB.class") == null) { //NOI19\8N + final String ejbClazz = isJakartaEENameSpace ? + "jakarta/ejb/EJB.class" : "javax/ejb/EJB.class"; //NOI18N + if (classPath.findResource(ejbClazz) == null) { // ad EJB API on classpath ContainerClassPathModifier modifier = project.getLookup().lookup(ContainerClassPathModifier.class); if (modifier != null) { @@ -732,8 +762,9 @@ public void run() { } private VariableTree generateEjbInjection(WorkingCopy workingCopy, TreeMaker make, String beanInterface, boolean[] onClassPath) { - TypeElement ejbAnElement = workingCopy.getElements().getTypeElement("javax.ejb.EJB"); //NOI18N - TypeElement interfaceElement = workingCopy.getElements().getTypeElement(beanInterface); //NOI18N + final String ejbClazz = isJakartaEENameSpace ? "jakarta.ejb.EJB" : "javax.ejb.EJB"; //NOI18N + TypeElement ejbAnElement = workingCopy.getElements().getTypeElement(ejbClazz); + TypeElement interfaceElement = workingCopy.getElements().getTypeElement(beanInterface); AnnotationTree ejbAnnotation = make.Annotation( make.QualIdent(ejbAnElement), @@ -761,13 +792,14 @@ private ClassTree generateMethods(WorkingCopy workingCopy, GeneratorUtilities utils = GeneratorUtilities.get(workingCopy); List interfaceElements = beanInterface.getEnclosedElements(); - TypeElement webMethodEl = workingCopy.getElements().getTypeElement("javax.jws.WebMethod"); //NOI18N + final String webMethodClazz = isJakartaEENameSpace ? "jakarta.jws.WebMethod" : "javax.jws.WebMethod"; //NOI18N + TypeElement webMethodEl = workingCopy.getElements().getTypeElement(webMethodClazz); assert (webMethodEl != null); if (webMethodEl == null) { return modifiedClass; } - Set operationNames = new HashSet(); + Set operationNames = new HashSet<>(); for (Element el : interfaceElements) { if (el.getKind() == ElementKind.METHOD) { ExecutableElement methodEl = (ExecutableElement) el; @@ -791,8 +823,12 @@ private ClassTree generateMethods(WorkingCopy workingCopy, // generate @RequestWrapper and @RequestResponse annotations if (!methodName.contentEquals(operationName)) { - TypeElement requestWrapperEl = workingCopy.getElements().getTypeElement("javax.xml.ws.RequestWrapper"); //NOI18N - TypeElement responseWrapperEl = workingCopy.getElements().getTypeElement("javax.xml.ws.ResponseWrapper"); //NOI18N + final String reqWrapperClazz = isJakartaEENameSpace ? + "jakarta.xml.ws.RequestWrapper" : "javax.xml.ws.RequestWrapper"; //NOI18N + final String resWrapperClazz = isJakartaEENameSpace ? + "jakarta.xml.ws.ResponseWrapper" : "javax.xml.ws.ResponseWrapper"; //NOI18N + TypeElement requestWrapperEl = workingCopy.getElements().getTypeElement(reqWrapperClazz); + TypeElement responseWrapperEl = workingCopy.getElements().getTypeElement(resWrapperClazz); AssignmentTree className = make.Assignment(make.Identifier("className"), make.Literal(operationName)); //NOI18N AnnotationTree requestWrapperAn = make.Annotation( make.QualIdent(requestWrapperEl), @@ -810,7 +846,9 @@ private ClassTree generateMethods(WorkingCopy workingCopy, // generate @Oneway annotation if (isVoid && method.getThrows().isEmpty()) { - TypeElement onewayEl = workingCopy.getElements().getTypeElement("javax.jws.Oneway"); //NOI18N + final String oneWayClazz = isJakartaEENameSpace ? + "jakarta.jws.Oneway" : "javax.jws.Oneway"; //NOI18N + TypeElement onewayEl = workingCopy.getElements().getTypeElement(oneWayClazz); AnnotationTree onewayAn = make.Annotation( make.QualIdent(onewayEl), Collections.emptyList()); @@ -818,9 +856,11 @@ private ClassTree generateMethods(WorkingCopy workingCopy, } // parameters List params = method.getParameters(); - List newParams = new ArrayList(); + List newParams = new ArrayList<>(); if (params.size() > 0) { - TypeElement paramEl = workingCopy.getElements().getTypeElement("javax.jws.WebParam"); //NOI18N + final String webParamClazz = isJakartaEENameSpace ? + "jakarta.jws.WebParam" : "javax.jws.WebParam"; //NOI18N + TypeElement paramEl = workingCopy.getElements().getTypeElement(webParamClazz); for (VariableTree param: params) { String paramName = param.getName().toString(); AssignmentTree nameAttr = make.Assignment(make.Identifier("name"), make.Literal(paramName)); //NOI18N @@ -833,7 +873,7 @@ private ClassTree generateMethods(WorkingCopy workingCopy, } // method body - List arguments = new ArrayList(); + List arguments = new ArrayList<>(); for (VariableElement ve : methodEl.getParameters()) { arguments.add(make.Identifier(ve.getSimpleName())); } From e55f8e077611f1b878b05458a0889b10a0a269b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 16:31:35 -0600 Subject: [PATCH 02/21] Add missing EJB version support Add missing Servlet version support Add missing AppClient descriptor for Jakarta EE 11 Add missing AppClient resolvers Java EE 7 to Jakarta EE 11 Bump default profile return to Jakarta EE 8 --- .../glassfish/eecommon/api/config/EjbJarVersion.java | 2 ++ .../glassfish/eecommon/api/config/ServletVersion.java | 3 +++ .../modules/j2ee/clientproject/ui/resources/layer.xml | 1 + .../modules/j2ee/dd/impl/client/ClientParseUtils.java | 10 ++++++++++ .../modules/maven/j2ee/ui/wizard/EAVisualPanel.java | 2 +- .../j2ee/ui/wizard/archetype/J2eeArchetypeFactory.java | 2 +- 6 files changed, 18 insertions(+), 2 deletions(-) diff --git a/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/EjbJarVersion.java b/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/EjbJarVersion.java index b8ca518b4f50..933e0a79effc 100644 --- a/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/EjbJarVersion.java +++ b/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/EjbJarVersion.java @@ -126,6 +126,8 @@ public static EjbJarVersion getEjbJarVersion(String version) { result = EJBJAR_3_2_6; } else if(EJBJAR_4_0.toString().equals(version)) { result = EJBJAR_4_0; + } else if(EJBJAR_4_0_1.toString().equals(version)) { + result = EJBJAR_4_0_1; } return result; diff --git a/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/ServletVersion.java b/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/ServletVersion.java index 84308b0b5e4d..af10e6c5c2c8 100644 --- a/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/ServletVersion.java +++ b/enterprise/glassfish.eecommon/src/org/netbeans/modules/glassfish/eecommon/api/config/ServletVersion.java @@ -102,6 +102,7 @@ private ServletVersion(String version, int nv, String specVersion, int nsv) { * than the version passed in as an argument. * @throws ClassCastException if obj is not a ServletVersion object. */ + @Override public int compareTo(Object obj) { ServletVersion target = (ServletVersion) obj; return numericCompare(target); @@ -126,6 +127,8 @@ public static ServletVersion getServletVersion(String version) { result = SERVLET_5_0; } else if(SERVLET_6_0.toString().equals(version)) { result = SERVLET_6_0; + } else if(SERVLET_6_1.toString().equals(version)) { + result = SERVLET_6_1; } return result; diff --git a/enterprise/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/ui/resources/layer.xml b/enterprise/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/ui/resources/layer.xml index f94dd78e480b..394436361dfe 100644 --- a/enterprise/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/ui/resources/layer.xml +++ b/enterprise/j2ee.clientproject/src/org/netbeans/modules/j2ee/clientproject/ui/resources/layer.xml @@ -57,6 +57,7 @@ + diff --git a/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java b/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java index 6a47f866bf76..138aca8a44fd 100644 --- a/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java +++ b/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java @@ -106,6 +106,16 @@ public InputSource resolveEntity(String publicId, String systemId) { return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_5.xsd"); //NOI18N } else if ("http://java.sun.com/xml/ns/javaee/application-client_6.xsd".equals(systemId)) { return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_6.xsd"); //NOI18N + } else if ("http://xmlns.jcp.org/xml/ns/javaee/application-client_7.xsd".equals(systemId)) { + return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_7.xsd"); //NOI18N + } else if ("http://xmlns.jcp.org/xml/ns/javaee/application-client_8.xsd".equals(systemId)) { + return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_8.xsd"); //NOI18N + } else if ("https://jakarta.ee/xml/ns/jakartaee/application-client_9.xsd".equals(systemId)) { + return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_9.xsd"); //NOI18N + } else if ("https://jakarta.ee/xml/ns/jakartaee/application-client_10.xsd".equals(systemId)) { + return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_10.xsd"); //NOI18N + } else if ("https://jakarta.ee/xml/ns/jakartaee/application-client_11.xsd".equals(systemId)) { + return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_11.xsd"); //NOI18N } else { // use the default behaviour return null; diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/EAVisualPanel.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/EAVisualPanel.java index eed67c5c326f..f86db2ff7c93 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/EAVisualPanel.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/EAVisualPanel.java @@ -101,7 +101,7 @@ void storeSettings(WizardDescriptor d) { Profile profile = helper.getSelectedProfile(); if (profile == null) { - profile = Profile.JAVA_EE_8_FULL; + profile = Profile.JAKARTA_EE_8_FULL; } helper.storeServerSettings(d); diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/archetype/J2eeArchetypeFactory.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/archetype/J2eeArchetypeFactory.java index 1e02f73856a0..c5b5a25f300f 100755 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/archetype/J2eeArchetypeFactory.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/wizard/archetype/J2eeArchetypeFactory.java @@ -74,7 +74,7 @@ public Archetype findArchetypeFor(J2eeModule.Type projectType, Profile profile) // Such situation might happened if user wants to create project with server that // doesn't support any of EE version we supported in NetBeans (e.g. Tomcat 5.5) if (profile == null) { - profile = Profile.J2EE_14; + profile = Profile.JAKARTA_EE_8_FULL; } return getProvider(projectType).getArchetypeFor(profile); } From 4bd3e3d9a1e36112a817acb75a5d63f1226896ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 18:00:03 -0600 Subject: [PATCH 03/21] Use try-with-resources Add @Override annotation Use diamond operator Use parseBoolean over valueOf Use Multi-catch Bump default deployment descriptor to AppClient 8 Replace usage of deprecated methods from codehaus --- .../j2ee/dd/impl/client/ClientParseUtils.java | 21 +++++--------- .../modules/maven/j2ee/ear/EarImpl.java | 29 ++++++++++--------- .../maven/j2ee/ear/EarModuleProviderImpl.java | 9 +++--- .../maven/j2ee/ejb/EjbModuleProviderImpl.java | 10 +++---- 4 files changed, 32 insertions(+), 37 deletions(-) diff --git a/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java b/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java index 138aca8a44fd..2d2c93b97f95 100644 --- a/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java +++ b/enterprise/j2ee.dd/src/org/netbeans/modules/j2ee/dd/impl/client/ClientParseUtils.java @@ -42,18 +42,15 @@ public class ClientParseUtils { /** Parsing just for detecting the version SAX parser used */ - public static String getVersion(java.io.InputStream is) throws java.io.IOException, SAXException { + public static String getVersion(InputStream is) throws IOException, SAXException { return ParseUtils.getVersion(is, new VersionHandler(), DDResolver.getInstance()); } /** Parsing just for detecting the version SAX parser used */ - public static String getVersion(FileObject fo) throws java.io.IOException, SAXException { - InputStream inputStream = fo.getInputStream(); - try { + public static String getVersion(FileObject fo) throws IOException, SAXException { + try (InputStream inputStream = fo.getInputStream()) { return ParseUtils.getVersion(inputStream, new VersionHandler(), DDResolver.getInstance()); - } finally { - inputStream.close(); } } @@ -97,6 +94,7 @@ static synchronized DDResolver getInstance() { } return resolver; } + @Override public InputSource resolveEntity(String publicId, String systemId) { if ("-//Sun Microsystems, Inc.//DTD J2EE Application Client 1.3//EN".equals(publicId)) { return new InputSource("nbres:/org/netbeans/modules/j2ee/dd/impl/resources/application-client_1_3.dtd"); //NOI18N @@ -125,17 +123,14 @@ public InputSource resolveEntity(String publicId, String systemId) { public static SAXParseException parse(FileObject fo) - throws org.xml.sax.SAXException, java.io.IOException { - InputStream inputStream = fo.getInputStream(); - try { + throws SAXException, IOException { + try (InputStream inputStream = fo.getInputStream()) { return parse(new InputSource(inputStream)); - } finally { - inputStream.close(); } } public static SAXParseException parse (InputSource is) - throws org.xml.sax.SAXException, java.io.IOException { + throws SAXException, IOException { return ParseUtils.parseDD(is, DDResolver.getInstance()); } @@ -147,7 +142,7 @@ public static SAXParseException parse (InputSource is) * no exception. */ public static SAXParseException parse(InputSource inputSource, EntityResolver resolver) - throws org.xml.sax.SAXException, java.io.IOException { + throws SAXException, IOException { return ParseUtils.parseDD(inputSource, resolver); } } diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java index e6baefd668f2..a39060120435 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java @@ -239,7 +239,7 @@ private boolean isApplicationXmlGenerated() { "generateApplicationXml", //NOI18N "generate-application-xml", null);//NOI18N //either the default or explicitly set generation of application.xml file - return (str == null || Boolean.valueOf(str)); + return (str == null || Boolean.parseBoolean(str)); } boolean isValid() { @@ -359,15 +359,16 @@ public RootInterface getDeploymentDescriptor(String location) { FileObject content = getDeploymentDescriptor(); if (content == null) { // System.out.println("getDeploymentDescriptor.application dd is null"); - StringInputStream str = new StringInputStream( - "" +//NOI18N + String str = + "" + //NOI18N "description" +//NOI18N - "" + mavenproject().getMavenProject().getArtifactId() + "");//NOI18N + "" + mavenproject().getMavenProject().getArtifactId() + "";//NOI18N try { - return DDProvider.getDefault().getDDRoot(new InputSource(str)); - } catch (SAXException ex) { - ex.printStackTrace(); - } catch (IOException ex) { + ByteArrayInputStream bais = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8)); + return DDProvider.getDefault().getDDRoot(new InputSource(bais)); + } catch (SAXException | IOException ex) { ex.printStackTrace(); } } else { @@ -397,7 +398,7 @@ public J2eeModule[] getModules() { fileNameMapping = "standard"; //NOI18N } - List toRet = new ArrayList(); + List toRet = new ArrayList<>(); EarImpl.MavenModule[] mm = readPomModules(); //#162173 order by dependency list, artifacts is unsorted set. for (Dependency d : deps) { @@ -405,7 +406,7 @@ public J2eeModule[] getModules() { for (Artifact a : artifactSet) { if (a.getGroupId().equals(d.getGroupId()) && a.getArtifactId().equals(d.getArtifactId()) && - StringUtils.equals(a.getClassifier(), d.getClassifier())) { + Objects.equals(a.getClassifier(), d.getClassifier())) { URI uri = Utilities.toURI(FileUtil.normalizeFile(a.getFile())); //#174744 - it's of essence we use the URI based method. items in local repo might not be available yet. Project owner = FileOwnerQuery.getOwner(uri); @@ -443,7 +444,7 @@ public J2eeModule[] getModules() { } } } - return toRet.toArray(new J2eeModule[0]); + return toRet.toArray(J2eeModule[]::new); } @Override @@ -453,7 +454,7 @@ public List getProjects() { Set artifactSet = mp.getArtifacts(); @SuppressWarnings("unchecked") List deps = mp.getRuntimeDependencies(); - List toRet = new ArrayList(); + List toRet = new ArrayList<>(); EarImpl.MavenModule[] mm = readPomModules(); //#162173 order by dependency list, artifacts is unsorted set. for (Dependency d : deps) { @@ -461,7 +462,7 @@ public List getProjects() { for (Artifact a : artifactSet) { if (a.getGroupId().equals(d.getGroupId()) && a.getArtifactId().equals(d.getArtifactId()) && - StringUtils.equals(a.getClassifier(), d.getClassifier())) { + Objects.equals(a.getClassifier(), d.getClassifier())) { URI uri = Utilities.toURI(FileUtil.normalizeFile(a.getFile())); //#174744 - it's of essence we use the URI based method. items in local repo might not be available yet. Project owner = FileOwnerQuery.getOwner(uri); @@ -769,7 +770,7 @@ private MavenModule[] checkConfiguration(MavenProject prj, Object conf) { } } } - return toRet.toArray(new MavenModule[0]); + return toRet.toArray(MavenModule[]::new); } private static class MavenModule { diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java index dceb3952c104..2d99b9197363 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java @@ -222,13 +222,12 @@ public String getServerID() { return ExecutionChecker.DEV_NULL; } - @Override public FileObject[] getSourceRoots() { ProjectSourcesClassPathProvider cppImpl = project.getLookup().lookup(ProjectSourcesClassPathProvider.class); ClassPath cp = cppImpl.getProjectSourcesClassPath(ClassPath.SOURCE); NbMavenProject prj = project.getLookup().lookup(NbMavenProject.class); - List resUris = new ArrayList(); + List resUris = new ArrayList<>(); for (URI uri : prj.getResources(false)) { try { resUris.add(uri.toURL()); @@ -237,7 +236,7 @@ public FileObject[] getSourceRoots() { } } Iterator en = cp.entries().listIterator(); - List toRet = new ArrayList(); + List toRet = new ArrayList<>(); int index = 0; while (en.hasNext()) { ClassPath.Entry ent = en.next(); @@ -250,7 +249,7 @@ public FileObject[] getSourceRoots() { toRet.add(ent.getRoot()); } } - return toRet.toArray(new FileObject[0]); + return toRet.toArray(FileObject[]::new); } @Override @@ -283,7 +282,7 @@ public DeployOnSaveSupport getDeployOnSaveSupport() { */ private class DeployOnSaveSupportProxy implements ArtifactListener, DeployOnSaveSupport { - private final List listeners = new ArrayList(); + private final List listeners = new ArrayList<>(); public DeployOnSaveSupportProxy() { super(); diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java index dab6ec3f038e..74628228ec41 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java @@ -62,7 +62,7 @@ public EjbJarImpl getModuleImpl() { @Override public EjbJar findEjbJar(FileObject file) { getModuleImpl(); - Project proj = FileOwnerQuery.getOwner (file); + Project proj = FileOwnerQuery.getOwner(file); if (proj != null) { proj = proj.getLookup().lookup(Project.class); } @@ -81,7 +81,7 @@ public EjbJar findEjbJar(FileObject file) { public FileObject[] getSourceRoots() { ProjectSourcesClassPathProvider cppImpl = project.getLookup().lookup(ProjectSourcesClassPathProvider.class); ClassPath cp = cppImpl.getProjectSourcesClassPath(ClassPath.SOURCE); - List resUris = new ArrayList(); + List resUris = new ArrayList<>(); for (URI uri : project.getLookup().lookup(NbMavenProject.class).getResources(false)) { try { resUris.add(uri.toURL()); @@ -90,7 +90,7 @@ public FileObject[] getSourceRoots() { } } Iterator en = cp.entries().listIterator(); - List toRet = new ArrayList(); + List toRet = new ArrayList<>(); int index = 0; while (en.hasNext()) { ClassPath.Entry ent = en.next(); @@ -124,7 +124,7 @@ public File[] getRequiredLibraries() { // do not use COMPILE classpath here because it contains dependencies // with *provided* scope which should not be deployed ClassPath cp = cppImpl.getProjectSourcesClassPath(ClassPath.EXECUTE); - List files = new ArrayList(); + List files = new ArrayList<>(); for (FileObject fo : cp.getRoots()) { fo = FileUtil.getArchiveFile(fo); if (fo == null) { @@ -132,6 +132,6 @@ public File[] getRequiredLibraries() { } files.add(FileUtil.toFile(fo)); } - return files.toArray(new File[0]); + return files.toArray(File[]::new); } } From 3f00c2aeb062e8fa99411f17749ae502b3b0fd0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 18:33:23 -0600 Subject: [PATCH 04/21] Refactor code and add missing support for Client Applications --- .../j2ee/common/J2eeProjectCapabilities.java | 16 ++++++------- .../modules/maven/j2ee/ProjectHookImpl.java | 23 ++++++++++++------ .../maven/j2ee/ui/SelectAppServerPanel.java | 24 ++++++++++++++----- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java b/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java index 6fdcfd672e2d..a67f4f110cff 100644 --- a/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java +++ b/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java @@ -64,24 +64,24 @@ public static J2eeProjectCapabilities forProject(@NonNull Project project) { if (provider == null) { return null; } + J2eeModule.Type type = provider.getJ2eeModule().getType(); Profile ejbJarProfile = null; Profile webProfile = null; Profile carProfile = null; - if (provider.getJ2eeModule().getType() == J2eeModule.Type.EJB || - provider.getJ2eeModule().getType() == J2eeModule.Type.WAR) { + if (type == J2eeModule.Type.EJB) { EjbJar[] ejbJars = EjbJar.getEjbJars(project); if (ejbJars.length > 0) { // just use first one to test profile: ejbJarProfile = ejbJars[0].getJ2eeProfile(); } - if (provider.getJ2eeModule().getType() == J2eeModule.Type.WAR) { - WebModule module = WebModule.getWebModule(project.getProjectDirectory()); - if (module != null) { - webProfile = module.getJ2eeProfile(); - } + } + if (type == J2eeModule.Type.WAR) { + WebModule module = WebModule.getWebModule(project.getProjectDirectory()); + if (module != null) { + webProfile = module.getJ2eeProfile(); } } - if (provider.getJ2eeModule().getType() == J2eeModule.Type.CAR) { + if (type == J2eeModule.Type.CAR) { Car car = Car.getCar(project.getProjectDirectory()); if (car != null) { carProfile = car.getJ2eeProfile(); diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ProjectHookImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ProjectHookImpl.java index 838fedb22391..fa2aacfff3d3 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ProjectHookImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ProjectHookImpl.java @@ -27,6 +27,7 @@ import java.util.prefs.Preferences; import org.netbeans.api.j2ee.core.Profile; import org.netbeans.api.project.Project; +import org.netbeans.modules.j2ee.api.ejbjar.Car; import org.netbeans.modules.j2ee.api.ejbjar.Ear; import org.netbeans.modules.j2ee.api.ejbjar.EjbJar; import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment; @@ -133,7 +134,9 @@ public void preferenceChange(PreferenceChangeEvent evt) { RP.post(new Runnable() { @Override public void run() { - LoggingUtils.logUsage(ExecutionChecker.class, "USG_PROJECT_OPEN_MAVEN_EE", new Object[] { getServerName(), getEEversion(), getProjectType() }, "maven"); //NOI18N + LoggingUtils.logUsage(ExecutionChecker.class, "USG_PROJECT_OPEN_MAVEN_EE", new Object[] { //NOI18N + getServerName(), getEEversion(), getProjectType() + }, "maven"); //NOI18N } }); } @@ -192,24 +195,30 @@ private String getEEversion() { String projectType = getProjectType(); if (projectType != null) { switch (projectType) { - case "ear": //NOI18N + case "ear" -> { //NOI18N Ear earProj = Ear.getEar(project.getProjectDirectory()); if (earProj != null) { profile = earProj.getJ2eeProfile(); } - break; - case "war": //NOI18N + } + case "war" -> { //NOI18N WebModule webM = WebModule.getWebModule(project.getProjectDirectory()); if (webM != null) { profile = webM.getJ2eeProfile(); } - break; - case "ejb": //NOI18N + } + case "ejb" -> { //NOI18N EjbJar ejbProj = EjbJar.getEjbJar(project.getProjectDirectory()); if (ejbProj != null) { profile = ejbProj.getJ2eeProfile(); } - break; + } + case "app-client" -> { //NOI18N + Car carM = Car.getCar(project.getProjectDirectory()); + if (carM != null) { + profile = carM.getJ2eeProfile(); + } + } } } if (profile != null) { diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/SelectAppServerPanel.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/SelectAppServerPanel.java index 1e3dba953bb4..560dce982690 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/SelectAppServerPanel.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/SelectAppServerPanel.java @@ -33,6 +33,7 @@ import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectInformation; import org.netbeans.api.project.ProjectUtils; +import org.netbeans.modules.j2ee.api.ejbjar.Car; import org.netbeans.modules.j2ee.api.ejbjar.Ear; import org.netbeans.modules.j2ee.api.ejbjar.EjbJar; import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment; @@ -232,12 +233,23 @@ private void loadComboModel() { Ear ear = Ear.getEar(project.getProjectDirectory()); EjbJar ejb = EjbJar.getEjbJar(project.getProjectDirectory()); WebModule war = WebModule.getWebModule(project.getProjectDirectory()); - J2eeModule.Type type = ear != null ? J2eeModule.Type.EAR : - ( war != null ? J2eeModule.Type.WAR : - (ejb != null ? J2eeModule.Type.EJB : J2eeModule.Type.CAR)); - Profile profile = ear != null ? ear.getJ2eeProfile() : - ( war != null ? war.getJ2eeProfile() : - (ejb != null ? ejb.getJ2eeProfile() : Profile.JAVA_EE_6_FULL)); + Car car = Car.getCar(project.getProjectDirectory()); + + J2eeModule.Type type; + Profile profile; + if (ear != null) { + type = J2eeModule.Type.EAR; + profile = ear.getJ2eeProfile(); + } else if (ejb != null) { + type = J2eeModule.Type.EJB; + profile = ejb.getJ2eeProfile(); + } else if (war != null) { + type = J2eeModule.Type.WAR; + profile = war.getJ2eeProfile(); + } else { + type = J2eeModule.Type.CAR; + profile = car.getJ2eeProfile(); + } String[] ids = Deployment.getDefault().getServerInstanceIDs(Collections.singletonList(type), profile); Collection col = new ArrayList<>(); col.add(new Server(ExecutionChecker.DEV_NULL)); From 8579ae62858eb3acd29b487570a992ecf0b9fe9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 18:37:47 -0600 Subject: [PATCH 05/21] Implement missing interface and its methods Remove subtypes from @ProjectServiceProvider --- .../maven/j2ee/appclient/AppClientImpl.java | 8 +-- .../AppClientModuleProviderImpl.java | 70 ++++++++++++++++--- .../maven/j2ee/ejb/EjbModuleProviderImpl.java | 15 +++- .../maven/j2ee/web/WebModuleProviderImpl.java | 3 +- 4 files changed, 80 insertions(+), 16 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java index e653a03d3cb1..7713ca6ccce6 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java @@ -32,9 +32,11 @@ import org.netbeans.modules.j2ee.dd.spi.client.AppClientMetadataModelFactory; import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule; import org.netbeans.modules.j2ee.metadata.model.api.MetadataModel; +import org.netbeans.modules.j2ee.spi.ejbjar.CarImplementation2; import org.netbeans.modules.javaee.project.api.JavaEEProjectSettings; import org.netbeans.modules.maven.api.classpath.ProjectSourcesClassPathProvider; import org.netbeans.modules.maven.j2ee.BaseEEModuleImpl; +import org.netbeans.modules.maven.j2ee.utils.MavenProjectSupport; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; @@ -44,7 +46,7 @@ * * @author Martin Janicek */ -public class AppClientImpl extends BaseEEModuleImpl { +public class AppClientImpl extends BaseEEModuleImpl implements CarImplementation2 { private MetadataModel appClientMetadataModel; @@ -52,7 +54,6 @@ public class AppClientImpl extends BaseEEModuleImpl { AppClientImpl(Project project, AppClientModuleProviderImpl provider) { super(project, provider, "application-client.xml", J2eeModule.CLIENT_XML); // NOI18N } - @Override public J2eeModule.Type getModuleType() { @@ -85,8 +86,7 @@ public String getModuleVersion() { ErrorManager.getDefault().notify(exc); } } - - return AppClient.VERSION_6_0; + return AppClient.VERSION_8_0; } @Override diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java index 1cefb4b4a230..22b2e83c2e15 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java @@ -26,8 +26,13 @@ import java.util.Iterator; import java.util.List; import org.netbeans.api.java.classpath.ClassPath; +import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; +import org.netbeans.modules.j2ee.api.ejbjar.Car; import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider; +import org.netbeans.modules.j2ee.spi.ejbjar.CarFactory; +import org.netbeans.modules.j2ee.spi.ejbjar.CarProvider; +import org.netbeans.modules.j2ee.spi.ejbjar.CarsInProject; import org.netbeans.modules.maven.api.NbMavenProject; import org.netbeans.modules.maven.api.classpath.ProjectSourcesClassPathProvider; import org.netbeans.modules.maven.j2ee.BaseEEModuleProvider; @@ -35,27 +40,61 @@ import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; -@ProjectServiceProvider(service = {AppClientModuleProviderImpl.class, J2eeModuleProvider.class}, projectType = {"org-netbeans-modules-maven/" + NbMavenProject.TYPE_APPCLIENT}) -public class AppClientModuleProviderImpl extends BaseEEModuleProvider { +/** + * Application Client module provider implementation for maven2 project type. + * @author Milos Kleint + */ +@ProjectServiceProvider( + service = { + CarProvider.class, + CarsInProject.class, + J2eeModuleProvider.class + }, + projectType = { + "org-netbeans-modules-maven/" + NbMavenProject.TYPE_APPCLIENT + } +) +public class AppClientModuleProviderImpl extends BaseEEModuleProvider implements CarProvider, CarsInProject { private AppClientImpl appClientImpl; - + private Car apiCarJar; + public AppClientModuleProviderImpl(Project project) { super(project); - appClientImpl = new AppClientImpl(project, this); } @Override public AppClientImpl getModuleImpl() { + if (appClientImpl == null) { + appClientImpl = new AppClientImpl(project, this); + } return appClientImpl; } + @Override + public Car findCar(FileObject file) { + getModuleImpl(); + Project proj = FileOwnerQuery.getOwner(file); + if (proj != null) { + proj = proj.getLookup().lookup(Project.class); + } + if (proj != null && project == proj) { + if (appClientImpl.isValid()) { + if (apiCarJar == null) { + apiCarJar = CarFactory.createCar(appClientImpl); + } + return apiCarJar; + } + } + return null; + } + @Override public FileObject[] getSourceRoots() { ProjectSourcesClassPathProvider cppImpl = project.getLookup().lookup(ProjectSourcesClassPathProvider.class); ClassPath cp = cppImpl.getProjectSourcesClassPath(ClassPath.SOURCE); - List resUris = new ArrayList(); + List resUris = new ArrayList<>(); for (URI uri : project.getLookup().lookup(NbMavenProject.class).getResources(false)) { try { resUris.add(uri.toURL()); @@ -64,7 +103,7 @@ public FileObject[] getSourceRoots() { } } Iterator en = cp.entries().listIterator(); - List toRet = new ArrayList(); + List toRet = new ArrayList<>(); int index = 0; while (en.hasNext()) { ClassPath.Entry ent = en.next(); @@ -77,7 +116,7 @@ public FileObject[] getSourceRoots() { toRet.add(ent.getRoot()); } } - return toRet.toArray(new FileObject[0]); + return toRet.toArray(FileObject[]::new); } @Override @@ -86,7 +125,7 @@ public File[] getRequiredLibraries() { // do not use COMPILE classpath here because it contains dependencies // with *provided* scope which should not be deployed ClassPath cp = cppImpl.getProjectSourcesClassPath(ClassPath.EXECUTE); - List files = new ArrayList(); + List files = new ArrayList<>(); for (FileObject fo : cp.getRoots()) { fo = FileUtil.getArchiveFile(fo); if (fo == null) { @@ -94,6 +133,19 @@ public File[] getRequiredLibraries() { } files.add(FileUtil.toFile(fo)); } - return files.toArray(new File[0]); + return files.toArray(File[]::new); + } + + @Override + public Car[] getCars() { + getModuleImpl(); + if (appClientImpl.isValid()) { + if (apiCarJar == null) { + apiCarJar = CarFactory.createCar(appClientImpl); + } + return new Car[] {apiCarJar}; + } + return new Car[0]; } + } diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java index 74628228ec41..b03380d4e67d 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java @@ -40,7 +40,20 @@ import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; -@ProjectServiceProvider(service = {EjbModuleProviderImpl.class, J2eeModuleProvider.class, EjbJarProvider.class, EjbJarsInProject.class}, projectType = {"org-netbeans-modules-maven/" + NbMavenProject.TYPE_EJB}) +/** + * EJB module provider implementation for maven2 project type. + * @author Milos Kleint + */ +@ProjectServiceProvider( + service = { + J2eeModuleProvider.class, + EjbJarProvider.class, + EjbJarsInProject.class + }, + projectType = { + "org-netbeans-modules-maven/" + NbMavenProject.TYPE_EJB + } +) public class EjbModuleProviderImpl extends BaseEEModuleProvider implements EjbJarProvider, EjbJarsInProject { private EjbJarImpl ejbimpl; diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java index 123760cd43e4..d828cacb48a2 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java @@ -51,12 +51,11 @@ */ @ProjectServiceProvider( service = { - WebModuleProviderImpl.class, WebModuleProvider.class, J2eeModuleProvider.class }, projectType = { - "org-netbeans-modules-maven/" + NbMavenProject.TYPE_WAR, + "org-netbeans-modules-maven/" + NbMavenProject.TYPE_WAR } ) public class WebModuleProviderImpl extends BaseEEModuleProvider implements WebModuleProvider { From fcdf19bd604bdce9be3118b23450738647f91041 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 18:45:04 -0600 Subject: [PATCH 06/21] -Move method getProfileFromPOM to MavenProjectSupport class and use it when computing the profile in all implementations. -Add getSourceLevel method to MavenProjectSupport, useful with JSE maven projects --- .../maven/j2ee/appclient/AppClientImpl.java | 7 +- .../modules/maven/j2ee/ejb/EjbJarImpl.java | 36 +-- .../maven/j2ee/utils/MavenProjectSupport.java | 195 ++++++++++++- .../modules/maven/j2ee/web/WebModuleImpl.java | 259 ++---------------- 4 files changed, 248 insertions(+), 249 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java index 7713ca6ccce6..b4eb4a745df3 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientImpl.java @@ -65,12 +65,17 @@ public FileObject getArchive() throws IOException { return getArchive(Constants.GROUP_APACHE_PLUGINS, "maven-acr-plugin", "acr", "jar"); // NOI18N } + @Override public Profile getJ2eeProfile() { Profile profile = JavaEEProjectSettings.getProfile(project); if (profile != null) { return profile; } - return Profile.JAVA_EE_7_FULL; + Profile pomProfile = MavenProjectSupport.getProfileFromPOM(project); + if (pomProfile != null) { + return pomProfile; + } + return Profile.JAKARTA_EE_8_FULL; } @Override diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbJarImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbJarImpl.java index 4d5b2a6f3ae8..198ac42a8270 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbJarImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbJarImpl.java @@ -39,6 +39,7 @@ import org.netbeans.modules.j2ee.spi.ejbjar.EjbJarImplementation2; import org.netbeans.modules.javaee.project.api.JavaEEProjectSettings; import org.netbeans.modules.maven.j2ee.BaseEEModuleImpl; +import org.netbeans.modules.maven.j2ee.utils.MavenProjectSupport; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; @@ -75,24 +76,27 @@ public Profile getJ2eeProfile() { if (profile != null) { return profile; } - String ver = getModuleVersion(); - - if (EjbJar.VERSION_4_0.equals(ver)) { - return Profile.JAKARTA_EE_9_FULL; - } - if (EjbJar.VERSION_3_2.equals(ver)) { - return Profile.JAVA_EE_7_FULL; + + Profile pomProfile = MavenProjectSupport.getProfileFromPOM(project); + if (pomProfile != null) { + return pomProfile; } - if (EjbJar.VERSION_3_1.equals(ver)) { - return Profile.JAVA_EE_6_FULL; - } - if (EjbJar.VERSION_3_0.equals(ver)) { - return Profile.JAVA_EE_5; - } - if (EjbJar.VERSION_2_1.equals(ver)) { - return Profile.J2EE_14; + + // Should we check CDI(beans.xml) too? + + String ver = getModuleVersion(); + if (null == ver) { + return Profile.JAKARTA_EE_8_FULL; + } else { + return switch (ver) { + case EjbJar.VERSION_4_0 -> Profile.JAKARTA_EE_10_FULL; + case EjbJar.VERSION_3_2 -> Profile.JAKARTA_EE_8_FULL; + case EjbJar.VERSION_3_1 -> Profile.JAVA_EE_6_FULL; + case EjbJar.VERSION_3_0 -> Profile.JAVA_EE_5; + case EjbJar.VERSION_2_1 -> Profile.J2EE_14; + default -> Profile.JAKARTA_EE_8_FULL; + }; } - return Profile.JAVA_EE_8_FULL; } @Override diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java index 6408d1eee826..3e0b365aad7a 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java @@ -20,7 +20,11 @@ import java.awt.event.ActionEvent; import java.io.IOException; +import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.BackingStoreException; @@ -28,11 +32,15 @@ import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.SwingUtilities; +import org.apache.maven.model.Dependency; import org.apache.maven.project.MavenProject; import org.netbeans.api.annotations.common.NonNull; import org.netbeans.api.j2ee.core.Profile; +import org.netbeans.api.java.project.JavaProjectConstants; +import org.netbeans.api.java.queries.SourceLevelQuery; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; +import org.netbeans.api.project.SourceGroup; import org.netbeans.modules.j2ee.common.dd.DDHelper; import org.netbeans.modules.j2ee.common.ui.BrokenServerLibrarySupport; import org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment; @@ -279,7 +287,7 @@ public static String obtainServerID(String serverInstanceID) { /** * Store given property pair to pom.xml file of the given project * - * @param projectFile project to which pom.xml should be updated + * @param project project to which pom.xml should be updated * @param name property name * @param value property value */ @@ -482,7 +490,8 @@ public void actionPerformed(ActionEvent e) { public void run() { final String newOne = ServerManager.showAddServerInstanceWizard(); final String serverType = newOne != null ? obtainServerID(newOne) : null; - Utilities.performPOMModelOperations(prj.getProjectDirectory().getFileObject("pom.xml"), Collections.singletonList(new ModelOperation() { //NOI18N + final FileObject fileObject = prj.getProjectDirectory().getFileObject("pom.xml"); //NOI18N + Utilities.performPOMModelOperations(fileObject, Collections.singletonList(new ModelOperation() { @Override public void performOperation(POMModel model) { if (newOne != null) { Properties props = model.getProject().getProperties(); @@ -523,4 +532,186 @@ public void run() { }); } } + + /** + * Trying to guess the Java/Jakarta EE version based on the dependency in pom.xml + * - See issue #230447 + * @param project + * @return Profile + */ + public static Profile getProfileFromPOM(final Project project) { + NbMavenProject nbMavenProject = project.getLookup().lookup(NbMavenProject.class); + if (nbMavenProject != null) { + MavenProject mavenProject = nbMavenProject.getMavenProject(); + List dependencies = mavenProject.getDependencies(); + + for (Map.Entry> entry : JAKARTA_EE_MAP.entrySet()) { + for (DependencyDesc dependencyDesc : entry.getValue()) { + Dependency dependency = checkForDependency(dependencies, dependencyDesc); + if (dependency != null) { + String version = dependency.getVersion(); + if (dependencyDesc.version() == null || (version != null && version.startsWith(dependencyDesc.version()))) { + return entry.getKey(); + } + } + } + } + } + return null; + } + + /** + * {@link List} containing Java/Jakarta EE implementations described by {@link DependencyDesc}. + * + * Fore more information see this link. + *

+ * In more detail: + *

    + * GlassFish: + *
  • 5.1 supports Jakarta EE 8
  • + *
  • 6.1 supports Jakarta EE 9.1
  • + *
  • 7.X supports Jakarta EE 10
  • + *
  • 8.X supports Jakarta EE 11
  • + * WebLogic: + *
  • 10.X supports Java EE 5
  • + *
  • 12.X supports Java EE 6
  • + *
  • No support for Java EE 7 yet
  • + *
+ *

+ */ + private static final Map> JAKARTA_EE_MAP = new LinkedHashMap<>(); + static { + List javaEE5 = new ArrayList<>(); + List javaEE6Web = new ArrayList<>(); + List javaEE6Full = new ArrayList<>(); + List javaEE7Web = new ArrayList<>(); + List javaEE7Full = new ArrayList<>(); + List javaEE8Web = new ArrayList<>(); + List javaEE8Full = new ArrayList<>(); + List jakartaEE8Web = new ArrayList<>(); + List jakartaEE8Full = new ArrayList<>(); + List jakartaEE9Web = new ArrayList<>(); + List jakartaEE9Full = new ArrayList<>(); + List jakartaEE91Web = new ArrayList<>(); + List jakartaEE91Full = new ArrayList<>(); + List jakartaEE10Web = new ArrayList<>(); + List jakartaEE10Full = new ArrayList<>(); + List jakartaEE11Web = new ArrayList<>(); + List jakartaEE11Full = new ArrayList<>(); + + // Java/Jakarta EE specification + javaEE5.add(new DependencyDesc("javaee", "javaee-api", "5.0")); + javaEE5.add(new DependencyDesc("javax", "javaee-web-api", "5.0")); + javaEE6Full.add(new DependencyDesc("javax", "javaee-api", "6.0")); + javaEE6Web.add(new DependencyDesc("javax", "javaee-web-api", "6.0")); + javaEE7Full.add(new DependencyDesc("javax", "javaee-api", "7.0")); + javaEE7Web.add(new DependencyDesc("javax", "javaee-web-api", "7.0")); + javaEE8Full.add(new DependencyDesc("javax", "javaee-api", "8.0")); + javaEE8Web.add(new DependencyDesc("javax", "javaee-web-api", "8.0")); + jakartaEE8Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","8.0.0")); + jakartaEE8Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","8.0.0")); + jakartaEE9Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.0.0")); + jakartaEE9Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.0.0")); + jakartaEE91Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.1.0")); + jakartaEE91Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.1.0")); + jakartaEE10Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","10.0.0")); + jakartaEE10Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","10.0.0")); + jakartaEE11Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","11.0.0-RC1")); + jakartaEE11Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","11.0.0-RC1")); + + // GlassFish implementations + javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "2")); + javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "2")); + javaEE6Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "3")); + javaEE6Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "3")); + javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.0")); + javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.0.1")); + javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.1.2")); + javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.1.2")); + javaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0")); + javaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1.0")); + jakartaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0")); + jakartaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1.0")); + jakartaEE9Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.0.0")); + jakartaEE9Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.0.0")); + jakartaEE91Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.2.5")); + jakartaEE91Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.2.5")); + jakartaEE10Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "7.0.23")); + jakartaEE10Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "7.0.23")); + jakartaEE11Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M10")); + jakartaEE11Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M10")); + + + // WebLogic implementations +// javaEE5.add(new DependencyDesc("weblogic", "weblogic", "10")); +// javaEE6Full.add(new DependencyDesc("weblogic", "weblogic", "12")); + + // JBoss implementations + javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-5.0", "1.0.0.GA")); + javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-5.0", "1.0.0.GA")); + javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-6.0", "3.0.3.Final")); + javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-6.0", "3.0.3.Final")); + javaEE6Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-6.0", "3.0.3.Final")); + javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-7.0", "1.1.1.Final")); + javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-7.0", "1.1.1.Final")); + javaEE7Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-7.0", "1.1.1.Final")); + javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-8.0", "1.0.4.Final")); + javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-8.0", "1.0.4.Final")); + javaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-8.0", "1.0.4.Final")); + jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-8.0", "1.0.1.Final")); + jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-all-8.0", "1.0.0.Final")); + jakartaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-web-8.0", "1.0.0.Final")); + + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_11_FULL, jakartaEE11Full); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_11_WEB, jakartaEE11Web); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_10_FULL, jakartaEE10Full); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_10_WEB, jakartaEE10Web); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_9_1_FULL, jakartaEE91Full); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_9_1_WEB, jakartaEE91Web); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_9_FULL, jakartaEE9Full); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_9_WEB, jakartaEE9Web); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_8_FULL, jakartaEE8Full); + JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_8_WEB, jakartaEE8Web); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_8_FULL, javaEE8Full); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_8_WEB, javaEE8Web); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_7_FULL, javaEE7Full); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_7_WEB, javaEE7Web); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_6_FULL, javaEE6Full); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_6_WEB, javaEE6Web); + JAKARTA_EE_MAP.put(Profile.JAVA_EE_5, javaEE5); + } + + private static record DependencyDesc ( + String groupID, + String artifactID, + String version) { + } + + private static Dependency checkForDependency(List dependencies, DependencyDesc dependencyDesc) { + if (dependencies != null) { + for (Dependency dependency : dependencies) { + if (dependency.getArtifactId().equals(dependencyDesc.artifactID()) && dependency.getGroupId().equals(dependencyDesc.groupID())) { + return dependency; + } + } + } + return null; + } + + /** + * Get the string representation of the source level. + * @param project + * @return a source level of the Java file, e.g. "1.8", "11", "21" + * or null if the source level is unknown. + */ + public static String getSourceLevel(Project project) { + SourceGroup[] srcGroups = ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); + String sl = SourceLevelQuery.getSourceLevel2(srcGroups[0].getRootFolder()).getSourceLevel(); + int index = sl.indexOf('.'); // NOI18N + if (index > 0) { + sl = sl.substring(index + 1); + } + return sl; + } + } diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java index a2e7324cffe9..a937adaca1ff 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleImpl.java @@ -22,13 +22,6 @@ import java.io.File; import java.io.IOException; import java.net.URI; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import org.apache.maven.model.Dependency; import org.apache.maven.project.MavenProject; import org.netbeans.api.j2ee.core.Profile; import org.netbeans.api.java.classpath.ClassPath; @@ -47,9 +40,9 @@ import org.netbeans.modules.javaee.project.api.JavaEEProjectSettings; import org.netbeans.modules.maven.api.Constants; import org.netbeans.modules.maven.api.FileUtilities; -import org.netbeans.modules.maven.api.NbMavenProject; import org.netbeans.modules.maven.api.classpath.ProjectSourcesClassPathProvider; import org.netbeans.modules.maven.j2ee.BaseEEModuleImpl; +import org.netbeans.modules.maven.j2ee.utils.MavenProjectSupport; import org.netbeans.modules.web.spi.webmodule.WebModuleImplementation2; import org.openide.ErrorManager; import org.openide.filesystems.FileChangeAdapter; @@ -133,35 +126,24 @@ public Profile getJ2eeProfile() { return profile; } - Profile pomProfile = getProfileFromPOM(project); + Profile pomProfile = MavenProjectSupport.getProfileFromPOM(project); if (pomProfile != null) { + if (pomProfile.isWebProfile()) { + return pomProfile; + } // If might happened in cases when WAR project uses Java EE full stack // Simply return corresponding Web profile until #232478 will be resolved - if (Profile.JAVA_EE_6_FULL.equals(pomProfile)) { - return Profile.JAVA_EE_6_WEB; - } - if (Profile.JAVA_EE_7_FULL.equals(pomProfile)) { - return Profile.JAVA_EE_7_WEB; - } - if (Profile.JAVA_EE_8_FULL.equals(pomProfile)) { - return Profile.JAVA_EE_8_WEB; - } - if (Profile.JAKARTA_EE_8_FULL.equals(pomProfile)) { - return Profile.JAKARTA_EE_8_WEB; - } - if (Profile.JAKARTA_EE_9_FULL.equals(pomProfile)) { - return Profile.JAKARTA_EE_9_WEB; - } - if (Profile.JAKARTA_EE_9_1_FULL.equals(pomProfile)) { - return Profile.JAKARTA_EE_9_1_WEB; - } - if (Profile.JAKARTA_EE_10_FULL.equals(pomProfile)) { - return Profile.JAKARTA_EE_10_WEB; - } - if (Profile.JAKARTA_EE_11_FULL.equals(pomProfile)) { - return Profile.JAKARTA_EE_11_WEB; - } - return pomProfile; + return switch (pomProfile) { + case JAVA_EE_6_FULL -> Profile.JAVA_EE_6_WEB; + case JAVA_EE_7_FULL -> Profile.JAVA_EE_7_WEB; + case JAVA_EE_8_FULL -> Profile.JAVA_EE_8_WEB; + case JAKARTA_EE_8_FULL -> Profile.JAKARTA_EE_8_WEB; + case JAKARTA_EE_9_FULL -> Profile.JAKARTA_EE_9_WEB; + case JAKARTA_EE_9_1_FULL -> Profile.JAKARTA_EE_9_1_WEB; + case JAKARTA_EE_10_FULL -> Profile.JAKARTA_EE_10_WEB; + case JAKARTA_EE_11_FULL -> Profile.JAKARTA_EE_11_WEB; + default -> pomProfile; + }; } Profile descriptorProfile = getProfileFromDescriptor(); @@ -169,7 +151,7 @@ public Profile getJ2eeProfile() { return descriptorProfile; } - return Profile.JAVA_EE_8_WEB; + return Profile.JAKARTA_EE_8_WEB; } private Profile getProfileFromDescriptor() { @@ -179,30 +161,18 @@ private Profile getProfileFromDescriptor() { try { WebApp wa = prov.getDDRoot(dd); String waVersion = wa.getVersion(); - - if (WebApp.VERSION_2_4.equals(waVersion)) { - return Profile.J2EE_14; - } - if (WebApp.VERSION_2_5.equals(waVersion)) { - return Profile.JAVA_EE_5; - } - if (WebApp.VERSION_3_0.equals(waVersion)) { - return Profile.JAVA_EE_6_WEB; - } - if (WebApp.VERSION_3_1.equals(waVersion)) { - return Profile.JAVA_EE_7_WEB; - } - if (WebApp.VERSION_4_0.equals(waVersion)) { - return Profile.JAKARTA_EE_8_WEB; - } - if (WebApp.VERSION_5_0.equals(waVersion)) { - return Profile.JAKARTA_EE_9_WEB; - } - if (WebApp.VERSION_6_0.equals(waVersion)) { - return Profile.JAKARTA_EE_10_WEB; - } - if (WebApp.VERSION_6_1.equals(waVersion)) { - return Profile.JAKARTA_EE_11_WEB; + if (null != waVersion) { + return switch (waVersion) { + case WebApp.VERSION_2_4 -> Profile.J2EE_14; + case WebApp.VERSION_2_5 -> Profile.JAVA_EE_5; + case WebApp.VERSION_3_0 -> Profile.JAVA_EE_6_WEB; + case WebApp.VERSION_3_1 -> Profile.JAVA_EE_7_WEB; + case WebApp.VERSION_4_0 -> Profile.JAKARTA_EE_8_WEB; + case WebApp.VERSION_5_0 -> Profile.JAKARTA_EE_9_1_WEB; + case WebApp.VERSION_6_0 -> Profile.JAKARTA_EE_10_WEB; + case WebApp.VERSION_6_1 -> Profile.JAKARTA_EE_11_WEB; + default -> Profile.JAKARTA_EE_8_WEB; + }; } } catch (IOException exc) { ErrorManager.getDefault().notify(exc); @@ -211,177 +181,6 @@ private Profile getProfileFromDescriptor() { return null; } - /** - * {@link List} containing Java EE implementations described by {@link DependencyDesc}. - * - * Fore more information see this link. - *

- * In more detail: - *

    - * GlassFish: - *
  • 2.X supports Java EE 5
  • - *
  • 3.X supports Java EE 6
  • - *
  • 4.X supports Java EE 7
  • - * WebLogic: - *
  • 10.X supports Java EE 5
  • - *
  • 12.X supports Java EE 6
  • - *
  • No support for Java EE 7 yet
  • - *
- *

- */ - private static Map> javaEEMap = new LinkedHashMap<>(); - static { - List javaEE5 = new ArrayList<>(); - List javaEE6Web = new ArrayList<>(); - List javaEE6Full = new ArrayList<>(); - List javaEE7Web = new ArrayList<>(); - List javaEE7Full = new ArrayList<>(); - List javaEE8Web = new ArrayList<>(); - List javaEE8Full = new ArrayList<>(); - List jakartaEE8Web = new ArrayList<>(); - List jakartaEE8Full = new ArrayList<>(); - List jakartaEE9Web = new ArrayList<>(); - List jakartaEE9Full = new ArrayList<>(); - List jakartaEE91Web = new ArrayList<>(); - List jakartaEE91Full = new ArrayList<>(); - List jakartaEE10Web = new ArrayList<>(); - List jakartaEE10Full = new ArrayList<>(); - List jakartaEE11Web = new ArrayList<>(); - List jakartaEE11Full = new ArrayList<>(); - - // Java EE specification - javaEE5.add(new DependencyDesc("javaee", "javaee-api", "5.0")); - javaEE5.add(new DependencyDesc("javax", "javaee-web-api", "5.0")); - javaEE6Full.add(new DependencyDesc("javax", "javaee-api", "6.0")); - javaEE6Web.add(new DependencyDesc("javax", "javaee-web-api", "6.0")); - javaEE7Full.add(new DependencyDesc("javax", "javaee-api", "7.0")); - javaEE7Web.add(new DependencyDesc("javax", "javaee-web-api", "7.0")); - javaEE8Full.add(new DependencyDesc("javax", "javaee-api", "8.0")); - javaEE8Web.add(new DependencyDesc("javax", "javaee-web-api", "8.0")); - jakartaEE8Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","8.0.0")); - jakartaEE8Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","8.0.0")); - jakartaEE9Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.0.0")); - jakartaEE9Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.0.0")); - jakartaEE91Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.1.0")); - jakartaEE91Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.1.0")); - jakartaEE10Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","10.0.0")); - jakartaEE10Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","10.0.0")); - jakartaEE11Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","11.0.0-M1")); - jakartaEE11Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","11.0.0-M1")); - - // GlassFish implementations - javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "2")); - javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "2")); - javaEE6Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "3")); - javaEE6Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "3")); - javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.0")); - javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.0.1")); - javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.1.2")); - javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.1.2")); - javaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0")); - javaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1.0")); - jakartaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0")); - jakartaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1.0")); - jakartaEE9Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.0.0")); - jakartaEE9Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.0.0")); - jakartaEE91Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.2.5")); - jakartaEE91Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.2.5")); - jakartaEE10Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "7.0.11")); - jakartaEE10Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "7.0.11")); - jakartaEE11Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M1")); - jakartaEE11Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M1")); - - - // WebLogic implementations - javaEE5.add(new DependencyDesc("weblogic", "weblogic", "10")); - javaEE6Full.add(new DependencyDesc("weblogic", "weblogic", "12")); - - // JBoss implementations - javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-5.0", null)); - javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-5.0", null)); - javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-6.0", null)); - javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-6.0", null)); - javaEE6Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-6.0", null)); - javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-7.0", null)); - javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-7.0", null)); - javaEE7Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-7.0", null)); - javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-8.0", null)); - javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-8.0", null)); - javaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-8.0", null)); - jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-8.0", null)); - jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-all-8.0", null)); - jakartaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-web-8.0", null)); - - javaEEMap.put(Profile.JAKARTA_EE_11_FULL, jakartaEE11Full); - javaEEMap.put(Profile.JAKARTA_EE_11_WEB, jakartaEE11Web); - javaEEMap.put(Profile.JAKARTA_EE_10_FULL, jakartaEE10Full); - javaEEMap.put(Profile.JAKARTA_EE_10_WEB, jakartaEE10Web); - javaEEMap.put(Profile.JAKARTA_EE_9_1_FULL, jakartaEE91Full); - javaEEMap.put(Profile.JAKARTA_EE_9_1_WEB, jakartaEE91Web); - javaEEMap.put(Profile.JAKARTA_EE_9_FULL, jakartaEE9Full); - javaEEMap.put(Profile.JAKARTA_EE_9_WEB, jakartaEE9Web); - javaEEMap.put(Profile.JAKARTA_EE_8_FULL, jakartaEE8Full); - javaEEMap.put(Profile.JAKARTA_EE_8_WEB, jakartaEE8Web); - javaEEMap.put(Profile.JAVA_EE_8_FULL, javaEE8Full); - javaEEMap.put(Profile.JAVA_EE_8_WEB, javaEE8Web); - javaEEMap.put(Profile.JAVA_EE_7_FULL, javaEE7Full); - javaEEMap.put(Profile.JAVA_EE_7_WEB, javaEE7Web); - javaEEMap.put(Profile.JAVA_EE_6_FULL, javaEE6Full); - javaEEMap.put(Profile.JAVA_EE_6_WEB, javaEE6Web); - javaEEMap.put(Profile.JAVA_EE_5, javaEE5); - } - - private static class DependencyDesc { - - private final String groupID; - private final String artifactID; - private final String version; - - - public DependencyDesc( - String groupID, - String artifactID, - String version) { - - this.groupID = groupID; - this.artifactID = artifactID; - this.version = version; - } - } - - // Trying to guess the Java EE version based on the dependency in pom.xml - See issue #230447 - private Profile getProfileFromPOM(final Project project) { - final NbMavenProject nbMavenProject = project.getLookup().lookup(NbMavenProject.class); - if (nbMavenProject != null) { - MavenProject mavenProject = nbMavenProject.getMavenProject(); - List dependencies = mavenProject.getDependencies(); - - for (Map.Entry> entry : javaEEMap.entrySet()) { - for (DependencyDesc dependencyDesc : entry.getValue()) { - Dependency dependency = checkForDependency(dependencies, dependencyDesc); - if (dependency != null) { - String version = dependency.getVersion(); - if (dependencyDesc.version == null || (version != null && version.startsWith(dependencyDesc.version))) { - return entry.getKey(); - } - } - } - } - } - return null; - } - - private Dependency checkForDependency(List dependencies, DependencyDesc dependencyDesc) { - if (dependencies != null) { - for (Dependency dependency : dependencies) { - if (dependency.getArtifactId().equals(dependencyDesc.artifactID) && dependency.getGroupId().equals(dependencyDesc.groupID)) { - return dependency; - } - } - } - return null; - } - @Override public File getDDFile(final String path) { URI webappDir = mavenproject().getWebAppDirectory(); From 91eda82b124ae25615647194f204ab585b717e6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:09:22 -0600 Subject: [PATCH 07/21] -Add new method getProfile() -Change logic in getJ2eeProfile() and use the new method getProfile() -Generate new code for equals() and hashCode() methods -Use Pattern Matching for instanceof -Use Switch Expressions --- .../modules/maven/j2ee/ear/EarImpl.java | 129 +++++++++++------- 1 file changed, 78 insertions(+), 51 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java index a39060120435..a1048b700bfe 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java @@ -20,12 +20,16 @@ package org.netbeans.modules.maven.j2ee.ear; import java.beans.PropertyChangeListener; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.net.URI; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Iterator; import java.util.List; +import java.util.Objects; import java.util.Set; import org.apache.maven.artifact.Artifact; import org.apache.maven.model.Dependency; @@ -33,8 +37,6 @@ import org.apache.maven.project.MavenProject; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException; import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator; -import org.codehaus.plexus.util.StringInputStream; -import org.codehaus.plexus.util.StringUtils; import org.codehaus.plexus.util.xml.Xpp3Dom; import org.netbeans.api.j2ee.core.Profile; import org.netbeans.api.project.FileOwnerQuery; @@ -107,15 +109,11 @@ public Profile getJ2eeProfile() { if (isApplicationXmlGenerated()) { String version = PluginPropertyUtils.getPluginProperty(project, Constants.GROUP_APACHE_PLUGINS, Constants.PLUGIN_EAR, "version", "generate-application-xml", null); //NOI18N - // the default version in maven plugin is also 1.3 //TODO what if the default changes? if (version != null) { version = version.trim(); - // 5, 6, 7 are not valid versions in NB it is 1.5, 1.6, 1.7 - if (!version.startsWith("1.")) { // NOI18N - version = "1." + version; // NOI18N - } - return Profile.fromPropertiesString(version); + profile = getProfile(version); + return profile; } } else { DDProvider prov = DDProvider.getDefault(); @@ -125,22 +123,37 @@ public Profile getJ2eeProfile() { Application app = prov.getDDRoot(dd); String appVersion = app.getVersion().toString(); appVersion = appVersion.trim(); - // 5, 6, 7 are not valid versions in NB it is 1.5, 1.6, 1.7 - if (!appVersion.startsWith("1.")) { // NOI18N - appVersion = "1." + appVersion; // NOI18N - } - return Profile.fromPropertiesString(appVersion); + profile = getProfile(appVersion); + return profile; } catch (IOException exc) { ErrorManager.getDefault().notify(exc); } } else { //TODO try to check the pom model again and user 'version' element if existing.. - return Profile.JAVA_EE_6_FULL; + return Profile.JAKARTA_EE_8_FULL; } } // hardwire? // System.out.println("eariml: getj2eepaltform"); - return Profile.JAVA_EE_5; + return Profile.JAKARTA_EE_8_FULL; + } + + /** + * Get {@code Profile} based on the EAR version written in the pom.xml file + * @param version + * @return Profile + */ + private static Profile getProfile(String version) { + return switch (version) { + case "11" -> Profile.JAKARTA_EE_11_FULL; + case "10" -> Profile.JAKARTA_EE_10_FULL; + case "9" -> Profile.JAKARTA_EE_9_1_FULL; + case "8" -> Profile.JAKARTA_EE_8_FULL; + case "7" -> Profile.JAVA_EE_7_FULL; + case "6" -> Profile.JAVA_EE_6_FULL; + case "5" -> Profile.JAVA_EE_5; + default -> Profile.JAKARTA_EE_8_FULL; + }; } @Override @@ -257,15 +270,22 @@ public J2eeModule.Type getModuleType() { */ @Override public String getModuleVersion() { - Profile prf = getJ2eeProfile(); - if (prf == Profile.JAKARTA_EE_11_FULL || prf == Profile.JAKARTA_EE_11_FULL) return Application.VERSION_11; - if (prf == Profile.JAKARTA_EE_10_FULL || prf == Profile.JAKARTA_EE_10_FULL) return Application.VERSION_10; - if (prf == Profile.JAKARTA_EE_9_1_FULL || prf == Profile.JAKARTA_EE_9_FULL) return Application.VERSION_9; - if (prf == Profile.JAKARTA_EE_8_FULL || prf == Profile.JAVA_EE_8_FULL) return Application.VERSION_8; - if (prf == Profile.JAVA_EE_7_FULL) return Application.VERSION_7; - if (prf == Profile.JAVA_EE_6_FULL) return Application.VERSION_6; - if (prf == Profile.JAVA_EE_5) return Application.VERSION_5; - return Application.VERSION_1_4; + Profile profile = getJ2eeProfile(); + if (null == profile) { + return Application.VERSION_8; + } + else { + return switch (profile) { + case JAKARTA_EE_11_FULL -> Application.VERSION_11; + case JAKARTA_EE_10_FULL -> Application.VERSION_10; + case JAKARTA_EE_9_1_FULL, JAKARTA_EE_9_FULL -> Application.VERSION_9; + case JAKARTA_EE_8_FULL, JAVA_EE_8_FULL -> Application.VERSION_8; + case JAVA_EE_7_FULL -> Application.VERSION_7; + case JAVA_EE_6_FULL -> Application.VERSION_6; + case JAVA_EE_5 -> Application.VERSION_5; + default -> Application.VERSION_8; + }; + } } /** @@ -541,8 +561,8 @@ public void addCarModule(Car arg0) { private static final class ContentIterator implements Iterator { - private List filesUnderRoot; - private FileObject root; + private final List filesUnderRoot; + private final FileObject root; private ContentIterator(FileObject root) { @@ -563,9 +583,7 @@ public Object next() { filesUnderRoot.remove(0); if (nextFile.isFolder()) { nextFile.refresh(); - for (FileObject child : nextFile.getChildren()) { - filesUnderRoot.add(child); - } + filesUnderRoot.addAll(Arrays.asList(nextFile.getChildren())); } return new RootedFileObject(root, nextFile); } @@ -578,8 +596,8 @@ public void remove() { private static final class RootedFileObject implements J2eeModule.RootedEntry { - private FileObject file; - private FileObject root; + private final FileObject file; + private final FileObject root; private RootedFileObject(FileObject root, FileObject file) { @@ -725,10 +743,10 @@ private EarImpl.MavenModule[] readPomModules() { } private MavenModule[] checkConfiguration(MavenProject prj, Object conf) { - List toRet = new ArrayList(); - if (conf instanceof Xpp3Dom) { + List toRet = new ArrayList<>(); + if (conf instanceof Xpp3Dom xpp3Dom) { ExpressionEvaluator eval = PluginPropertyUtils.createEvaluator(project); - Xpp3Dom dom = (Xpp3Dom) conf; + Xpp3Dom dom = xpp3Dom; Xpp3Dom modules = dom.getChild("modules"); //NOI18N if (modules != null) { int index = 0; @@ -747,20 +765,16 @@ private MavenModule[] checkConfiguration(MavenProject prj, Object conf) { } catch (ExpressionEvaluationException e) { //log silently } - if ("groupId".equals(param.getName())) { //NOI18N - mm.groupId = value; - } else if ("artifactId".equals(param.getName())) { //NOI18N - mm.artifactId = value; - } else if ("classifier".equals(param.getName())) { //NOI18N - mm.classifier = value; - } else if ("uri".equals(param.getName())) { //NOI18N - mm.uri = value; - } else if ("bundleDir".equals(param.getName())) { //NOI18N - mm.bundleDir = value; - } else if ("bundleFileName".equals(param.getName())) { //NOI18N - mm.bundleFileName = value; - } else if ("excluded".equals(param.getName())) { //NOI18N - mm.excluded = Boolean.valueOf(value); + if (null != param.getName()) { + switch (param.getName()) { + case "groupId" -> mm.groupId = value; + case "artifactId" -> mm.artifactId = value; + case "classifier" -> mm.classifier = value; + case "uri" -> mm.uri = value; + case "bundleDir"-> mm.bundleDir = value; + case "bundleFileName"-> mm.bundleFileName = value; + case "excluded"-> mm.excluded = Boolean.parseBoolean(value); + } } } } @@ -837,7 +851,6 @@ String resolveBundleName(String fileNameMapping) { } - private static class ProxyJ2eeModule implements J2eeModuleImplementation2 { private final J2eeModule module; private final EarImpl.MavenModule mavenModule; @@ -906,12 +919,26 @@ public void removePropertyChangeListener(PropertyChangeListener listener) { @Override public boolean equals(Object obj) { - return module.equals(obj); + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final ProxyJ2eeModule other = (ProxyJ2eeModule) obj; + return Objects.equals(this.module, other.module); } @Override public int hashCode() { - return module.hashCode(); + int hash = 5; + hash = 31 * hash + Objects.hashCode(this.module); + hash = 31 * hash + Objects.hashCode(this.mavenModule); + hash = 31 * hash + Objects.hashCode(this.fileNameMapping); + return hash; } } From c2dc126735dd69c06ea24d6005b09e7158ca9a59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:10:50 -0600 Subject: [PATCH 08/21] -Remove unused imports -Remove subtypes from @ProjectServiceProvider -Use psf LOGGER - --- .../maven/j2ee/ear/EarModuleProviderImpl.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java index 2d99b9197363..e79673782fe7 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarModuleProviderImpl.java @@ -19,7 +19,6 @@ package org.netbeans.modules.maven.j2ee.ear; import java.io.File; -import java.io.IOException; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; @@ -32,7 +31,6 @@ import org.netbeans.modules.maven.api.NbMavenProject; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; -import org.netbeans.api.project.ProjectManager; import org.netbeans.modules.j2ee.api.ejbjar.Ear; import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule; import org.netbeans.modules.j2ee.deployment.devmodules.api.ModuleChangeReporter; @@ -51,7 +49,6 @@ import org.netbeans.spi.project.ProjectServiceProvider; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; -import org.openide.util.Exceptions; /** * provider for ear specific functionality @@ -59,10 +56,8 @@ */ @ProjectServiceProvider( service = { - EarModuleProviderImpl.class, EarProvider.class, - J2eeModuleProvider.class, - J2eeApplicationProvider.class + J2eeModuleProvider.class }, projectType = { "org-netbeans-modules-maven/" + NbMavenProject.TYPE_EAR @@ -76,6 +71,7 @@ public class EarModuleProviderImpl extends J2eeApplicationProvider implements Ea private J2eeModule j2eemodule; private final DeployOnSaveSupport deployOnSaveSupport = new DeployOnSaveSupportProxy(); + private static final Logger LOGGER = Logger.getLogger(EarModuleProviderImpl.class.getName()); public EarModuleProviderImpl(Project proj) { @@ -125,10 +121,10 @@ public J2eeModuleProvider getChildModuleProvider(String uri) { */ @Override public J2eeModuleProvider[] getChildModuleProviders() { - List provs = new ArrayList(); + List provs = new ArrayList<>(); for (Project prj : earimpl.getProjects()) { if(prj.getProjectDirectory().equals(project.getProjectDirectory())) { - Logger.getLogger(EarModuleProviderImpl.class.getName()).log(Level.WARNING, "EarImpl.getProjects() for project {0} returns itself as a child project!", project.getProjectDirectory()); + LOGGER.log(Level.WARNING, "EarImpl.getProjects() for project {0} returns itself as a child project!", project.getProjectDirectory()); continue; } J2eeModuleProvider prv = prj.getLookup().lookup(J2eeModuleProvider.class); @@ -136,7 +132,7 @@ public J2eeModuleProvider[] getChildModuleProviders() { provs.add(prv); } } - return provs.toArray(new J2eeModuleProvider[0]); + return provs.toArray(J2eeModuleProvider[]::new); } @Override @@ -161,7 +157,7 @@ public EarImpl getEarImpl() { * Returns source deployment configuration file path for the given deployment * configuration file name. * - * @param name file name of the deployement configuration file. + * @param name file name of the deployment configuration file. * @return non-null absolute path to the deployment configuration file. */ public File getDeploymentConfigurationFile(String name) { @@ -176,13 +172,11 @@ public File getDeploymentConfigurationFile(String name) { return earimpl.getDDFile(path); } - - /** * Finds source deployment configuration file object for the given deployment * configuration file name. * - * @param name file name of the deployement configuration file. + * @param name file name of the deployment configuration file. * @return FileObject of the configuration descriptor file; null if the file does not exists. */ public FileObject findDeploymentConfigurationFile(String name) { @@ -295,7 +289,7 @@ public synchronized void addArtifactListener(ArtifactListener listener) { boolean register = listeners.isEmpty(); if (listener != null) { if(listener == DeployOnSaveSupportProxy.this) { - Logger.getLogger(EarModuleProviderImpl.class.getName()).log(Level.WARNING, "DeployOnSaveSupportProxy.addArtifactListener for project {0} was about to register itself as a listener!", project.getProjectDirectory()); + LOGGER.log(Level.WARNING, "DeployOnSaveSupportProxy.addArtifactListener for project {0} was about to register itself as a listener!", project.getProjectDirectory()); } else { listeners.add(listener); } @@ -341,7 +335,6 @@ public boolean containsIdeArtifacts() { } return false; } - @Override public void artifactsUpdated(Iterable artifacts) { From 4adb600bbb008592f81b2898aabf6b0555cd40bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:17:12 -0600 Subject: [PATCH 09/21] -Add import for Plugin class -Fix wrong if statement -Remove version model when calling addJaxWSPlugin(), the default version will vary for the computed Profile, Java EE 8 will use model 2.2, Jakarta EE 9/10/11 will use 3.0. --- .../maven/jaxws/wizards/JaxWsClientCreator.java | 11 ++++------- .../maven/jaxws/wizards/JaxWsServiceCreator.java | 10 +++------- 2 files changed, 7 insertions(+), 14 deletions(-) diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java index b0efe57cbcba..94f096f0ecfc 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java @@ -43,6 +43,7 @@ import org.netbeans.modules.maven.model.ModelOperation; import org.netbeans.modules.maven.model.Utilities; import org.netbeans.modules.maven.model.pom.POMModel; +import org.netbeans.modules.maven.model.pom.Plugin; import org.netbeans.modules.websvc.jaxws.light.api.JAXWSLightSupport; import org.openide.DialogDisplayer; import org.openide.NotifyDescriptor; @@ -95,8 +96,7 @@ public void createClient() throws IOException { } if (localWsdlFolder != null) { - FileObject wsdlFo = retrieveWsdl(wsdlUrl, localWsdlFolder, - hasSrcFolder); + FileObject wsdlFo = retrieveWsdl(wsdlUrl, localWsdlFolder, hasSrcFolder); if (wsdlFo != null) { final boolean isJaxWsLibrary = MavenModelUtils.hasJaxWsAPI(project, isJakartaEENameSpace); final String relativePath = FileUtil.getRelativePath(localWsdlFolder, wsdlFo); @@ -125,14 +125,11 @@ public void createClient() throws IOException { public void performOperation(POMModel model) { String packageName = (String) wiz.getProperty(WizardProperties.WSDL_PACKAGE_NAME); - org.netbeans.modules.maven.model.pom.Plugin plugin = - isEJB ? - MavenModelUtils.addJaxWSPlugin(model, "2.0") : //NOI18N - MavenModelUtils.addJaxWSPlugin(model); + Plugin plugin = MavenModelUtils.addJaxWSPlugin(model); MavenModelUtils.addWsimportExecution(plugin, clientName, relativePath,wsdlLocation, packageName); - if (isEJB) { // expecting web project + if (isWeb) { // expecting web project MavenModelUtils.addWarPlugin(model, true); } else { // J2SE Project MavenModelUtils.addWsdlResources(model); diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java index e8c65dfdcb0b..3f2ebab286d9 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsServiceCreator.java @@ -88,6 +88,7 @@ import org.netbeans.modules.maven.api.execute.RunConfig; import org.netbeans.modules.maven.api.execute.RunUtils; import org.netbeans.modules.maven.jaxws.MavenModelUtils; +import org.netbeans.modules.maven.model.pom.Plugin; import org.netbeans.modules.websvc.api.support.java.GenerationUtils; import org.netbeans.modules.websvc.api.support.java.SourceUtils; import org.netbeans.modules.websvc.jaxws.light.api.JAXWSLightSupport; @@ -302,19 +303,14 @@ private void generateWsFromWsdl15(final ProgressHandle handle) throws IOExceptio MavenModelUtils.addMetroLibrary(project); MavenModelUtils.addJavadoc(project); } catch (Exception ex) { - Logger.getLogger( - JaxWsServiceCreator.class.getName()).log( - Level.INFO, "Cannot add Metro libbrary to pom file", ex); //NOI18N + LOG.log(Level.INFO, "Cannot add Metro libbrary to pom file", ex); //NOI18N } } ModelOperation operation = new ModelOperation() { @Override public void performOperation(POMModel model) { - org.netbeans.modules.maven.model.pom.Plugin plugin = - isEJB ? - MavenModelUtils.addJaxWSPlugin(model, "2.0") : //NOI18N - MavenModelUtils.addJaxWSPlugin(model); + Plugin plugin = MavenModelUtils.addJaxWSPlugin(model); MavenModelUtils.addWsimportExecution(plugin, serviceName, relativePath,null ); if (isWeb) { // expecting web project From f1f3fb30ee5aa027eb6edce411092c4f2cc4e19f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:19:19 -0600 Subject: [PATCH 10/21] Add support for creating web services for EJB, CAR and Java SE maven projects. --- .../modules/maven/jaxws/MavenModelUtils.java | 69 +++++++++++++++---- 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java index 006e1e072ae0..97e327f17627 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/MavenModelUtils.java @@ -40,6 +40,8 @@ import javax.xml.namespace.QName; import org.apache.maven.project.MavenProject; import org.netbeans.api.j2ee.core.Profile; +import org.netbeans.modules.j2ee.api.ejbjar.Car; +import org.netbeans.modules.j2ee.api.ejbjar.EjbJar; import org.netbeans.modules.javaee.specs.support.api.JaxWs; import org.netbeans.modules.maven.model.pom.Build; import org.netbeans.modules.maven.model.pom.Configuration; @@ -59,6 +61,8 @@ public final class MavenModelUtils { private static Profile profile; + + // Maven coordinates private static final String WSIPMORT_GENERATE_PREFIX = "wsimport-generate-"; //NOI18N private static final String STALE_FILE_DIRECTORY = "${project.build.directory}/jaxws/stale/"; //NOI18N private static final String STALE_FILE_EXTENSION = ".stale"; //NOI18N @@ -79,7 +83,7 @@ public final class MavenModelUtils { public static final String MAVEN_PLUGINS_GROUP_ID = "org.apache.maven.plugins"; //NOI18N public static final String WAR_PLUGIN_ARTIFACT_ID = "maven-war-plugin"; //NOI18N - public static final String WAR_PLUGIN_VERSION = "2.3.4"; //NOI18N + public static final String WAR_PLUGIN_VERSION = "3.4.0"; //NOI18N /** * adds jaxws plugin, requires the model to have a transaction started, @@ -127,9 +131,6 @@ public static Plugin addJaxWSPlugin(POMModel model, String jaxWsVersion) { config.setSimpleParameter("verbose", "true"); //NOI18N config.setSimpleParameter("extension", "true"); //NOI18N config.setSimpleParameter("catalog", "${basedir}/" + MavenJAXWSSupportImpl.CATALOG_PATH); - if (jaxWsVersion != null) { - config.setSimpleParameter("target", jaxWsVersion); //NOI18N - } Dependency webservicesDep = model.getFactory().createDependency(); webservicesDep.setGroupId(WEBSERVICES_METRO_GROUP_ID); webservicesDep.setArtifactId(WEBSERVICES_API_ARTIFACT_ID); @@ -427,19 +428,12 @@ public static void addMetroLibrary(Project project) { * @return true if library was detected */ public static boolean hasJaxWsAPI(Project project, boolean isJakartaEENameSpace) { - SourceGroup[] srcGroups = ProjectUtils.getSources(project).getSourceGroups( - JavaProjectConstants.SOURCES_TYPE_JAVA); - - final boolean isWeb = WSUtils.isWeb(project); - if(isWeb) { - WebModule wm = WebModule.getWebModule(project.getProjectDirectory()); - profile = wm.getJ2eeProfile(); - } - // TODO: Add support for EJB modules - + SourceGroup[] srcGroups = ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); + getProfile(project); if (srcGroups.length > 0) { ClassPath classPath = ClassPath.getClassPath(srcGroups[0].getRootFolder(), ClassPath.BOOT); - final String wsfClazz = isJakartaEENameSpace ? "jakarta/xml/ws/WebServiceFeature.class" : "javax/xml/ws/WebServiceFeature.class"; // NOI18N + String wsfClazz = isJakartaEENameSpace ? + "jakarta/xml/ws/WebServiceFeature.class" : "javax/xml/ws/WebServiceFeature.class"; // NOI18N FileObject wsFeature = classPath.findResource(wsfClazz); if (wsFeature == null) { classPath = ClassPath.getClassPath(srcGroups[0].getRootFolder(), ClassPath.COMPILE); @@ -694,4 +688,49 @@ private static String getJaxWsVersion(Profile profile) { } } + /** + * Get {@code Profile} to use when generating the web service client, the + * {@code Profile} will be computed every time there is a call to + * {@code hasJaxWsAPI}. + * @param project + * @see hasJaxWsAPI + */ + private static void getProfile(Project project) { + FileObject projectDirectory = project.getProjectDirectory(); + if(WSUtils.isWeb(project)) { + WebModule wm = WebModule.getWebModule(projectDirectory); + profile = wm.getJ2eeProfile(); + } else if (WSUtils.isEJB(project)) { + EjbJar ejbm = EjbJar.getEjbJar(projectDirectory); + profile = ejbm.getJ2eeProfile(); + } else if (WSUtils.isCar(project)) { + Car cm = Car.getCar(projectDirectory); + profile = cm.getJ2eeProfile(); + } else if (WSUtils.isJar(project)) { + String sourceLevel = WSUtils.getSourceLevel(project); + profile = getJarProfile(sourceLevel); + } else { + profile = Profile.JAKARTA_EE_8_WEB; + } + } + + /** + * Given the source level return an appropriate {@code Profile} to use + * with JSE projects to generate web services clients. + * @param jseVersion sourceLevel + * @return Profile + */ + private static Profile getJarProfile(String jseVersion) { + int sourceLevel = Integer.parseInt(jseVersion); + if (sourceLevel >= 17) { + return Profile.JAKARTA_EE_11_WEB; + } else if (sourceLevel >= 11) { + return Profile.JAKARTA_EE_10_WEB; + } else if (sourceLevel >= 8) { + return Profile.JAKARTA_EE_8_WEB; + } + return Profile.JAKARTA_EE_8_WEB; + } + + } From 3637c075457298839e18538ff1e1b25f040b9d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:26:11 -0600 Subject: [PATCH 11/21] -Simplify logic that compute whether a project is Web, Car, Jar, EJB -Add support for Car and Jar projects to isJakartaEENameSpace() -Add method getSourceLevel() --- .../netbeans/modules/maven/jaxws/WSUtils.java | 89 ++++++++++++------- 1 file changed, 57 insertions(+), 32 deletions(-) diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java index d51c5949cf88..94d17a1fbfe9 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java @@ -41,10 +41,12 @@ import java.util.prefs.Preferences; import org.netbeans.api.j2ee.core.Profile; import org.netbeans.api.java.project.JavaProjectConstants; +import org.netbeans.api.java.queries.SourceLevelQuery; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.SourceGroup; import org.netbeans.api.project.Sources; +import org.netbeans.modules.j2ee.api.ejbjar.Car; import org.netbeans.modules.j2ee.api.ejbjar.EjbJar; import org.netbeans.modules.j2ee.common.dd.DDHelper; import org.netbeans.modules.j2ee.dd.api.common.NameAlreadyUsedException; @@ -54,7 +56,6 @@ import org.netbeans.modules.j2ee.dd.api.web.ServletMapping; import org.netbeans.modules.j2ee.dd.api.web.ServletMapping25; import org.netbeans.modules.j2ee.dd.api.web.WebApp; -import org.netbeans.modules.j2ee.deployment.devmodules.api.J2eeModule; import org.netbeans.modules.j2ee.deployment.devmodules.spi.J2eeModuleProvider; import org.netbeans.modules.javaee.specs.support.api.JaxWs; import org.netbeans.modules.maven.api.NbMavenProject; @@ -296,48 +297,56 @@ public static boolean isProjectReferenceable(Project sourceProject, Project targ } public static boolean isEJB(Project project) { - J2eeModuleProvider j2eeModuleProvider = project.getLookup().lookup(J2eeModuleProvider.class); - if (j2eeModuleProvider != null) { - J2eeModule.Type moduleType = j2eeModuleProvider.getJ2eeModule().getType(); - if (J2eeModule.Type.EJB.equals(moduleType)) { - return true; - } - } - return false; + String packaging = project.getLookup().lookup(NbMavenProject.class).getPackagingType(); + return packaging != null && packaging.equals(NbMavenProject.TYPE_EJB); } public static boolean isWeb(Project project) { - J2eeModuleProvider j2eeModuleProvider = project.getLookup().lookup(J2eeModuleProvider.class); - if (j2eeModuleProvider != null) { - J2eeModule.Type moduleType = j2eeModuleProvider.getJ2eeModule().getType(); - if (J2eeModule.Type.WAR.equals(moduleType)) { - return true; - } - } - return false; + String packaging = project.getLookup().lookup(NbMavenProject.class).getPackagingType(); + return packaging != null && packaging.equals(NbMavenProject.TYPE_WAR); + } + + public static boolean isCar(Project project) { + String packaging = project.getLookup().lookup(NbMavenProject.class).getPackagingType(); + return packaging != null && packaging.equals(NbMavenProject.TYPE_APPCLIENT); + } + + public static boolean isJar(Project project) { + String packaging = project.getLookup().lookup(NbMavenProject.class).getPackagingType(); + return packaging != null && packaging.equals(NbMavenProject.TYPE_JAR); } /** * Check if this project is at least Jakarta EE 9 and will use the - * {@code jakarta.*} namespace. + * {@code jakarta.*} namespace. Java SE projects that use source level + * equal or greater than 11 should use jakarta namespace. * @param project * @return True if this project use jakarta namespace {@code false} otherwise */ public static boolean isJakartaEENameSpace(Project project) { - J2eeModuleProvider j2eeModuleProvider = project.getLookup().lookup(J2eeModuleProvider.class); - if (j2eeModuleProvider != null) { - J2eeModule.Type moduleType = j2eeModuleProvider.getJ2eeModule().getType(); - FileObject projectDirectory = project.getProjectDirectory(); - if (J2eeModule.Type.WAR.equals(moduleType)) { - WebModule wm = WebModule.getWebModule(projectDirectory); - Profile profile = wm.getJ2eeProfile(); - boolean isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); - return isJakarta; - } else if (J2eeModule.Type.WAR.equals(moduleType)) { - EjbJar ejbm = EjbJar.getEjbJar(projectDirectory); - Profile profile = ejbm.getJ2eeProfile(); - boolean isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); - return isJakarta; + + FileObject projectDirectory = project.getProjectDirectory(); + boolean isJakarta; + Profile profile; + if(isWeb(project)) { + WebModule wm = WebModule.getWebModule(projectDirectory); + profile = wm.getJ2eeProfile(); + isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); + return isJakarta; + } else if (isEJB(project)) { + EjbJar ejbm = EjbJar.getEjbJar(projectDirectory); + profile = ejbm.getJ2eeProfile(); + isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); + return isJakarta; + } else if (isCar(project)) { + Car cm = Car.getCar(projectDirectory); + profile = cm.getJ2eeProfile(); + isJakarta = profile.isAtLeast(Profile.JAKARTA_EE_9_WEB); + return isJakarta; + } else if (isJar(project)) { + int sourceLevel = Integer.parseInt(getSourceLevel(project)); + if (sourceLevel >= 11) { + return true; } } return false; @@ -1048,4 +1057,20 @@ static boolean isInSourceGroup(Project prj, String serviceClass) { return false; } + /** + * Get the string representation of the source level from a project. + * @param project + * @return a source level of the Java file, e.g. "8", "11", "21" + * or null if the source level is unknown. + */ + public static String getSourceLevel(Project project) { + SourceGroup[] srcGroups = ProjectUtils.getSources(project).getSourceGroups(JavaProjectConstants.SOURCES_TYPE_JAVA); + String sl = SourceLevelQuery.getSourceLevel2(srcGroups[0].getRootFolder()).getSourceLevel(); + int index = sl.indexOf('.'); // NOI18N + if (index > 0) { + sl = sl.substring(index + 1); + } + return sl; + } + } From bca5baa1981418b7f47c0eb3848d949c456c0736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:40:11 -0600 Subject: [PATCH 12/21] -Add a new module dependency in order to get the source level of a java file -Add module maven.jaxws as a friend --- enterprise/maven.j2ee/nbproject/project.xml | 10 ++++++++++ enterprise/maven.jaxws/nbproject/project.xml | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/enterprise/maven.j2ee/nbproject/project.xml b/enterprise/maven.j2ee/nbproject/project.xml index cf72801a24bd..68b600e960c8 100644 --- a/enterprise/maven.j2ee/nbproject/project.xml +++ b/enterprise/maven.j2ee/nbproject/project.xml @@ -52,6 +52,15 @@ 2.16 + + org.netbeans.api.java + + + + 1 + 1.95 + + org.netbeans.api.java.classpath @@ -539,6 +548,7 @@ + org.netbeans.modules.maven.jaxws org.netbeans.modules.payara.micro org.netbeans.modules.jakarta.transformer org.netbeans.modules.maven.j2ee diff --git a/enterprise/maven.jaxws/nbproject/project.xml b/enterprise/maven.jaxws/nbproject/project.xml index 5309f332c49c..63434c1b0524 100644 --- a/enterprise/maven.jaxws/nbproject/project.xml +++ b/enterprise/maven.jaxws/nbproject/project.xml @@ -25,6 +25,15 @@ org.netbeans.modules.maven.jaxws + + org.netbeans.api.java + + + + 1 + 1.95 + + org.netbeans.api.java.classpath From 71e3a2b49392fcb14a7c4553b16ba9b3c58fd038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:41:14 -0600 Subject: [PATCH 13/21] Bump javac to version 17 and use: -Pattern Matching for instanceof -Switch Expressions --- enterprise/maven.j2ee/nbproject/project.properties | 2 +- enterprise/maven.jaxws/nbproject/project.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/enterprise/maven.j2ee/nbproject/project.properties b/enterprise/maven.j2ee/nbproject/project.properties index 5f9e836dbcef..5b10422d7663 100644 --- a/enterprise/maven.j2ee/nbproject/project.properties +++ b/enterprise/maven.j2ee/nbproject/project.properties @@ -18,5 +18,5 @@ is.eager=true javac.compilerargs=-Xlint -Xlint:-serial -Xlint -Xlint:-serial -javac.source=1.8 +javac.release=17 test.config.stableBTD.includes=**/*Test.class diff --git a/enterprise/maven.jaxws/nbproject/project.properties b/enterprise/maven.jaxws/nbproject/project.properties index d9eb0f68eb69..bb8182b75b7e 100644 --- a/enterprise/maven.jaxws/nbproject/project.properties +++ b/enterprise/maven.jaxws/nbproject/project.properties @@ -17,4 +17,4 @@ is.eager=true javac.compilerargs=-Xlint:unchecked -javac.source=1.8 +javac.release=17 From 9fedfe73bdeff6438d4434df7664f3dbfb895fbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 7 Apr 2025 19:42:40 -0600 Subject: [PATCH 14/21] -Add useful comment for debugging -Add useful variable for debugging -Remove unused imports --- .../maven/j2ee/ui/customizer/impl/CustomizerRunEjb.java | 3 ++- .../netbeans/modules/websvc/core/client/wizard/ClientInfo.java | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunEjb.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunEjb.java index ca11af1de560..f6bebfbbc17a 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunEjb.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ui/customizer/impl/CustomizerRunEjb.java @@ -38,7 +38,8 @@ public CustomizerRunEjb(ModelHandle2 handle, Project project) { module = EjbJar.getEjbJar(project.getProjectDirectory()); if (module != null) { - txtJ2EEVersion.setText(module.getJ2eeProfile().getDisplayName()); + String profile = module.getJ2eeProfile().getDisplayName(); + txtJ2EEVersion.setText(profile); } initDeployOnSave(jCheckBoxDeployOnSave, dosDescription); diff --git a/enterprise/websvc.core/src/org/netbeans/modules/websvc/core/client/wizard/ClientInfo.java b/enterprise/websvc.core/src/org/netbeans/modules/websvc/core/client/wizard/ClientInfo.java index 7fcfff85573b..1625606a674f 100644 --- a/enterprise/websvc.core/src/org/netbeans/modules/websvc/core/client/wizard/ClientInfo.java +++ b/enterprise/websvc.core/src/org/netbeans/modules/websvc/core/client/wizard/ClientInfo.java @@ -37,7 +37,6 @@ import java.net.ProxySelector; import java.net.URL; import java.net.URLDecoder; -import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.util.logging.Level; import java.util.logging.Logger; @@ -75,7 +74,6 @@ import org.netbeans.api.java.project.JavaProjectConstants; import org.netbeans.api.java.queries.SourceLevelQuery; -import org.netbeans.api.options.OptionsDisplayer; import org.netbeans.api.progress.ProgressUtils; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectUtils; @@ -1401,6 +1399,7 @@ private J2eePlatform getJ2eePlatform(Project project){ try { return Deployment.getDefault().getServerInstance(serverInstanceID).getJ2eePlatform(); } catch (InstanceRemovedException ex) { + // Probably NO server selected! Logger.getLogger(getClass().getName()).log(Level.INFO, "Failed to find J2eePlatform", ex); } } From 6aa3c6309d6a21f7b9cb3e5caea35b2a5344cfca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 28 Apr 2025 12:05:51 -0600 Subject: [PATCH 15/21] Fix wrong artifact and update GlassFish 7/8 version --- .../maven/j2ee/utils/MavenProjectSupport.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java index 3e0b365aad7a..4204d51c00f6 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java @@ -608,16 +608,16 @@ public static Profile getProfileFromPOM(final Project project) { javaEE7Web.add(new DependencyDesc("javax", "javaee-web-api", "7.0")); javaEE8Full.add(new DependencyDesc("javax", "javaee-api", "8.0")); javaEE8Web.add(new DependencyDesc("javax", "javaee-web-api", "8.0")); - jakartaEE8Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","8.0.0")); - jakartaEE8Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","8.0.0")); - jakartaEE9Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.0.0")); - jakartaEE9Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.0.0")); - jakartaEE91Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.1.0")); - jakartaEE91Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.1.0")); - jakartaEE10Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","10.0.0")); - jakartaEE10Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","10.0.0")); - jakartaEE11Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","11.0.0-RC1")); - jakartaEE11Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","11.0.0-RC1")); + jakartaEE8Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","8.0.0")); + jakartaEE8Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","8.0.0")); + jakartaEE9Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.0.0")); + jakartaEE9Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.0.0")); + jakartaEE91Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","9.1.0")); + jakartaEE91Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.1.0")); + jakartaEE10Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","10.0.0")); + jakartaEE10Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","10.0.0")); + jakartaEE11Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","11.0.0-RC1")); + jakartaEE11Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","11.0.0-RC1")); // GlassFish implementations javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "2")); @@ -636,10 +636,10 @@ public static Profile getProfileFromPOM(final Project project) { jakartaEE9Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.0.0")); jakartaEE91Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.2.5")); jakartaEE91Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.2.5")); - jakartaEE10Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "7.0.23")); - jakartaEE10Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "7.0.23")); - jakartaEE11Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M10")); - jakartaEE11Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M10")); + jakartaEE10Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "7.0.24")); + jakartaEE10Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "7.0.24")); + jakartaEE11Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M11")); + jakartaEE11Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M11")); // WebLogic implementations From 9721d1c4bb4d6fb7a9223f7f4618f81908abd870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Tue, 29 Apr 2025 20:15:29 -0600 Subject: [PATCH 16/21] Revert: When creating capabilities for a project the EJB & WAR project types should be in the same if statement. --- .../modules/j2ee/common/J2eeProjectCapabilities.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java b/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java index a67f4f110cff..b9ae12cd1adc 100644 --- a/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java +++ b/enterprise/j2ee.common/src/org/netbeans/modules/j2ee/common/J2eeProjectCapabilities.java @@ -68,17 +68,17 @@ public static J2eeProjectCapabilities forProject(@NonNull Project project) { Profile ejbJarProfile = null; Profile webProfile = null; Profile carProfile = null; - if (type == J2eeModule.Type.EJB) { + if (type == J2eeModule.Type.EJB || type == J2eeModule.Type.WAR) { EjbJar[] ejbJars = EjbJar.getEjbJars(project); if (ejbJars.length > 0) { // just use first one to test profile: ejbJarProfile = ejbJars[0].getJ2eeProfile(); } - } - if (type == J2eeModule.Type.WAR) { - WebModule module = WebModule.getWebModule(project.getProjectDirectory()); - if (module != null) { - webProfile = module.getJ2eeProfile(); + if (type == J2eeModule.Type.WAR) { + WebModule module = WebModule.getWebModule(project.getProjectDirectory()); + if (module != null) { + webProfile = module.getJ2eeProfile(); + } } } if (type == J2eeModule.Type.CAR) { From e8d98ea2d5e48284d3a53778e00667288eb416ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Wed, 30 Apr 2025 18:26:42 -0600 Subject: [PATCH 17/21] Revert: Remove subtypes from @ProjectServiceProvider --- .../maven/j2ee/appclient/AppClientModuleProviderImpl.java | 1 + .../netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java | 1 + .../netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java | 1 + 3 files changed, 3 insertions(+) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java index 22b2e83c2e15..6d445b73d6a2 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/appclient/AppClientModuleProviderImpl.java @@ -46,6 +46,7 @@ */ @ProjectServiceProvider( service = { + AppClientModuleProviderImpl.class, CarProvider.class, CarsInProject.class, J2eeModuleProvider.class diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java index b03380d4e67d..4d6593e76eea 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ejb/EjbModuleProviderImpl.java @@ -46,6 +46,7 @@ */ @ProjectServiceProvider( service = { + EjbModuleProviderImpl.class, J2eeModuleProvider.class, EjbJarProvider.class, EjbJarsInProject.class diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java index d828cacb48a2..f9f86563839f 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/web/WebModuleProviderImpl.java @@ -51,6 +51,7 @@ */ @ProjectServiceProvider( service = { + WebModuleProviderImpl.class, WebModuleProvider.class, J2eeModuleProvider.class }, From f7737776aecf8da50c1396bf636b5b6064bc26bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Wed, 30 Apr 2025 18:27:31 -0600 Subject: [PATCH 18/21] Update maven coordinates inside test --- .../modules/maven/j2ee/web/WebModuleImplTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java index e70edf752d5a..7dce934f3247 100644 --- a/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java +++ b/enterprise/maven.j2ee/test/unit/src/org/netbeans/modules/maven/j2ee/web/WebModuleImplTest.java @@ -151,11 +151,11 @@ public void testGetJ2eeProfile_jakartaEE10WebSpecification() throws IOException } public void testGetJ2eeProfile_warProject_jakartaEE11FullSpecification() throws IOException { - checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "jakarta.platform", "jakarta.jakartaee-api", "11.0.0-M1"); //NOI18N + checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "jakarta.platform", "jakarta.jakartaee-api", "11.0.0-RC1"); //NOI18N } public void testGetJ2eeProfile_jakartaEE11WebSpecification() throws IOException { - checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "jakarta.platform", "jakarta.jakartaee-web-api", "11.0.0-M1"); //NOI18N + checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "jakarta.platform", "jakarta.jakartaee-web-api", "11.0.0-RC1"); //NOI18N } public void testGetJ2eeProfile_javaEE5Full_glassfish() throws IOException { @@ -215,19 +215,19 @@ public void testGetJ2eeProfile_jakartaEE91Web_glassfish() throws IOException { } public void testGetJ2eeProfile_warProject_jakartaEE10Full_glassfish() throws IOException { - checkJ2eeProfile(Profile.JAKARTA_EE_10_WEB, "org.glassfish.main.extras", "glassfish-embedded-all", "7.0.11"); //NOI18N + checkJ2eeProfile(Profile.JAKARTA_EE_10_WEB, "org.glassfish.main.extras", "glassfish-embedded-all", "7.0.24"); //NOI18N } public void testGetJ2eeProfile_jakartaEE10Web_glassfish() throws IOException { - checkJ2eeProfile(Profile.JAKARTA_EE_10_WEB, "org.glassfish.main.extras", "glassfish-embedded-web", "7.0.11"); //NOI18N + checkJ2eeProfile(Profile.JAKARTA_EE_10_WEB, "org.glassfish.main.extras", "glassfish-embedded-web", "7.0.24"); //NOI18N } public void testGetJ2eeProfile_warProject_jakartaEE11Full_glassfish() throws IOException { - checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M1"); //NOI18N + checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M11"); //NOI18N } public void testGetJ2eeProfile_jakartaEE11Web_glassfish() throws IOException { - checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M1"); //NOI18N + checkJ2eeProfile(Profile.JAKARTA_EE_11_WEB, "org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M11"); //NOI18N } public void testGetJ2eeProfile_javaEE5_weblogic() throws IOException { From 3116743265371fe6d5fc7a8a2470537e011ce266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Wed, 30 Apr 2025 18:38:50 -0600 Subject: [PATCH 19/21] Fix mismatch when using MavenProjectSupport.getProfileFromPOM() to retrieve the correct Profile. --- .../maven/j2ee/utils/MavenProjectSupport.java | 95 ++++++++++++------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java index 4204d51c00f6..2016cbe50124 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/utils/MavenProjectSupport.java @@ -568,8 +568,11 @@ public static Profile getProfileFromPOM(final Project project) { * In more detail: *
    * GlassFish: + *
  • 5.0 supports Java EE 8
  • *
  • 5.1 supports Jakarta EE 8
  • + *
  • 6.0 supports Jakarta EE 9
  • *
  • 6.1 supports Jakarta EE 9.1
  • + *
  • 6.2 supports Jakarta EE 9.1
  • *
  • 7.X supports Jakarta EE 10
  • *
  • 8.X supports Jakarta EE 11
  • * WebLogic: @@ -598,6 +601,12 @@ public static Profile getProfileFromPOM(final Project project) { List jakartaEE10Full = new ArrayList<>(); List jakartaEE11Web = new ArrayList<>(); List jakartaEE11Full = new ArrayList<>(); + + // The version field from the DependencyDesc Java Record will be + // matched with a String.startsWith(...) method, hence the version + // should be declared at is minimum expression. e.g + // GlassFish 7.0.24 will be matched to 7.0 and return true for + // Profile.JakartaEE_10 // Java/Jakarta EE specification javaEE5.add(new DependencyDesc("javaee", "javaee-api", "5.0")); @@ -616,8 +625,8 @@ public static Profile getProfileFromPOM(final Project project) { jakartaEE91Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","9.1.0")); jakartaEE10Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","10.0.0")); jakartaEE10Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","10.0.0")); - jakartaEE11Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","11.0.0-RC1")); - jakartaEE11Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","11.0.0-RC1")); + jakartaEE11Web.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-web-api","11.0.0")); + jakartaEE11Full.add(new DependencyDesc("jakarta.platform","jakarta.jakartaee-api","11.0.0")); // GlassFish implementations javaEE5.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "2")); @@ -625,42 +634,62 @@ public static Profile getProfileFromPOM(final Project project) { javaEE6Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "3")); javaEE6Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "3")); javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.0")); - javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.0.1")); - javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.1.2")); - javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.1.2")); - javaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0")); - javaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1.0")); - jakartaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1.0")); - jakartaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1.0")); - jakartaEE9Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.0.0")); - jakartaEE9Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.0.0")); - jakartaEE91Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.2.5")); - jakartaEE91Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.2.5")); - jakartaEE10Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "7.0.24")); - jakartaEE10Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "7.0.24")); - jakartaEE11Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "8.0.0-M11")); - jakartaEE11Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "8.0.0-M11")); + javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.0")); + javaEE7Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "4.1")); + javaEE7Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "4.1")); + javaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.0")); + javaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.0")); + jakartaEE8Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "5.1")); + jakartaEE8Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "5.1")); + jakartaEE9Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.0")); + jakartaEE9Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.0")); + jakartaEE91Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.1")); + jakartaEE91Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.1")); + jakartaEE91Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "6.2")); + jakartaEE91Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "6.2")); + jakartaEE10Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "7.0")); + jakartaEE10Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "7.0")); + jakartaEE11Full.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-all", "8.0")); + jakartaEE11Web.add(new DependencyDesc("org.glassfish.main.extras", "glassfish-embedded-web", "8.0")); + + // Tomcat implementations + javaEE6Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "7")); + javaEE7Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "8")); + javaEE8Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "9")); + jakartaEE8Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "9")); + jakartaEE91Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "10.0")); + jakartaEE10Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "10.1")); + jakartaEE11Web.add(new DependencyDesc("org.apache.tomcat.embed", "tomcat-embed-core", "11")); + + // TomEE implementations + javaEE7Web.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "7")); + javaEE7Full.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "7")); + jakartaEE8Web.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "8")); + jakartaEE91Full.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "9")); + jakartaEE91Web.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "9")); + jakartaEE10Full.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "10")); + jakartaEE10Web.add(new DependencyDesc("org.apache.tomee", "tomee-embedded", "10")); // WebLogic implementations -// javaEE5.add(new DependencyDesc("weblogic", "weblogic", "10")); -// javaEE6Full.add(new DependencyDesc("weblogic", "weblogic", "12")); + javaEE5.add(new DependencyDesc("weblogic", "weblogic", "10")); + javaEE6Full.add(new DependencyDesc("weblogic", "weblogic", "12")); // JBoss implementations - javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-5.0", "1.0.0.GA")); - javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-5.0", "1.0.0.GA")); - javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-6.0", "3.0.3.Final")); - javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-6.0", "3.0.3.Final")); - javaEE6Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-6.0", "3.0.3.Final")); - javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-7.0", "1.1.1.Final")); - javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-7.0", "1.1.1.Final")); - javaEE7Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-7.0", "1.1.1.Final")); - javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-8.0", "1.0.4.Final")); - javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-8.0", "1.0.4.Final")); - javaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-8.0", "1.0.4.Final")); - jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-8.0", "1.0.1.Final")); - jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-all-8.0", "1.0.0.Final")); - jakartaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-web-8.0", "1.0.0.Final")); + javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-5.0", null)); + javaEE5.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-5.0", null)); + javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-6.0", null)); + javaEE6Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-6.0", null)); + javaEE6Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-6.0", null)); + javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-7.0", null)); + javaEE7Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-7.0", null)); + javaEE7Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-7.0", null)); + javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-8.0", null)); + javaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-all-8.0", null)); + javaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-javaee-web-8.0", null)); + jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-8.0", null)); + jakartaEE8Full.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-all-8.0", null)); + jakartaEE8Web.add(new DependencyDesc("org.jboss.spec", "jboss-jakartaee-web-8.0", null)); JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_11_FULL, jakartaEE11Full); JAKARTA_EE_MAP.put(Profile.JAKARTA_EE_11_WEB, jakartaEE11Web); From 02d35fd36e7e006873bd84e7318663f40bbf2af2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Mon, 9 Jun 2025 12:47:09 -0600 Subject: [PATCH 20/21] Add Logger and use it Use try-with-resources --- .../modules/maven/jaxws/wizards/JaxWsClientCreator.java | 9 +++++---- .../src/org/netbeans/modules/maven/model/Utilities.java | 5 +---- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java index 94f096f0ecfc..3ed9d740f5dc 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/wizards/JaxWsClientCreator.java @@ -63,6 +63,8 @@ public class JaxWsClientCreator implements ClientCreator { private boolean isWeb; private boolean isEJB; private boolean isJakartaEENameSpace; + + private static final Logger LOG = Logger.getLogger(JaxWsClientCreator.class.getCanonicalName()); /** * Creates a new instance of WebServiceClientCreator @@ -113,9 +115,7 @@ public void createClient() throws IOException { MavenModelUtils.addMetroLibrary(project); MavenModelUtils.addJavadoc(project); } catch (Exception ex) { - Logger.getLogger( - JaxWsClientCreator.class.getName()).log( - Level.INFO, "Cannot add Metro library to pom file", ex); //NOI18N + LOG.log(Level.INFO, "Cannot add Metro library to pom file", ex); //NOI18N } } @@ -136,6 +136,7 @@ public void performOperation(POMModel model) { } } }; + Utilities.performPOMModelOperations(project.getProjectDirectory().getFileObject("pom.xml"), Collections.singletonList(operation)); @@ -147,7 +148,7 @@ public void performOperation(POMModel model) { Collections.singletonList("compile")); //NOI18N RunUtils.executeMaven(cfg); - } + } } } diff --git a/java/maven.model/src/org/netbeans/modules/maven/model/Utilities.java b/java/maven.model/src/org/netbeans/modules/maven/model/Utilities.java index 2deeb9eb1f1a..e998749da6f2 100644 --- a/java/maven.model/src/org/netbeans/modules/maven/model/Utilities.java +++ b/java/maven.model/src/org/netbeans/modules/maven/model/Utilities.java @@ -243,11 +243,8 @@ public static void saveChanges(AbstractDocumentModel model) throws IOExceptio if (fo == null) { fo = fParentFo.createData(file.getName()); } - OutputStream os = fo.getOutputStream(); - try { + try (OutputStream os = fo.getOutputStream()) { os.write(text.getBytes(StandardCharsets.UTF_8)); - } finally { - os.close(); } } }); From 897da59e9416a484bf6b476cfac643dd621f5d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Contreras?= Date: Fri, 20 Jun 2025 13:21:44 -0600 Subject: [PATCH 21/21] -equals() and hashCode( should cover the same fields -Remove the redundant Xpp3Dom variable -close all wrapped streams in try-with-resources with 'bw' --- .../org/netbeans/modules/maven/j2ee/ear/EarImpl.java | 12 ++++++------ .../org/netbeans/modules/maven/jaxws/WSUtils.java | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java index a1048b700bfe..c321791494b9 100644 --- a/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java +++ b/enterprise/maven.j2ee/src/org/netbeans/modules/maven/j2ee/ear/EarImpl.java @@ -273,8 +273,7 @@ public String getModuleVersion() { Profile profile = getJ2eeProfile(); if (null == profile) { return Application.VERSION_8; - } - else { + } else { return switch (profile) { case JAKARTA_EE_11_FULL -> Application.VERSION_11; case JAKARTA_EE_10_FULL -> Application.VERSION_10; @@ -744,9 +743,8 @@ private EarImpl.MavenModule[] readPomModules() { private MavenModule[] checkConfiguration(MavenProject prj, Object conf) { List toRet = new ArrayList<>(); - if (conf instanceof Xpp3Dom xpp3Dom) { + if (conf instanceof Xpp3Dom dom) { ExpressionEvaluator eval = PluginPropertyUtils.createEvaluator(project); - Xpp3Dom dom = xpp3Dom; Xpp3Dom modules = dom.getChild("modules"); //NOI18N if (modules != null) { int index = 0; @@ -911,7 +909,7 @@ public File getDeploymentConfigurationFile(String name) { public void addPropertyChangeListener(PropertyChangeListener listener) { module.addPropertyChangeListener(listener); } - + @Override public void removePropertyChangeListener(PropertyChangeListener listener) { module.removePropertyChangeListener(listener); @@ -929,7 +927,9 @@ public boolean equals(Object obj) { return false; } final ProxyJ2eeModule other = (ProxyJ2eeModule) obj; - return Objects.equals(this.module, other.module); + return Objects.equals(this.module, other.module) + && Objects.equals(this.mavenModule, other.mavenModule) + && Objects.equals(this.fileNameMapping, other.fileNameMapping); } @Override diff --git a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java index 94d17a1fbfe9..78696d0b2d25 100644 --- a/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java +++ b/enterprise/maven.jaxws/src/org/netbeans/modules/maven/jaxws/WSUtils.java @@ -141,9 +141,9 @@ public static void generateSunJaxwsFile(final FileObject targetDir) throws IOExc @Override public void run() throws IOException { FileObject sunJaxwsFo = FileUtil.createData(targetDir, "sun-jaxws.xml");//NOI18N - try (FileLock lock = sunJaxwsFo.lock(); OutputStream os = sunJaxwsFo.getOutputStream(lock); - OutputStreamWriter osw = new OutputStreamWriter(os, StandardCharsets.UTF_8); - BufferedWriter bw = new BufferedWriter(osw)) { + try (FileLock lock = sunJaxwsFo.lock(); + BufferedWriter bw = new BufferedWriter( + new OutputStreamWriter(sunJaxwsFo.getOutputStream(lock), StandardCharsets.UTF_8))) { bw.write(sunJaxwsContent); } }