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

cziegeler pushed a commit to branch SLING-11970
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-engine.git


The following commit(s) were added to refs/heads/SLING-11970 by this push:
     new b32fc6c  SLING-11970 : Avoid restarting of components on configuration 
change
b32fc6c is described below

commit b32fc6cf6a7b0b7817ae002c8c953954b44f4246
Author: Carsten Ziegeler <[email protected]>
AuthorDate: Tue Jul 18 16:15:06 2023 +0200

    SLING-11970 : Avoid restarting of components on configuration change
---
 .../apache/sling/engine/impl/SlingMainServlet.java | 23 ++++++++-----
 .../engine/impl/SlingRequestProcessorImpl.java     | 38 +++++++++++++++-------
 2 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java 
b/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
index 52cf1a5..9e4c533 100644
--- a/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
+++ b/src/main/java/org/apache/sling/engine/impl/SlingMainServlet.java
@@ -20,6 +20,7 @@ package org.apache.sling.engine.impl;
 
 import java.util.Dictionary;
 import java.util.Hashtable;
+import java.util.Objects;
 
 import javax.servlet.GenericServlet;
 import javax.servlet.Servlet;
@@ -76,16 +77,16 @@ public class SlingMainServlet extends GenericServlet {
      * The product info provider
      */
     @Reference
-    private ProductInfoProvider productInfoProvider;
+    private volatile ProductInfoProvider productInfoProvider;
 
     /**
      * The Sling http context
      */
     @Reference(target = SlingServletContext.TARGET)
-    private ServletContext slingServletContext;
+    private volatile ServletContext slingServletContext;
 
     @Reference
-    private SlingRequestProcessorImpl requestProcessorImpl;
+    private volatile SlingRequestProcessorImpl requestProcessorImpl;
 
     private volatile boolean allowTrace;
 
@@ -125,6 +126,7 @@ public class SlingMainServlet extends GenericServlet {
                         : null;
 
                 // real request handling for HTTP requests
+                // we don't check for null of requestProcessorImpl as we would 
throw an exception anyway in that case
                 requestProcessorImpl.doProcessRequest(request, 
(HttpServletResponse) res,
                     resolver);
 
@@ -177,7 +179,9 @@ public class SlingMainServlet extends GenericServlet {
         
servletConfig.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT,
                 "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + 
"=" + SlingHttpContext.SERVLET_CONTEXT_NAME + ")");
         
servletConfig.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN, "/");
-        
servletConfig.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, 
servletName);
+        if (servletName != null) {
+            
servletConfig.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, 
servletName);
+        }
         servletConfig.put(Constants.SERVICE_DESCRIPTION, "Apache Sling Engine 
Main Servlet");
         servletConfig.put(Constants.SERVICE_VENDOR, "The Apache Software 
Foundation");
 
@@ -190,14 +194,15 @@ public class SlingMainServlet extends GenericServlet {
 
         String servletName = config.servlet_name();
         if (servletName == null || servletName.isEmpty()) {
-            servletName = this.productInfoProvider.getProductInfo();
+            final ProductInfoProvider localProvider = this.productInfoProvider;
+            servletName = localProvider != null ? 
localProvider.getProductInfo() : null;
         }
         if (this.servletRegistration == null) {
             this.servletRegistration = 
bundleContext.registerService(Servlet.class, this,
                     getServletContextRegistrationProps(servletName));
         } else {
             // check if the servlet name has changed and update properties
-            if (!servletName.equals(this.servletRegistration.getReference()
+            if (!Objects.equals(servletName, 
this.servletRegistration.getReference()
                     
.getProperty(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME))) {
                 
this.servletRegistration.setProperties(getServletContextRegistrationProps(servletName));
             }
@@ -212,7 +217,8 @@ public class SlingMainServlet extends GenericServlet {
 
     @Override
     public void init() throws ServletException {
-        log.info("{} ready to serve requests", 
this.slingServletContext.getServerInfo());
+        final ServletContext localContext = this.slingServletContext;
+        log.info("{} ready to serve requests", localContext != null ? 
localContext.getServerInfo() : "Sling");
     }
 
     @Deactivate
@@ -223,7 +229,8 @@ public class SlingMainServlet extends GenericServlet {
         }
 
         this.bundleContext = null;
-        log.info("{} shut down", this.slingServletContext.getServerInfo());
+        final ServletContext localContext = this.slingServletContext;
+        log.info("{} shut down", localContext != null ? 
localContext.getServerInfo() : "Sling");
     }
 
     /**
diff --git 
a/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java 
b/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
index 90b28cb..19e5544 100644
--- a/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
+++ b/src/main/java/org/apache/sling/engine/impl/SlingRequestProcessorImpl.java
@@ -84,16 +84,13 @@ public class SlingRequestProcessorImpl implements 
SlingRequestProcessor {
     private final Logger log = 
LoggerFactory.getLogger(SlingRequestProcessorImpl.class);
 
     @Reference
-    private ServletResolver servletResolver;
+    private volatile ServletResolver servletResolver;
 
     @Reference
-    private ServletFilterManager filterManager;
+    private volatile ServletFilterManager filterManager;
 
     @Reference
-    private RequestProcessorMBeanImpl mbean;
-
-    @Reference(target = SlingServletContext.TARGET)
-    private ServletContext slingServletContext;
+    private volatile RequestProcessorMBeanImpl mbean;
 
     @Reference(cardinality=ReferenceCardinality.OPTIONAL, policy = 
ReferencePolicy.DYNAMIC)
     private volatile AdapterManager adapterManager;
@@ -119,7 +116,6 @@ public class SlingRequestProcessorImpl implements 
SlingRequestProcessor {
 
     @Activate
     public void activate(final Config config) {
-        
this.errorHandler.setServerInfo(this.slingServletContext.getServerInfo());
         this.modified(config);
     }
 
@@ -148,6 +144,15 @@ public class SlingRequestProcessorImpl implements 
SlingRequestProcessor {
         this.checkContentTypeOnInclude = 
config.sling_includes_checkcontenttype();
     }
 
+    @Reference(target = SlingServletContext.TARGET, policy = 
ReferencePolicy.DYNAMIC, updated = "bindServletContext")
+    void bindServletContext(final ServletContext servletContext) {
+        this.errorHandler.setServerInfo(servletContext.getServerInfo());
+    }
+
+    void unbindServletContext(final ServletContext servletContext) {
+        // nothing to do here, but DS requires this method
+    }
+
     @Reference(name = "ErrorHandler",
                cardinality=ReferenceCardinality.OPTIONAL,
                policy = ReferencePolicy.DYNAMIC,
@@ -281,8 +286,9 @@ public class SlingRequestProcessorImpl implements 
SlingRequestProcessor {
             // record the request for the web console and info provider
             RequestInfoProviderImpl.recordRequest(request);
 
-            if (mbean != null) {
-                mbean.addRequestData(requestData);
+            final RequestProcessorMBeanImpl localBean = this.mbean;
+            if (localBean != null) {
+                localBean.addRequestData(requestData);
             }
         }
     }
@@ -355,12 +361,22 @@ public class SlingRequestProcessorImpl implements 
SlingRequestProcessor {
             final RequestPathInfo resolvedURL, 
             final DispatchingInfo dispatchingInfo)
     throws IOException, ServletException {
-
         // we need a SlingHttpServletRequest/SlingHttpServletResponse tupel
         // to continue
         final SlingHttpServletRequest cRequest = 
RequestData.toSlingHttpServletRequest(request);
         final SlingHttpServletResponse cResponse = 
RequestData.toSlingHttpServletResponse(response);
 
+        // check that we have all required services
+        final ServletResolver sr = this.servletResolver;
+        if (sr == null) {
+            final int status = HttpServletResponse.SC_SERVICE_UNAVAILABLE;
+            String errorMessage = "Required service missing (ServletResolver)";
+            log.debug("{}), cannot dispatch requests, sending status {}", 
errorMessage, status);
+            cResponse.sendError(status, errorMessage);
+            return;
+        }
+
+
         // get the request data (and btw check the correct type)
         final RequestData requestData = RequestData.getRequestData(cRequest);
         final ContentData oldContentData = requestData.getContentData();
@@ -370,7 +386,7 @@ public class SlingRequestProcessorImpl implements 
SlingRequestProcessor {
         requestData.setDispatchingInfo(dispatchingInfo);
         try {
             // resolve the servlet
-            Servlet servlet = servletResolver.resolveServlet(cRequest);
+            Servlet servlet = sr.resolveServlet(cRequest);
             contentData.setServlet(servlet);
 
             final FilterChainType type = dispatchingInfo.getType() == 
DispatcherType.INCLUDE

Reply via email to