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:="(&amp;(osgi.implementation=osgi.http)(version&gt;=1.0)(!(version&gt;=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();
+        }
+    }
 }