This is an automated email from the ASF dual-hosted git repository.
cziegeler pushed a commit to branch FELIX-6761
in repository https://gitbox.apache.org/repos/asf/felix-dev.git
The following commit(s) were added to refs/heads/FELIX-6761 by this push:
new 84f2ff7b69 FELIX-6761 : NullPointerException when registering a new
servlet
84f2ff7b69 is described below
commit 84f2ff7b69ba0def4c7dc84856f05221222e71dd
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Wed Apr 2 09:05:47 2025 +0200
FELIX-6761 : NullPointerException when registering a new servlet
---
.../base/internal/handler/WebSocketHandler.java | 5 +-
.../internal/handler/WhiteboardServletHandler.java | 26 ++++++++
.../handler/WhiteboardWebSocketServletHandler.java | 76 ----------------------
.../base/internal/service/HttpServiceFactory.java | 1 -
.../internal/whiteboard/WhiteboardManager.java | 14 ----
5 files changed, 30 insertions(+), 92 deletions(-)
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WebSocketHandler.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WebSocketHandler.java
index 89b58d7c3f..e5ec679e2f 100644
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WebSocketHandler.java
+++
b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WebSocketHandler.java
@@ -88,13 +88,16 @@ public final class WebSocketHandler {
return false;
}
- /**
+ /**
* Check if the servlet is a JettyWebSocketServlet.
* JettyWebSocket classes are handled differently due to FELIX-6746.
* @param servlet the servlet to check
* @return true if the servlet is a JettyWebSocketServlet, false otherwise
*/
public static boolean isJettyWebSocketServlet(Object servlet) {
+ if (servlet == null) {
+ return false;
+ }
final Class<?> superClass = servlet.getClass().getSuperclass();
SystemLogger.LOGGER.debug("Checking if the servlet is a
JettyWebSocketServlet: '" + superClass.getSimpleName() + "'");
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardServletHandler.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardServletHandler.java
index 8427da5535..1b25f6b5e6 100644
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardServletHandler.java
+++
b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardServletHandler.java
@@ -17,6 +17,7 @@
package org.apache.felix.http.base.internal.handler;
import java.io.FilePermission;
+import java.io.IOException;
import org.apache.felix.http.base.internal.context.ExtServletContext;
import org.apache.felix.http.base.internal.runtime.ServletInfo;
@@ -25,6 +26,9 @@ import org.osgi.framework.BundleContext;
import org.osgi.service.servlet.runtime.dto.DTOConstants;
import jakarta.servlet.Servlet;
+import jakarta.servlet.ServletException;
+import jakarta.servlet.ServletRequest;
+import jakarta.servlet.ServletResponse;
/**
* Servlet handler for servlets registered through the http whiteboard.
@@ -37,6 +41,8 @@ public class WhiteboardServletHandler extends ServletHandler
private final Bundle multipartSecurityContext;
+ private volatile WebSocketHandler webSocketHandler;
+
public WhiteboardServletHandler(final long contextServiceId,
final ExtServletContext context,
final ServletInfo servletInfo,
@@ -105,6 +111,14 @@ public class WhiteboardServletHandler extends
ServletHandler
this.setServlet(this.getServletInfo().getService(this.bundleContext));
+ if (WebSocketHandler.isJettyWebSocketServlet(this.getServlet())) {
+ this.webSocketHandler = new WebSocketHandler(this);
+ if (!webSocketHandler.shouldInit()) {
+ // do nothing, delay init until first service call
+ return -1;
+ }
+ }
+
final int reason = super.init();
if ( reason != -1 )
{
@@ -120,6 +134,10 @@ public class WhiteboardServletHandler extends
ServletHandler
final Servlet s = this.getServlet();
if ( s != null )
{
+ if ( this.webSocketHandler != null &&
!this.webSocketHandler.shouldDestroy() ) {
+ return false;
+ }
+ this.webSocketHandler = null;
if ( super.destroy() )
{
this.getServletInfo().ungetService(this.bundleContext,
this.getServlet());
@@ -135,4 +153,12 @@ public class WhiteboardServletHandler extends
ServletHandler
{
return multipartSecurityContext;
}
+
+ @Override
+ public void handle(ServletRequest req, ServletResponse res) throws
ServletException, IOException {
+ if ( this.webSocketHandler != null ) {
+ this.webSocketHandler.lazyInit();
+ }
+ super.handle(req, res);
+ }
}
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardWebSocketServletHandler.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardWebSocketServletHandler.java
deleted file mode 100644
index dba9de191e..0000000000
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/handler/WhiteboardWebSocketServletHandler.java
+++ /dev/null
@@ -1,76 +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.felix.http.base.internal.handler;
-
-import java.io.FilePermission;
-import java.io.IOException;
-
-import jakarta.servlet.Servlet;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.ServletResponse;
-
-import org.apache.felix.http.base.internal.context.ExtServletContext;
-import org.apache.felix.http.base.internal.logger.SystemLogger;
-import org.apache.felix.http.base.internal.runtime.ServletInfo;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.service.servlet.runtime.dto.DTOConstants;
-
-/**
- * Servlet handler for servlets extending JettyWebSocketServlet registered
through the http whiteboard.
- */
-public final class WhiteboardWebSocketServletHandler extends
WhiteboardServletHandler
-{
- private final WebSocketHandler webSocketHandler;
-
- public WhiteboardWebSocketServletHandler(final long contextServiceId,
- final ExtServletContext context,
- final ServletInfo servletInfo,
- final BundleContext
contextBundleContext,
- final Bundle registeringBundle,
- final Bundle httpWhiteboardBundle,
- final Object servlet)
- {
- super(contextServiceId, context, servletInfo, contextBundleContext,
registeringBundle, httpWhiteboardBundle);
- this.webSocketHandler = new WebSocketHandler(this);
- this.setServlet((Servlet) servlet);
- }
-
- @Override
- public int init() {
- if (webSocketHandler.shouldInit()) {
- return super.init();
- }
- // do nothing, delay init until first service call
- return -1;
- }
-
- @Override
- public void handle(ServletRequest req, ServletResponse res) throws
ServletException, IOException {
- this.webSocketHandler.lazyInit();
- super.handle(req, res);
- }
-
- @Override
- public boolean destroy() {
- if (webSocketHandler.shouldDestroy()) {
- return super.destroy();
- }
- return false;
- }
-}
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceFactory.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceFactory.java
index c5f7b1d8a3..d550c2f2c3 100644
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceFactory.java
+++
b/http/base/src/main/java/org/apache/felix/http/base/internal/service/HttpServiceFactory.java
@@ -23,7 +23,6 @@ import java.util.Map;
import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.registry.HandlerRegistry;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
diff --git
a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
index 7f1cb5f4b6..3ba52d81ab 100644
---
a/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
+++
b/http/base/src/main/java/org/apache/felix/http/base/internal/whiteboard/WhiteboardManager.java
@@ -16,7 +16,6 @@
*/
package org.apache.felix.http.base.internal.whiteboard;
-import static
org.apache.felix.http.base.internal.handler.WebSocketHandler.isJettyWebSocketServlet;
import static
org.osgi.service.servlet.runtime.dto.DTOConstants.FAILURE_REASON_NO_SERVLET_CONTEXT_MATCHING;
import static
org.osgi.service.servlet.runtime.dto.DTOConstants.FAILURE_REASON_SHADOWED_BY_OTHER_SERVICE;
import static
org.osgi.service.servlet.runtime.dto.DTOConstants.FAILURE_REASON_UNKNOWN;
@@ -40,9 +39,7 @@ import
org.apache.felix.http.base.internal.handler.HttpSessionWrapper;
import org.apache.felix.http.base.internal.handler.ListenerHandler;
import org.apache.felix.http.base.internal.handler.PreprocessorHandler;
import org.apache.felix.http.base.internal.handler.ServletHandler;
-import org.apache.felix.http.base.internal.handler.WebSocketHandler;
import org.apache.felix.http.base.internal.handler.WhiteboardServletHandler;
-import
org.apache.felix.http.base.internal.handler.WhiteboardWebSocketServletHandler;
import org.apache.felix.http.base.internal.logger.SystemLogger;
import org.apache.felix.http.base.internal.registry.EventListenerRegistry;
import org.apache.felix.http.base.internal.registry.HandlerRegistry;
@@ -807,17 +804,6 @@ public final class WhiteboardManager
WhiteboardServiceInfo<?> info,
ExtServletContext
servletContext)
{
- Object servlet = info.getService(handler.getBundleContext());
- if (isJettyWebSocketServlet(servlet))
- {
- return new WhiteboardWebSocketServletHandler(
- handler.getContextInfo().getServiceId(),
- servletContext,
- (ServletInfo) info,
- handler.getBundleContext(),
- info.getServiceReference().getBundle(),
- this.httpBundleContext.getBundle(), servlet);
- }
return new WhiteboardServletHandler(
handler.getContextInfo().getServiceId(),
servletContext,