Added support for selectors and extensions script mapping
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
index 5ad8010..a15bae9 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptFinder.java
@@ -20,6 +20,7 @@
 
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
@@ -39,6 +40,8 @@
 public class BundledScriptFinder {
 
     private static final String NS_JAVAX_SCRIPT_CAPABILITY = "javax.script";
+    private static final String SLASH = "/";
+    private static final String DOT = ".";
     private List<String> scriptEngineExtensions;
 
     @Reference
@@ -55,24 +58,44 @@
     }
 
     public Script getScript(SlingHttpServletRequest request, Bundle bundle) {
-        String resourceType = request.getResource().getResourceType();
-        String type;
-        String version = null;
-        if (resourceType.contains("/") && StringUtils.countMatches(resourceType, "/") == 1) {
-            type = resourceType.substring(0, resourceType.indexOf("/"));
-            version = resourceType.substring(resourceType.indexOf("/") + 1, resourceType.length());
-        } else {
-            type = resourceType;
-        }
-        String scriptName = version == null ? resourceType.substring(resourceType.lastIndexOf('.') + 1) : type.substring(type.lastIndexOf
-                ('.') + 1);
-        String scriptPath = type + (version == null ? "/" : "/" + version + "/") + scriptName;
+        List<String> scriptMatches = buildScriptMatches(request);
         for (String extension : scriptEngineExtensions) {
-            URL bundledScriptURL = bundle.getEntry(NS_JAVAX_SCRIPT_CAPABILITY + "/" + scriptPath + "." + extension);
-            if (bundledScriptURL != null) {
-                return new Script(bundledScriptURL, scriptEngineManager.getEngineByExtension(extension));
+            for (String match : scriptMatches) {
+                URL bundledScriptURL = bundle.getEntry(NS_JAVAX_SCRIPT_CAPABILITY + SLASH + match + DOT + extension);
+                if (bundledScriptURL != null) {
+                    return new Script(bundledScriptURL, scriptEngineManager.getEngineByExtension(extension));
+                }
             }
         }
         return null;
     }
+
+    private List<String> buildScriptMatches(SlingHttpServletRequest request) {
+        List<String> matches = new ArrayList<>();
+        String resourceType = request.getResource().getResourceType();
+        String version = null;
+        if (resourceType.contains(SLASH) && StringUtils.countMatches(resourceType, SLASH) == 1) {
+            version = resourceType.substring(resourceType.indexOf(SLASH) + 1, resourceType.length());
+            resourceType = resourceType.substring(0, resourceType.length() - version.length() - 1);
+        }
+        String extension = request.getRequestPathInfo().getExtension();
+        String[] selectors = request.getRequestPathInfo().getSelectors();
+        if (selectors.length > 0) {
+            for (int i = selectors.length - 1; i >= 0; i--) {
+                String script = resourceType + (StringUtils.isNotEmpty(version) ? SLASH + version + SLASH : SLASH) + String.join
+                        (SLASH, Arrays.copyOf(selectors, i + 1));
+                if (StringUtils.isNotEmpty(extension)) {
+                    matches.add(script +  DOT + extension);
+                }
+                matches.add(script);
+            }
+        }
+        String script = resourceType + (StringUtils.isNotEmpty(version) ? SLASH + version + SLASH : SLASH) + resourceType
+                .substring(resourceType.lastIndexOf(DOT) + 1);
+        if (StringUtils.isNotEmpty(extension)) {
+            matches.add(script + DOT + extension);
+        }
+        matches.add(script);
+        return Collections.unmodifiableList(matches);
+    }
 }
diff --git a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptTracker.java b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptTracker.java
index 817ddce..5f3898d 100644
--- a/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptTracker.java
+++ b/src/main/java/org/apache/sling/scripting/resolver/internal/BundledScriptTracker.java
@@ -141,7 +141,7 @@
 
                     if (selectors != null || extensions != null)
                     {
-                        m_context.registerService(Servlet.class, servlet, properties);
+                        result.add(m_context.registerService(Servlet.class, servlet, properties));
                     }
                     return result.stream();
                 }).collect(Collectors.toList());