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 2020/03/12 23:38:32 UTC

[sling-org-apache-sling-scripting-bundle-tracker] 03/03: SLING-9203 - Perform script / class lookup using the Sling script naming conventions

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

radu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-scripting-bundle-tracker.git

commit fc38b64ea59cc1585e8ac1968339528449bdd9cf
Author: Radu Cotescu <ra...@apache.org>
AuthorDate: Fri Mar 13 00:38:03 2020 +0100

    SLING-9203 - Perform script / class lookup using the Sling script naming conventions
---
 .../tracker/internal/BundledScriptFinder.java      |  49 ++++-----
 .../tracker/internal/BundledScriptTracker.java     |  14 +--
 .../{ResourceTypeParser.java => ResourceType.java} | 120 +++++++++++----------
 .../bundle/tracker/internal/TypeProvider.java      |  21 ++--
 ...ceTypeParserTest.java => ResourceTypeTest.java} |  18 ++--
 5 files changed, 114 insertions(+), 108 deletions(-)

diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java
index ed25e30..0c6b926 100644
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java
+++ b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptFinder.java
@@ -52,7 +52,6 @@ public class BundledScriptFinder {
     private static final String NS_JAVAX_SCRIPT_CAPABILITY = "javax.script";
     private static final String SLASH = "/";
     private static final String DOT = ".";
-    private static final Set<String> DEFAULT_METHODS = new HashSet<>(Arrays.asList("GET", "HEAD"));
 
     @Reference
     private ScriptEngineManager scriptEngineManager;
@@ -96,48 +95,38 @@ public class BundledScriptFinder {
         return null;
     }
 
-    private List<String> buildScriptMatches(SlingHttpServletRequest request, ResourceTypeParser.ResourceType resourceType) {
+    private List<String> buildScriptMatches(SlingHttpServletRequest request, ResourceType resourceType) {
         List<String> matches = new ArrayList<>();
         String method = request.getMethod();
-        boolean defaultMethod = DEFAULT_METHODS.contains(method);
         String extension = request.getRequestPathInfo().getExtension();
         String[] selectors = request.getRequestPathInfo().getSelectors();
         if (selectors.length > 0) {
             for (int i = selectors.length - 1; i >= 0; i--) {
-                String scriptForMethod = resourceType.getType() +
+                String base =
+                resourceType.getType() +
                         (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() + SLASH : SLASH) +
-                        method + DOT + String.join(SLASH, Arrays.copyOf(selectors, i + 1));
-                String scriptNoMethod = resourceType.getType() +
-                        (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() + SLASH : SLASH) +
-                        String.join
-                                (SLASH, Arrays.copyOf(selectors, i + 1));
-                if (StringUtils.isNotEmpty(extension)) {
-                    if (defaultMethod) {
-                        matches.add(scriptNoMethod + DOT + extension);
-                    }
-                    matches.add(scriptForMethod + DOT + extension);
-                }
-                if (defaultMethod) {
-                    matches.add(scriptNoMethod);
+                        String.join(SLASH, Arrays.copyOf(selectors, i + 1));
+                if (StringUtils.isNotEmpty(extension)){
+                    matches.add(base + DOT + extension + DOT + method);
+                    matches.add(base + DOT + extension);
                 }
-                matches.add(scriptForMethod);
+                matches.add(base + DOT + method);
+                matches.add(base);
             }
         }
-        String scriptForMethod = resourceType.getType() +
-                (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() + SLASH : SLASH) + method;
-        String scriptNoMethod = resourceType.getType() +
-                (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() + SLASH : SLASH) +
-                resourceType.getResourceLabel();
+        String base = resourceType.getType() +
+                (StringUtils.isNotEmpty(resourceType.getVersion()) ? SLASH + resourceType.getVersion() : StringUtils.EMPTY);
+
         if (StringUtils.isNotEmpty(extension)) {
-            if (defaultMethod) {
-                matches.add(scriptNoMethod + DOT + extension);
-            }
-            matches.add(scriptForMethod + DOT + extension);
+            matches.add(base + SLASH + resourceType.getResourceLabel() + DOT + extension + DOT + method);
+            matches.add(base + SLASH + resourceType.getResourceLabel() + DOT + extension);
         }
-        if (defaultMethod) {
-            matches.add(scriptNoMethod);
+        matches.add(base + SLASH + resourceType.getResourceLabel() + DOT + method);
+        matches.add(base + SLASH + resourceType.getResourceLabel());
+        matches.add(base + SLASH + method);
+        if (StringUtils.isNotEmpty(extension)) {
+            matches.add(base + SLASH + extension);
         }
-        matches.add(scriptForMethod);
         return Collections.unmodifiableList(matches);
     }
 
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java
index 1d69b3a..f9c1661 100644
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java
+++ b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/BundledScriptTracker.java
@@ -171,8 +171,8 @@ public class BundledScriptTracker implements BundleTrackerCustomizer<List<Servic
 
                     List<ServiceRegistration<Servlet>> regs = new ArrayList<>();
                     LinkedHashSet<TypeProvider> wiredProviders = new LinkedHashSet<>();
-                    wiredProviders.add(new TypeProvider(ResourceTypeParser.parseResourceType(resourceType), bundle));
-                    wiredProviders.add(new TypeProvider(ResourceTypeParser.parseResourceType(resourceTypeString), bundle));
+                    wiredProviders.add(new TypeProvider(ResourceType.parseResourceType(resourceType), bundle));
+                    wiredProviders.add(new TypeProvider(ResourceType.parseResourceType(resourceTypeString), bundle));
                     if (optionalWire.isPresent()) {
                         BundleWire extendsWire = optionalWire.get();
                         Bundle providerBundle = extendsWire.getProvider().getBundle();
@@ -181,8 +181,8 @@ public class BundledScriptTracker implements BundleTrackerCustomizer<List<Servic
                         Version wireResourceTypeVersion = (Version) wireCapabilityAttributes.get(AT_VERSION);
                         String wireResourceTypeString = wireResourceType + (wireResourceTypeVersion != null ? "/" +
                                 wireResourceTypeVersion.toString() : "");
-                        wiredProviders.add(new TypeProvider(ResourceTypeParser.parseResourceType(wireResourceType), providerBundle));
-                        wiredProviders.add(new TypeProvider(ResourceTypeParser.parseResourceType(wireResourceTypeString), providerBundle));
+                        wiredProviders.add(new TypeProvider(ResourceType.parseResourceType(wireResourceType), providerBundle));
+                        wiredProviders.add(new TypeProvider(ResourceType.parseResourceType(wireResourceTypeString), providerBundle));
                         properties.put(ServletResolverConstants.SLING_SERVLET_RESOURCE_SUPER_TYPE, wireResourceTypeString);
                     }
                     populateWiredProviders(wiredProviders);
@@ -224,7 +224,7 @@ public class BundledScriptTracker implements BundleTrackerCustomizer<List<Servic
                                 .AT_VERSION);
                         if (!initialResourceTypes.contains(resourceType)) {
                             initialProviders.add(new TypeProvider(
-                                    ResourceTypeParser.parseResourceType(resourceType + (version == null ? "" : "/" + version.toString())),
+                                    ResourceType.parseResourceType(resourceType + (version == null ? "" : "/" + version.toString())),
                                     bundleWire.getProvider().getBundle()));
                         }
                     }
@@ -291,14 +291,14 @@ public class BundledScriptTracker implements BundleTrackerCustomizer<List<Servic
     private String getResourceType(Hashtable<String, Object> props) {
         String[] values = PropertiesUtil.toStringArray(props.get(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
         String resourceTypeValue = values[0];
-        ResourceTypeParser.ResourceType resourceType = ResourceTypeParser.parseResourceType(resourceTypeValue);
+        ResourceType resourceType = ResourceType.parseResourceType(resourceTypeValue);
         return resourceType.getType();
     }
 
     private String getResourceTypeVersion(ServiceReference<?> ref) {
         String[] values = PropertiesUtil.toStringArray(ref.getProperty(ServletResolverConstants.SLING_SERVLET_RESOURCE_TYPES));
         String resourceTypeValue = values[0];
-        ResourceTypeParser.ResourceType resourceType = ResourceTypeParser.parseResourceType(resourceTypeValue);
+        ResourceType resourceType = ResourceType.parseResourceType(resourceTypeValue);
         return resourceType.getVersion();
     }
 
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeParser.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceType.java
similarity index 61%
rename from src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeParser.java
rename to src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceType.java
index 0dbe226..a8b6ff5 100644
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeParser.java
+++ b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceType.java
@@ -18,6 +18,8 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.scripting.bundle.tracker.internal;
 
+import java.util.Objects;
+
 import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -35,68 +37,60 @@ import org.osgi.framework.Version;
  * <li><tt>a</tt> - flat (sub-set of path-based)</li>
  * </ol>
  */
-final class ResourceTypeParser {
+final class ResourceType {
+
+    private final String type;
+    private final String version;
+    private final String resourceLabel;
 
-    private ResourceTypeParser() {
+    private ResourceType(@NotNull String type, @Nullable String version) {
+        this.type = type;
+        this.version = version;
+        if (type.lastIndexOf('/') != -1) {
+            resourceLabel = type.substring(type.lastIndexOf('/') + 1);
+        } else if (type.lastIndexOf('.') != -1) {
+            resourceLabel = type.substring(type.lastIndexOf('.') + 1);
+        } else {
+            resourceLabel = type;
+        }
     }
 
     /**
-     * The {@code ResourceType} class encapsulates the details about a resource type.
+     * Returns a resource type's label. The label is important for script selection, since it will provide the name of the main script
+     * for this resource type. For more details check the Apache Sling
+     * <a href="https://sling.apache.org/documentation/the-sling-engine/url-to-script-resolution.html#scripts-for-get-requests">URL to
+     * Script Resolution</a> page
+     *
+     * @return the resource type label
      */
-    static class ResourceType {
-        private final String type;
-        private final String version;
-        private final String resourceLabel;
-
-        private ResourceType(@NotNull String type, @Nullable String version) {
-            this.type = type;
-            this.version = version;
-            if (type.lastIndexOf('/') != -1) {
-                resourceLabel = type.substring(type.lastIndexOf('/') + 1);
-            } else if (type.lastIndexOf('.') != -1) {
-                resourceLabel = type.substring(type.lastIndexOf('.') + 1);
-            } else {
-                resourceLabel = type;
-            }
-        }
-
-        /**
-         * Returns a resource type's label. The label is important for script selection, since it will provide the name of the main script
-         * for this resource type. For more details check the Apache Sling
-         * <a href="https://sling.apache.org/documentation/the-sling-engine/url-to-script-resolution.html#scripts-for-get-requests">URL to
-         * Script Resolution</a> page
-         *
-         * @return the resource type label
-         */
-        @NotNull
-        public String getResourceLabel() {
-            return resourceLabel;
-        }
+    @NotNull
+    public String getResourceLabel() {
+        return resourceLabel;
+    }
 
-        /**
-         * Returns the resource type string, without any version information.
-         *
-         * @return the resource type string
-         */
-        @NotNull
-        String getType() {
-            return type;
-        }
+    /**
+     * Returns the resource type string, without any version information.
+     *
+     * @return the resource type string
+     */
+    @NotNull
+    String getType() {
+        return type;
+    }
 
-        /**
-         * Returns the version, if available.
-         *
-         * @return the version, if available; {@code null} otherwise
-         */
-        @Nullable
-        String getVersion() {
-            return version;
-        }
+    /**
+     * Returns the version, if available.
+     *
+     * @return the version, if available; {@code null} otherwise
+     */
+    @Nullable
+    String getVersion() {
+        return version;
+    }
 
-        @Override
-        public String toString() {
-            return type + (version == null ? "" : "/" + version);
-        }
+    @Override
+    public String toString() {
+        return type + (version == null ? "" : "/" + version);
     }
 
     /**
@@ -136,4 +130,22 @@ final class ResourceTypeParser {
         }
         return new ResourceType(type, version);
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, version, resourceLabel);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof ResourceType) {
+            ResourceType other = (ResourceType) obj;
+            return Objects.equals(type, other.type) && Objects.equals(version, other.version) && Objects.equals(resourceLabel,
+                    other.resourceLabel);
+        }
+        return false;
+    }
 }
diff --git a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProvider.java b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProvider.java
index d1db81d..befdc5f 100644
--- a/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProvider.java
+++ b/src/main/java/org/apache/sling/scripting/bundle/tracker/internal/TypeProvider.java
@@ -18,6 +18,8 @@
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
 package org.apache.sling.scripting.bundle.tracker.internal;
 
+import java.util.Objects;
+
 import org.osgi.framework.Bundle;
 
 /**
@@ -25,7 +27,7 @@ import org.osgi.framework.Bundle;
  */
 public class TypeProvider {
 
-    private final ResourceTypeParser.ResourceType resourceType;
+    private final ResourceType resourceType;
     private final Bundle bundle;
 
     /**
@@ -34,7 +36,7 @@ public class TypeProvider {
      * @param resourceType   the resource type
      * @param bundle the bundle that provides the resource type
      */
-    TypeProvider(ResourceTypeParser.ResourceType resourceType, Bundle bundle) {
+    TypeProvider(ResourceType resourceType, Bundle bundle) {
         this.resourceType = resourceType;
         this.bundle = bundle;
     }
@@ -44,7 +46,7 @@ public class TypeProvider {
      *
      * @return the resource type
      */
-    ResourceTypeParser.ResourceType getResourceType() {
+    ResourceType getResourceType() {
         return resourceType;
     }
 
@@ -59,15 +61,18 @@ public class TypeProvider {
 
     @Override
     public int hashCode() {
-        return resourceType.hashCode() ^ bundle.hashCode();
+        return Objects.hash(bundle, resourceType);
     }
 
     @Override
     public boolean equals(Object obj) {
-        if (!(obj instanceof TypeProvider)) {
-            return false;
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof TypeProvider) {
+            TypeProvider other = (TypeProvider) obj;
+            return Objects.equals(bundle, other.bundle) && Objects.equals(resourceType, other.resourceType);
         }
-        TypeProvider other = (TypeProvider) obj;
-        return other.bundle.equals(bundle) && other.resourceType.equals(resourceType);
+        return false;
     }
 }
diff --git a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeParserTest.java b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeTest.java
similarity index 76%
rename from src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeParserTest.java
rename to src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeTest.java
index 47f92ef..e8a6a6b 100644
--- a/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeParserTest.java
+++ b/src/test/java/org/apache/sling/scripting/bundle/tracker/internal/ResourceTypeTest.java
@@ -24,11 +24,11 @@ import org.junit.Test;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-public class ResourceTypeParserTest {
+public class ResourceTypeTest {
 
     @Test
     public void testSlashNoVersion() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType("a/b/c");
+        ResourceType t1 = ResourceType.parseResourceType("a/b/c");
         assertEquals("a/b/c", t1.getType());
         assertEquals("c", t1.getResourceLabel());
         assertNull(t1.getVersion());
@@ -36,7 +36,7 @@ public class ResourceTypeParserTest {
 
     @Test
     public void testSlashVersion() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType("a/b/c/1.0.0");
+        ResourceType t1 = ResourceType.parseResourceType("a/b/c/1.0.0");
         assertEquals("a/b/c", t1.getType());
         assertEquals("c", t1.getResourceLabel());
         assertEquals("1.0.0", t1.getVersion());
@@ -44,7 +44,7 @@ public class ResourceTypeParserTest {
 
     @Test
     public void testOneSegmentNoVersion() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType("a");
+        ResourceType t1 = ResourceType.parseResourceType("a");
         assertEquals("a", t1.getType());
         assertEquals("a", t1.getResourceLabel());
         assertNull(t1.getVersion());
@@ -52,7 +52,7 @@ public class ResourceTypeParserTest {
 
     @Test
     public void testOneSegmentVersion() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType("a/1.2.3");
+        ResourceType t1 = ResourceType.parseResourceType("a/1.2.3");
         assertEquals("a", t1.getType());
         assertEquals("a", t1.getResourceLabel());
         assertEquals("1.2.3", t1.getVersion());
@@ -60,7 +60,7 @@ public class ResourceTypeParserTest {
 
     @Test
     public void testDotNoVersion() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType("a.b.c");
+        ResourceType t1 = ResourceType.parseResourceType("a.b.c");
         assertEquals("a.b.c", t1.getType());
         assertEquals("c", t1.getResourceLabel());
         assertNull(t1.getVersion());
@@ -68,7 +68,7 @@ public class ResourceTypeParserTest {
 
     @Test
     public void testDotVersion() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType("a.b.c/42.0.0");
+        ResourceType t1 = ResourceType.parseResourceType("a.b.c/42.0.0");
         assertEquals("a.b.c", t1.getType());
         assertEquals("c", t1.getResourceLabel());
         assertEquals("42.0.0", t1.getVersion());
@@ -76,12 +76,12 @@ public class ResourceTypeParserTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void testEmptyString() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType(StringUtils.EMPTY);
+        ResourceType t1 = ResourceType.parseResourceType(StringUtils.EMPTY);
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testNull() {
-        ResourceTypeParser.ResourceType t1 = ResourceTypeParser.parseResourceType(null);
+        ResourceType t1 = ResourceType.parseResourceType(null);
     }
 
 }