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

cziegeler pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/felix-dev.git


The following commit(s) were added to refs/heads/master by this push:
     new 34cc1ab460 FELIX-6761 : NullPointerException when registering a new 
servlet (#399)
34cc1ab460 is described below

commit 34cc1ab4608e6aae151252968cf0219baaa16d4a
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Wed Apr 2 10:28:20 2025 +0200

    FELIX-6761 : NullPointerException when registering a new servlet (#399)
    
    * FELIX-6761 : NullPointerException when registering a new servlet
    
    * FELIX-6761
    - Check for null before creating new instance
    
    ---------
    
    Co-authored-by: Paul Rütter <[email protected]>
---
 .../base/internal/handler/WebSocketHandler.java    |  5 +-
 .../internal/handler/WhiteboardServletHandler.java | 28 ++++++++
 .../handler/WhiteboardWebSocketServletHandler.java | 76 ----------------------
 .../base/internal/service/HttpServiceFactory.java  |  1 -
 .../internal/whiteboard/WhiteboardManager.java     | 14 ----
 5 files changed, 32 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..c11143d6e9 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,16 @@ public class WhiteboardServletHandler extends 
ServletHandler
 
         this.setServlet(this.getServletInfo().getService(this.bundleContext));
 
+        if (WebSocketHandler.isJettyWebSocketServlet(this.getServlet())) {
+            if (this.webSocketHandler == null) {
+                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 +136,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 +155,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,

Reply via email to