incubator-sling-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cziege...@apache.org
Subject svn commit: r1401572 - in /sling/trunk/bundles/api/src: main/java/org/apache/sling/api/resource/ResourceUtil.java test/java/org/apache/sling/api/resource/ResourceUtilTest.java
Date Wed, 24 Oct 2012 07:34:03 GMT
Author: cziegeler
Date: Wed Oct 24 07:34:02 2012
New Revision: 1401572

URL: http://svn.apache.org/viewvc?rev=1401572&view=rev
Log:
SLING-2364 : ResourceUtil should provide a method to get the parent on an arbitrary level

Modified:
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java
    sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java

Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java?rev=1401572&r1=1401571&r2=1401572&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java
(original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceUtil.java
Wed Oct 24 07:34:02 2012
@@ -162,6 +162,40 @@ public class ResourceUtil {
     }
 
     /**
+     * Utility method returns the ancestor's path at the given <code>level</code>
+     * relative to <code>path</code>, which is normalized by {@link #normalize(String)}
+     * before resolving the ancestor.
+     * 
+     * <ul>
+     * <li><code>level</code> = 0 returns the <code>path</code>.</li>
+     * <li><code>level</code> = 1 returns the parent of <code>path</code>,
if it exists, <code>null</code> otherwise.</li>
+     * <li><code>level</code> = 2 returns the grandparent of <code>path</code>,
if it exists, <code>null</code> otherwise.</li>
+     * </ul>
+     * 
+     * @param path The path whose ancestor is to be returned.
+     * @param level The relative level of the ancestor, relative to <code>path</code>.
+     * @return <code>null</code> if <code>path</code> doesn't have
an ancestor at the
+     *            specified <code>level</code>.
+     * @throws IllegalArgumentException If the path cannot be normalized by the
+     *             {@link #normalize(String)} method or if <code>level</code>
< 0.
+     * @throws NullPointerException If <code>path</code> is <code>null</code>.
+     * @since 2.2
+     */
+    public static String getParent(final String path, final int level) {
+        if ( level < 0 ) {
+            throw new IllegalArgumentException("level must be non-negative");
+        }
+        String result = path;
+        for(int i=0; i<level; i++) {
+            result = getParent(result);
+            if ( result == null ) {
+                break;
+            }
+        }
+        return result;
+    }
+
+    /**
      * Utility method returns the parent resource of the resource.
      *
      * @throws NullPointerException If <code>rsrc</code> is <code>null</code>.
@@ -402,9 +436,9 @@ public class ResourceUtil {
             // if the path is relative we use the search paths
             for (final String searchPath : resourceResolver.getSearchPath()) {
                 final Resource rtResource = resourceResolver.getResource(searchPath
-                    + rtPath);
+                        + rtPath);
                 if (rtResource != null
-                    && rtResource.getResourceSuperType() != null) {
+                        && rtResource.getResourceSuperType() != null) {
                     resourceSuperType = rtResource.getResourceSuperType();
                     break;
                 }
@@ -429,7 +463,7 @@ public class ResourceUtil {
         String resourceSuperType = resource.getResourceSuperType();
         if (resourceSuperType == null) {
             resourceSuperType = getResourceSuperType(
-                resource.getResourceResolver(), resource.getResourceType());
+                    resource.getResourceResolver(), resource.getResourceType());
         }
         return resourceSuperType;
     }
@@ -483,7 +517,7 @@ public class ResourceUtil {
                 return true;
             }
             superType = getResourceSuperType(resource.getResourceResolver(),
-                superType);
+                    superType);
         }
 
         return false;

Modified: sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java?rev=1401572&r1=1401571&r2=1401572&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java
(original)
+++ sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceUtilTest.java
Wed Oct 24 07:34:02 2012
@@ -151,7 +151,7 @@ public class ResourceUtilTest {
 
         assertNull(ResourceUtil.getParent("b"));
         assertNull(ResourceUtil.getParent("/b/.."));
-        
+
         assertEquals("security:/", ResourceUtil.getParent("security:/b"));
         assertEquals("security:/b", ResourceUtil.getParent("security:/b/c"));
         assertEquals("security:/b/c", ResourceUtil.getParent("security:/b/c/d"));
@@ -384,33 +384,92 @@ public class ResourceUtilTest {
     }
 
     @Test public void testIsStarResource() {
-		final Resource nonStar = context.mock(Resource.class, "nonStarResource");
-		final String starPath = "/foo/*";
-		final Resource star = context.mock(Resource.class, "starResource");
-		final String nonStarPath = "/foo/*";
+        final Resource nonStar = context.mock(Resource.class, "nonStarResource");
+        final String starPath = "/foo/*";
+        final Resource star = context.mock(Resource.class, "starResource");
+        final String nonStarPath = "/foo/*";
         this.context.checking(new Expectations() {{
-        	allowing(star).getPath(); will(returnValue(starPath));
-        	allowing(nonStar).getPath(); will(returnValue(nonStarPath));
+            allowing(star).getPath(); will(returnValue(starPath));
+            allowing(nonStar).getPath(); will(returnValue(nonStarPath));
         }});
 
-		assertTrue("expecting star==true for path" + starPath,
-				ResourceUtil.isStarResource(star));
-		assertTrue("expecting star==false for path" + starPath,
-				ResourceUtil.isStarResource(nonStar));
+        assertTrue("expecting star==true for path" + starPath,
+                ResourceUtil.isStarResource(star));
+        assertTrue("expecting star==false for path" + starPath,
+                ResourceUtil.isStarResource(nonStar));
     }
     @Test public void testIsSyntheticResource() {
-		final Resource synth = new SyntheticResource(null, "foo", "bar");
-		final Resource star = context.mock(Resource.class);
+        final Resource synth = new SyntheticResource(null, "foo", "bar");
+        final Resource star = context.mock(Resource.class);
         this.context.checking(new Expectations() {{
-        	allowing(star).getPath(); will(returnValue("/foo/*"));
+            allowing(star).getPath(); will(returnValue("/foo/*"));
         }});
         final Resource wrapped = new ResourceWrapper(synth);
 
-		assertTrue("expecting synthetic==true for SyntheticResource",
-				ResourceUtil.isSyntheticResource(synth));
-		assertFalse("expecting synthetic==false for star resource",
-				ResourceUtil.isSyntheticResource(star));
-		assertTrue("expecting synthetic==true for wrapped Resource",
-				ResourceUtil.isSyntheticResource(wrapped));
+        assertTrue("expecting synthetic==true for SyntheticResource",
+                ResourceUtil.isSyntheticResource(synth));
+        assertFalse("expecting synthetic==false for star resource",
+                ResourceUtil.isSyntheticResource(star));
+        assertTrue("expecting synthetic==true for wrapped Resource",
+                ResourceUtil.isSyntheticResource(wrapped));
+    }
+
+    @Test public void testGetParentLevel() throws Exception {
+        boolean caughtNullPointerException = false;
+        try {
+            ResourceUtil.getParent(null, 4);
+        } catch (NullPointerException e) {
+            // Expected exception
+            caughtNullPointerException = true;
+        } catch (Exception e) {
+            fail("Expected NullPointerException, but caught " +
+                    e.getClass().getName() + " instead.");
+        }
+        if (!caughtNullPointerException) {
+            fail("Expected NullPointerException, but no exception was thrown.");
+        }
+
+        boolean caughtIllegalArgumentException = false;
+        try {
+            ResourceUtil.getParent("/a/b", -2);
+        } catch (IllegalArgumentException e) {
+            // Expected exception
+            caughtIllegalArgumentException = true;
+        } catch (Exception e) {
+            fail("Expected IllegalArgumentException, but caught " +
+                    e.getClass().getName() + " instead.");
+        }
+        if (!caughtIllegalArgumentException) {
+            fail("Expected IllegalArgumentException, but no exception was thrown.");
+        }
+
+        assertNull(ResourceUtil.getParent("/a", 4));
+        assertNull(ResourceUtil.getParent("/", 1));
+        assertNull(ResourceUtil.getParent("b/c", 2));
+        assertNull(ResourceUtil.getParent("/b/..", 1));
+        assertNull(ResourceUtil.getParent("b", 1));
+        assertNull(ResourceUtil.getParent("", 3));
+        assertNull(ResourceUtil.getParent("/..", 1));
+        assertNull(ResourceUtil.getParent("security:/b", 2));
+        assertNull(ResourceUtil.getParent("/b///", 2));
+
+        assertEquals("", ResourceUtil.getParent("", 0));
+        assertEquals("b", ResourceUtil.getParent("b", 0));
+        assertEquals("/", ResourceUtil.getParent("/", 0));
+        assertEquals("/a/b", ResourceUtil.getParent("/a/b", 0));
+        assertEquals("security:/b", ResourceUtil.getParent("security:/b", 0));
+
+        assertEquals("/", ResourceUtil.getParent("/b", 1));
+        assertEquals("b", ResourceUtil.getParent("b/c", 1));
+        assertEquals("b/c", ResourceUtil.getParent("b/c/d", 1));
+        assertEquals("/b/c", ResourceUtil.getParent("/b/c/d", 1));
+        assertEquals("security:/", ResourceUtil.getParent("security:/b", 1));
+        assertEquals("security:/b", ResourceUtil.getParent("security:/b/c", 1));
+        assertEquals("security:/b/c", ResourceUtil.getParent("security:/b/c/d", 1));
+
+        assertEquals("b", ResourceUtil.getParent("b/c/d", 2));
+        assertEquals("b/c", ResourceUtil.getParent("b/c/d/e", 2));
+        assertEquals("/", ResourceUtil.getParent("/b/c/d", 3));
+        assertEquals("/", ResourceUtil.getParent("/b///", 1));
     }
 }



Mime
View raw message