SLING-12981 migrate to Jakarta Servlet (#8)

diff --git a/pom.xml b/pom.xml
index 63712bf..7169eed 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,7 +28,7 @@
     </parent>
 
     <artifactId>org.apache.sling.commons.fsclassloader</artifactId>
-    <version>1.0.17-SNAPSHOT</version>
+    <version>2.0.0-SNAPSHOT</version>
 
     <name>Apache Sling Commons FileSystem ClassLoader</name>
     <description>The Sling Commons FileSystem ClassLoader bundle provides a dynamic class loader for reading
@@ -42,13 +42,15 @@
     </scm>
 
     <properties>
-        <sling.java.version>8</sling.java.version>
+        <sling.java.version>17</sling.java.version>
+        <slf4j.version>2.0.17</slf4j.version>
     </properties>
 
     <dependencies>
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-api</artifactId>
+            <version>${slf4j.version}</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -83,8 +85,9 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>6.1.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
@@ -94,6 +97,12 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-text</artifactId>
+            <version>1.10.0</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>
             <version>2.14.0</version>
@@ -102,7 +111,7 @@
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.webconsole</artifactId>
-            <version>3.0.0</version>
+            <version>5.0.10</version>
             <scope>provided</scope>
         </dependency>
 
@@ -115,7 +124,7 @@
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
-            <version>4.9.0</version>
+            <version>5.20.0</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -127,6 +136,7 @@
         <dependency>
             <groupId>org.slf4j</groupId>
             <artifactId>slf4j-simple</artifactId>
+            <version>${slf4j.version}</version>
             <scope>test</scope>
         </dependency>
     </dependencies>
diff --git a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java
index 3955f8c..cef13af 100644
--- a/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java
+++ b/src/main/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsole.java
@@ -18,12 +18,6 @@
  */
 package org.apache.sling.commons.fsclassloader.impl;
 
-import javax.servlet.Servlet;
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -32,10 +26,14 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.felix.webconsole.AbstractWebConsolePlugin;
+import org.apache.commons.text.StringEscapeUtils;
+import org.apache.felix.webconsole.servlet.AbstractServlet;
 import org.apache.sling.commons.classloader.ClassLoaderWriter;
 import org.osgi.service.component.ComponentContext;
 import org.osgi.service.component.annotations.Activate;
@@ -59,7 +57,7 @@
             "felix.webconsole.css=" + FSClassLoaderWebConsole.RES_LOC + "/prettify.css",
             "felix.webconsole.category=Sling"
         })
-public class FSClassLoaderWebConsole extends AbstractWebConsolePlugin {
+public class FSClassLoaderWebConsole extends AbstractServlet {
 
     static final String APP_ROOT = "fsclassloader";
 
@@ -68,8 +66,7 @@
 
     private static final Logger LOG = LoggerFactory.getLogger(FSClassLoaderWebConsole.class);
 
-    @Reference(target = "(component.name=org.apache.sling.commons.fsclassloader.impl.FSClassLoaderProvider)")
-    private ClassLoaderWriter classLoaderWriter;
+    private final transient ClassLoaderWriter classLoaderWriter;
 
     /**
      * The root under which the class files are under
@@ -82,18 +79,18 @@
     private static final long serialVersionUID = -5728679635644481848L;
 
     /**
-     * The servlet configuration
-     */
-    private ServletConfig config;
-
-    /**
      * Activate this component. Create the root directory.
      *
      * @param componentContext
      *            the component context
      */
     @Activate
-    protected void activate(final ComponentContext componentContext, final FSClassLoaderComponentConfig config) {
+    public FSClassLoaderWebConsole(
+            @Reference(target = "(component.name=org.apache.sling.commons.fsclassloader.impl.FSClassLoaderProvider)")
+                    ClassLoaderWriter classLoaderWriter,
+            final ComponentContext componentContext,
+            final FSClassLoaderComponentConfig config) {
+        this.classLoaderWriter = classLoaderWriter;
         // get the file root
         this.root = CacheLocationUtils.getRootDir(componentContext.getBundleContext(), config);
     }
@@ -101,14 +98,6 @@
     /*
      * (non-Javadoc)
      *
-     * @see javax.servlet.Servlet#destroy()
-     */
-    @Override
-    public void destroy() {}
-
-    /*
-     * (non-Javadoc)
-     *
      * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest,
      * javax.servlet.ServletResponse)
      */
@@ -180,56 +169,6 @@
         }
     }
 
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getLabel()
-     */
-    @Override
-    public String getLabel() {
-        return "fsclassloader";
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see javax.servlet.Servlet#getServletConfig()
-     */
-    @Override
-    public ServletConfig getServletConfig() {
-        return this.config;
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see javax.servlet.Servlet#getServletInfo()
-     */
-    @Override
-    public String getServletInfo() {
-        return "";
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see org.apache.felix.webconsole.AbstractWebConsolePlugin#getTitle()
-     */
-    @Override
-    public String getTitle() {
-        return "File System Class Loader";
-    }
-
-    /*
-     * (non-Javadoc)
-     *
-     * @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
-     */
-    @Override
-    public void init(ServletConfig config) throws ServletException {
-        this.config = config;
-    }
-
     /**
      * Checks whether the specified file is a file and is underneath the root
      * directory.
@@ -285,11 +224,11 @@
      * (non-Javadoc)
      *
      * @see
-     * org.apache.felix.webconsole.AbstractWebConsolePlugin#renderContent(javax
+     * org.apache.felix.webconsole.servlet.AbstractServlet#renderContent(javax
      * .servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
      */
     @Override
-    protected void renderContent(HttpServletRequest request, HttpServletResponse response)
+    public void renderContent(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         Map<String, ScriptFiles> scripts = new LinkedHashMap<String, ScriptFiles>();
         readFiles(root, root, scripts);
diff --git a/src/test/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsoleTest.java b/src/test/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsoleTest.java
index 1e68c8a..99967a1 100644
--- a/src/test/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsoleTest.java
+++ b/src/test/java/org/apache/sling/commons/fsclassloader/impl/FSClassLoaderWebConsoleTest.java
@@ -18,16 +18,17 @@
  */
 package org.apache.sling.commons.fsclassloader.impl;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import org.apache.sling.commons.classloader.ClassLoaderWriter;
 import org.junit.After;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.component.ComponentContext;
 import org.powermock.reflect.Whitebox;
 
 import static org.junit.Assert.assertEquals;
@@ -95,8 +96,12 @@
     }
 
     private void setFixture(boolean clwReturn) {
-        console = spy(new FSClassLoaderWebConsole());
         classLoaderWriter = mock(ClassLoaderWriter.class);
+        ComponentContext componentContext = mock(ComponentContext.class);
+        BundleContext bundleContext = mock(BundleContext.class);
+        Mockito.doReturn(bundleContext).when(componentContext).getBundleContext();
+        FSClassLoaderComponentConfig config = mock(FSClassLoaderComponentConfig.class);
+        console = spy(new FSClassLoaderWebConsole(classLoaderWriter, componentContext, config));
         when(classLoaderWriter.delete("")).thenReturn(clwReturn);
         Whitebox.setInternalState(console, "classLoaderWriter", classLoaderWriter);
     }