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