[574787] Tomcat: Jakarta JavaDoc URLs should be based on the Tomcat Runtime
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.server.tomcat.core/META-INF/MANIFEST.MF index 4017225..8934296 100644 --- a/plugins/org.eclipse.jst.server.tomcat.core/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.jst.server.tomcat.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@ Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jst.server.tomcat.core; singleton:=true -Bundle-Version: 1.1.1500.qualifier +Bundle-Version: 1.1.1600.qualifier Bundle-Activator: org.eclipse.jst.server.tomcat.core.internal.TomcatPlugin Bundle-Vendor: %providerName Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/pom.xml b/plugins/org.eclipse.jst.server.tomcat.core/pom.xml index 81566c9..dc5ab03 100644 --- a/plugins/org.eclipse.jst.server.tomcat.core/pom.xml +++ b/plugins/org.eclipse.jst.server.tomcat.core/pom.xml
@@ -22,6 +22,6 @@ <groupId>org.eclipse.webtools.servertools</groupId> <artifactId>org.eclipse.jst.server.tomcat.core</artifactId> - <version>1.1.1500-SNAPSHOT</version> + <version>1.1.1600-SNAPSHOT</version> <packaging>eclipse-plugin</packaging> </project>
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatLaunchConfigurationDelegate.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatLaunchConfigurationDelegate.java index a12032f..db86483 100644 --- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatLaunchConfigurationDelegate.java +++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatLaunchConfigurationDelegate.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2020 IBM Corporation and others. + * Copyright (c) 2003, 2021 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -147,6 +147,16 @@ } catch (Exception e) { // Ensure we don't continue to think the server is starting tomcatServer.stopImpl(); + StringBuilder builder = new StringBuilder(); + builder.append("Exception while launching using "); + builder.append(vm.getInstallLocation()); + builder.append("with VM args '"); + builder.append(String.join(" ", runConfig.getVMArguments())); + builder.append("' and program args'"); + builder.append(String.join(" ", runConfig.getProgramArguments())); + builder.append("'"); + builder.append(server.getName()); + Platform.getLog(Platform.getBundle(TomcatPlugin.PLUGIN_ID)).error(builder.toString(), e); } } } \ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeClasspathProvider.java b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeClasspathProvider.java index 4d8256b..91c4661 100644 --- a/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeClasspathProvider.java +++ b/plugins/org.eclipse.jst.server.tomcat.core/tomcatcore/org/eclipse/jst/server/tomcat/core/internal/TomcatRuntimeClasspathProvider.java
@@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2003, 2020 IBM Corporation and others. + * Copyright (c) 2003, 2021 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 * which accompanies this distribution, and is available at @@ -27,68 +27,50 @@ import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager; import org.eclipse.wst.server.core.IRuntime; /** - * Classpath provider for the Tomcat runtime. + * Classpath provider for the Apache Tomcat runtime. */ public class TomcatRuntimeClasspathProvider extends RuntimeClasspathProviderDelegate { private static final String JST_WEB_FACET_ID = "jst.web"; - private final String getEEJavadocLocation(IProject project) { - int eeVersion = 9; - try { - IFacetedProject faceted = ProjectFacetsManager.create(project); - if (faceted != null && ProjectFacetsManager.isProjectFacetDefined(JST_WEB_FACET_ID)) { - IProjectFacet webModuleFacet = ProjectFacetsManager.getProjectFacet(JST_WEB_FACET_ID); - if (faceted.hasProjectFacet(webModuleFacet)) { - String servletVersionStr = faceted.getInstalledVersion(webModuleFacet).getVersionString(); - if (servletVersionStr.equals("5.0")) { - eeVersion = 9; - } else if (servletVersionStr.equals("4.0")) { - eeVersion = 8; - } else if (servletVersionStr.equals("3.1")) { - eeVersion = 7; - } else if (servletVersionStr.equals("3.0")) { - eeVersion = 6; - } else if (servletVersionStr.equals("2.5")) { - eeVersion = 5; - } else if (servletVersionStr.equals("2.4")) { - eeVersion = 4; - } else if (servletVersionStr.equals("2.3")) { - eeVersion = 3; - } - } - } - } - catch (NumberFormatException e) { - // default to the latest - } - catch (CoreException e) { - // default to the latest - } - + private final String getStandardsJavadocLocation(int eeVersion, String jarName) { String url = "https://jakarta.ee/specifications/servlet/5.0/apidocs/"; switch (eeVersion) { - case 3: - url = "https://docs.oracle.com/javaee/3/api/"; - break; - case 4: - url = "https://docs.oracle.com/javaee/4/api/"; - break; - case 5: - url = "https://docs.oracle.com/javaee/5/api/"; - break; - case 6: - url = "https://docs.oracle.com/javaee/6/api/"; - break; - case 7: - url = "https://docs.oracle.com/javaee/7/api/"; - break; - case 8: - url = "https://javaee.github.io/javaee-spec/javadocs/"; - break; - default: - // Servlet Javadoc. Jakarta EE 9 doesn't appear to have a central URL for all Javadoc. - url = "https://jakarta.ee/specifications/servlet/5.0/apidocs/"; - break; + case 3 : + url = "https://docs.oracle.com/javaee/3/api/"; + break; + case 4 : + url = "https://docs.oracle.com/javaee/4/api/"; + break; + case 5 : + url = "https://docs.oracle.com/javaee/5/api/"; + break; + case 6 : + url = "https://docs.oracle.com/javaee/6/api/"; + break; + case 7 : + url = "https://docs.oracle.com/javaee/7/api/"; + break; + case 8 : + url = "https://javaee.github.io/javaee-spec/javadocs/"; + break; + default : + // Jakarta EE uses a different URL for each component specification + url = "https://jakarta.ee/specifications/servlet/5.0/apidocs/"; + if (jarName.contains("jsp")) { + url = "https://jakarta.ee/specifications/pages/3.0/apidocs/"; + } + else if (jarName.contains("websocket")) { + url = "https://jakarta.ee/specifications/websocket/2.0/apidocs/"; + } + else if (jarName.contains("annotation")) { + url = "https://jakarta.ee/specifications/annotations/2.0/apidocs/jakarta.annotation/"; + } + else if (jarName.equals("el-api.jar")) { + url = "https://jakarta.ee/specifications/expression-language/4.0/apidocs/"; + } + else if (jarName.contains("jaspic")) { + url = "https://jakarta.ee/specifications/authentication/2.0/apidocs/"; + } } return url; @@ -110,6 +92,9 @@ else if (runtimeTypeId.indexOf("70") > 0) { tomcatDocURL = "https://tomcat.apache.org/tomcat-7.0-doc/api/"; } + else if (runtimeTypeId.indexOf("60") > 0) { + tomcatDocURL = "https://tomcat.apache.org/tomcat-6.0-doc/api/"; + } return tomcatDocURL; } @@ -120,7 +105,7 @@ IPath installPath = runtime.getLocation(); if (installPath == null) return new IClasspathEntry[0]; - + List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); String runtimeId = runtime.getRuntimeType().getId(); if (runtimeId.indexOf("32") > 0) { @@ -139,18 +124,81 @@ } IClasspathEntry[] entries = list.toArray(new IClasspathEntry[list.size()]); - String apiJavadocLocation = getEEJavadocLocation(project); - String tomcatDocLocation = getTomcatJavadocLocation(runtime); + String tomcatJavadocLocation = getTomcatJavadocLocation(runtime); + + /* + * The URL for the EE API can vary based on the project jst.web facet + * version and jar name, or the Tomcat version (preferred, as it is + * more concrete). Find the first value, as it is the same for the + * entire project. -1 represents unknown. + */ + int eeVersion = -1; + if (runtimeId.indexOf("100") > 0) { + eeVersion = 9; + } + else if (runtimeId.indexOf("90") > 0) { + eeVersion = 8; + } + else if (runtimeId.indexOf("85") > 0 || runtimeId.indexOf("80") > 0) { + eeVersion = 7; + } + else if (runtimeId.indexOf("70") > 0) { + eeVersion = 6; + } + else if (runtimeId.indexOf("60") > 0) { + eeVersion = 5; + } + else { + try { + IFacetedProject faceted = ProjectFacetsManager.create(project); + if (faceted != null && ProjectFacetsManager.isProjectFacetDefined(JST_WEB_FACET_ID)) { + IProjectFacet webModuleFacet = ProjectFacetsManager.getProjectFacet(JST_WEB_FACET_ID); + if (faceted.hasProjectFacet(webModuleFacet)) { + String servletVersionStr = faceted.getInstalledVersion(webModuleFacet).getVersionString(); + if (servletVersionStr.equals("5.0")) { + eeVersion = 9; + } + else if (servletVersionStr.equals("4.0")) { + eeVersion = 8; + } + else if (servletVersionStr.equals("3.1")) { + eeVersion = 7; + } + else if (servletVersionStr.equals("3.0")) { + eeVersion = 6; + } + else if (servletVersionStr.equals("2.5")) { + eeVersion = 5; + } + else if (servletVersionStr.equals("2.4")) { + eeVersion = 4; + } + else if (servletVersionStr.equals("2.3")) { + eeVersion = 3; + } + } + } + } + catch (NumberFormatException e) { + // default to the latest + eeVersion = 9; + } + catch (CoreException e) { + // default to the latest + eeVersion = 9; + } + } + for (int i = 0; i < entries.length; i++) { IClasspathEntry entry = entries[i]; String jarName = entry.getPath().lastSegment(); if (jarName.endsWith("-api.jar") && !jarName.startsWith("tomcat")) { - // these are assumed to be the API jars for the runtime standards - IClasspathEntry apiLibraryEntry = JavaCore.newLibraryEntry(entry.getPath(), entry.getSourceAttachmentPath(), entry.getSourceAttachmentRootPath(), entry.getAccessRules(), new IClasspathAttribute[]{JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, apiJavadocLocation)}, entry.isExported()); + // these are assumed to be the API jars for the EE runtime standards + IClasspathEntry apiLibraryEntry = JavaCore.newLibraryEntry(entry.getPath(), entry.getSourceAttachmentPath(), entry.getSourceAttachmentRootPath(), entry.getAccessRules(), new IClasspathAttribute[]{JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, getStandardsJavadocLocation(eeVersion, entry.getPath().lastSegment()))}, entry.isExported()); entries[i] = apiLibraryEntry; } else { - IClasspathEntry tomcatLibraryEntry = JavaCore.newLibraryEntry(entry.getPath(), entry.getSourceAttachmentPath(), entry.getSourceAttachmentRootPath(), entry.getAccessRules(), new IClasspathAttribute[]{JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, tomcatDocLocation)}, entry.isExported()); + IClasspathEntry tomcatLibraryEntry = JavaCore.newLibraryEntry(entry.getPath(), entry.getSourceAttachmentPath(), entry.getSourceAttachmentRootPath(), entry.getAccessRules(), new IClasspathAttribute[]{JavaCore.newClasspathAttribute(IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME, tomcatJavadocLocation)}, entry.isExported()); entries[i] = tomcatLibraryEntry; } }