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);
+ }
+
+}