You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by pa...@apache.org on 2020/04/28 22:11:04 UTC

[sling-org-apache-sling-servlets-resolver] branch issues/SLING-9365 updated: SLING-9365: optionally use internal resource provider for servlets.

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

pauls pushed a commit to branch issues/SLING-9365
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git


The following commit(s) were added to refs/heads/issues/SLING-9365 by this push:
     new 0b87457  SLING-9365: optionally use internal resource provider for servlets.
0b87457 is described below

commit 0b874578148a35bb4738d0f3d24d24e90a2f608d
Author: Karl Pauls <ka...@gmail.com>
AuthorDate: Wed Apr 29 00:10:50 2020 +0200

    SLING-9365: optionally use internal resource provider for servlets.
---
 .../servlets/resolver/internal/ResolverConfig.java |   7 +-
 .../resolver/internal/ScriptResourceDecorator.java |  40 +++-----
 .../resolver/internal/ScriptResourceResolver.java  | 111 +++++++--------------
 .../resolver/internal/SlingServletResolver.java    |   5 +-
 .../resource/MergingServletResourceProvider.java   |  88 ++++++----------
 .../resolver/internal/resource/ServletMounter.java |  91 ++++-------------
 .../internal/resource/ServletResource.java         |  17 ++--
 7 files changed, 115 insertions(+), 244 deletions(-)

diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
index deff978..7d5b9d5 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ResolverConfig.java
@@ -59,7 +59,8 @@ public @interface ResolverConfig {
             + "will be used. This means that the last path segment of the resource type can be used as the script name.")
     String[] servletresolver_defaultExtensions() default "html";
 
-    @AttributeDefinition(name = "Merge Mounts", description = "Should a dispatching servlet be mounted at the highest level of the tree. If true,"
-        + " a resource provider will be merged at the top level that dispatches internally instead of serveral resource provider per servlet. ")
-    String servletresolver_mergeMounts() default "INTERNAL";
+    @AttributeDefinition(name = "Mount Internal", description = "Should servlets be mounted internally and not as a resource provider. If true,"
+        + " an internal resource provider will be used for servlet resolving and the servlets be decorated back into the resource tree instead of " +
+        "serveral resource provider per servlet. ")
+    boolean servletresolver_mountInternal() default false;
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceDecorator.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceDecorator.java
index b2827d0..fb4c9bb 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceDecorator.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceDecorator.java
@@ -19,7 +19,6 @@
 package org.apache.sling.servlets.resolver.internal;
 
 import java.util.Iterator;
-import javax.servlet.Servlet;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.sling.api.resource.Resource;
@@ -34,18 +33,16 @@ import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
 
 @Component
-public class ScriptResourceDecorator implements ResourceDecorator
-{
-    private final MergingServletResourceProvider m_provider;
+public class ScriptResourceDecorator implements ResourceDecorator {
+    private final MergingServletResourceProvider provider;
 
     @Activate
     public ScriptResourceDecorator(@Reference MergingServletResourceProvider provider) {
-        m_provider = provider;
+        this.provider = provider;
     }
 
     @Override
-    public Resource decorate(Resource resource)
-    {
+    public Resource decorate(Resource resource) {
         String path = resource.getPath();
         Resource script = getResource(resource, path);
         if (script == resource && Resource.RESOURCE_TYPE_NON_EXISTING.equals(resource.getResourceType())) {
@@ -61,46 +58,37 @@ public class ScriptResourceDecorator implements ResourceDecorator
     }
 
     @Override
-    public Resource decorate(Resource resource, HttpServletRequest request)
-    {
+    public Resource decorate(Resource resource, HttpServletRequest request) {
         return decorate(resource);
     }
 
     private Resource getResource(Resource resource, String path) {
-        return m_provider.getResource(new ResolveContext<Void>()
-        {
+        return provider.getResource(new ResolveContext<Void>() {
             @Override
-            public ResourceResolver getResourceResolver()
-            {
-                return new ScriptResourceResolver(resource.getResourceResolver(), () -> m_provider);
+            public ResourceResolver getResourceResolver() {
+                return new ScriptResourceResolver(resource.getResourceResolver(), () -> provider);
             }
 
             @Override
-            public Void getProviderState()
-            {
+            public Void getProviderState() {
                 return null;
             }
 
             @Override
-            public ResolveContext<?> getParentResolveContext()
-            {
+            public ResolveContext<?> getParentResolveContext() {
                 return null;
             }
 
             @Override
-            public ResourceProvider<?> getParentResourceProvider()
-            {
-                return new ResourceProvider<Object>()
-                {
+            public ResourceProvider<?> getParentResourceProvider() {
+                return new ResourceProvider<Object>() {
                     @Override
-                    public Resource getResource(ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent)
-                    {
+                    public Resource getResource(ResolveContext<Object> ctx, String path, ResourceContext resourceContext, Resource parent) {
                         return resource;
                     }
 
                     @Override
-                    public Iterator<Resource> listChildren(ResolveContext<Object> ctx, Resource parent)
-                    {
+                    public Iterator<Resource> listChildren(ResolveContext<Object> ctx, Resource parent) {
                         return null;
                     }
                 };
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
index 161e656..84be911 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResourceResolver.java
@@ -32,79 +32,59 @@ import org.apache.sling.spi.resource.provider.ResolveContext;
 import org.apache.sling.spi.resource.provider.ResourceContext;
 import org.apache.sling.spi.resource.provider.ResourceProvider;
 
-public class ScriptResourceResolver extends ResourceResolverWrapper
-{
-    private final ResourceResolver m_resolver;
-    private final Supplier<ResourceProvider> m_provider;
+public class ScriptResourceResolver extends ResourceResolverWrapper {
+    private final ResourceResolver resolver;
+    private final Supplier<ResourceProvider> provider;
 
     public ScriptResourceResolver(ResourceResolver resolver, Supplier<ResourceProvider> provider) {
         super(resolver);
-        m_resolver = resolver;
-        m_provider = provider;
+        this.resolver = resolver;
+        this.provider = provider;
     }
 
-    public static ScriptResourceResolver wrap(ResourceResolver scriptResourceResolver, Supplier<ResourceProvider> provider)
-    {
+    public static ScriptResourceResolver wrap(ResourceResolver scriptResourceResolver, Supplier<ResourceProvider> provider) {
         return new ScriptResourceResolver(scriptResourceResolver, provider);
     }
 
     @Override
-    public Iterable<Resource> getChildren(Resource parent)
-    {
-        return new Iterable<Resource>()
-        {
-            @Override
-            public Iterator<Resource> iterator()
-            {
-                return listChildren(parent);
-            }
-        };
+    public Iterable<Resource> getChildren(Resource parent) {
+        return () -> listChildren(parent);
     }
 
-    public Resource getResource(String scriptPath)
-    {
-        ResourceProvider provider = m_provider.get();
+    public Resource getResource(String scriptPath) {
+        ResourceProvider provider = this.provider.get();
 
-        if (provider == null)
-        {
+        if (provider == null) {
             return super.getResource(scriptPath);
         }
         else {
-            return wrap(provider.getResource(new ResolveContext()
-            {
+            return wrap(provider.getResource(new ResolveContext() {
                 @Override
-                public ResourceResolver getResourceResolver()
-                {
+                public ResourceResolver getResourceResolver() {
                     return ScriptResourceResolver.this;
                 }
 
                 @Override
-                public Object getProviderState()
-                {
+                public Object getProviderState() {
                     return null;
                 }
 
                 @Override
-                public ResolveContext<?> getParentResolveContext()
-                {
+                public ResolveContext<?> getParentResolveContext() {
                     return null;
                 }
 
                 @Override
-                public ResourceProvider<?> getParentResourceProvider()
-                {
+                public ResourceProvider<?> getParentResourceProvider() {
                     return new ResourceProvider() {
-
                         @Override
-                        public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent)
-                        {
-                            return m_resolver.getResource(path);
+                        public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
+                            return resolver.getResource(path);
                         }
 
                         @Override
-                        public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent)
-                        {
-                            return m_resolver.listChildren(parent);
+                        public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
+                            return resolver.listChildren(parent);
                         }
                     };
                 }
@@ -113,47 +93,37 @@ public class ScriptResourceResolver extends ResourceResolverWrapper
     }
 
     @Override
-    public Iterator<Resource> listChildren(Resource parent)
-    {
-        ResourceProvider provider = m_provider.get();
-        if (provider == null)
-        {
+    public Iterator<Resource> listChildren(Resource parent) {
+        ResourceProvider provider = this.provider.get();
+        if (provider == null) {
             return super.listChildren(parent);
         }
         else {
-            return wrap(provider.listChildren(new ResolveContext()
-            {
+            return wrap(provider.listChildren(new ResolveContext() {
                 @Override
-                public ResourceResolver getResourceResolver()
-                {
+                public ResourceResolver getResourceResolver() {
                     return ScriptResourceResolver.this;
                 }
 
                 @Override
-                public Object getProviderState()
-                {
+                public Object getProviderState() {
                     return null;
                 }
 
-                public ResolveContext<?> getParentResolveContext()
-                {
+                public ResolveContext<?> getParentResolveContext() {
                     return null;
                 }
 
-                public ResourceProvider<?> getParentResourceProvider()
-                {
+                public ResourceProvider<?> getParentResourceProvider() {
                     return new ResourceProvider() {
-
                         @Override
-                        public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent)
-                        {
-                            return m_resolver.getResource(path);
+                        public Resource getResource(ResolveContext ctx, String path, ResourceContext resourceContext, Resource parent) {
+                            return resolver.getResource(path);
                         }
 
                         @Override
-                        public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent)
-                        {
-                            return m_resolver.listChildren(parent);
+                        public Iterator<Resource> listChildren(ResolveContext ctx, Resource parent) {
+                            return resolver.listChildren(parent);
                         }
                     };
                 }
@@ -172,8 +142,7 @@ public class ScriptResourceResolver extends ResourceResolverWrapper
         if (iter != null) {
             iter = new IteratorWrapper<Resource>(iter){
                 @Override
-                public Resource next()
-                {
+                public Resource next() {
                     return wrap(super.next());
                 }
             };
@@ -188,21 +157,17 @@ public class ScriptResourceResolver extends ResourceResolverWrapper
         return resource;
     }
 
-    public ScriptResourceResolver clone(Map o) throws LoginException
-    {
-        return ScriptResourceResolver.wrap(m_resolver.clone(o), m_provider);
+    public ScriptResourceResolver clone(Map o) throws LoginException {
+        return ScriptResourceResolver.wrap(resolver.clone(o), provider);
     }
 
-    private class ScriptResourceResolverResourceWrapper extends ResourceWrapper
-    {
-        public ScriptResourceResolverResourceWrapper(Resource resource)
-        {
+    private class ScriptResourceResolverResourceWrapper extends ResourceWrapper {
+        public ScriptResourceResolverResourceWrapper(Resource resource) {
             super(resource);
         }
 
         @Override
-        public ResourceResolver getResourceResolver()
-        {
+        public ResourceResolver getResourceResolver() {
             return ScriptResourceResolver.this;
         }
     }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
index caed253..170bc32 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
@@ -52,7 +52,6 @@ import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.api.servlets.OptingServlet;
 import org.apache.sling.api.servlets.ServletResolver;
 import org.apache.sling.api.servlets.ServletResolverConstants;
-import org.apache.sling.api.wrappers.SlingHttpServletRequestWrapper;
 import org.apache.sling.engine.servlets.ErrorHandler;
 import org.apache.sling.serviceusermapping.ServiceUserMapped;
 import org.apache.sling.servlets.resolver.internal.defaults.DefaultErrorHandlerServlet;
@@ -159,14 +158,14 @@ public class SlingServletResolver
         final String timerName = "resolveServlet(" + resource.getPath() + ")";
         tracker.startTimer(timerName);
 
-        String resourceType = resource.getResourceType();
+        final String resourceType = resource.getResourceType();
         if (LOGGER.isDebugEnabled()) {
             LOGGER.debug("resolveServlet called for resource {}", resource);
         }
 
         final ResourceResolver scriptResolver = this.getScriptResourceResolver();
-
         Servlet servlet = null;
+
         if ( resourceType != null && resourceType.length() > 0 ) {
             servlet = resolveServletInternal(request, null, resourceType, scriptResolver);
         }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
index 800d372..82f6249 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/MergingServletResourceProvider.java
@@ -30,7 +30,6 @@ import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.SyntheticResource;
 import org.apache.sling.spi.resource.provider.ResolveContext;
@@ -40,18 +39,18 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.ServiceReference;
 
 public class MergingServletResourceProvider extends ResourceProvider<Void> {
-    private final List<Pair<ServletResourceProvider, ServiceReference<?>>> m_registrations = new ArrayList<>();
+    private final List<Pair<ServletResourceProvider, ServiceReference<?>>> registrations = new ArrayList<>();
 
-    private final ConcurrentHashMap<String, Set<String>> m_tree = new ConcurrentHashMap<>();
-    private final ConcurrentHashMap<String, Pair<ServletResourceProvider, ServiceReference<?>>> m_providers = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, Set<String>> tree = new ConcurrentHashMap<>();
+    private final ConcurrentHashMap<String, Pair<ServletResourceProvider, ServiceReference<?>>> providers = new ConcurrentHashMap<>();
 
-    synchronized Set<String> add(ServletResourceProvider provider, ServiceReference<?> reference) {
-        m_registrations.add(Pair.of(provider, reference));
-        return index(Arrays.asList(m_registrations.get(m_registrations.size() - 1)));
+    synchronized void add(ServletResourceProvider provider, ServiceReference<?> reference) {
+        registrations.add(Pair.of(provider, reference));
+        index(Arrays.asList(registrations.get(registrations.size() - 1)));
     }
 
-    synchronized Set<String> remove(ServletResourceProvider provider, ServiceReference<?> reference) {
-        for (Iterator<Pair<ServletResourceProvider, ServiceReference<?>>> regIter = m_registrations.iterator(); regIter.hasNext(); ) {
+    synchronized void remove(ServletResourceProvider provider, ServiceReference<?> reference) {
+        for (Iterator<Pair<ServletResourceProvider, ServiceReference<?>>> regIter = registrations.iterator(); regIter.hasNext(); ) {
             Pair<ServletResourceProvider, ServiceReference<?>> reg = regIter.next();
             if (reg.getLeft() == provider) {
                 regIter.remove();
@@ -63,76 +62,67 @@ public class MergingServletResourceProvider extends ResourceProvider<Void> {
                 }
             }
         }
-        m_tree.clear();
-        m_providers.clear();
-        return index(m_registrations);
+        tree.clear();
+        providers.clear();
+        index(registrations);
     }
 
     synchronized void clear() {
-        m_registrations.clear();
-        m_tree.clear();
-        m_providers.clear();
+        registrations.clear();
+        tree.clear();
+        providers.clear();
     }
 
-    private Set<String> index(List<Pair<ServletResourceProvider, ServiceReference<?>>> registrations) {
-        Set<String> mounts = new LinkedHashSet<>();
-
+    private void index(List<Pair<ServletResourceProvider, ServiceReference<?>>> registrations) {
         for (Pair<ServletResourceProvider, ServiceReference<?>> reference : registrations) {
             for (String path : reference.getLeft().getServletPaths()) {
                 String current = "";
-                int count = 0;
                 for (String part : path.split("/")) {
-                    Set<String> childs = m_tree.get(current);
+                    Set<String> childs = tree.get(current);
                     if (childs == null) {
                         childs = Collections.synchronizedSet(new LinkedHashSet<>());
-                        m_tree.put(current, childs);
+                        tree.put(current, childs);
                     }
                     current += "/" + part;
                     current = current.trim().replace("//", "/");
 
                     childs.add(current);
-
-                    if (count++ == 1)
-                    {
-                        mounts.add(current);
-                    }
                 }
 
-                Pair<ServletResourceProvider, ServiceReference<?>> old = m_providers.put(path, reference);
+                Pair<ServletResourceProvider, ServiceReference<?>> old = providers.put(path, reference);
                 if (old != null) {
                     if (reference.getRight().compareTo(old.getRight()) < 0) {
-                        m_providers.put(path, old);
+                        providers.put(path, old);
                     }
                 }
             }
         }
-        return mounts;
     }
 
     @Override
     public Resource getResource(ResolveContext resolveContext, String path, ResourceContext resourceContext, Resource parent) {
-        Resource fromParent = null;
+        Resource wrapped = null;
         final ResourceProvider parentProvider = resolveContext.getParentResourceProvider();
         if (parentProvider != null) {
-            fromParent = parentProvider.getResource(resolveContext.getParentResolveContext(), path, resourceContext, parent);
+            wrapped = parentProvider.getResource(resolveContext.getParentResolveContext(), path, resourceContext, parent);
         }
         Resource result;
-        Pair<ServletResourceProvider, ServiceReference<?>> provider = m_providers.get(path);
+        Pair<ServletResourceProvider, ServiceReference<?>> provider = providers.get(path);
 
         if (provider != null) {
             result = provider.getLeft().getResource(resolveContext, path, resourceContext, parent);
             if (result instanceof ServletResource) {
-                ((ServletResource) result).setFromParent(fromParent);
+                ((ServletResource) result).setWrappedResource(wrapped);
             }
         }
         else {
-            if (fromParent != null) {
-                result = fromParent;
+            if (wrapped != null) {
+                result = wrapped;
             }
             else {
                 result = null;
             }
-            if (result == null && m_tree.containsKey(path)) {
+            if (result == null && tree.containsKey(path)) {
                 result = new SyntheticResource(resolveContext.getResourceResolver(), path, ResourceProvider.RESOURCE_TYPE_SYNTHETIC);
             }
         }
@@ -151,18 +141,18 @@ public class MergingServletResourceProvider extends ResourceProvider<Void> {
                 result.put(resource.getPath(), resource);
             }
         }
-        Set<String> paths = m_tree.get(parent.getPath());
+        Set<String> paths = tree.get(parent.getPath());
 
         if (paths != null) {
             for (String path : paths) {
-                Pair<ServletResourceProvider, ServiceReference<?>> provider = m_providers.get(path);
+                Pair<ServletResourceProvider, ServiceReference<?>> provider = providers.get(path);
 
                 if (provider != null) {
                     Resource resource = provider.getLeft().getResource(ctx, path, null, parent);
                     if (resource != null) {
-                        Resource fromParent = result.put(path, resource);
+                        Resource wrapped = result.put(path, resource);
                         if (resource instanceof ServletResource) {
-                            ((ServletResource) resource).setFromParent(fromParent);
+                            ((ServletResource) resource).setWrappedResource(wrapped);
                         }
                     }
                 }
@@ -173,22 +163,4 @@ public class MergingServletResourceProvider extends ResourceProvider<Void> {
         }
         return result.values().iterator();
     }
-
-    @Override
-    public Resource create(ResolveContext ctx, String path, Map properties) throws PersistenceException
-    {
-        return ctx.getParentResourceProvider().create(ctx.getParentResolveContext(), path, properties);
-    }
-
-    @Override
-    public void delete(ResolveContext ctx, Resource resource) throws PersistenceException
-    {
-        ctx.getParentResourceProvider().delete(ctx.getParentResolveContext(), resource);
-    }
-
-    @Override
-    public <AdapterType> AdapterType adaptTo(ResolveContext<Void> ctx, Class<AdapterType> type)
-    {
-        return super.adaptTo(ctx, type);
-    }
 }
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
index 147f33f..71606ef 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletMounter.java
@@ -25,15 +25,11 @@ import static org.osgi.service.component.ComponentConstants.COMPONENT_NAME;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
 import javax.servlet.Servlet;
@@ -87,16 +83,11 @@ public class ServletMounter {
 
     private final ServletResourceProviderFactory servletResourceProviderFactory;
 
-    private final MergingServletResourceProvider m_provider;
-    private final Set<ServiceRegistration<ResourceProvider>> m_providerRegs;
+    private final MergingServletResourceProvider provider;
 
-    private final BundleContext m_context;
+    private final ServiceRegistration<MergingServletResourceProvider> providerReg;
 
-    private final Set<ResolutionCache> resolutionCaches = Collections.synchronizedSet(new HashSet<>());
-
-    private final ConcurrentHashMap<ResolutionCache, ResolutionCache> m_resolutionCaches = new ConcurrentHashMap<>();
-
-    private final ServiceRegistration<MergingServletResourceProvider> m_providerReg;
+    private final ConcurrentHashMap<ResolutionCache, ResolutionCache> resolutionCaches = new ConcurrentHashMap<>();
 
     /**
      * Activate this component.
@@ -105,28 +96,17 @@ public class ServletMounter {
     public ServletMounter(final BundleContext context, @Reference final ResourceResolverFactory resourceResolverFactory,
             @Reference(target = "(name=org.apache.sling)") ServletContext servletContext,
             final ResolverConfig config) {
-        m_context = context;
         this.servletContext = servletContext;
         servletResourceProviderFactory = new ServletResourceProviderFactory(config.servletresolver_servletRoot(),
                 resourceResolverFactory.getSearchPath());
 
-        if (config.servletresolver_mergeMounts() != null) {
-            m_provider = new MergingServletResourceProvider();
-            if ("INTERNAL".equals(config.servletresolver_mergeMounts()))
-            {
-                m_providerReg = context.registerService(MergingServletResourceProvider.class, m_provider, null);
-                m_providerRegs = null;
-            }
-            else
-            {
-                m_providerReg = null;
-                m_providerRegs = Collections.synchronizedSet(new HashSet<>());
-            }
+        if (config.servletresolver_mountInternal()) {
+            provider = new MergingServletResourceProvider();
+            providerReg = context.registerService(MergingServletResourceProvider.class, provider, null);
         }
         else {
-            m_provider = null;
-            m_providerRegs = null;
-            m_providerReg = null;
+            provider = null;
+            providerReg = null;
         }
     }
 
@@ -142,20 +122,14 @@ public class ServletMounter {
         synchronized (this.servletsByReference) {
             refs = new ArrayList<>(servletsByReference.keySet());
         }
-        if (m_provider != null) {
-            m_provider.clear();
+        if (provider != null) {
+            provider.clear();
         }
         // destroy all servlets
         destroyAllServlets(refs);
 
-        // sanity check: clear array (it should be empty now anyway)
-        if (m_providerRegs != null) {
-            m_providerRegs.stream().forEach(ServiceRegistration::unregister);
-            m_providerRegs.clear();
-        }
-
-        if (m_providerReg != null) {
-            m_providerReg.unregister();
+        if (providerReg != null) {
+            providerReg.unregister();
         }
 
         // sanity check: clear array (it should be empty now anyway)
@@ -188,11 +162,11 @@ public class ServletMounter {
     )
     protected void bindResolutionCache(ResolutionCache cache) {
         cache.flushCache();
-        m_resolutionCaches.put(cache, cache);
+        resolutionCaches.put(cache, cache);
     }
 
     protected void unbindResolutionCache(ResolutionCache cache) {
-        m_resolutionCaches.remove(cache);
+        resolutionCaches.remove(cache);
     }
 
     private boolean createServlet(final Servlet servlet, final ServiceReference<Servlet> reference) {
@@ -225,24 +199,9 @@ public class ServletMounter {
             if ( bundleContext != null ) {
                 final List<ServiceRegistration<ResourceProvider<Object>>> regs = new ArrayList<>();
                 try {
-                    if (m_provider != null) {
-                        for (String mount : m_provider.add(provider, reference))
-                        {
-                            if (m_providerRegs != null)
-                            {
-                                if (m_providerRegs.stream().noneMatch(reg -> mount.equals(reg.getReference().getProperty(ResourceProvider.PROPERTY_ROOT))))
-                                {
-                                    final Dictionary<String, Object> params = new Hashtable<>();
-                                    params.put(ResourceProvider.PROPERTY_ROOT, mount);
-                                    params.put(Constants.SERVICE_DESCRIPTION,
-                                        "ServletResourceProvider for Servlets at " + mount);
-                                    params.put(ResourceProvider.PROPERTY_AUTHENTICATE, ResourceProvider.AUTHENTICATE_REQUIRED);
-                                    params.put(ResourceProvider.PROPERTY_MODIFIABLE, true);
-                                    m_providerRegs.add(m_context.registerService(ResourceProvider.class, m_provider, (Dictionary) params));
-                                }
-                            }
-                        }
-                        m_resolutionCaches.values().forEach(ResolutionCache::flushCache);
+                    if (this.provider != null) {
+                        this.provider.add(provider, reference);
+                        resolutionCaches.values().forEach(ResolutionCache::flushCache);
                     }
                     else {
                         for (final String root : provider.getServletPaths()) {
@@ -311,20 +270,8 @@ public class ServletMounter {
                     // this might happen on shutdown
                 }
             }
-            if (registration.provider != null && m_provider != null) {
-                Set<String> mounts = m_provider.remove(registration.provider, reference);
-                if (m_providerRegs != null)
-                {
-                    for (Iterator<ServiceRegistration<ResourceProvider>> registrationIterator = m_providerRegs.iterator(); ((Iterator) registrationIterator).hasNext(); )
-                    {
-                        ServiceRegistration<ResourceProvider> reg = registrationIterator.next();
-                        if (!mounts.contains(reg.getReference().getProperty(ResourceProvider.PROPERTY_ROOT)))
-                        {
-                            reg.unregister();
-                            registrationIterator.remove();
-                        }
-                    }
-                }
+            if (registration.provider != null && provider != null) {
+                provider.remove(registration.provider, reference);
             }
             final String name = RequestUtil.getServletName(registration.servlet);
             logger.debug("unbindServlet: Servlet {} removed", name);
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
index 16d1c5a..90a97e0 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResource.java
@@ -44,7 +44,7 @@ public class ServletResource extends AbstractResource {
 
     private final ResourceMetadata metadata;
 
-    private volatile Resource parent;
+    private volatile Resource wrapped;
 
     public ServletResource(ResourceResolver resourceResolver, Servlet servlet, String path) {
         this(resourceResolver, servlet, path, null);
@@ -62,6 +62,10 @@ public class ServletResource extends AbstractResource {
         this.metadata = new ResourceMetadata();
     }
 
+    void setWrappedResource(Resource wrapped) {
+        this.wrapped = wrapped;
+    }
+
     @Override
     public ResourceMetadata getResourceMetadata() {
         return metadata;
@@ -108,12 +112,12 @@ public class ServletResource extends AbstractResource {
     @Override
     @SuppressWarnings("unchecked")
     public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-        Resource fromParent = parent;
+        Resource wrapped = this.wrapped;
         if (type == Servlet.class && servlet != null) {
             return (AdapterType) servlet; // unchecked cast
         }
-        else if (fromParent != null) {
-            return fromParent.adaptTo(type);
+        else if (wrapped != null) {
+            return wrapped.adaptTo(type);
         }
         else if ( type == ValueMap.class ) {
             final Map<String, Object> props = new HashMap<>();
@@ -135,9 +139,4 @@ public class ServletResource extends AbstractResource {
         return getClass().getSimpleName() + ", servlet=" + this.getServletName()
             + ", path=" + getPath();
     }
-
-    void setFromParent(Resource fromParent) {
-        this.parent = fromParent;
-    }
-
 }