This is an automated email from the ASF dual-hosted git repository.

rombert pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-launchpad-base.git


The following commit(s) were added to refs/heads/master by this push:
     new 6887196  SLING-12365 - Support for new servlet containers in Sling 
launchpad (#14)
6887196 is described below

commit 6887196ca1d99e698f1f21e290af5c462836e5f9
Author: Sagar Miglani <[email protected]>
AuthorDate: Tue Jul 9 16:21:09 2024 +0530

    SLING-12365 - Support for new servlet containers in Sling launchpad (#14)
    
    Co-authored-by: Sagar Miglani <[email protected]>
---
 pom.xml                                            |  8 +-
 .../apache/sling/launchpad/base/impl/Sling.java    |  2 +-
 .../launchpad/base/shared/SharedConstants.java     |  2 +-
 .../sling/launchpad/base/webapp/SlingBridge.java   |  2 +-
 .../webapp/SlingHttpSessionListenerDelegate.java   | 78 -------------------
 .../base/webapp/SlingServletDelegate.java          | 45 +++++------
 .../sling/launchpad/webapp/SlingServlet.java       | 16 ++--
 .../launchpad/webapp/SlingSessionListener.java     | 61 ---------------
 src/main/webapp/WEB-INF/web.xml                    |  6 +-
 .../base/webapp/SlingServletDelegateTest.java      | 87 ++++++++++++++++++++++
 10 files changed, 129 insertions(+), 178 deletions(-)

diff --git a/pom.xml b/pom.xml
index 1083ff9..1821bee 100644
--- a/pom.xml
+++ b/pom.xml
@@ -259,15 +259,15 @@
             <scope>provided</scope>
         </dependency>
         <dependency>
-            <groupId>javax.servlet</groupId>
-            <artifactId>javax.servlet-api</artifactId>
-            <version>3.1.0</version>
+            <groupId>jakarta.servlet</groupId>
+            <artifactId>jakarta.servlet-api</artifactId>
+            <version>5.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.felix</groupId>
             <artifactId>org.apache.felix.http.proxy</artifactId>
-            <version>3.0.4</version>
+            <version>4.0.0</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
diff --git a/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java 
b/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java
index dcc17aa..30d3048 100644
--- a/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java
+++ b/src/main/java/org/apache/sling/launchpad/base/impl/Sling.java
@@ -288,7 +288,7 @@ public class Sling {
     /**
      * Called when the OSGi framework is being started. This implementation
      * registers as a service listener for the
-     * <code>javax.servlet.Servlet</code> class and calls the
+     * <code>jakarta.servlet.Servlet</code> class and calls the
      * {@link #doStartBundle()} method for implementations to execute more
      * startup tasks. Additionally the <code>context</code> URL protocol
      * handler is registered.
diff --git 
a/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java 
b/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java
index 5a77e29..0becc3e 100644
--- a/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java
+++ b/src/main/java/org/apache/sling/launchpad/base/shared/SharedConstants.java
@@ -48,7 +48,7 @@ public interface SharedConstants {
     /**
      * The fully qualified name of the class used by the Sling Web Applicaiton
      * servlet to control the framework. This class implements the
-     * <code>javax.servlet.Servlet</code> and {@link Launcher} (for setup only)
+     * <code>jakarta.servlet.Servlet</code> and {@link Launcher} (for setup 
only)
      * interfaces.
      */
     public static final String DEFAULT_SLING_SERVLET = 
"org.apache.sling.launchpad.base.webapp.SlingServletDelegate";
diff --git 
a/src/main/java/org/apache/sling/launchpad/base/webapp/SlingBridge.java 
b/src/main/java/org/apache/sling/launchpad/base/webapp/SlingBridge.java
index 8bf261e..77b7f5a 100644
--- a/src/main/java/org/apache/sling/launchpad/base/webapp/SlingBridge.java
+++ b/src/main/java/org/apache/sling/launchpad/base/webapp/SlingBridge.java
@@ -18,7 +18,7 @@ package org.apache.sling.launchpad.base.webapp;
 
 import java.util.Map;
 
-import javax.servlet.ServletContext;
+import jakarta.servlet.ServletContext;
 
 import org.apache.felix.framework.Logger;
 import org.apache.sling.launchpad.api.LaunchpadContentProvider;
diff --git 
a/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java
 
b/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java
deleted file mode 100644
index 5e29776..0000000
--- 
a/src/main/java/org/apache/sling/launchpad/base/webapp/SlingHttpSessionListenerDelegate.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sling.launchpad.base.webapp;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.http.HttpSessionAttributeListener;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
-
-import org.apache.felix.http.proxy.ProxyListener;
-
-@Deprecated
-public class SlingHttpSessionListenerDelegate implements
-        HttpSessionAttributeListener, HttpSessionListener,
-        ServletContextListener {
-
-    private final ProxyListener proxyListener = new ProxyListener();
-
-    // ---------- ServletContextListener
-
-    @Override
-    public void contextInitialized(final ServletContextEvent sce) {
-        this.proxyListener.contextInitialized(sce);
-    }
-
-    @Override
-    public void contextDestroyed(final ServletContextEvent sce) {
-        this.proxyListener.contextDestroyed(sce);
-    }
-
-    // ---------- HttpSessionListener
-
-    @Override
-    public void sessionCreated(HttpSessionEvent se) {
-        proxyListener.sessionCreated(se);
-    }
-
-    @Override
-    public void sessionDestroyed(HttpSessionEvent se) {
-        proxyListener.sessionDestroyed(se);
-    }
-
-    // ---------- HttpSessionAttributeListener
-
-    @Override
-    public void attributeAdded(HttpSessionBindingEvent se) {
-        proxyListener.attributeAdded(se);
-    }
-
-    @Override
-    public void attributeRemoved(HttpSessionBindingEvent se) {
-        proxyListener.attributeRemoved(se);
-    }
-
-    @Override
-    public void attributeReplaced(HttpSessionBindingEvent se) {
-        proxyListener.attributeReplaced(se);
-    }
-
-}
diff --git 
a/src/main/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegate.java
 
b/src/main/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegate.java
index 2ee5f17..ad0c282 100644
--- 
a/src/main/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegate.java
+++ 
b/src/main/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegate.java
@@ -28,13 +28,13 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
-import javax.servlet.GenericServlet;
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletContext;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.felix.framework.Logger;
 import org.apache.felix.http.proxy.ProxyServlet;
@@ -56,10 +56,10 @@ import org.osgi.framework.ServiceReference;
  * <li>The {@link #init()} method launches Apache <code>Felix</code> as the
  * OSGi framework implementation we use.
  * <li>Registers as a service listener interested for services of type
- * <code>javax.servlet.Servlet</code>.
+ * <code>jakarta.servlet.Servlet</code>.
  * <li>Handles requests by delegating to a servlet which is expected to be
  * registered with the framework as a service of type
- * <code>javax.servlet.Servlet</code>. If no delegatee servlet has been
+ * <code>jakarta.servlet.Servlet</code>. If no delegatee servlet has been
  * registered request handlings results in a temporary unavailability of the
  * servlet.
  * </ul>
@@ -262,7 +262,7 @@ public class SlingServletDelegate extends GenericServlet 
implements Launcher {
      *            client's request
      * @param res the <code>ServletResponse</code> object that will contain
      *            the servlet's response
-     * @throws javax.servlet.UnavailableException if the no delegatee servlet 
is currently
+     * @throws jakarta.servlet.UnavailableException if the no delegatee 
servlet is currently
      *             available
      * @throws ServletException if an exception occurs that interferes with the
      *             servlet's normal operation occurred
@@ -314,18 +314,21 @@ public class SlingServletDelegate extends GenericServlet 
implements Launcher {
 
     // ---------- Configuration Loading 
----------------------------------------
 
-    private String calculateServletPackages(final String servletVersion, final 
int majorVersion) {
-        final String servlet2Packages = 
"javax.servlet;javax.servlet.http;javax.servlet.resources";
-        final String servlet3Packages = servlet2Packages + 
";javax.servlet.annotation;javax.servlet.descriptor";
-        if (majorVersion < 3) {
-            return servlet2Packages.concat(";version=").concat(servletVersion);
-        } else if (majorVersion < 4) {
-            return 
servlet2Packages.concat(";version=2.6,").concat(servlet3Packages).concat(";version=")
+    protected String calculateServletPackages(final String servletVersion, 
final int majorVersion) {
+
+        final String servlet5Packages = 
"jakarta.servlet;jakarta.servlet.http;jakarta.servlet.descriptor;jakarta.servlet.annotation";
+        final String servlet6Packages = servlet5Packages;
+
+        if (majorVersion < 5) {
+            throw new RuntimeException("Servlet API version " + majorVersion + 
" is not supported. Please use version 5 or 6.");
+        } else if (majorVersion < 6) {
+            return servlet5Packages.concat(";version=").concat(servletVersion);
+        } else if (majorVersion < 7) {
+            return 
servlet5Packages.concat(";version=5.0,").concat(servlet6Packages).concat(";version=")
                     .concat(servletVersion);
         }
-        return 
servlet2Packages.concat(";version=2.6,").concat(servlet3Packages).concat(";version=3.1,")
-                
.concat(servlet3Packages).concat(";version=").concat(servletVersion);
-
+        return 
servlet5Packages.concat(";version=5.0,").concat(servlet6Packages).concat(";version=6.0,")
+                
.concat(servlet6Packages).concat(";version=").concat(servletVersion);
     }
 
     /**
@@ -359,7 +362,7 @@ public class SlingServletDelegate extends GenericServlet 
implements Launcher {
                 ",".concat(calculateServletPackages(servletVersion, 
getServletContext().getMajorVersion())));
         // extra capabilities
         final String servletCaps = 
"osgi.contract;osgi.contract=JavaServlet;version:Version=\" " + servletVersion 
+ "\";" +
-                        
"uses:=\"javax.servlet,javax.servlet.http,javax.servlet.descriptor,javax.servlet.annotation\"";
+                        
"uses:=\"jakarta.servlet,jakarta.servlet.http,jakarta.servlet.descriptor,jakarta.servlet.annotation\"";
         props.put(Sling.PROP_EXTRA_CAPS, servletCaps);
 
         // prevent system properties from being considered
diff --git a/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java 
b/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java
index c5992d3..75b49c9 100644
--- a/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java
+++ b/src/main/java/org/apache/sling/launchpad/webapp/SlingServlet.java
@@ -26,14 +26,14 @@ import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Map;
 
-import javax.servlet.GenericServlet;
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletRequestWrapper;
-import javax.servlet.http.HttpServletResponse;
+import jakarta.servlet.GenericServlet;
+import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletRequestWrapper;
+import jakarta.servlet.http.HttpServletResponse;
 
 import org.apache.sling.launchpad.base.shared.Launcher;
 import org.apache.sling.launchpad.base.shared.Loader;
diff --git 
a/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java 
b/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java
deleted file mode 100644
index 9330b4a..0000000
--- a/src/main/java/org/apache/sling/launchpad/webapp/SlingSessionListener.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.sling.launchpad.webapp;
-
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.http.HttpSessionAttributeListener;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
-
-@Deprecated
-public class SlingSessionListener implements HttpSessionAttributeListener,
-        HttpSessionListener, ServletContextListener {
-
-    @Override
-    public void contextInitialized(ServletContextEvent sce) {
-        sce.getServletContext().log("Deprecated SlingSessionListener is used. 
Please remove it from your web.xml");
-    }
-
-    @Override
-    public void contextDestroyed(ServletContextEvent sce) {
-    }
-
-    @Override
-    public void sessionCreated(HttpSessionEvent se) {
-    }
-
-    @Override
-    public void sessionDestroyed(HttpSessionEvent se) {
-    }
-
-    @Override
-    public void attributeAdded(HttpSessionBindingEvent se) {
-    }
-
-    @Override
-    public void attributeRemoved(HttpSessionBindingEvent se) {
-    }
-
-    @Override
-    public void attributeReplaced(HttpSessionBindingEvent se) {
-    }
-
-}
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index 0052f7f..46c5e23 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -17,10 +17,10 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<web-app version="3.1"
-         xmlns="http://xmlns.jcp.org/xml/ns/javaee";
+<web-app version="5.0"
+         xmlns="https://jakarta.ee/xml/ns/jakartaee";
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd";>
+         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee 
https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd";>
     <display-name>Sling Launchpad Web Application</display-name>
 
     <servlet>
diff --git 
a/src/test/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegateTest.java
 
b/src/test/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegateTest.java
new file mode 100644
index 0000000..a32447f
--- /dev/null
+++ 
b/src/test/java/org/apache/sling/launchpad/base/webapp/SlingServletDelegateTest.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.launchpad.base.webapp;
+
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.verify;
+
+
+public class SlingServletDelegateTest {
+
+    @Mock
+    private ServletRequest servletRequest;
+
+    @Mock
+    private HttpServletResponse servletResponse;
+
+    private SlingServletDelegate slingServletDelegate;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.openMocks(this);
+        slingServletDelegate = new SlingServletDelegate();
+    }
+
+    @Test
+    public void testServiceWithNoDelegatee() throws Exception {
+        slingServletDelegate.service(servletRequest, servletResponse);
+        verify(servletResponse).sendError(HttpServletResponse.SC_NOT_FOUND);
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void testCalculateServletPackagesForVersionLessThan5() {
+        String servletVersion = "3.1";
+        int majorVersion = 3;
+
+        slingServletDelegate.calculateServletPackages(servletVersion, 
majorVersion);
+    }
+
+    @Test
+    public void testCalculateServletPackagesForVersion5() {
+        String servletVersion = "5.0";
+        int majorVersion = 5;
+        String expectedPackages = 
"jakarta.servlet;jakarta.servlet.http;jakarta.servlet.descriptor;jakarta.servlet.annotation;version=5.0";
+
+        // Get the servlet packages
+        String actualPackages = 
slingServletDelegate.calculateServletPackages(servletVersion, majorVersion);
+        // Verify
+        assertEquals(expectedPackages, actualPackages);
+    }
+
+    @Test
+    public void testCalculateServletPackagesForVersion6() {
+        String servletVersion = "6.0";
+        int majorVersion = 6;
+        String expectedPackages = 
"jakarta.servlet;jakarta.servlet.http;jakarta.servlet.descriptor;jakarta.servlet.annotation;version=5.0"
+                + 
",jakarta.servlet;jakarta.servlet.http;jakarta.servlet.descriptor;jakarta.servlet.annotation;version=6.0";
+
+        // Get the servlet packages
+        String actualPackages = 
slingServletDelegate.calculateServletPackages(servletVersion, majorVersion);
+        // Verify
+        assertEquals(expectedPackages, actualPackages);
+    }
+
+}

Reply via email to