You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ra...@apache.org on 2018/12/11 13:50:22 UTC

[sling-org-apache-sling-servlets-resolver] 01/01: SLING-8170 - Allow Sling servlets to declare a resource super type

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

radu pushed a commit to branch issue/SLING-8170
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-servlets-resolver.git

commit 23663221bdfeb1a39dcc131cc30ef9403c09c4fc
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Tue Dec 11 14:49:59 2018 +0100

    SLING-8170 - Allow Sling servlets to declare a resource super type
---
 pom.xml                                            |  8 +++---
 .../internal/resource/ServletResource.java         | 15 +++++++---
 .../internal/resource/ServletResourceProvider.java |  6 ++--
 .../resource/ServletResourceProviderFactory.java   | 32 ++++++++++++++--------
 .../ServletResourceProviderCreateTest.java         | 26 ++++++++++++++++++
 5 files changed, 66 insertions(+), 21 deletions(-)

diff --git a/pom.xml b/pom.xml
index e40c224..60f32cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -7,9 +7,9 @@
     to you under the Apache License, Version 2.0 (the
     "License"); you may not use this file except in compliance
     with the License.  You may obtain a copy of the License at
-    
+
     http://www.apache.org/licenses/LICENSE-2.0
-    
+
     Unless required by applicable law or agreed to in writing,
     software distributed under the License is distributed on an
     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -64,7 +64,7 @@
                         </Import-Package>
                         <Embed-Dependency>
                             org.apache.sling.engine;inline="org/apache/sling/engine/impl/request/SlingRequestPathInfo*",
-                        </Embed-Dependency>                
+                        </Embed-Dependency>
                         <Provide-Capability>
                             osgi.extender;osgi.extender="org.apache.sling.servlets.resolver";version:Version="1.0"
                         </Provide-Capability>
@@ -96,7 +96,7 @@
         <dependency>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.api</artifactId>
-            <version>2.18.0</version>
+            <version>2.18.5-SNAPSHOT</version>
             <scope>provided</scope>
         </dependency>
         <!-- for ServiceUserMapped (SLING-4312) -->
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 63704f2..41375a5 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
@@ -23,6 +23,7 @@ import java.util.Map;
 
 import javax.servlet.Servlet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.AbstractResource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -38,17 +39,23 @@ class ServletResource extends AbstractResource {
     private final String path;
 
     private final String resourceType;
+    private final String resourceSuperType;
 
     private final ResourceMetadata metadata;
 
+    public ServletResource(ResourceResolver resourceResolver, Servlet servlet, String path) {
+        this(resourceResolver, servlet, path, null);
+    }
+
     ServletResource(final ResourceResolver resourceResolver,
-            final Servlet servlet,
-            final String path) {
+                    final Servlet servlet,
+                    final String path,
+                    final String resourceSuperType) {
         this.resourceResolver = resourceResolver;
         this.servlet = servlet;
         this.path = path;
         this.resourceType = ServletResourceProviderFactory.ensureServletNameExtension(path);
-
+        this.resourceSuperType = StringUtils.isEmpty(resourceSuperType) ? "sling/bundle/resource" : resourceSuperType;
         this.metadata = new ResourceMetadata();
     }
 
@@ -71,7 +78,7 @@ class ServletResource extends AbstractResource {
      * the super type. */
     @Override
     public String getResourceSuperType() {
-        return "sling/bundle/resource";
+        return resourceSuperType;
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java
index f0d6bb9..fd284ce 100644
--- a/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java
+++ b/src/main/java/org/apache/sling/servlets/resolver/internal/resource/ServletResourceProvider.java
@@ -33,10 +33,12 @@ public class ServletResourceProvider extends ResourceProvider<Object> {
     private final Servlet servlet;
 
     private final Set<String> resourcePaths;
+    private final String resourceSuperType;
 
-    ServletResourceProvider(final Servlet servlet, final Set<String> resourcePaths) {
+    ServletResourceProvider(final Servlet servlet, final Set<String> resourcePaths, final String resourceSuperType) {
         this.servlet = servlet;
         this.resourcePaths = resourcePaths;
+        this.resourceSuperType = resourceSuperType;
     }
 
     @SuppressWarnings("unchecked")
@@ -47,7 +49,7 @@ public class ServletResourceProvider extends ResourceProvider<Object> {
             final Resource parent) {
         // only return a resource if the servlet has been assigned
         if (resourcePaths.contains(path)) {
-            return new ServletResource(ctx.getResourceResolver(), servlet, path);
+            return new ServletResource(ctx.getResourceResolver(), servlet, path, resourceSuperType);
         }
 
         @SuppressWarnings("rawtypes")
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 128695c..8b0e44c 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
@@ -18,21 +18,13 @@
  */
 package org.apache.sling.servlets.resolver.internal.resource;
 
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_EXTENSIONS;
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_METHODS;
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_NAME;
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_PATHS;
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_PREFIX;
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES;
-import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_SELECTORS;
-import static org.osgi.service.component.ComponentConstants.COMPONENT_NAME;
-
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
 import javax.servlet.Servlet;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.servlets.HttpConstants;
 import org.apache.sling.commons.osgi.PropertiesUtil;
@@ -42,6 +34,16 @@ import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_EXTENSIONS;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_METHODS;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_NAME;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_PATHS;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_PREFIX;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_RESOURCE_SUPER_TYPE;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES;
+import static org.apache.sling.api.servlets.ServletResolverConstants.SLING_SERVLET_SELECTORS;
+import static org.osgi.service.component.ComponentConstants.COMPONENT_NAME;
+
 public class ServletResourceProviderFactory {
 
     /**
@@ -144,8 +146,16 @@ public class ServletResourceProviderFactory {
             log.debug("create({}): Registering servlet for paths {}",
                     getServiceReferenceInfo(ref), pathSet);
         }
-
-        return new ServletResourceProvider(servlet, pathSet);
+        String resourceSuperType = PropertiesUtil.toString(ref.getProperty(SLING_SERVLET_RESOURCE_SUPER_TYPE), "");
+        if (StringUtils.isNotEmpty(resourceSuperType)) {
+            for (String rt : PropertiesUtil.toStringArray(ref.getProperty(SLING_SERVLET_RESOURCE_TYPES))) {
+                if (!rt.startsWith("/")) {
+                    rt = getPrefix(ref).concat(ResourceUtil.resourceTypeToPath(rt));
+                }
+                pathSet.add(rt);
+            }
+        }
+        return new ServletResourceProvider(servlet, pathSet, resourceSuperType);
     }
 
     /**
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 7f508ed..9f09fbc 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
@@ -19,6 +19,7 @@
 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.assertTrue;
 
 import java.util.Collections;
@@ -29,10 +30,15 @@ import javax.servlet.Servlet;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
 import org.apache.sling.api.servlets.HttpConstants;
 import org.apache.sling.api.servlets.ServletResolverConstants;
+import org.apache.sling.resourceresolver.impl.helper.ResourceResolverContext;
+import org.apache.sling.spi.resource.provider.ResolveContext;
+import org.apache.sling.spi.resource.provider.ResourceContext;
 import org.junit.Test;
+import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceReference;
@@ -179,4 +185,24 @@ public class ServletResourceProviderCreateTest {
             + ServletResourceProviderFactory.SERVLET_PATH_EXTENSION));
     }
 
+    @Test
+    public void testCreateWithResourceSuperType() {
+        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_EXTENSIONS)).thenReturn(new String[] {"html"});
+        Mockito.when(msr.getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_SUPER_TYPE)).thenReturn(new String[] {"this/is/a" +
+                "/test", "resource/two"});
+        final ServletResourceProvider srp = factory.create(msr, TEST_SERVLET);
+        final Set<String> paths = srp.getServletPaths();
+        assertEquals(2, paths.size());
+        assertTrue(paths.contains(ROOT + RES_TYPE_PATH));
+        assertTrue(paths.contains(ROOT + RES_TYPE_PATH + "/html" + ServletResourceProviderFactory.SERVLET_PATH_EXTENSION));
+        Resource servletResource = srp.getResource(Mockito.mock(ResolveContext.class), "/apps/sling/sample",
+                Mockito.mock(ResourceContext.class), Mockito.mock(Resource.class));
+        assertNotNull(servletResource);
+        assertEquals("this/is/a/test", servletResource.getResourceSuperType());
+
+    }
+
 }