Merge pull request #1 from apache/master

Merge upstream
diff --git a/pom.xml b/pom.xml
index 81117a9..689a621 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
     </parent>
 
     <artifactId>org.apache.sling.resourceresolver</artifactId>
-    <version>1.6.9-SNAPSHOT</version>
+    <version>1.6.11-SNAPSHOT</version>
 
     <name>Apache Sling Resource Resolver</name>
     <description>
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
index 21ca9c9..229525a 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
@@ -30,6 +30,7 @@
 import java.util.Set;
 import java.util.StringTokenizer;
 
+import org.apache.commons.lang3.StringUtils;
 import org.jetbrains.annotations.Nullable;
 import javax.jcr.Session;
 import javax.servlet.http.HttpServletRequest;
@@ -689,6 +690,10 @@
      */
     public Resource resolveInternal(final String absPath, final Map<String, String> parameters) {
         Resource resource = null;
+        if (absPath != null && !absPath.startsWith("/")) {
+            logger.debug("resolveInternal: absolute path expected {} ",absPath);
+            return resource; // resource is null at this point
+        }
         String curPath = absPath;
         try {
             final ResourcePathIterator it = new ResourcePathIterator(absPath);
@@ -731,6 +736,9 @@
 
             final StringBuilder resolutionPath = new StringBuilder();
             final StringTokenizer tokener = new StringTokenizer(tokenizedPath, "/");
+            final int delimCount = StringUtils.countMatches(tokenizedPath,'/');
+            final int redundantDelimCount = delimCount - tokener.countTokens();
+
             while (resource != null && tokener.hasMoreTokens()) {
                 final String childNameRaw = tokener.nextToken();
 
@@ -767,7 +775,7 @@
             // uriPath = curPath + sling.resolutionPathInfo
             if (resource != null) {
                 final String path = resolutionPath.toString();
-                final String pathInfo = absPath.substring(path.length());
+                final String pathInfo = absPath.substring(path.length() + redundantDelimCount);
 
                 resource.getResourceMetadata().setResolutionPath(path);
                 resource.getResourceMetadata().setResolutionPathInfo(pathInfo);
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
index be2dfd5..953cd89 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/MockedResourceResolverImplTest.java
@@ -150,7 +150,7 @@
         activator.resourceProviderTracker = resourceProviderTracker;
         activator.changeListenerWhiteboard = resourceChangeListenerWhiteboard;
         activator.serviceUserMapper = Mockito.mock(ServiceUserMapper.class);
-        handlers.add(createRPHandler(resourceProvider, "org.apache.sling.resourceresolver.impl.DummyTestProvider", 10L, "/single"));
+        handlers.add(createRPHandler(resourceProvider, "org.apache.sling.resourceresolver.impl.DummyTestProvider", 10L, "/"));
 
         // setup mapping resources at /etc/map to exercise vanity etc.
         // hmm, can't provide the resolver since its not up and ready.
@@ -553,6 +553,14 @@
         path = resourceResolver.map("/content.html");
         Assert.assertEquals("/content.html", path);
 
+        path = resourceResolver.map(request,"some/relative/path/test");
+        Assert.assertEquals("some/relative/path/test", path);
+      
+        buildResource("/", EMPTY_RESOURCE_LIST, resourceResolver, resourceProvider);
+        buildResource("/single", EMPTY_RESOURCE_LIST, resourceResolver, resourceProvider);
+        buildResource("/single/test", EMPTY_RESOURCE_LIST, resourceResolver, resourceProvider);
+        path = resourceResolver.map("/single//test.html");
+        Assert.assertEquals("/single/test.html", path);
     }