[nobug] Add the ability to report the web fragment facet version
Change-Id: I44c62495b02bb57af5ef6f0bfb1878246553543c

Change-Id: I330bce66827b19304fd9044b71ca4c8b6aaee5fa
diff --git a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java
index 1812afa..f941156 100644
--- a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java
+++ b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/DeploymentDescriptorPropertyCache.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2022 IBM Corporation and others.
+ * Copyright (c) 2007, 2023 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
@@ -830,7 +830,7 @@
 	 *         facet version and looking at available API classes and methods.
 	 */
 	private ServletAPIDescriptor discoverServletAPIVersion(IProject project) {
-		if (FacetModuleCoreSupport.isDynamicWebProject(project) || FacetModuleCoreSupport.isWebFragmentProject(project)) {
+		if (FacetModuleCoreSupport.isDynamicWebProject(project)) {
 			float version = FacetModuleCoreSupport.getDynamicWebProjectVersion(project);
 			if (version >= 5) {
 				return doCacheDescriptor(project.getName(), new ServletAPIDescriptor(JAKARTA_SERVLET, version, ServletAPIDescriptor.ORIGIN.FACET));
@@ -840,11 +840,23 @@
 			}
 		}
 
+		if (FacetModuleCoreSupport.isWebFragmentProject(project)) {
+			float version = FacetModuleCoreSupport.getDynamicWebFragmentVersion(project);
+			if (version >= 5) {
+				return doCacheDescriptor(project.getName(), new ServletAPIDescriptor(JAKARTA_SERVLET, version, ServletAPIDescriptor.ORIGIN.FFACET));
+			}
+			if (version > 0) {
+				return doCacheDescriptor(project.getName(), new ServletAPIDescriptor(JAVAX_SERVLET, version, ServletAPIDescriptor.ORIGIN.FFACET));
+			}
+		}
 		IJavaProject javaProject = JavaCore.create(project);
 		if (javaProject == null || !javaProject.exists()) {
 			return null;
 		}
 
+		if (findType(javaProject, "jakarta.servlet.ServletConnection") != null) { //$NON-NLS-1$
+			return doCacheDescriptor(project.getName(), new ServletAPIDescriptor(JAKARTA_SERVLET, 6, ServletAPIDescriptor.ORIGIN.BUILD_PATH));
+		}
 		if (findType(javaProject, "jakarta.servlet.GenericFilter") != null) { //$NON-NLS-1$
 			return doCacheDescriptor(project.getName(), new ServletAPIDescriptor(JAKARTA_SERVLET, 5, ServletAPIDescriptor.ORIGIN.BUILD_PATH));
 		}
diff --git a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ServletAPIDescriptor.java b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ServletAPIDescriptor.java
index 4c4b6ce..bc0ddf6 100644
--- a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ServletAPIDescriptor.java
+++ b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/contenttype/ServletAPIDescriptor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************

- * Copyright (c) 2020, 2022 IBM Corporation and others.

+ * Copyright (c) 2020, 2023 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

@@ -24,10 +24,14 @@
 		 **/

 		BUILD_PATH,

 		/**

-		 * This descriptor is based on the project's Facet(s)

+		 * This descriptor is based on the project's Dynamic Web Module facet

 		 **/

 		FACET,

 		/**

+		 * This descriptor is based on the project's Web Fragment Module facet

+		 **/

+		FFACET,

+		/**

 		 * This descriptor is merely a set of defaults.

 		 **/

 		DEFAULT

diff --git a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java
index 3d23d36..212394d 100755
--- a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java
+++ b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupport.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2022 IBM Corporation and others.
+ * Copyright (c) 2007, 2023 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
@@ -69,6 +69,23 @@
 
 	/**
 	 * @param project
+	 * @return the version of the JST Web Fragment facet installed on the project, -1 otherwise
+	 * @throws org.eclipse.core.runtime.CoreException
+	 */
+	public static float getDynamicWebFragmentVersion(IProject project) {
+		float version = -1;
+		try {
+			version = FacetModuleCoreSupportDelegate.getDynamicWebFragmentVersion(project);
+		}
+		catch (NoClassDefFoundError e) {
+			if (_dump_NCDFE)
+				e.printStackTrace();
+		}
+		return version;
+	}
+
+	/**
+	 * @param project
 	 * @return the version of the JST Web facet installed on the project, -1 otherwise
 	 * @throws org.eclipse.core.runtime.CoreException
 	 */
diff --git a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java
index eaef667..c9b8483 100644
--- a/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java
+++ b/web/bundles/org.eclipse.jst.jsp.core/src/org/eclipse/jst/jsp/core/internal/util/FacetModuleCoreSupportDelegate.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2022 IBM Corporation and others.
+ * Copyright (c) 2007, 2023 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
@@ -88,6 +88,34 @@
 	}
 
 	/**
+	 * @param project
+	 * @return the version of the JST Web Fragment facet, a default version otherwise
+	 * @throws CoreException
+	 */
+	static float getDynamicWebFragmentVersion(IProject project) {
+		if (project == null)
+			return -1;
+
+		float version = -1;
+		try {
+			IFacetedProject faceted = ProjectFacetsManager.create(project);
+			if (faceted != null && ProjectFacetsManager.isProjectFacetDefined(JST_WEBFRAGMENT_MODULE)) {
+				IProjectFacet webFragmentFacet = ProjectFacetsManager.getProjectFacet(JST_WEBFRAGMENT_MODULE);
+				if (faceted.hasProjectFacet(webFragmentFacet)) {
+					version = Float.parseFloat(faceted.getInstalledVersion(webFragmentFacet).getVersionString());
+				}
+			}
+		}
+		catch (NumberFormatException e) {
+			Logger.logException(e);
+		}
+		catch (CoreException e) {
+			Logger.logException(e);
+		}
+		return version;
+	}
+
+	/**
 	 * @param path -
 	 *            the full path to a resource within the workspace
 	 * @return - the runtime path of the resource if one exists, null