You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by as...@apache.org on 2014/11/17 10:03:41 UTC

svn commit: r1640109 - in /sling/trunk/bundles/resourceresolver/src: main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java

Author: asanso
Date: Mon Nov 17 09:03:40 2014
New Revision: 1640109

URL: http://svn.apache.org/r1640109
Log:
SLING-4168 - MapEntries doesn't update correctly on alias removal

Modified:
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
    sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java?rev=1640109&r1=1640108&r2=1640109&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java Mon Nov 17 09:03:40 2014
@@ -478,9 +478,13 @@ public class MapEntries implements Event
             if (!"/".equals(path)){
                 if (path.endsWith("/jcr:content")) {
                     path =  path.substring(0, path.length() - "/jcr:content".length());
-                }  
-                resourceName = path.substring(path.lastIndexOf("/")+1);
-                path = path.substring(0, path.lastIndexOf("/"));
+                }
+                resourceName = path.substring(path.lastIndexOf("/") + 1);
+                if (path.lastIndexOf("/") == 0) {
+                    path = "/";
+                } else {
+                    path = path.substring(0, path.lastIndexOf("/"));
+                }        
             } else {
                 resourceName = "";
             }

Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java?rev=1640109&r1=1640108&r2=1640109&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java Mon Nov 17 09:03:40 2014
@@ -766,6 +766,73 @@ public class MapEntriesTest {
     }
     
     @Test
+    public void test_doAddAlias2() throws Exception {
+        Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
+        method.setAccessible(true);
+        
+        Field field0 = MapEntries.class.getDeclaredField("aliasMap");
+        field0.setAccessible(true);   
+        
+        Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
+        assertEquals(0, aliasMap.size());        
+        
+        Resource parent = mock(Resource.class);
+        when(parent.getPath()).thenReturn("/");
+        
+        final Resource result = mock(Resource.class);
+        when(resourceResolver.getResource("/parent")).thenReturn(result);
+        when(result.getParent()).thenReturn(parent);
+        when(result.getPath()).thenReturn("/parent");
+        when(result.getName()).thenReturn("parent");
+        when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
+        
+        method.invoke(mapEntries, "/parent");
+        
+        Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertTrue(aliasMapEntry.containsKey("alias"));
+        assertEquals("parent", aliasMapEntry.get("alias"));
+        
+        assertEquals(1, aliasMap.size()); 
+        
+        //test_that_duplicate_alias_doesnt_replace_first_alias
+        final Resource secondResult = mock(Resource.class);
+        when(resourceResolver.getResource("/parent2")).thenReturn(secondResult);
+        when(secondResult.getParent()).thenReturn(parent);
+        when(secondResult.getPath()).thenReturn("/parent2");
+        when(secondResult.getName()).thenReturn("parent2");
+        when(secondResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
+        
+        method.invoke(mapEntries, "/parent2");
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertTrue(aliasMapEntry.containsKey("alias"));
+        assertEquals("parent", aliasMapEntry.get("alias"));
+        
+        assertEquals(1, aliasMap.size()); 
+        
+        //testing jcr:content node
+        final Resource jcrContentResult = mock(Resource.class);
+        when(resourceResolver.getResource("/parent/jcr:content")).thenReturn(jcrContentResult);
+        when(jcrContentResult.getParent()).thenReturn(result);
+        when(jcrContentResult.getPath()).thenReturn("/parent/jcr:content");
+        when(jcrContentResult.getName()).thenReturn("jcr:content");
+        when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
+        
+        method.invoke(mapEntries, "/parent/jcr:content");
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertEquals(2, aliasMapEntry.size()); 
+        assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
+        assertEquals("parent", aliasMapEntry.get("aliasJcrContent"));
+        
+        assertEquals(1, aliasMap.size()); 
+    }
+    
+    
+    @Test
     public void test_doUpdateAlias() throws Exception {
         Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
         method.setAccessible(true);
@@ -1131,6 +1198,133 @@ public class MapEntriesTest {
     }
     
     @Test
+    public void test_doRemoveAlias4() throws Exception {       
+        Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
+        method.setAccessible(true);
+        
+        Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
+        method1.setAccessible(true);
+        
+        Field field0 = MapEntries.class.getDeclaredField("aliasMap");
+        field0.setAccessible(true);   
+        
+        Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
+        assertEquals(0, aliasMap.size()); 
+        
+        Resource parent = mock(Resource.class);
+        when(parent.getPath()).thenReturn("/");
+        
+        final Resource result = mock(Resource.class);
+        when(resourceResolver.getResource("/parent")).thenReturn(result);
+        when(result.getParent()).thenReturn(parent);
+        when(result.getPath()).thenReturn("/parent");
+        when(result.getName()).thenReturn("parent");
+        when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias"));
+        
+        method.invoke(mapEntries, "/parent");
+        
+        Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertTrue(aliasMapEntry.containsKey("alias"));
+        assertEquals("parent", aliasMapEntry.get("alias"));
+        
+        assertEquals(1, aliasMap.size()); 
+        
+        method1.invoke(mapEntries, "/parent", new String[] { "sling:alias" }, false, false);
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNull(aliasMapEntry);
+        
+        assertEquals(0, aliasMap.size()); 
+        
+        //re-add node and test nodeDeletion true
+        method.invoke(mapEntries, "/parent");
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertTrue(aliasMapEntry.containsKey("alias"));
+        assertEquals("parent", aliasMapEntry.get("alias"));
+        
+        assertEquals(1, aliasMap.size()); 
+        
+        when(resourceResolver.getResource("/parent")).thenReturn(null);
+        method1.invoke(mapEntries, "/parent", new String[] { "sling:alias" }, true, false);
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNull(aliasMapEntry);
+        
+        assertEquals(0, aliasMap.size()); 
+    } 
+       
+    @Test
+    public void test_doRemoveAlias5() throws Exception { 
+        Method method = MapEntries.class.getDeclaredMethod("doAddAlias", String.class);
+        method.setAccessible(true);
+        
+        Method method1 = MapEntries.class.getDeclaredMethod("doRemoveAttributes", String.class, String[].class, boolean.class, boolean.class);
+        method1.setAccessible(true);
+        
+        Field field0 = MapEntries.class.getDeclaredField("aliasMap");
+        field0.setAccessible(true);   
+        
+        Map<String, Map<String, String>> aliasMap = ( Map<String, Map<String, String>>) field0.get(mapEntries);
+        assertEquals(0, aliasMap.size()); 
+        
+        Resource parent = mock(Resource.class);
+        when(parent.getPath()).thenReturn("/");
+        
+        final Resource result = mock(Resource.class);
+        when(resourceResolver.getResource("/parent")).thenReturn(result);
+        when(result.getParent()).thenReturn(parent);
+        when(result.getPath()).thenReturn("/parent");
+        when(result.getName()).thenReturn("parent");
+        when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap());
+        
+        //testing jcr:content node removal
+        final Resource jcrContentResult = mock(Resource.class);
+        when(resourceResolver.getResource("/parent/jcr:content")).thenReturn(jcrContentResult);
+        when(jcrContentResult.getParent()).thenReturn(result);
+        when(jcrContentResult.getPath()).thenReturn("/parent/jcr:content");
+        when(jcrContentResult.getName()).thenReturn("jcr:content");
+        when(jcrContentResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "aliasJcrContent"));
+        when(result.getChild("jcr:content")).thenReturn(jcrContentResult);
+        
+        method.invoke(mapEntries, "/parent/jcr:content");
+        
+        Map<String, String> aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
+        assertEquals("parent", aliasMapEntry.get("aliasJcrContent"));
+        
+        assertEquals(1, aliasMap.size());        
+        
+        method1.invoke(mapEntries, "/parent/jcr:content", new String[] { "sling:alias" }, false, false);
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNull(aliasMapEntry);
+        
+        assertEquals(0, aliasMap.size()); 
+        
+        //re-add node and test nodeDeletion true       
+        method.invoke(mapEntries, "/parent/jcr:content");
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNotNull(aliasMapEntry);
+        assertTrue(aliasMapEntry.containsKey("aliasJcrContent"));
+        assertEquals("parent", aliasMapEntry.get("aliasJcrContent"));
+        
+        assertEquals(1, aliasMap.size());        
+        when(resourceResolver.getResource("/parent/jcr:content")).thenReturn(null);
+        when(result.getChild("jcr:content")).thenReturn(null);
+        method1.invoke(mapEntries, "/parent/jcr:content", new String[] { "sling:alias" }, true, false);
+        
+        aliasMapEntry = mapEntries.getAliasMap("/");
+        assertNull(aliasMapEntry);
+        
+        assertEquals(0, aliasMap.size());
+    }
+    
+    @Test
     public void test_isValidVanityPath() throws Exception {
         Method method = MapEntries.class.getDeclaredMethod("isValidVanityPath", Resource.class);
         method.setAccessible(true);