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