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;
- }
-
}