This is an automated email from the ASF dual-hosted git repository. pauls pushed a commit to branch issues/SLING-9714 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git
commit b3e8299414aea4e8cc9bb380b54d96363b34c859 Author: Karl Pauls <[email protected]> AuthorDate: Tue Sep 1 17:27:53 2020 +0200 SLING-9714: Ignore default resource super type for servlet registrations. Co-authored-by: Radu Cotescu [email protected] --- .../internal/resource/ServletResource.java | 6 ++-- .../resource/ServletResourceProviderFactory.java | 4 ++- .../ServletResourceProviderCreateTest.java | 37 +++++++++++++++++++--- 3 files changed, 38 insertions(+), 9 deletions(-) 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 ab63f8b..883e40f 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 @@ -35,6 +35,8 @@ import org.apache.sling.servlets.resolver.bundle.tracker.internal.BundledScriptS public class ServletResource extends AbstractResource { + public static final String DEFAULT_RESOURCE_SUPER_TYPE = "sling/bundle/resource"; + private final ResourceResolver resourceResolver; private final Servlet servlet; @@ -60,7 +62,7 @@ public class ServletResource extends AbstractResource { this.servlet = servlet; this.path = path; this.resourceType = ServletResourceProviderFactory.ensureServletNameExtension(path); - this.resourceSuperType = StringUtils.isEmpty(resourceSuperType) ? "sling/bundle/resource" : resourceSuperType; + this.resourceSuperType = StringUtils.isEmpty(resourceSuperType) ? DEFAULT_RESOURCE_SUPER_TYPE : resourceSuperType; this.metadata = new ResourceMetadata(); this.metadata.put("sling.servlet.resource", "true"); } @@ -86,8 +88,6 @@ public class ServletResource extends AbstractResource { return resourceType; } - /** Servlet Resources always returns "sling/bundle/resource" as - * the super type. */ @Override public String getResourceSuperType() { return resourceSuperType; diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java index 629d25b..946d7b6 100644 --- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java +++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderFactory.java @@ -36,6 +36,8 @@ import javax.servlet.Servlet; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.sling.api.resource.ResourceResolver; +import org.apache.sling.api.resource.ResourceResolverFactory; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.servlets.HttpConstants; import org.apache.sling.commons.osgi.PropertiesUtil; @@ -149,7 +151,7 @@ public class ServletResourceProviderFactory { } String resourceSuperType = PropertiesUtil.toString(ref.getProperty(SLING_SERVLET_RESOURCE_SUPER_TYPE), null); Set<String> resourceSuperTypeMarkers = new HashSet<>(); - if (StringUtils.isNotEmpty(resourceSuperType)) { + if (StringUtils.isNotEmpty(resourceSuperType) && !ServletResource.DEFAULT_RESOURCE_SUPER_TYPE.equals(resourceSuperType)) { for (String rt : PropertiesUtil.toStringArray(ref.getProperty(SLING_SERVLET_RESOURCE_TYPES))) { if (!rt.startsWith("/")) { rt = getPrefix(ref).concat(ResourceUtil.resourceTypeToPath(rt)); diff --git a/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java b/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java index a1c25e5..8b11b6c 100644 --- a/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java +++ b/src/test/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProviderCreateTest.java @@ -18,11 +18,6 @@ */ package org.apache.sling.servlets.resolver.internal.resource; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - import java.util.Collections; import java.util.Set; @@ -42,6 +37,11 @@ import org.mockito.Mockito; import org.osgi.framework.Constants; import org.osgi.framework.ServiceReference; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + public class ServletResourceProviderCreateTest { private static final Servlet TEST_SERVLET = new GenericServlet() { @@ -213,4 +213,31 @@ public class ServletResourceProviderCreateTest { assertEquals(TEST_SERVLET, servletResource.adaptTo(Servlet.class)); } + @Test + public void testCreateWithDefaultResourceSuperType() { + @SuppressWarnings("unchecked") + final ServiceReference<Servlet> msr = Mockito.mock(ServiceReference.class); + Mockito.when(msr.getProperty(Constants.SERVICE_ID)).thenReturn(1L); + Mockito.when(msr.getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES)).thenReturn(RES_TYPE); + Mockito.when(msr.getProperty(ServletResolverConstants.SLING_SERVLET_SELECTORS)).thenReturn("sel"); + Mockito.when(msr.getProperty(ServletResolverConstants.SLING_SERVLET_EXTENSIONS)).thenReturn(new String[] {"html"}); + Mockito.when(msr.getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_SUPER_TYPE)) + .thenReturn(new String[]{ServletResource.DEFAULT_RESOURCE_SUPER_TYPE}); + final ServletResourceProvider srp = factory.create(msr, TEST_SERVLET); + final Set<String> paths = srp.getServletPaths(); + assertEquals(1, paths.size()); + assertTrue(paths.contains(ROOT + RES_TYPE_PATH + "/sel.html" + ServletResourceProviderFactory.SERVLET_PATH_EXTENSION)); + @SuppressWarnings("unchecked") + Resource superTypeMarkingResource = srp.getResource(Mockito.mock(ResolveContext.class), "/apps/sling/sample", + Mockito.mock(ResourceContext.class), Mockito.mock(Resource.class)); + assertNull(superTypeMarkingResource); + + @SuppressWarnings("unchecked") + Resource servletResource = srp.getResource(Mockito.mock(ResolveContext.class), "/apps/sling/sample/sel.html.servlet", + Mockito.mock(ResourceContext.class), Mockito.mock(Resource.class)); + assertNotNull(servletResource); + assertEquals(ServletResource.DEFAULT_RESOURCE_SUPER_TYPE, servletResource.getResourceSuperType()); + assertEquals(TEST_SERVLET, servletResource.adaptTo(Servlet.class)); + } + }
