Author: sseifert
Date: Sat Sep 30 11:26:03 2017
New Revision: 1810196

URL: http://svn.apache.org/viewvc?rev=1810196&view=rev
Log:
SLING-7165 fix problem with resolving config collection item name for nested 
configuration lists

Added:
    
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
   (with props)
Modified:
    
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistence2Test.java
    
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java?rev=1810196&r1=1810195&r2=1810196&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/main/java/org/apache/sling/caconfig/impl/ConfigurationBuilderImpl.java
 Sat Sep 30 11:26:03 2017
@@ -27,7 +27,9 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.collections.IteratorUtils;
+import org.apache.commons.collections.ResettableListIterator;
 import org.apache.commons.collections.Transformer;
+import org.apache.commons.collections.iterators.ListIteratorWrapper;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceUtil;
@@ -144,8 +146,8 @@ class ConfigurationBuilderImpl implement
                        
.getResourceCollectionInheritanceChain(this.contentResource, configBucketNames, 
collectionParentConfigName);
                if (result != null) {
                    resourceInheritanceChains.addAll(result);
+                   }
                }
-           }
 
            final Collection<T> result = new ArrayList<>();
            if (resourceInheritanceChains != null) {
@@ -169,8 +171,9 @@ class ConfigurationBuilderImpl implement
         Resource configResource = null;
         String conversionName = name;
         if (resourceInhertianceChain != null) {
+            ResettableListIterator resettableResourceInhertianceChain = new 
ListIteratorWrapper(resourceInhertianceChain);
             // apply persistence transformation
-            Iterator<Resource> transformedResources = 
IteratorUtils.transformedIterator(resourceInhertianceChain,
+            Iterator<Resource> transformedResources = 
IteratorUtils.transformedIterator(resettableResourceInhertianceChain,
                     new Transformer() {
                         @Override
                         public Object transform(Object input) {
@@ -187,8 +190,14 @@ class ConfigurationBuilderImpl implement
             // apply overrides
             configResource = 
configurationOverrideMultiplexer.overrideProperties(contentResource.getPath(), 
name, configResource, configResource.getResourceResolver());
             // build name
-            if (configResource != null && isCollection) {
-                conversionName = conversionName + "/" + 
configResource.getName();
+            if (isCollection) {
+                // get untransformed resource for getting collection item name
+                resettableResourceInhertianceChain.reset();
+                Resource untransformedConfigResource = 
configurationInheritanceStrategy.getResource(resettableResourceInhertianceChain);
+                if (untransformedConfigResource != null && configResource != 
null) {
+                    conversionName = 
configurationPersistenceStrategy.getCollectionParentConfigName(conversionName, 
configResource.getPath())
+                            + "/" + untransformedConfigResource.getName();
+                }
             }
         }
         if (log.isTraceEnabled() && configResource != null) {

Added: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java?rev=1810196&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
 (added)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
 Sat Sep 30 11:26:03 2017
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.sling.caconfig.example;
+
+import org.apache.sling.caconfig.annotation.Configuration;
+
+@Configuration(collection = true)
+public @interface ListDoubleNestedConfig {
+
+    String stringParam();
+    
+    int intParam();
+
+    ListNestedConfig[] subListNestedConfig();
+    
+}

Propchange: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
------------------------------------------------------------------------------
--- svn:keywords (added)
+++ svn:keywords Sat Sep 30 11:26:03 2017
@@ -0,0 +1 @@
+LastChangedDate LastChangedRevision LastChangedBy HeadURL Id Author

Propchange: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/example/ListDoubleNestedConfig.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java?rev=1810196&r1=1810195&r2=1810196&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverAnnotationClassTest.java
 Sat Sep 30 11:26:03 2017
@@ -35,6 +35,7 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.caconfig.ConfigurationResolveException;
 import org.apache.sling.caconfig.ConfigurationResolver;
 import org.apache.sling.caconfig.example.ListConfig;
+import org.apache.sling.caconfig.example.ListDoubleNestedConfig;
 import org.apache.sling.caconfig.example.ListNestedConfig;
 import org.apache.sling.caconfig.example.NestedConfig;
 import org.apache.sling.caconfig.example.SimpleConfig;
@@ -191,6 +192,54 @@ public class ConfigurationResolverAnnota
     }
 
     @Test
+    public void testConfig_List_DoubleNested() {
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value1")
+            .resource("2", "stringParam", "value2")
+            .resource("3", "stringParam", "value3");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/1/subListNestedConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value11")
+            .resource("2", "stringParam", "value12");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/1/subListNestedConfig/1/subListConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value111")
+            .resource("2", "stringParam", "value112");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/1/subListNestedConfig/2/subListConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value121");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/2/subListNestedConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value21");
+
+        List<ListDoubleNestedConfig> cfgList = 
ImmutableList.copyOf(underTest.get(site1Page1).asCollection(ListDoubleNestedConfig.class));
+
+        assertEquals(3, cfgList.size());
+        
+        ListDoubleNestedConfig config1 = cfgList.get(0);
+        assertEquals("value1", config1.stringParam());
+        assertEquals(2, config1.subListNestedConfig().length);
+        assertEquals("value11", 
config1.subListNestedConfig()[0].stringParam());
+        assertEquals(2, 
config1.subListNestedConfig()[0].subListConfig().length);
+        assertEquals("value111", 
config1.subListNestedConfig()[0].subListConfig()[0].stringParam());
+        assertEquals("value112", 
config1.subListNestedConfig()[0].subListConfig()[1].stringParam());
+        assertEquals("value12", 
config1.subListNestedConfig()[1].stringParam());
+        assertEquals(1, 
config1.subListNestedConfig()[1].subListConfig().length);
+        assertEquals("value121", 
config1.subListNestedConfig()[1].subListConfig()[0].stringParam());
+        
+        ListDoubleNestedConfig config2 = cfgList.get(1);
+        assertEquals("value2", config2.stringParam());
+        assertEquals(1, config2.subListNestedConfig().length);
+        assertEquals("value21", 
config2.subListNestedConfig()[0].stringParam());
+        assertEquals(0, 
config2.subListNestedConfig()[0].subListConfig().length);
+
+        ListDoubleNestedConfig config3 = cfgList.get(2);
+        assertEquals("value3", config3.stringParam());
+        assertEquals(0, config3.subListNestedConfig().length);
+    }
+
+    @Test
     public void testConfig_List_CollectionPropertyInheritance() {
         context.build()
             
.resource("/conf/global/sling:configs/org.apache.sling.caconfig.example.ListConfig")

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistence2Test.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistence2Test.java?rev=1810196&r1=1810195&r2=1810196&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistence2Test.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistence2Test.java
 Sat Sep 30 11:26:03 2017
@@ -27,11 +27,14 @@ import static org.junit.Assert.assertTru
 import java.awt.geom.Rectangle2D;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.ConfigurationResolveException;
 import org.apache.sling.caconfig.ConfigurationResolver;
 import org.apache.sling.caconfig.example.ListConfig;
+import org.apache.sling.caconfig.example.ListDoubleNestedConfig;
+import org.apache.sling.caconfig.example.ListNestedConfig;
 import org.apache.sling.caconfig.example.NestedConfig;
 import org.apache.sling.caconfig.example.SimpleConfig;
 import 
org.apache.sling.caconfig.management.impl.CustomConfigurationPersistenceStrategy2;
@@ -42,6 +45,8 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.osgi.framework.Constants;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * Test {@link ConfigurationResolver} with annotation classes for reading the 
config.
  */
@@ -126,17 +131,100 @@ public class ConfigurationResolverCustom
     public void testConfig_List() {
         
context.build().resource("/conf/content/site1/settings/org.apache.sling.caconfig.example.ListConfig/jcr:content")
             .siblingsMode()
-            .resource("1", "stringParam", "configValue1.1")
-            .resource("2", "stringParam", "configValue1.2")
-            .resource("3", "stringParam", "configValue1.3");
+            .resource("1", "stringParam", "value1")
+            .resource("2", "stringParam", "value2")
+            .resource("3", "stringParam", "value3");
 
         Collection<ListConfig> cfgList = 
underTest.get(site1Page1).asCollection(ListConfig.class);
 
         assertEquals(3, cfgList.size());
         Iterator<ListConfig> cfgIterator = cfgList.iterator();
-        assertEquals("configValue1.1", cfgIterator.next().stringParam());
-        assertEquals("configValue1.2", cfgIterator.next().stringParam());
-        assertEquals("configValue1.3", cfgIterator.next().stringParam());
+        assertEquals("value1", cfgIterator.next().stringParam());
+        assertEquals("value2", cfgIterator.next().stringParam());
+        assertEquals("value3", cfgIterator.next().stringParam());
+    }
+
+    @Test
+    public void testConfig_List_Nested() {
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListNestedConfig/jcr:content")
+            .siblingsMode()
+            .resource("1", "stringParam", "value1")
+            .resource("2", "stringParam", "value2")
+            .resource("3", "stringParam", "value3");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListNestedConfig/jcr:content/1/subListConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value11")
+            .resource("2", "stringParam", "value12");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListNestedConfig/jcr:content/2/subListConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value21");
+
+        List<ListNestedConfig> cfgList = 
ImmutableList.copyOf(underTest.get(site1Page1).asCollection(ListNestedConfig.class));
+
+        assertEquals(3, cfgList.size());
+        
+        ListNestedConfig config1 = cfgList.get(0);
+        assertEquals("value1", config1.stringParam());
+        assertEquals(2, config1.subListConfig().length);
+        assertEquals("value11", config1.subListConfig()[0].stringParam());
+        assertEquals("value12", config1.subListConfig()[1].stringParam());
+        
+        ListNestedConfig config2 = cfgList.get(1);
+        assertEquals("value2", config2.stringParam());
+        assertEquals(1, config2.subListConfig().length);
+        assertEquals("value21", config2.subListConfig()[0].stringParam());
+
+        ListNestedConfig config3 = cfgList.get(2);
+        assertEquals("value3", config3.stringParam());
+        assertEquals(0, config3.subListConfig().length);
+    }
+
+    @Test
+    public void testConfig_List_DoubleNested() {
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/jcr:content")
+            .siblingsMode()
+            .resource("1", "stringParam", "value1")
+            .resource("2", "stringParam", "value2")
+            .resource("3", "stringParam", "value3");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/jcr:content/1/subListNestedConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value11")
+            .resource("2", "stringParam", "value12");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/jcr:content/1/subListNestedConfig/1/subListConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value111")
+            .resource("2", "stringParam", "value112");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/jcr:content/1/subListNestedConfig/2/subListConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value121");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/jcr:content/2/subListNestedConfig")
+            .siblingsMode()
+            .resource("1", "stringParam", "value21");
+
+        List<ListDoubleNestedConfig> cfgList = 
ImmutableList.copyOf(underTest.get(site1Page1).asCollection(ListDoubleNestedConfig.class));
+
+        assertEquals(3, cfgList.size());
+        
+        ListDoubleNestedConfig config1 = cfgList.get(0);
+        assertEquals("value1", config1.stringParam());
+        assertEquals(2, config1.subListNestedConfig().length);
+        assertEquals("value11", 
config1.subListNestedConfig()[0].stringParam());
+        assertEquals(2, 
config1.subListNestedConfig()[0].subListConfig().length);
+        assertEquals("value111", 
config1.subListNestedConfig()[0].subListConfig()[0].stringParam());
+        assertEquals("value112", 
config1.subListNestedConfig()[0].subListConfig()[1].stringParam());
+        assertEquals("value12", 
config1.subListNestedConfig()[1].stringParam());
+        assertEquals(1, 
config1.subListNestedConfig()[1].subListConfig().length);
+        assertEquals("value121", 
config1.subListNestedConfig()[1].subListConfig()[0].stringParam());
+        
+        ListDoubleNestedConfig config2 = cfgList.get(1);
+        assertEquals("value2", config2.stringParam());
+        assertEquals(1, config2.subListNestedConfig().length);
+        assertEquals("value21", 
config2.subListNestedConfig()[0].stringParam());
+        assertEquals(0, 
config2.subListNestedConfig()[0].subListConfig().length);
+
+        ListDoubleNestedConfig config3 = cfgList.get(2);
+        assertEquals("value3", config3.stringParam());
+        assertEquals(0, config3.subListNestedConfig().length);
     }
 
     @Test

Modified: 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java?rev=1810196&r1=1810195&r2=1810196&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java
 (original)
+++ 
sling/trunk/bundles/extensions/caconfig/impl/src/test/java/org/apache/sling/caconfig/impl/ConfigurationResolverCustomPersistenceTest.java
 Sat Sep 30 11:26:03 2017
@@ -27,11 +27,14 @@ import static org.junit.Assert.assertTru
 import java.awt.geom.Rectangle2D;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.caconfig.ConfigurationResolveException;
 import org.apache.sling.caconfig.ConfigurationResolver;
 import org.apache.sling.caconfig.example.ListConfig;
+import org.apache.sling.caconfig.example.ListDoubleNestedConfig;
+import org.apache.sling.caconfig.example.ListNestedConfig;
 import org.apache.sling.caconfig.example.NestedConfig;
 import org.apache.sling.caconfig.example.SimpleConfig;
 import 
org.apache.sling.caconfig.management.impl.CustomConfigurationPersistenceStrategy;
@@ -42,6 +45,8 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.osgi.framework.Constants;
 
+import com.google.common.collect.ImmutableList;
+
 /**
  * Test {@link ConfigurationResolver} with annotation classes for reading the 
config.
  */
@@ -126,17 +131,100 @@ public class ConfigurationResolverCustom
     public void testConfig_List() {
         
context.build().resource("/conf/content/site1/settings/org.apache.sling.caconfig.example.ListConfig")
             .siblingsMode()
-            .resource("1/jcr:content", "stringParam", "configValue1.1")
-            .resource("2/jcr:content", "stringParam", "configValue1.2")
-            .resource("3/jcr:content", "stringParam", "configValue1.3");
+            .resource("1/jcr:content", "stringParam", "value1")
+            .resource("2/jcr:content", "stringParam", "value2")
+            .resource("3/jcr:content", "stringParam", "value3");
 
         Collection<ListConfig> cfgList = 
underTest.get(site1Page1).asCollection(ListConfig.class);
 
         assertEquals(3, cfgList.size());
         Iterator<ListConfig> cfgIterator = cfgList.iterator();
-        assertEquals("configValue1.1", cfgIterator.next().stringParam());
-        assertEquals("configValue1.2", cfgIterator.next().stringParam());
-        assertEquals("configValue1.3", cfgIterator.next().stringParam());
+        assertEquals("value1", cfgIterator.next().stringParam());
+        assertEquals("value2", cfgIterator.next().stringParam());
+        assertEquals("value3", cfgIterator.next().stringParam());
+    }
+
+    @Test
+    public void testConfig_List_Nested() {
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListNestedConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value1")
+            .resource("2/jcr:content", "stringParam", "value2")
+            .resource("3/jcr:content", "stringParam", "value3");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListNestedConfig/1/jcr:content/subListConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value11")
+            .resource("2/jcr:content", "stringParam", "value12");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListNestedConfig/2/jcr:content/subListConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value21");
+
+        List<ListNestedConfig> cfgList = 
ImmutableList.copyOf(underTest.get(site1Page1).asCollection(ListNestedConfig.class));
+
+        assertEquals(3, cfgList.size());
+        
+        ListNestedConfig config1 = cfgList.get(0);
+        assertEquals("value1", config1.stringParam());
+        assertEquals(2, config1.subListConfig().length);
+        assertEquals("value11", config1.subListConfig()[0].stringParam());
+        assertEquals("value12", config1.subListConfig()[1].stringParam());
+        
+        ListNestedConfig config2 = cfgList.get(1);
+        assertEquals("value2", config2.stringParam());
+        assertEquals(1, config2.subListConfig().length);
+        assertEquals("value21", config2.subListConfig()[0].stringParam());
+
+        ListNestedConfig config3 = cfgList.get(2);
+        assertEquals("value3", config3.stringParam());
+        assertEquals(0, config3.subListConfig().length);
+    }
+
+    @Test
+    public void testConfig_List_DoubleNested() {
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value1")
+            .resource("2/jcr:content", "stringParam", "value2")
+            .resource("3/jcr:content", "stringParam", "value3");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/1/jcr:content/subListNestedConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value11")
+            .resource("2/jcr:content", "stringParam", "value12");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/1/jcr:content/subListNestedConfig/1/jcr:content/subListConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value111")
+            .resource("2/jcr:content", "stringParam", "value112");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/1/jcr:content/subListNestedConfig/2/jcr:content/subListConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value121");
+        
context.build().resource("/conf/content/site1/sling:configs/org.apache.sling.caconfig.example.ListDoubleNestedConfig/2/jcr:content/subListNestedConfig")
+            .siblingsMode()
+            .resource("1/jcr:content", "stringParam", "value21");
+
+        List<ListDoubleNestedConfig> cfgList = 
ImmutableList.copyOf(underTest.get(site1Page1).asCollection(ListDoubleNestedConfig.class));
+
+        assertEquals(3, cfgList.size());
+        
+        ListDoubleNestedConfig config1 = cfgList.get(0);
+        assertEquals("value1", config1.stringParam());
+        assertEquals(2, config1.subListNestedConfig().length);
+        assertEquals("value11", 
config1.subListNestedConfig()[0].stringParam());
+        assertEquals(2, 
config1.subListNestedConfig()[0].subListConfig().length);
+        assertEquals("value111", 
config1.subListNestedConfig()[0].subListConfig()[0].stringParam());
+        assertEquals("value112", 
config1.subListNestedConfig()[0].subListConfig()[1].stringParam());
+        assertEquals("value12", 
config1.subListNestedConfig()[1].stringParam());
+        assertEquals(1, 
config1.subListNestedConfig()[1].subListConfig().length);
+        assertEquals("value121", 
config1.subListNestedConfig()[1].subListConfig()[0].stringParam());
+        
+        ListDoubleNestedConfig config2 = cfgList.get(1);
+        assertEquals("value2", config2.stringParam());
+        assertEquals(1, config2.subListNestedConfig().length);
+        assertEquals("value21", 
config2.subListNestedConfig()[0].stringParam());
+        assertEquals(0, 
config2.subListNestedConfig()[0].subListConfig().length);
+
+        ListDoubleNestedConfig config3 = cfgList.get(2);
+        assertEquals("value3", config3.stringParam());
+        assertEquals(0, config3.subListNestedConfig().length);
     }
 
     @Test


Reply via email to