SLING-8635 : Close resource resolver at the end of each request
diff --git a/pom.xml b/pom.xml
index fd38c18..943706f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -23,7 +23,7 @@
<parent>
<groupId>org.apache.sling</groupId>
<artifactId>sling</artifactId>
- <version>32</version>
+ <version>34</version>
<relativePath />
</parent>
@@ -53,6 +53,7 @@
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
+ <version>4.1.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
@@ -62,9 +63,6 @@
org.osgi.service.useradmin;resolution:=optional,
*
</Import-Package>
- <Require-Capability>
- osgi.implementation;filter:="(&(osgi.implementation=osgi.http)(version>=1.0)(!(version>=2.0)))"
- </Require-Capability>
</instructions>
</configuration>
</plugin>
@@ -81,13 +79,25 @@
</build>
<dependencies>
<dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.annotation.versioning</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.service.component.annotations</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.osgi</groupId>
+ <artifactId>org.osgi.service.metatype.annotations</artifactId>
+ </dependency>
+ <dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.osgi</groupId>
<artifactId>org.osgi.service.http.whiteboard</artifactId>
- <version>1.0.0</version>
+ <version>1.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
diff --git a/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java b/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
index 3296390..5e7ce25 100644
--- a/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
+++ b/src/main/java/org/apache/sling/engine/impl/SlingHttpContext.java
@@ -25,11 +25,13 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.sling.api.request.RequestProgressTracker;
+import org.apache.sling.api.resource.ResourceResolver;
import org.apache.sling.auth.core.AuthenticationSupport;
import org.apache.sling.commons.mime.MimeTypeService;
import org.apache.sling.engine.impl.parameters.ParameterSupport;
import org.apache.sling.engine.impl.request.SlingRequestProgressTracker;
import org.osgi.service.http.context.ServletContextHelper;
+import org.osgi.service.http.whiteboard.annotations.RequireHttpWhiteboard;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,6 +39,7 @@
* The <code>SlingHttpContext</code> implements the OSGi HttpContext used to
* register the {@link SlingMainServlet} with the OSGi HttpService.
*/
+@RequireHttpWhiteboard
class SlingHttpContext extends ServletContextHelper {
/** Logger */
@@ -144,4 +147,18 @@
// terminate this request now
return false;
}
+
+ @Override
+ public void finishSecurity(HttpServletRequest request, HttpServletResponse response) {
+ super.finishSecurity(request, response);
+ // get ResourceResolver (set by AuthenticationSupport)
+ final Object resolverObject = request.getAttribute(AuthenticationSupport.REQUEST_ATTRIBUTE_RESOLVER);
+ final ResourceResolver resolver = (resolverObject instanceof ResourceResolver)
+ ? (ResourceResolver) resolverObject
+ : null;
+ if (resolver != null) {
+ // it's safe to call close() several times - checking isLive() can be expensive
+ resolver.close();
+ }
+ }
}