You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2014/04/20 21:32:10 UTC

svn commit: r1588831 [9/11] - in /commons/proper/configuration/trunk: ./ src/main/java/org/apache/commons/configuration/ src/main/java/org/apache/commons/configuration/beanutils/ src/main/java/org/apache/commons/configuration/builder/combined/ src/main...

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestSubnodeConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestSubnodeConfiguration.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestSubnodeConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestSubnodeConfiguration.java Sun Apr 20 19:32:08 2014
@@ -17,11 +17,11 @@
 package org.apache.commons.configuration;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
-import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -31,41 +31,30 @@ import org.apache.commons.collections.Co
 import org.apache.commons.configuration.convert.DefaultListDelimiterHandler;
 import org.apache.commons.configuration.convert.DisabledListDelimiterHandler;
 import org.apache.commons.configuration.convert.ListDelimiterHandler;
-import org.apache.commons.configuration.event.ConfigurationEvent;
-import org.apache.commons.configuration.event.ConfigurationListener;
-import org.apache.commons.configuration.ex.ConfigurationException;
 import org.apache.commons.configuration.interpol.ConfigurationInterpolator;
 import org.apache.commons.configuration.interpol.Lookup;
-import org.apache.commons.configuration.tree.ConfigurationNode;
+import org.apache.commons.configuration.tree.ImmutableNode;
+import org.apache.commons.configuration.tree.InMemoryNodeModel;
+import org.apache.commons.configuration.tree.NodeSelector;
+import org.apache.commons.configuration.tree.NodeStructureHelper;
+import org.apache.commons.configuration.tree.TrackedNodeModel;
 import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
+import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
 
 /**
  * Test case for SubnodeConfiguration.
  *
- * @author <a
- * href="http://commons.apache.org/configuration/team-list.html">Commons
- * Configuration team</a>
  * @version $Id$
  */
 public class TestSubnodeConfiguration
 {
-    /** An array with names of tables (test data). */
-    private static final String[] TABLE_NAMES =
-    { "documents", "users" };
-
-    /** An array with the fields of the test tables (test data). */
-    private static final String[][] TABLE_FIELDS =
-    {
-    { "docid", "docname", "author", "dateOfCreation", "version", "size" },
-    { "userid", "uname", "firstName", "lastName" } };
-
-    /** Constant for an updated table name.*/
-    private static final String NEW_TABLE_NAME = "newTable";
-
     /** The key used for the SubnodeConfiguration. */
-    private static final String SUB_KEY = "tables.table(1)";
+    private static final String SUB_KEY = "tables.table(0)";
+
+    /** The selector used by the test configuration. */
+    private static final NodeSelector SELECTOR = new NodeSelector(SUB_KEY);
 
     /** The parent configuration. */
     private BaseHierarchicalConfiguration parent;
@@ -73,14 +62,67 @@ public class TestSubnodeConfiguration
     /** The subnode configuration to be tested. */
     private SubnodeConfiguration config;
 
-    /** Stores a counter for the created nodes. */
-    private int nodeCounter;
-
     @Before
     public void setUp() throws Exception
     {
         parent = setUpParentConfig();
-        nodeCounter = 0;
+    }
+
+    /**
+     * Initializes the parent configuration. This method creates the typical
+     * structure of tables and fields nodes.
+     *
+     * @return the parent configuration
+     */
+    private static BaseHierarchicalConfiguration setUpParentConfig()
+    {
+        BaseHierarchicalConfiguration conf =
+                new BaseHierarchicalConfiguration();
+        appendTree(conf, NodeStructureHelper.ROOT_TABLES_TREE);
+        return conf;
+    }
+
+    /**
+     * Adds a tree structure to the root node of the given configuration.
+     *
+     * @param configuration the configuration
+     * @param root the root of the tree structure to be added
+     */
+    private static void appendTree(BaseHierarchicalConfiguration configuration,
+            ImmutableNode root)
+    {
+        configuration.addNodes(null, Collections.singleton(root));
+    }
+
+    /**
+     * Performs a standard initialization of the subnode config to test.
+     */
+    private void setUpSubnodeConfig()
+    {
+        setUpSubnodeConfig(SUB_KEY);
+    }
+
+    /**
+     * Initializes the test configuration using the specified key.
+     *
+     * @param key the key
+     */
+    private void setUpSubnodeConfig(String key)
+    {
+        config = (SubnodeConfiguration) parent.configurationAt(key, true);
+    }
+
+    /**
+     * Sets up the tracked model for the sub configuration.
+     *
+     * @param selector the selector
+     * @return the tracked model
+     */
+    private TrackedNodeModel setUpTrackedModel(NodeSelector selector)
+    {
+        InMemoryNodeModel parentModel = (InMemoryNodeModel) parent.getModel();
+        parentModel.trackNode(selector, parent);
+        return new TrackedNodeModel(parent, selector, true);
     }
 
     /**
@@ -90,8 +132,9 @@ public class TestSubnodeConfiguration
     public void testInitSubNodeConfig()
     {
         setUpSubnodeConfig();
-        assertSame("Wrong root node in subnode", getSubnodeRoot(parent), config
-                .getRootNode());
+        assertSame("Wrong root node in subnode",
+                NodeStructureHelper.nodeForKey(parent.getRootNode(),
+                        "tables/table(0)"), config.getRootNode());
         assertSame("Wrong parent config", parent, config.getParent());
     }
 
@@ -102,17 +145,19 @@ public class TestSubnodeConfiguration
     @Test(expected = IllegalArgumentException.class)
     public void testInitSubNodeConfigWithNullParent()
     {
-        config = new SubnodeConfiguration(null, getSubnodeRoot(parent), null);
+        config =
+                new SubnodeConfiguration(null, setUpTrackedModel(SELECTOR)
+                );
     }
 
     /**
-     * Tests constructing a subnode configuration with a null root node. This
+     * Tests constructing a subnode configuration with a null node model. This
      * should cause an exception.
      */
     @Test(expected = IllegalArgumentException.class)
     public void testInitSubNodeConfigWithNullNode()
     {
-        config = new SubnodeConfiguration(parent, null, null);
+        config = new SubnodeConfiguration(parent, null);
     }
 
     /**
@@ -122,15 +167,23 @@ public class TestSubnodeConfiguration
     public void testGetProperties()
     {
         setUpSubnodeConfig();
-        assertEquals("Wrong table name", TABLE_NAMES[0], config
-                .getString("name"));
+        checkSubConfigContent();
+    }
+
+    /**
+     * Checks whether the sub configuration has the expected content.
+     */
+    private void checkSubConfigContent()
+    {
+        assertEquals("Wrong table name", NodeStructureHelper.table(0),
+                config.getString("name"));
         List<Object> fields = config.getList("fields.field.name");
-        assertEquals("Wrong number of fields", TABLE_FIELDS[0].length, fields
-                .size());
-        for (int i = 0; i < TABLE_FIELDS[0].length; i++)
+        assertEquals("Wrong number of fields",
+                NodeStructureHelper.fieldsLength(0), fields.size());
+        for (int i = 0; i < NodeStructureHelper.fieldsLength(0); i++)
         {
-            assertEquals("Wrong field at position " + i, TABLE_FIELDS[0][i],
-                    fields.get(i));
+            assertEquals("Wrong field at position " + i,
+                    NodeStructureHelper.field(0, i), fields.get(i));
         }
     }
 
@@ -143,15 +196,15 @@ public class TestSubnodeConfiguration
     {
         setUpSubnodeConfig();
         config.setProperty(null, "testTable");
-        config.setProperty("name", TABLE_NAMES[0] + "_tested");
-        assertEquals("Root value was not set", "testTable", parent
-                .getString("tables.table(0)"));
-        assertEquals("Table name was not changed", TABLE_NAMES[0] + "_tested",
-                parent.getString("tables.table(0).name"));
+        config.setProperty("name", NodeStructureHelper.table(0) + "_tested");
+        assertEquals("Root value was not set", "testTable",
+                parent.getString("tables.table(0)"));
+        assertEquals("Table name was not changed", NodeStructureHelper.table(0)
+                + "_tested", parent.getString("tables.table(0).name"));
 
         parent.setProperty("tables.table(0).fields.field(1).name", "testField");
-        assertEquals("Field name was not changed", "testField", config
-                .getString("fields.field(1).name"));
+        assertEquals("Field name was not changed", "testField",
+                config.getString("fields.field(1).name"));
     }
 
     /**
@@ -162,16 +215,15 @@ public class TestSubnodeConfiguration
     {
         setUpSubnodeConfig();
         config.addProperty("[@table-type]", "test");
-        assertEquals("parent.createNode() was not called", 1, nodeCounter);
-        assertEquals("Attribute not set", "test", parent
-                .getString("tables.table(0)[@table-type]"));
+        assertEquals("Attribute not set", "test",
+                parent.getString("tables.table(0)[@table-type]"));
 
         parent.addProperty("tables.table(0).fields.field(-1).name", "newField");
         List<Object> fields = config.getList("fields.field.name");
-        assertEquals("New field was not added", TABLE_FIELDS[0].length + 1,
-                fields.size());
-        assertEquals("Wrong last field", "newField", fields
-                .get(fields.size() - 1));
+        assertEquals("New field was not added",
+                NodeStructureHelper.fieldsLength(0) + 1, fields.size());
+        assertEquals("Wrong last field", "newField",
+                fields.get(fields.size() - 1));
     }
 
     /**
@@ -197,13 +249,14 @@ public class TestSubnodeConfiguration
     {
         parent.setThrowExceptionOnMissing(true);
         setUpSubnodeConfig();
-        assertTrue("Exception flag not fetchted from parent", config
-                .isThrowExceptionOnMissing());
+        assertTrue("Exception flag not fetchted from parent",
+                config.isThrowExceptionOnMissing());
         config.getString("non existing key");
     }
 
     /**
-     * Tests whether the exception flag can be set independently from the parent.
+     * Tests whether the exception flag can be set independently from the
+     * parent.
      */
     @Test
     public void testSetThrowExceptionOnMissingAffectsParent()
@@ -211,8 +264,8 @@ public class TestSubnodeConfiguration
         parent.setThrowExceptionOnMissing(true);
         setUpSubnodeConfig();
         config.setThrowExceptionOnMissing(false);
-        assertTrue("Exception flag reset on parent", parent
-                .isThrowExceptionOnMissing());
+        assertTrue("Exception flag reset on parent",
+                parent.isThrowExceptionOnMissing());
     }
 
     /**
@@ -244,31 +297,47 @@ public class TestSubnodeConfiguration
     public void testSetExpressionEngine()
     {
         parent.setExpressionEngine(new XPathExpressionEngine());
-        setUpSubnodeConfig();
-        assertEquals("Wrong field name", TABLE_FIELDS[0][1], config
-                .getString("fields/field[2]/name"));
+        setUpSubnodeConfig("tables/table[1]");
+        assertEquals("Wrong field name", NodeStructureHelper.field(0, 1),
+                config.getString("fields/field[2]/name"));
         Set<String> keys = new HashSet<String>();
         CollectionUtils.addAll(keys, config.getKeys());
         assertEquals("Wrong number of keys", 2, keys.size());
         assertTrue("Key 1 not contained", keys.contains("name"));
         assertTrue("Key 2 not contained", keys.contains("fields/field/name"));
         config.setExpressionEngine(null);
-        assertTrue("Expression engine reset on parent", parent
-                .getExpressionEngine() instanceof XPathExpressionEngine);
+        assertTrue("Expression engine reset on parent",
+                parent.getExpressionEngine() instanceof XPathExpressionEngine);
+    }
+
+    /**
+     * Tests the configurationAt() method if updates are not supported.
+     */
+    @Test
+    public void testConfiguarationAtNoUpdates()
+    {
+        setUpSubnodeConfig();
+        HierarchicalConfiguration<ImmutableNode> sub2 =
+                config.configurationAt("fields.field(1)");
+        assertEquals("Wrong value of property",
+                NodeStructureHelper.field(0, 1), sub2.getString("name"));
+        parent.setProperty("tables.table(0).fields.field(1).name", "otherName");
+        assertEquals("Change of parent is visible",
+                NodeStructureHelper.field(0, 1), sub2.getString("name"));
     }
 
     /**
-     * Tests the configurationAt() method.
+     * Tests configurationAt() if updates are supported.
      */
     @Test
-    public void testConfiguarationAt()
+    public void testConfigurationAtWithUpdateSupport()
     {
         setUpSubnodeConfig();
-        SubnodeConfiguration sub2 = config
-                .configurationAt("fields.field(1)");
-        assertEquals("Wrong value of property", TABLE_FIELDS[0][1], sub2
-                .getString("name"));
-        assertEquals("Wrong parent", config.getParent(), sub2.getParent());
+        SubnodeConfiguration sub2 =
+                (SubnodeConfiguration) config.configurationAt("fields.field(1)", true);
+        assertEquals("Wrong value of property",
+                NodeStructureHelper.field(0, 1), sub2.getString("name"));
+        assertEquals("Wrong parent", config, sub2.getParent());
     }
 
     /**
@@ -282,8 +351,8 @@ public class TestSubnodeConfiguration
         parent.addProperty("tablespaces.tablespace(-1).name", "test");
         parent.addProperty("tables.table(0).tablespace",
                 "${tablespaces.tablespace(0).name}");
-        assertEquals("Wrong interpolated tablespace", "default", parent
-                .getString("tables.table(0).tablespace"));
+        assertEquals("Wrong interpolated tablespace", "default",
+                parent.getString("tables.table(0).tablespace"));
 
         setUpSubnodeConfig();
         assertEquals("Wrong interpolated tablespace in subnode", "default",
@@ -291,28 +360,50 @@ public class TestSubnodeConfiguration
     }
 
     /**
-     * An additional test for interpolation when the configurationAt() method is
-     * involved.
+     * Helper method for testing interpolation facilities between a sub and its
+     * parent configuration.
+     *
+     * @param withUpdates the supports updates flag
      */
-    @Test
-    public void testInterpolationFromConfigurationAt()
+    private void checkInterpolationFromConfigurationAt(boolean withUpdates)
     {
         parent.addProperty("base.dir", "/home/foo");
         parent.addProperty("test.absolute.dir.dir1", "${base.dir}/path1");
         parent.addProperty("test.absolute.dir.dir2", "${base.dir}/path2");
         parent.addProperty("test.absolute.dir.dir3", "${base.dir}/path3");
 
-        Configuration sub = parent.configurationAt("test.absolute.dir");
+        Configuration sub =
+                parent.configurationAt("test.absolute.dir", withUpdates);
         for (int i = 1; i < 4; i++)
         {
             assertEquals("Wrong interpolation in parent", "/home/foo/path" + i,
                     parent.getString("test.absolute.dir.dir" + i));
-            assertEquals("Wrong interpolation in subnode",
-                    "/home/foo/path" + i, sub.getString("dir" + i));
+            assertEquals("Wrong interpolation in sub", "/home/foo/path" + i,
+                    sub.getString("dir" + i));
         }
     }
 
     /**
+     * Tests whether interpolation works for a sub configuration obtained via
+     * configurationAt() if updates are not supported.
+     */
+    @Test
+    public void testInterpolationFromConfigurationAtNoUpdateSupport()
+    {
+        checkInterpolationFromConfigurationAt(false);
+    }
+
+    /**
+     * Tests whether interpolation works for a sub configuration obtained via
+     * configurationAt() if updates are supported.
+     */
+    @Test
+    public void testInterpolationFromConfigurationAtWithUpdateSupport()
+    {
+        checkInterpolationFromConfigurationAt(true);
+    }
+
+    /**
      * An additional test for interpolation when the configurationAt() method is
      * involved for a local interpolation.
      */
@@ -324,10 +415,10 @@ public class TestSubnodeConfiguration
         parent.addProperty("test.absolute.dir.dir2", "${dir1}");
 
         Configuration sub = parent.configurationAt("test.absolute.dir");
-        assertEquals("Wrong interpolation in subnode",
-            "/home/foo/path1", sub.getString("dir1"));
-        assertEquals("Wrong local interpolation in subnode",
-            "/home/foo/path1", sub.getString("dir2"));
+        assertEquals("Wrong interpolation in subnode", "/home/foo/path1",
+                sub.getString("dir1"));
+        assertEquals("Wrong local interpolation in subnode", "/home/foo/path1",
+                sub.getString("dir2"));
     }
 
     /**
@@ -344,157 +435,23 @@ public class TestSubnodeConfiguration
     }
 
     @Test
-    public void testLocalLookupsInInterpolatorAreInherited() {
+    public void testLocalLookupsInInterpolatorAreInherited()
+    {
         parent.addProperty("tablespaces.tablespace.name", "default");
         parent.addProperty("tablespaces.tablespace(-1).name", "test");
         parent.addProperty("tables.table(0).var", "${brackets:x}");
 
         ConfigurationInterpolator interpolator = parent.getInterpolator();
-        interpolator.registerLookup("brackets", new Lookup(){
+        interpolator.registerLookup("brackets", new Lookup() {
 
-            @Override
             public String lookup(String key) {
-                return "(" + key +")";
+                return "(" + key + ")";
             }
 
         });
         setUpSubnodeConfig();
-        assertEquals("Local lookup was not inherited", "(x)", config.getString("var", ""));
-    }
-
-    /**
-     * Tests a reload operation for the parent configuration when the subnode
-     * configuration does not support reloads. Then the new value should not be
-     * detected.
-     */
-    @Test
-    public void testParentReloadNotSupported() throws ConfigurationException
-    {
-        Configuration c = setUpLiveUpdateTest(false);
-        assertEquals("Name changed in sub config", TABLE_NAMES[1], config
-                .getString("name"));
-        assertEquals("Name not changed in parent", NEW_TABLE_NAME, c
-                .getString("tables.table(1).name"));
-    }
-
-    /**
-     * Tests a reload operation for the parent configuration when the subnode
-     * configuration does support reloads. The new value should be returned.
-     */
-    @Test
-    public void testParentReloadSupported() throws ConfigurationException
-    {
-        Configuration c = setUpLiveUpdateTest(true);
-        assertEquals("Name not changed in sub config", NEW_TABLE_NAME, config
-                .getString("name"));
-        assertEquals("Name not changed in parent", NEW_TABLE_NAME, c
-                .getString("tables.table(1).name"));
-    }
-
-    /**
-     * Tests whether events are fired if a change of the parent is detected.
-     */
-    @Test
-    public void testParentReloadEvents() throws ConfigurationException
-    {
-        config = parent.configurationAt(SUB_KEY, true);
-        ConfigurationListenerTestImpl l = new ConfigurationListenerTestImpl();
-        config.addConfigurationListener(l);
-        updateParent();
-        assertEquals("Wrong number of events", 4, l.events.size());
-        boolean before = true;
-        for (ConfigurationEvent e : l.events)
-        {
-            assertEquals("Wrong configuration", config, e.getSource());
-            assertEquals("Wrong event type",
-                    BaseHierarchicalConfiguration.EVENT_SUBNODE_CHANGED, e
-                            .getType());
-            assertNull("Got a property name", e.getPropertyName());
-            assertNull("Got a property value", e.getPropertyValue());
-            assertEquals("Wrong before flag", before, e.isBeforeUpdate());
-            before = !before;
-        }
-    }
-
-    /**
-     * Tests a reload operation for the parent configuration when the subnode
-     * configuration is aware of reloads, and the parent configuration is
-     * accessed first. The new value should be returned.
-     */
-    @Test
-    public void testParentReloadSupportAccessParent()
-            throws ConfigurationException
-    {
-        Configuration c = setUpLiveUpdateTest(true);
-        assertEquals("Name not changed in parent", NEW_TABLE_NAME, c
-                .getString("tables.table(1).name"));
-        assertEquals("Name not changed in sub config", NEW_TABLE_NAME, config
-                .getString("name"));
-    }
-
-    /**
-     * Tests whether reloads work with sub subnode configurations.
-     */
-    @Test
-    public void testParentReloadSubSubnode() throws ConfigurationException
-    {
-        setUpLiveUpdateTest(true);
-        SubnodeConfiguration sub = config.configurationAt("fields", true);
-        assertEquals("Wrong subnode key", "tables.table(1).fields", sub
-                .getSubnodeKey());
-        assertEquals("Changed field not detected", "newField", sub
-                .getString("field(0).name"));
-    }
-
-    /**
-     * Tests creating a sub sub config when the sub config is not aware of
-     * changes. Then the sub sub config shouldn't be either.
-     */
-    @Test
-    public void testParentReloadSubSubnodeNoChangeSupport()
-            throws ConfigurationException
-    {
-        setUpLiveUpdateTest(false);
-        SubnodeConfiguration sub = config.configurationAt("fields", true);
-        assertNull("Sub sub config is attached to parent", sub.getSubnodeKey());
-        assertEquals("Changed field name returned", TABLE_FIELDS[1][0], sub
-                .getString("field(0).name"));
-    }
-
-    /**
-     * Prepares a test for updates of a SubnodeConfiguration if the node
-     * structure of the parent changes. This method replaces the nodes for the
-     * tables with new ones.
-     *
-     * @param supportReload a flag whether the SubnodeConfiguration should
-     *        support reload operations
-     * @return the parent configuration that can be used for testing
-     */
-    private HierarchicalConfiguration setUpLiveUpdateTest(boolean supportReload)
-    {
-        config = parent.configurationAt(SUB_KEY, supportReload);
-        updateParent();
-        return parent;
-    }
-
-    /**
-     * Updates the parent configuration. Replaces the node structure so that
-     * an attached SubnodeConfiguration should be removed now.
-     */
-    private void updateParent()
-    {
-        String[] tableNamesNew = TABLE_NAMES.clone();
-        String[][] fieldNamesNew = new String[TABLE_FIELDS.length][];
-        for(int i = 0; i < TABLE_FIELDS.length; i++)
-        {
-            fieldNamesNew[i] = TABLE_FIELDS[i].clone();
-        }
-        tableNamesNew[1] = NEW_TABLE_NAME;
-        fieldNamesNew[1][0] = "newField";
-        addTableData(parent, tableNamesNew, fieldNamesNew);
-        String keyClear = "tables.table(0)";
-        parent.clearTree(keyClear);
-        parent.clearTree(keyClear);
+        assertEquals("Local lookup was not inherited", "(x)",
+                config.getString("var", ""));
     }
 
     /**
@@ -505,117 +462,60 @@ public class TestSubnodeConfiguration
     @Test
     public void testParentChangeDetach()
     {
-        final String key = SUB_KEY;
-        config = parent.configurationAt(key, true);
-        assertEquals("Wrong subnode key", key, config.getSubnodeKey());
-        assertEquals("Wrong table name", TABLE_NAMES[1], config
-                .getString("name"));
-        parent.clearTree(key);
-        assertEquals("Wrong table name after change", TABLE_NAMES[1], config
-                .getString("name"));
-        assertNull("Sub config was not detached", config.getSubnodeKey());
+        setUpSubnodeConfig();
+        parent.clear();
+        checkSubConfigContent();
     }
 
     /**
-     * Tests detaching a subnode configuration when an exception is thrown
-     * during reconstruction. This can happen e.g. if the expression engine is
-     * changed for the parent.
+     * Tests detaching a subnode configuration if an exception is thrown during
+     * reconstruction. This can happen e.g. if the expression engine is changed
+     * for the parent.
      */
     @Test
     public void testParentChangeDetatchException()
     {
-        config = parent.configurationAt(SUB_KEY, true);
+        setUpSubnodeConfig();
         parent.setExpressionEngine(new XPathExpressionEngine());
         parent.addProperty("newProp", "value");
-        assertEquals("Wrong name of table", TABLE_NAMES[1], config
-                .getString("name"));
-        assertNull("Sub config was not detached", config.getSubnodeKey());
-    }
-
-    /**
-     * Initializes the parent configuration. This method creates the typical
-     * structure of tables and fields nodes.
-     *
-     * @return the parent configuration
-     */
-    protected BaseHierarchicalConfiguration setUpParentConfig()
-    {
-        BaseHierarchicalConfiguration conf = new BaseHierarchicalConfiguration()
-        {
-            /**
-             * Serial version UID.
-             */
-            private static final long serialVersionUID = 1L;
-
-            // Provide a special implementation of createNode() to check
-            // if it is called by the subnode config
-            @Override
-            protected ConfigurationNode createNode(String name)
-            {
-                nodeCounter++;
-                return super.createNode(name);
-            }
-        };
-        addTableData(conf, TABLE_NAMES, TABLE_FIELDS);
-        return conf;
-    }
-
-    /**
-     * Appends properties for table names and their fields to the given
-     * configuration.
-     *
-     * @param conf the configuration to be filled
-     * @param tableNames an array with the names of the tables to add
-     * @param fields and array with the field names per table
-     */
-    private static void addTableData(Configuration conf, String[] tableNames,
-            String[][] fields)
-    {
-        for (int i = 0; i < tableNames.length; i++)
-        {
-            conf.addProperty("tables.table(-1).name", tableNames[i]);
-            for (int j = 0; j < fields[i].length; j++)
-            {
-                conf.addProperty("tables.table.fields.field(-1).name",
-                        fields[i][j]);
-            }
-        }
+        checkSubConfigContent();
     }
 
     /**
-     * Returns the root node for the subnode config. This method returns the
-     * first table node.
-     *
-     * @param conf the parent config
-     * @return the root node for the subnode config
+     * Tests whether a clone of a sub configuration can be created.
      */
-    protected ConfigurationNode getSubnodeRoot(HierarchicalConfiguration conf)
+    @Test
+    public void testClone()
     {
-        ConfigurationNode root = conf.getRootNode();
-        return root.getChild(0).getChild(0);
-    }
+        setUpSubnodeConfig();
+        SubnodeConfiguration copy = (SubnodeConfiguration) config.clone();
+        assertNotSame("Same model", config.getModel(), copy.getModel());
+        TrackedNodeModel subModel = (TrackedNodeModel) copy.getModel();
+        assertEquals("Wrong selector", SELECTOR, subModel.getSelector());
+        InMemoryNodeModel parentModel = (InMemoryNodeModel) parent.getModel();
+        assertEquals("Wrong parent model", parentModel,
+                subModel.getParentModel());
 
-    /**
-     * Performs a standard initialization of the subnode config to test.
-     */
-    protected void setUpSubnodeConfig()
-    {
-        config = new SubnodeConfiguration(parent, getSubnodeRoot(parent), null);
+        // Check whether the track count was increased
+        parentModel.untrackNode(SELECTOR);
+        parentModel.untrackNode(SELECTOR);
+        assertTrue("Wrong finalize flag",
+                subModel.isReleaseTrackedNodeOnFinalize());
     }
 
     /**
-     * A specialized configuration listener for testing whether the expected
-     * events are fired.
+     * Tests whether the configuration can be closed.
      */
-    private static class ConfigurationListenerTestImpl implements ConfigurationListener
+    @Test
+    public void testClose()
     {
-        /** Stores the events received.*/
-        final List<ConfigurationEvent> events = new ArrayList<ConfigurationEvent>();
+        TrackedNodeModel model = EasyMock.createMock(TrackedNodeModel.class);
+        EasyMock.expect(model.getSelector()).andReturn(SELECTOR).anyTimes();
+        model.close();
+        EasyMock.replay(model);
 
-        @Override
-        public void configurationChanged(ConfigurationEvent event)
-        {
-            events.add(event);
-        }
+        SubnodeConfiguration config = new SubnodeConfiguration(parent, model);
+        config.close();
+        EasyMock.verify(model);
     }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestXMLConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestXMLConfiguration.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestXMLConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestXMLConfiguration.java Sun Apr 20 19:32:08 2014
@@ -17,13 +17,19 @@
 
 package org.apache.commons.configuration;
 
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.TransformerFactoryConfigurationError;
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
@@ -36,21 +42,16 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-
 import org.apache.commons.configuration.SynchronizerTestImpl.Methods;
 import org.apache.commons.configuration.builder.FileBasedBuilderParametersImpl;
 import org.apache.commons.configuration.builder.FileBasedConfigurationBuilder;
 import org.apache.commons.configuration.convert.DefaultListDelimiterHandler;
 import org.apache.commons.configuration.convert.DisabledListDelimiterHandler;
 import org.apache.commons.configuration.ex.ConfigurationException;
-import org.apache.commons.configuration.ex.ConfigurationRuntimeException;
 import org.apache.commons.configuration.io.FileHandler;
 import org.apache.commons.configuration.resolver.CatalogResolver;
-import org.apache.commons.configuration.tree.ConfigurationNode;
-import org.apache.commons.configuration.tree.DefaultConfigurationNode;
+import org.apache.commons.configuration.tree.ImmutableNode;
+import org.apache.commons.configuration.tree.NodeStructureHelper;
 import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
 import org.junit.Before;
 import org.junit.Test;
@@ -300,7 +301,7 @@ public class TestXMLConfiguration
     }
 
     @Test
-    public void testClearAttributenonExisting()
+    public void testClearAttributeNonExisting()
     {
         String key = "clear[@id]";
         conf.clearProperty(key);
@@ -343,20 +344,22 @@ public class TestXMLConfiguration
         conf.setProperty("foo[@bar]", "value");
         assertEquals("foo[@bar]", "value", conf.getProperty("foo[@bar]"));
 
-        conf.setProperty("name1","value1");
-        assertEquals("value1",conf.getProperty("name1"));
+        conf.setProperty("name1", "value1");
+        assertEquals("value1", conf.getProperty("name1"));
     }
 
+    /**
+     * Tests whether an attribute value can be overridden.
+     */
     @Test
-    public void testAddAttribute()
+    public void testOverrideAttribute()
     {
         conf.addProperty("element3[@name]", "bar");
 
         List<Object> list = conf.getList("element3[@name]");
         assertNotNull("null list", list);
-        assertTrue("'foo' element missing", list.contains("foo"));
         assertTrue("'bar' element missing", list.contains("bar"));
-        assertEquals("list size", 2, list.size());
+        assertEquals("list size", 1, list.size());
     }
 
     @Test
@@ -387,17 +390,6 @@ public class TestXMLConfiguration
                 .getString("[@test]"));
     }
 
-    /**
-     * Tests whether the configuration's root node is initialized with a
-     * reference to the corresponding XML element.
-     */
-    @Test
-    public void testGetRootReference()
-    {
-        assertNotNull("Root node has no reference", conf.getRootNode()
-                .getReference());
-    }
-
     @Test
     public void testAddList()
     {
@@ -932,8 +924,8 @@ public class TestXMLConfiguration
 
         StringWriter out = new StringWriter();
         handler.save(out);
-        assertTrue("Encoding was not written to file", out.toString().indexOf(
-                "encoding=\"" + ENCODING + "\"") >= 0);
+        assertThat("Encoding was not written to file", out.toString(),
+                containsString("encoding=\"" + ENCODING + "\""));
     }
 
     /**
@@ -950,8 +942,8 @@ public class TestXMLConfiguration
 
         StringWriter out = new StringWriter();
         handler.save(out);
-        assertTrue("Encoding was written to file", out.toString().indexOf(
-                "encoding=\"UTF-") >= 0);
+        assertThat("Encoding was written to file", out.toString(),
+                containsString("encoding=\"UTF-"));
     }
 
     /**
@@ -967,7 +959,8 @@ public class TestXMLConfiguration
         assertEquals("Wrong system ID", SYSTEM_ID, conf.getSystemID());
         StringWriter out = new StringWriter();
         new FileHandler(conf).save(out);
-        assertTrue("Did not find DOCTYPE", out.toString().indexOf(DOCTYPE) >= 0);
+        assertThat("Did not find DOCTYPE", out.toString(),
+                containsString(DOCTYPE));
     }
 
     /**
@@ -983,25 +976,24 @@ public class TestXMLConfiguration
         conf.setSystemID(SYSTEM_ID);
         StringWriter out = new StringWriter();
         new FileHandler(conf).save(out);
-        assertTrue("Did not find DOCTYPE", out.toString().indexOf(
-                DOCTYPE + "testconfig" + DOCTYPE_DECL) >= 0);
+        assertThat("Did not find DOCTYPE", out.toString(), containsString(
+                DOCTYPE + "testconfig" + DOCTYPE_DECL));
     }
 
     /**
-     * Tests saving a configuration when an invalid transformer factory is
-     * specified. In this case the error thrown by the TransformerFactory class
-     * should be caught and re-thrown as a ConfigurationException.
+     * Tests saving a configuration if an invalid transformer factory is
+     * specified. In this case an error is thrown by the transformer factory.
+     * XMLConfiguration should not catch this error.
      */
     @Test
-    public void testSaveWithInvalidTransformerFactory()
-    {
+    public void testSaveWithInvalidTransformerFactory() throws ConfigurationException {
         System.setProperty(PROP_FACTORY, "an.invalid.Class");
         try
         {
             saveTestConfig();
             fail("Could save with invalid TransformerFactory!");
         }
-        catch (ConfigurationException cex)
+        catch (TransformerFactoryConfigurationError cex)
         {
             // ok
         }
@@ -1034,11 +1026,6 @@ public class TestXMLConfiguration
         copy.setListDelimiterHandler(new DefaultListDelimiterHandler(','));
         assertEquals("value", copy.getProperty("element"));
         assertNull("Document was copied, too", copy.getDocument());
-        ConfigurationNode root = copy.getRootNode();
-        for (ConfigurationNode node : root.getChildren())
-        {
-            assertNull("Reference was not cleared", node.getReference());
-        }
 
         new FileHandler(copy).save(testSaveConf);
         checkSavedConfig();
@@ -1146,7 +1133,7 @@ public class TestXMLConfiguration
         builder.getFileHandler().setFile(testSaveConf);
         builder.setAutoSave(true);
         final String newValue = "I am autosaved";
-        Configuration sub = conf.configurationAt("element2.subelement");
+        Configuration sub = conf.configurationAt("element2.subelement", true);
         sub.setProperty("subsubelement", newValue);
         assertEquals("Change not visible to parent", newValue,
                 conf.getString("element2.subelement.subsubelement"));
@@ -1172,8 +1159,8 @@ public class TestXMLConfiguration
         builder.getFileHandler().setFile(testSaveConf);
         builder.setAutoSave(true);
         final String newValue = "I am autosaved";
-        SubnodeConfiguration sub1 = conf.configurationAt("element2");
-        SubnodeConfiguration sub2 = sub1.configurationAt("subelement");
+        HierarchicalConfiguration<?> sub1 = conf.configurationAt("element2", true);
+        HierarchicalConfiguration<?> sub2 = sub1.configurationAt("subelement", true);
         sub2.setProperty("subsubelement", newValue);
         assertEquals("Change not visible to parent", newValue, conf
                 .getString("element2.subelement.subsubelement"));
@@ -1230,15 +1217,19 @@ public class TestXMLConfiguration
     }
 
     /**
-     * Tries to create an attribute with multiple values.
+     * Tries to create an attribute with multiple values. Only the first value
+     * is taken into account.
      */
-    @Test(expected = ConfigurationRuntimeException.class)
+    @Test
     public void testAttributeKeyWithMultipleValues()
             throws ConfigurationException
     {
         conf.addProperty("errorTest[@multiAttr]", Arrays.asList("v1", "v2"));
-        StringWriter out = new StringWriter();
-        new FileHandler(conf).save(out);
+        saveTestConfig();
+        XMLConfiguration checkConfig = new XMLConfiguration();
+        load(checkConfig, testSaveConf.getAbsolutePath());
+        assertEquals("Wrong attribute value", "v1",
+                checkConfig.getString("errorTest[@multiAttr]"));
     }
 
     /**
@@ -1268,9 +1259,9 @@ public class TestXMLConfiguration
         conf = builder.getConfiguration();
         builder.getFileHandler().setFile(testSaveConf);
         builder.setAutoSave(true);
-        ConfigurationNode node = new DefaultConfigurationNode(
+        ImmutableNode node = NodeStructureHelper.createNode(
                 "addNodesTest", Boolean.TRUE);
-        Collection<ConfigurationNode> nodes = new ArrayList<ConfigurationNode>(1);
+        Collection<ImmutableNode> nodes = new ArrayList<ImmutableNode>(1);
         nodes.add(node);
         conf.addNodes("test.autosave", nodes);
         XMLConfiguration c2 = new XMLConfiguration();
@@ -1286,16 +1277,12 @@ public class TestXMLConfiguration
     @Test
     public void testAddNodesAndSave() throws ConfigurationException
     {
-        ConfigurationNode node = new DefaultConfigurationNode("test");
-        ConfigurationNode child = new DefaultConfigurationNode("child");
-        node.addChild(child);
-        ConfigurationNode attr = new DefaultConfigurationNode("attr");
-        node.addAttribute(attr);
-        ConfigurationNode node2 = conf.createNode("test2");
-        Collection<ConfigurationNode> nodes = new ArrayList<ConfigurationNode>(2);
-        nodes.add(node);
-        nodes.add(node2);
-        conf.addNodes("add.nodes", nodes);
+        ImmutableNode.Builder bldrNode = new ImmutableNode.Builder(1);
+        bldrNode.addChild(NodeStructureHelper.createNode("child", null));
+        bldrNode.addAttribute("attr", "");
+        ImmutableNode node2 = NodeStructureHelper.createNode("test2", null);
+        conf.addNodes("add.nodes",
+                Arrays.asList(bldrNode.name("test").create(), node2));
         saveTestConfig();
         conf.setProperty("add.nodes.test", "true");
         conf.setProperty("add.nodes.test.child", "yes");
@@ -1350,7 +1337,8 @@ public class TestXMLConfiguration
     public void testSaveAfterCreateWithCopyConstructor()
             throws ConfigurationException
     {
-        HierarchicalConfiguration hc = conf.configurationAt("element2");
+        HierarchicalConfiguration<ImmutableNode> hc =
+                conf.configurationAt("element2");
         conf = new XMLConfiguration(hc);
         saveTestConfig();
         XMLConfiguration checkConfig = checkSavedConfig();
@@ -1401,25 +1389,15 @@ public class TestXMLConfiguration
     }
 
     /**
-     * Tests adding an attribute node using the addNodes() method.
+     * Tests the copy constructor for null input.
      */
     @Test
-    public void testAddNodesAttributeNode()
+    public void testCopyNull()
     {
-        conf.addProperty("testAddNodes.property[@name]", "prop1");
-        conf.addProperty("testAddNodes.property(0).value", "value1");
-        conf.addProperty("testAddNodes.property(-1)[@name]", "prop2");
-        conf.addProperty("testAddNodes.property(1).value", "value2");
-        Collection<ConfigurationNode> nodes = new ArrayList<ConfigurationNode>();
-        nodes.add(new DefaultConfigurationNode("property"));
-        conf.addNodes("testAddNodes", nodes);
-        nodes.clear();
-        ConfigurationNode nd = new DefaultConfigurationNode("name", "prop3");
-        nd.setAttribute(true);
-        nodes.add(nd);
-        conf.addNodes("testAddNodes.property(2)", nodes);
-        assertEquals("Attribute not added", "prop3", conf
-                .getString("testAddNodes.property(2)[@name]"));
+        conf = new XMLConfiguration(null);
+        assertTrue("Not empty", conf.isEmpty());
+        assertEquals("Wrong root element name", "configuration",
+                conf.getRootElementName());
     }
 
     /**
@@ -1558,8 +1536,8 @@ public class TestXMLConfiguration
         StringWriter writer = new StringWriter();
         new FileHandler(conf).save(writer);
         String content = writer.toString();
-        assertTrue("Path not found: " + content,
-                content.indexOf("<path>C:\\Temp</path>") >= 0);
+        assertThat("Path not found: ", content,
+                containsString("<path>C:\\Temp</path>"));
         saveTestConfig();
         XMLConfiguration conf2 = new XMLConfiguration();
         load(conf2, testSaveConf.getAbsolutePath());
@@ -1593,13 +1571,11 @@ public class TestXMLConfiguration
     @Test
     public void testAddNodesToSubnodeConfiguration() throws Exception
     {
-        SubnodeConfiguration sub = conf.configurationAt("element2");
+        HierarchicalConfiguration<ImmutableNode> sub =
+                conf.configurationAt("element2", true);
         sub.addProperty("newKey", "newvalue");
-        ConfigurationNode root = conf.getRootNode();
-        ConfigurationNode elem = root.getChildren("element2").get(0);
-        ConfigurationNode newNode = elem.getChildren("newKey").get(0);
-        assertTrue("Wrong node type: " + newNode,
-                newNode instanceof XMLConfiguration.XMLNode);
+        assertEquals("Property not added", "newvalue",
+                conf.getString("element2.newKey"));
     }
 
     /**
@@ -1666,18 +1642,6 @@ public class TestXMLConfiguration
     }
 
     /**
-     * Tests whether access to the document is synchronized.
-     */
-    @Test
-    public void testGetDocumentSynchronized()
-    {
-        SynchronizerTestImpl sync = new SynchronizerTestImpl();
-        conf.setSynchronizer(sync);
-        assertNotNull("No document", conf.getDocument());
-        sync.verify(Methods.BEGIN_READ, Methods.END_READ);
-    }
-
-    /**
      * Removes the test output file if it exists.
      */
     private void removeTestFile()

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/beanutils/TestXMLBeanDeclaration.java Sun Apr 20 19:32:08 2014
@@ -28,8 +28,7 @@ import java.util.Map;
 
 import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.commons.configuration.SubnodeConfiguration;
-import org.apache.commons.configuration.tree.ConfigurationNode;
+import org.apache.commons.configuration.ex.ConfigurationRuntimeException;
 import org.junit.Test;
 
 /**
@@ -92,24 +91,13 @@ public class TestXMLBeanDeclaration
     private static final String VARS = "variables.";
 
     /**
-     * Tests creating a declaration from a null node. This should cause an
-     * exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testInitFromNullNode()
-    {
-        new XMLBeanDeclaration(new BaseHierarchicalConfiguration().configurationAt(null),
-                (ConfigurationNode) null);
-    }
-
-    /**
      * Tests creating a declaration from a null configuration. This should cause
      * an exception.
      */
     @Test(expected = IllegalArgumentException.class)
     public void testInitFromNullConfiguration()
     {
-        new XMLBeanDeclaration((HierarchicalConfiguration) null);
+        new XMLBeanDeclaration(null);
     }
 
     /**
@@ -123,17 +111,6 @@ public class TestXMLBeanDeclaration
     }
 
     /**
-     * Tests creating a declaration from a null configuration with a node. This
-     * should cause an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testInitFromNullConfigurationAndNode()
-    {
-        new XMLBeanDeclaration(null, new BaseHierarchicalConfiguration()
-                .getRootNode());
-    }
-
-    /**
      * Tests fetching the bean's class name.
      */
     @Test
@@ -157,6 +134,18 @@ public class TestXMLBeanDeclaration
     }
 
     /**
+     * Tests that a missing bean class name does not cause an exception.
+     */
+    @Test
+    public void testGetBeanClassNameUndefinedWithEx()
+    {
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        config.setThrowExceptionOnMissing(true);
+        XMLBeanDeclaration decl = new XMLBeanDeclaration(config);
+        assertNull("Got a bean class name", decl.getBeanClassName());
+    }
+
+    /**
      * Tests whether a default bean class name is taken into account.
      */
     @Test
@@ -212,6 +201,18 @@ public class TestXMLBeanDeclaration
     }
 
     /**
+     * Tests that a missing bean factory name does not throw an exception.
+     */
+    @Test
+    public void testGetBeanFactoryNameUndefinedWithEx()
+    {
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        config.setThrowExceptionOnMissing(true);
+        XMLBeanDeclaration decl = new XMLBeanDeclaration(config);
+        assertNull("Got a factory name", decl.getBeanFactoryName());
+    }
+
+    /**
      * Tests fetching the parameter for the bean factory.
      */
     @Test
@@ -237,6 +238,18 @@ public class TestXMLBeanDeclaration
     }
 
     /**
+     * Tests that an undefined bean factory parameter does not cause an exception.
+     */
+    @Test
+    public void testGetBeanFactoryParameterUndefinedWithEx()
+    {
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        config.setThrowExceptionOnMissing(true);
+        XMLBeanDeclaration decl = new XMLBeanDeclaration(config);
+        assertNull("Got a factory parameter", decl.getBeanFactoryParameter());
+    }
+
+    /**
      * Tests if the bean's properties are correctly extracted from the
      * configuration object.
      */
@@ -278,9 +291,10 @@ public class TestXMLBeanDeclaration
     /**
      * Creates a configuration with data for testing nested bean declarations
      * including constructor arguments.
+     *
      * @return the initialized test configuration
      */
-    private HierarchicalConfiguration prepareNestedBeanDeclarations()
+    private static BaseHierarchicalConfiguration prepareNestedBeanDeclarations()
     {
         BaseHierarchicalConfiguration config =
                 new BaseHierarchicalConfiguration();
@@ -308,7 +322,7 @@ public class TestXMLBeanDeclaration
     @Test
     public void testGetNestedBeanDeclarations()
     {
-        HierarchicalConfiguration config = prepareNestedBeanDeclarations();
+        BaseHierarchicalConfiguration config = prepareNestedBeanDeclarations();
         XMLBeanDeclaration decl = new XMLBeanDeclaration(config, KEY);
         checkProperties(decl, TEST_PROPS, TEST_VALUES);
 
@@ -333,15 +347,14 @@ public class TestXMLBeanDeclaration
     @Test
     public void testGetNestedBeanDeclarationsFactoryMethod()
     {
-        HierarchicalConfiguration config = prepareNestedBeanDeclarations();
+        BaseHierarchicalConfiguration config = prepareNestedBeanDeclarations();
         XMLBeanDeclaration decl = new XMLBeanDeclaration(config, KEY)
         {
             @Override
-            protected BeanDeclaration createBeanDeclaration(
-                    ConfigurationNode node)
+            BeanDeclaration createBeanDeclaration(NodeData<?> node)
             {
                 return new XMLBeanDeclarationTestImpl(getConfiguration()
-                        .configurationAt(node.getName()), node);
+                        .configurationAt(node.nodeName()), node);
             }
         };
         Map<String, Object> nested = decl.getNestedBeanDeclarations();
@@ -388,7 +401,7 @@ public class TestXMLBeanDeclaration
      * Tests constructing a bean declaration from an undefined key. This should
      * cause an exception.
      */
-    @Test(expected = IllegalArgumentException.class)
+    @Test(expected = ConfigurationRuntimeException.class)
     public void testInitFromUndefinedKey()
     {
         BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
@@ -415,7 +428,7 @@ public class TestXMLBeanDeclaration
      * Tests constructing a bean declaration from a key with multiple values.
      * This should cause an exception because keys must be unique.
      */
-    @Test(expected = IllegalArgumentException.class)
+    @Test(expected = ConfigurationRuntimeException.class)
     public void testInitFromMultiValueKey()
     {
         BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
@@ -430,7 +443,7 @@ public class TestXMLBeanDeclaration
     @Test
     public void testGetConstructorArgs()
     {
-        HierarchicalConfiguration config = prepareNestedBeanDeclarations();
+        BaseHierarchicalConfiguration config = prepareNestedBeanDeclarations();
         XMLBeanDeclaration decl = new XMLBeanDeclaration(config, KEY);
         Collection<ConstructorArg> args = decl.getConstructorArgs();
         assertEquals("Wrong number of constructor arguments", 2, args.size());
@@ -454,7 +467,7 @@ public class TestXMLBeanDeclaration
     @Test
     public void testGetConstructorArgsNullArg()
     {
-        HierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
         setupBeanDeclaration(config, KEY, TEST_PROPS, TEST_VALUES);
         config.addProperty(KEY + ".config-constrarg", "");
         XMLBeanDeclaration decl = new XMLBeanDeclaration(config, KEY);
@@ -471,7 +484,7 @@ public class TestXMLBeanDeclaration
     @Test
     public void testGetInterpolatedConstructorArgs()
     {
-        HierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
         String expectedValue = "ctorArg";
         config.addProperty("value", expectedValue);
         setupBeanDeclaration(config, KEY, TEST_PROPS, TEST_VALUES);
@@ -488,7 +501,7 @@ public class TestXMLBeanDeclaration
     @Test
     public void testInterpolateNoInterpolator()
     {
-        HierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
         config.addProperty("value", "expectedValue");
         setupBeanDeclaration(config, KEY, TEST_PROPS, TEST_VALUES);
         String value = "${value}";
@@ -509,7 +522,7 @@ public class TestXMLBeanDeclaration
      * @param names an array with the names of the properties
      * @param values an array with the corresponding values
      */
-    private void setupBeanDeclaration(HierarchicalConfiguration config,
+    private static void setupBeanDeclaration(HierarchicalConfiguration config,
             String key, String[] names, String[] values)
     {
         for (int i = 0; i < names.length; i++)
@@ -525,7 +538,7 @@ public class TestXMLBeanDeclaration
      * @param names an array with the expected property names
      * @param values an array with the expected property values
      */
-    private void checkProperties(BeanDeclaration beanDecl, String[] names,
+    private static void checkProperties(BeanDeclaration beanDecl, String[] names,
             String[] values)
     {
         Map<String, Object> props = beanDecl.getBeanProperties();
@@ -545,8 +558,8 @@ public class TestXMLBeanDeclaration
      */
     private static class XMLBeanDeclarationTestImpl extends XMLBeanDeclaration
     {
-        public XMLBeanDeclarationTestImpl(SubnodeConfiguration config,
-                ConfigurationNode node)
+        public XMLBeanDeclarationTestImpl(HierarchicalConfiguration<?> config,
+                NodeData<?> node)
         {
             super(config, node);
         }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilder.java Sun Apr 20 19:32:08 2014
@@ -44,7 +44,6 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.DynamicCombinedConfiguration;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.PropertiesConfiguration;
-import org.apache.commons.configuration.SubnodeConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.configuration.XMLPropertiesConfiguration;
 import org.apache.commons.configuration.builder.BasicConfigurationBuilder;
@@ -74,6 +73,7 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.reloading.ReloadingController;
 import org.apache.commons.configuration.reloading.ReloadingControllerSupport;
 import org.apache.commons.configuration.resolver.CatalogResolver;
+import org.apache.commons.configuration.tree.ImmutableNode;
 import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine;
 import org.easymock.EasyMock;
 import org.junit.After;
@@ -133,8 +133,8 @@ public class TestCombinedConfigurationBu
      * @param defConfig the definition configuration
      * @return the definition builder
      */
-    protected static BasicConfigurationBuilder<? extends HierarchicalConfiguration> createDefinitionBuilder(
-            HierarchicalConfiguration defConfig)
+    protected static BasicConfigurationBuilder<? extends BaseHierarchicalConfiguration> createDefinitionBuilder(
+            BaseHierarchicalConfiguration defConfig)
     {
         return new ConstantConfigurationBuilder(defConfig);
     }
@@ -148,10 +148,10 @@ public class TestCombinedConfigurationBu
      * @param attrs the attributes of this tag
      * @return the definition configuration
      */
-    protected static HierarchicalConfiguration createDefinitionConfig(String tag,
+    protected static BaseHierarchicalConfiguration createDefinitionConfig(String tag,
             Map<String, Object> attrs)
     {
-        HierarchicalConfiguration defConfig =
+        BaseHierarchicalConfiguration defConfig =
                 new BaseHierarchicalConfiguration();
         String prefix = "override." + tag;
         for (Map.Entry<String, Object> e : attrs.entrySet())
@@ -332,9 +332,9 @@ public class TestCombinedConfigurationBu
         attrs.put("config-name", name);
         attrs.put("config-optional", Boolean.TRUE);
         attrs.put("config-forceCreate", Boolean.TRUE);
-        HierarchicalConfiguration defConfig =
+        BaseHierarchicalConfiguration defConfig =
                 createDefinitionConfig("xml", attrs);
-        BasicConfigurationBuilder<? extends HierarchicalConfiguration> defBuilder =
+        BasicConfigurationBuilder<? extends BaseHierarchicalConfiguration> defBuilder =
                 createDefinitionBuilder(defConfig);
         builder.configure(new CombinedBuilderParametersImpl()
                 .setDefinitionBuilder(defBuilder));
@@ -439,14 +439,14 @@ public class TestCombinedConfigurationBu
      * @param attrs the map with attributes
      * @return the definition builder
      */
-    private BasicConfigurationBuilder<? extends HierarchicalConfiguration> prepareSubBuilderTest(
+    private BasicConfigurationBuilder<? extends HierarchicalConfiguration<ImmutableNode>> prepareSubBuilderTest(
             Map<String, Object> attrs)
     {
         attrs.put("fileName", TEST_SUB_XML);
         attrs.put("config-name", BUILDER_NAME);
-        HierarchicalConfiguration defConfig =
+        BaseHierarchicalConfiguration defConfig =
                 createDefinitionConfig("xml", attrs);
-        BasicConfigurationBuilder<? extends HierarchicalConfiguration> defBuilder =
+        BasicConfigurationBuilder<? extends HierarchicalConfiguration<ImmutableNode>> defBuilder =
                 createDefinitionBuilder(defConfig);
         builder.configure(new CombinedBuilderParametersImpl()
                 .setDefinitionBuilder(defBuilder));
@@ -461,7 +461,7 @@ public class TestCombinedConfigurationBu
     public void testResetBuilder() throws ConfigurationException
     {
         Map<String, Object> attrs = new HashMap<String, Object>();
-        BasicConfigurationBuilder<? extends HierarchicalConfiguration> defBuilder =
+        BasicConfigurationBuilder<? extends HierarchicalConfiguration<ImmutableNode>> defBuilder =
                 prepareSubBuilderTest(attrs);
         CombinedConfiguration cc = builder.getConfiguration();
         ConfigurationBuilder<? extends Configuration> subBuilder =
@@ -616,7 +616,7 @@ public class TestCombinedConfigurationBu
     public void testCustomBuilderProvider() throws ConfigurationException
     {
         String tagName = "myTestTag";
-        final HierarchicalConfiguration dataConf =
+        final BaseHierarchicalConfiguration dataConf =
                 new BaseHierarchicalConfiguration();
         dataConf.addProperty(tagName, Boolean.TRUE);
         Map<String, Object> attrs = new HashMap<String, Object>();
@@ -757,7 +757,7 @@ public class TestCombinedConfigurationBu
     public void testConfigureEntityResolverWithProperties()
             throws ConfigurationException
     {
-        HierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        HierarchicalConfiguration<ImmutableNode> config = new BaseHierarchicalConfiguration();
         config.addProperty("header.entity-resolver[@config-class]",
                 EntityResolverWithPropertiesTestImpl.class.getName());
         XMLBuilderParametersImpl xmlParams = new XMLBuilderParametersImpl();
@@ -784,6 +784,7 @@ public class TestCombinedConfigurationBu
     {
         builder.configure(createParameters().setFile(fsFile));
         builder.getConfiguration();
+        @SuppressWarnings("unchecked") // this is the minimum bound for type arguments
         FileBasedConfigurationBuilder<? extends Configuration> xmlBuilder =
                 (FileBasedConfigurationBuilder<? extends Configuration>) builder
                         .getNamedBuilder("xml");
@@ -866,7 +867,7 @@ public class TestCombinedConfigurationBu
     public void testBasePathForChildConfigurations()
             throws ConfigurationException
     {
-        HierarchicalConfiguration defConfig =
+        BaseHierarchicalConfiguration defConfig =
                 new BaseHierarchicalConfiguration();
         defConfig.addProperty("properties[@fileName]", "test.properties");
         File deepDir = new File(ConfigurationAssert.TEST_DIR, "config/deep");
@@ -908,7 +909,7 @@ public class TestCombinedConfigurationBu
     public void testConfigurationBuilderProvider()
             throws ConfigurationException
     {
-        HierarchicalConfiguration defConfig =
+        BaseHierarchicalConfiguration defConfig =
                 new BaseHierarchicalConfiguration();
         defConfig.addProperty("override.configuration[@fileName]",
                 TEST_FILE.getAbsolutePath());
@@ -1096,7 +1097,7 @@ public class TestCombinedConfigurationBu
                 (XMLConfiguration) combConfig.getConfiguration("test");
         assertEquals("Wrong value from XML config", "abc-product",
                 xmlConfig.getString("products/product/desc"));
-        SubnodeConfiguration subConfig =
+        HierarchicalConfiguration<ImmutableNode> subConfig =
                 xmlConfig
                         .configurationAt("products/product[@name='abc']", true);
         assertEquals("Wrong value from sub config", "abc-product",
@@ -1161,8 +1162,8 @@ public class TestCombinedConfigurationBu
     {
         CombinedConfiguration config = createMultiFileConfig("testCCMultiTenent.xml");
         switchToMultiFile("1001");
-        HierarchicalConfiguration multiConf =
-                (HierarchicalConfiguration) config
+        HierarchicalConfiguration<?> multiConf =
+                (HierarchicalConfiguration<?>) config
                         .getConfiguration("clientConfig");
         assertTrue(
                 "Expression engine not configured",
@@ -1327,7 +1328,7 @@ public class TestCombinedConfigurationBu
         public ConfigurationBuilder<? extends Configuration> getConfigurationBuilder(
                 ConfigurationDeclaration decl) throws ConfigurationException
         {
-            HierarchicalConfiguration config =
+            BaseHierarchicalConfiguration config =
                     new BaseHierarchicalConfiguration();
             config.addProperty(getPropertyKey(), Boolean.TRUE);
             return new ConstantConfigurationBuilder(config);
@@ -1338,18 +1339,18 @@ public class TestCombinedConfigurationBu
      * A test builder class which always returns the same configuration.
      */
     private static class ConstantConfigurationBuilder extends
-            BasicConfigurationBuilder<HierarchicalConfiguration>
+            BasicConfigurationBuilder<BaseHierarchicalConfiguration>
     {
-        private final HierarchicalConfiguration configuration;
+        private final BaseHierarchicalConfiguration configuration;
 
-        public ConstantConfigurationBuilder(HierarchicalConfiguration conf)
+        public ConstantConfigurationBuilder(BaseHierarchicalConfiguration conf)
         {
-            super(HierarchicalConfiguration.class);
+            super(BaseHierarchicalConfiguration.class);
             configuration = conf;
         }
 
         @Override
-        public HierarchicalConfiguration getConfiguration()
+        public BaseHierarchicalConfiguration getConfiguration()
                 throws ConfigurationException
         {
             return configuration;

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilderVFS.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilderVFS.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilderVFS.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestCombinedConfigurationBuilderVFS.java Sun Apr 20 19:32:08 2014
@@ -22,6 +22,7 @@ import java.io.File;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationAssert;
 import org.apache.commons.configuration.HierarchicalConfiguration;
@@ -29,6 +30,7 @@ import org.apache.commons.configuration.
 import org.apache.commons.configuration.builder.fluent.FileBasedBuilderParameters;
 import org.apache.commons.configuration.ex.ConfigurationException;
 import org.apache.commons.configuration.io.VFSFileSystem;
+import org.apache.commons.configuration.tree.ImmutableNode;
 import org.junit.Test;
 
 /**
@@ -60,11 +62,11 @@ public class TestCombinedConfigurationBu
         File deepDir = new File(ConfigurationAssert.TEST_DIR, "config/deep");
         Map<String, Object> params = new HashMap<String, Object>();
         params.put("fileName", "test.properties");
-        HierarchicalConfiguration defConfig =
+        BaseHierarchicalConfiguration defConfig =
                 createDefinitionConfig("properties", params);
         defConfig.addProperty("override.properties.fileSystem[@config-class]",
                 VFSFileSystem.class.getName());
-        BasicConfigurationBuilder<? extends HierarchicalConfiguration> defBuilder =
+        BasicConfigurationBuilder<? extends HierarchicalConfiguration<ImmutableNode>> defBuilder =
                 createDefinitionBuilder(defConfig);
         builder.configure(new CombinedBuilderParametersImpl()
                 .setDefinitionBuilder(defBuilder).setBasePath(

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestConfigurationDeclaration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestConfigurationDeclaration.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestConfigurationDeclaration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestConfigurationDeclaration.java Sun Apr 20 19:32:08 2014
@@ -24,7 +24,6 @@ import static org.junit.Assert.assertTru
 import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.ex.ConfigurationRuntimeException;
-import org.apache.commons.configuration.tree.DefaultConfigurationNode;
 import org.junit.Test;
 
 /**
@@ -42,9 +41,9 @@ public class TestConfigurationDeclaratio
      * @return the test object
      */
     private static ConfigurationDeclaration createDeclaration(
-            HierarchicalConfiguration conf)
+            HierarchicalConfiguration<?> conf)
     {
-        HierarchicalConfiguration config =
+        HierarchicalConfiguration<?> config =
                 (conf != null) ? conf : new BaseHierarchicalConfiguration();
         return new ConfigurationDeclaration(null, config);
     }
@@ -56,23 +55,11 @@ public class TestConfigurationDeclaratio
     public void testConfigurationDeclarationIsReserved()
     {
         ConfigurationDeclaration decl = createDeclaration(null);
-        DefaultConfigurationNode parent = new DefaultConfigurationNode();
-        DefaultConfigurationNode nd = new DefaultConfigurationNode("at");
-        parent.addAttribute(nd);
-        assertTrue("Attribute at not recognized", decl.isReservedNode(nd));
-        nd = new DefaultConfigurationNode("optional");
-        parent.addAttribute(nd);
-        assertTrue("Attribute optional not recognized", decl.isReservedNode(nd));
-        nd = new DefaultConfigurationNode("config-class");
-        parent.addAttribute(nd);
+        assertTrue("Attribute at not recognized", decl.isReservedAttributeName("at"));
+        assertTrue("Attribute optional not recognized", decl.isReservedAttributeName("optional"));
         assertTrue("Inherited attribute not recognized",
-                decl.isReservedNode(nd));
-        nd = new DefaultConfigurationNode("different");
-        parent.addAttribute(nd);
-        assertFalse("Wrong reserved attribute", decl.isReservedNode(nd));
-        nd = new DefaultConfigurationNode("at");
-        parent.addChild(nd);
-        assertFalse("Node type not evaluated", decl.isReservedNode(nd));
+                decl.isReservedAttributeName("config-class"));
+        assertFalse("Wrong reserved attribute", decl.isReservedAttributeName("different"));
     }
 
     /**
@@ -104,19 +91,17 @@ public class TestConfigurationDeclaratio
      */
     private void checkOldReservedAttribute(String name)
     {
-        ConfigurationDeclaration decl = createDeclaration(null);
-        DefaultConfigurationNode parent = new DefaultConfigurationNode();
-        DefaultConfigurationNode nd =
-                new DefaultConfigurationNode("config-" + name);
-        parent.addAttribute(nd);
-        assertTrue("config-" + name + " attribute not recognized",
-                decl.isReservedNode(nd));
-        DefaultConfigurationNode nd2 = new DefaultConfigurationNode(name);
-        parent.addAttribute(nd2);
+        String prefixName = "config-" + name;
+        BaseHierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        config.addProperty(String.format("[@%s]", prefixName), Boolean.TRUE);
+        ConfigurationDeclaration decl = createDeclaration(config);
+        assertTrue(prefixName + " attribute not recognized",
+                decl.isReservedAttributeName(prefixName));
+        config.addProperty(String.format("[@%s]", name), Boolean.TRUE);
         assertFalse(name + " is reserved though config- exists",
-                decl.isReservedNode(nd2));
+                decl.isReservedAttributeName(name));
         assertTrue("config- attribute not recognized when " + name + " exists",
-                decl.isReservedNode(nd));
+                decl.isReservedAttributeName(prefixName));
     }
 
     /**
@@ -126,26 +111,32 @@ public class TestConfigurationDeclaratio
     @Test
     public void testConfigurationDeclarationGetAttributes()
     {
-        HierarchicalConfiguration config = new BaseHierarchicalConfiguration();
+        HierarchicalConfiguration<?> config = new BaseHierarchicalConfiguration();
         config.addProperty("xml.fileName", "test.xml");
         ConfigurationDeclaration decl =
                 createDeclaration(config.configurationAt("xml"));
         assertNull("Found an at attribute", decl.getAt());
         assertFalse("Found an optional attribute", decl.isOptional());
         config.addProperty("xml[@config-at]", "test1");
+        decl = createDeclaration(config.configurationAt("xml"));
         assertEquals("Wrong value of at attribute", "test1", decl.getAt());
         config.addProperty("xml[@at]", "test2");
+        decl = createDeclaration(config.configurationAt("xml"));
         assertEquals("Wrong value of config-at attribute", "test1",
                 decl.getAt());
         config.clearProperty("xml[@config-at]");
+        decl = createDeclaration(config.configurationAt("xml"));
         assertEquals("Old at attribute not detected", "test2", decl.getAt());
         config.addProperty("xml[@config-optional]", "true");
+        decl = createDeclaration(config.configurationAt("xml"));
         assertTrue("Wrong value of optional attribute", decl.isOptional());
         config.addProperty("xml[@optional]", "false");
+        decl = createDeclaration(config.configurationAt("xml"));
         assertTrue("Wrong value of config-optional attribute",
                 decl.isOptional());
         config.clearProperty("xml[@config-optional]");
         config.setProperty("xml[@optional]", Boolean.TRUE);
+        decl = createDeclaration(config.configurationAt("xml"));
         assertTrue("Old optional attribute not detected", decl.isOptional());
     }
 
@@ -155,11 +146,11 @@ public class TestConfigurationDeclaratio
     @Test(expected = ConfigurationRuntimeException.class)
     public void testConfigurationDeclarationOptionalAttributeInvalid()
     {
-        HierarchicalConfiguration factory = new BaseHierarchicalConfiguration();
+        HierarchicalConfiguration<?> factory = new BaseHierarchicalConfiguration();
         factory.addProperty("xml.fileName", "test.xml");
+        factory.setProperty("xml[@optional]", "invalid value");
         ConfigurationDeclaration decl =
                 createDeclaration(factory.configurationAt("xml"));
-        factory.setProperty("xml[@optional]", "invalid value");
         decl.isOptional();
     }
 }

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestReloadingCombinedConfigurationBuilderFileBased.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestReloadingCombinedConfigurationBuilderFileBased.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestReloadingCombinedConfigurationBuilderFileBased.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/builder/combined/TestReloadingCombinedConfigurationBuilderFileBased.java Sun Apr 20 19:32:08 2014
@@ -28,7 +28,6 @@ import java.text.MessageFormat;
 import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.CombinedConfiguration;
 import org.apache.commons.configuration.Configuration;
-import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.XMLConfiguration;
 import org.apache.commons.configuration.builder.BasicBuilderParameters;
 import org.apache.commons.configuration.builder.BasicBuilderProperties;
@@ -155,9 +154,7 @@ public class TestReloadingCombinedConfig
             throws IOException
     {
         return writeReloadFile(f,
-                MessageFormat.format(RELOAD_CONTENT, new Object[] {
-                        value, tagIdx
-                }));
+                MessageFormat.format(RELOAD_CONTENT, value, tagIdx));
     }
 
     /**
@@ -191,7 +188,7 @@ public class TestReloadingCombinedConfig
                         return new AlwaysReloadingDetector();
                     }
                 };
-        HierarchicalConfiguration defConf = new BaseHierarchicalConfiguration();
+        BaseHierarchicalConfiguration defConf = new BaseHierarchicalConfiguration();
         addReloadSource(defConf, xmlConf1.getAbsolutePath());
         addReloadSource(defConf, xmlConf2.getAbsolutePath());
         builder.configure(parameters
@@ -245,7 +242,7 @@ public class TestReloadingCombinedConfig
                         return new RandomReloadingDetector();
                     }
                 };
-        HierarchicalConfiguration defConf = new BaseHierarchicalConfiguration();
+        BaseHierarchicalConfiguration defConf = new BaseHierarchicalConfiguration();
         defConf.addProperty("header.result.nodeCombiner[@config-class]",
                 MergeCombiner.class.getName());
         defConf.addProperty("header.result.expressionEngine[@config-class]",
@@ -375,18 +372,18 @@ public class TestReloadingCombinedConfig
      * A test builder class which always returns the same configuration.
      */
     private static class ConstantConfigurationBuilder extends
-            BasicConfigurationBuilder<HierarchicalConfiguration>
+            BasicConfigurationBuilder<BaseHierarchicalConfiguration>
     {
-        private final HierarchicalConfiguration configuration;
+        private final BaseHierarchicalConfiguration configuration;
 
-        public ConstantConfigurationBuilder(HierarchicalConfiguration conf)
+        public ConstantConfigurationBuilder(BaseHierarchicalConfiguration conf)
         {
-            super(HierarchicalConfiguration.class);
+            super(BaseHierarchicalConfiguration.class);
             configuration = conf;
         }
 
         @Override
-        public HierarchicalConfiguration getConfiguration()
+        public BaseHierarchicalConfiguration getConfiguration()
                 throws ConfigurationException
         {
             return configuration;

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/convert/TestDisabledListDelimiterHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/convert/TestDisabledListDelimiterHandler.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/convert/TestDisabledListDelimiterHandler.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/convert/TestDisabledListDelimiterHandler.java Sun Apr 20 19:32:08 2014
@@ -54,12 +54,13 @@ public class TestDisabledListDelimiterHa
     }
 
     /**
-     * Checks whether the passed in iterator contains the expected values.
+     * Checks whether the passed in container contains the expected values.
      *
-     * @param it the iterator to test
+     * @param container the iterator to test
      */
-    private static void checkIterator(Iterator<?> it)
+    private static void checkIterator(Iterable<?> container)
     {
+        Iterator<?> it = container.iterator();
         for (Object o : VALUES)
         {
             assertEquals("Wrong value", o, it.next());
@@ -100,7 +101,7 @@ public class TestDisabledListDelimiterHa
     @Test
     public void testParseSimpleValue()
     {
-        Iterator<?> it = handler.parse(STR_VALUE);
+        Iterator<?> it = handler.parse(STR_VALUE).iterator();
         assertEquals("Wrong value", STR_VALUE, it.next());
         assertFalse("Too many values", it.hasNext());
     }
@@ -111,7 +112,7 @@ public class TestDisabledListDelimiterHa
     @Test
     public void testParseNull()
     {
-        assertFalse("Got a value", handler.parse(null).hasNext());
+        assertFalse("Got a value", handler.parse(null).iterator().hasNext());
     }
 
     /**

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/event/TestHierarchicalConfigurationEvents.java Sun Apr 20 19:32:08 2014
@@ -25,9 +25,9 @@ import java.util.Collection;
 import org.apache.commons.configuration.AbstractConfiguration;
 import org.apache.commons.configuration.BaseHierarchicalConfiguration;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.apache.commons.configuration.SubnodeConfiguration;
-import org.apache.commons.configuration.tree.ConfigurationNode;
-import org.apache.commons.configuration.tree.DefaultConfigurationNode;
+import org.apache.commons.configuration.tree.ImmutableNode;
+import org.apache.commons.configuration.tree.NodeStructureHelper;
+import org.apache.commons.configuration.tree.QueryResult;
 import org.junit.Test;
 
 /**
@@ -50,10 +50,10 @@ public class TestHierarchicalConfigurati
     @Test
     public void testClearTreeEvent()
     {
-        HierarchicalConfiguration hc = (HierarchicalConfiguration) config;
+        BaseHierarchicalConfiguration hc = (BaseHierarchicalConfiguration) config;
         String key = EXIST_PROPERTY.substring(0, EXIST_PROPERTY.indexOf('.'));
-        Collection<ConfigurationNode> nodes = hc.getExpressionEngine()
-                .query(hc.getRootNode(), key);
+        Collection<QueryResult<ImmutableNode>> nodes = hc.getExpressionEngine()
+                .query(hc.getRootNode(), key, hc.getNodeModel().getNodeHandler());
         hc.clearTree(key);
         l.checkEvent(BaseHierarchicalConfiguration.EVENT_CLEAR_TREE, key, null,
                 true);
@@ -68,9 +68,9 @@ public class TestHierarchicalConfigurati
     @Test
     public void testAddNodesEvent()
     {
-        HierarchicalConfiguration hc = (HierarchicalConfiguration) config;
-        Collection<ConfigurationNode> nodes = new ArrayList<ConfigurationNode>(1);
-        nodes.add(new DefaultConfigurationNode("a_key", TEST_PROPVALUE));
+        BaseHierarchicalConfiguration hc = (BaseHierarchicalConfiguration) config;
+        Collection<ImmutableNode> nodes = new ArrayList<ImmutableNode>(1);
+        nodes.add(NodeStructureHelper.createNode("a_key", TEST_PROPVALUE));
         hc.addNodes(TEST_PROPNAME, nodes);
         l.checkEvent(BaseHierarchicalConfiguration.EVENT_ADD_NODES, TEST_PROPNAME,
                 nodes, true);
@@ -86,31 +86,45 @@ public class TestHierarchicalConfigurati
     @Test
     public void testAddNodesEmptyEvent()
     {
-        ((HierarchicalConfiguration) config).addNodes(TEST_PROPNAME,
-                new ArrayList<ConfigurationNode>());
+        ((BaseHierarchicalConfiguration) config).addNodes(TEST_PROPNAME,
+                new ArrayList<ImmutableNode>());
         l.done();
     }
 
     /**
-     * Tests whether manipulations of a subnode configuration trigger correct
+     * Tests whether manipulations of a connected sub configuration trigger correct
      * events.
      */
     @Test
-    public void testSubnodeChangedEvent()
+    public void testSubConfigurationChangedEventConnected()
     {
-        SubnodeConfiguration sub = ((HierarchicalConfiguration) config)
-                .configurationAt(EXIST_PROPERTY);
+        HierarchicalConfiguration<ImmutableNode> sub =
+                ((BaseHierarchicalConfiguration) config)
+                        .configurationAt(EXIST_PROPERTY, true);
         sub.addProperty("newProp", "newValue");
-        checkSubnodeEvent(l
-                .nextEvent(BaseHierarchicalConfiguration.EVENT_SUBNODE_CHANGED),
+        checkSubnodeEvent(
+                l.nextEvent(BaseHierarchicalConfiguration.EVENT_SUBNODE_CHANGED),
                 true);
-        checkSubnodeEvent(l
-                .nextEvent(BaseHierarchicalConfiguration.EVENT_SUBNODE_CHANGED),
+        checkSubnodeEvent(
+                l.nextEvent(BaseHierarchicalConfiguration.EVENT_SUBNODE_CHANGED),
                 false);
         l.done();
     }
 
     /**
+     * Tests that no events are generated for a disconnected sub configuration.
+     */
+    @Test
+    public void testSubConfigurationChangedEventNotConnected()
+    {
+        HierarchicalConfiguration<ImmutableNode> sub =
+                ((BaseHierarchicalConfiguration) config)
+                        .configurationAt(EXIST_PROPERTY);
+        sub.addProperty("newProp", "newValue");
+        l.done();
+    }
+
+    /**
      * Tests whether a received event contains a correct subnode event.
      *
      * @param event the event object

Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/plist/TestPropertyListConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/plist/TestPropertyListConfiguration.java?rev=1588831&r1=1588830&r2=1588831&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/plist/TestPropertyListConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/plist/TestPropertyListConfiguration.java Sun Apr 20 19:32:08 2014
@@ -38,9 +38,12 @@ import junitx.framework.ObjectAssert;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationAssert;
 import org.apache.commons.configuration.ConfigurationComparator;
+import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.apache.commons.configuration.StrictConfigurationComparator;
 import org.apache.commons.configuration.ex.ConfigurationException;
 import org.apache.commons.configuration.io.FileHandler;
+import org.apache.commons.configuration.tree.ImmutableNode;
+import org.apache.commons.configuration.tree.NodeHandler;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -222,7 +225,7 @@ public class TestPropertyListConfigurati
     {
         Calendar cal = Calendar.getInstance();
         cal.clear();
-        cal.set(2002, 2, 22, 11, 30, 0);
+        cal.set(2002, Calendar.MARCH, 22, 11, 30, 0);
         cal.setTimeZone(TimeZone.getTimeZone("GMT+0100"));
         Date date = cal.getTime();
 
@@ -311,8 +314,24 @@ public class TestPropertyListConfigurati
         PropertyListConfiguration checkConfig = new PropertyListConfiguration();
         load(checkConfig, savedFile);
 
-        assertFalse(config.getRootNode().getChildren("empty-dictionary").isEmpty());
-        assertFalse(checkConfig.getRootNode().getChildren("empty-dictionary").isEmpty());
+        assertFalse(getNamedChildren(config, "empty-dictionary").isEmpty());
+        assertFalse(getNamedChildren(checkConfig, "empty-dictionary").isEmpty());
+    }
+
+    /**
+     * Returns a list with the children of the given configuration's root note
+     * with the specified name.
+     *
+     * @param config the configuration
+     * @param name the name of the desired children
+     * @return the list with the corresponding child nodes
+     */
+    private static List<ImmutableNode> getNamedChildren(
+            HierarchicalConfiguration<ImmutableNode> config, String name)
+    {
+        NodeHandler<ImmutableNode> handler =
+                config.getNodeModel().getNodeHandler();
+        return handler.getChildren(handler.getRootNode(), name);
     }
 
     @Test
@@ -421,12 +440,12 @@ public class TestPropertyListConfigurati
     {
         Calendar cal = Calendar.getInstance();
         cal.clear();
-        cal.set(2007, 9, 29, 23, 4, 30);
+        cal.set(2007, Calendar.OCTOBER, 29, 23, 4, 30);
         cal.setTimeZone(TimeZone.getTimeZone("GMT-0230"));
         assertEquals("Wrong date literal (1)", "<*D2007-10-29 23:04:30 -0230>",
                 PropertyListConfiguration.formatDate(cal));
         cal.clear();
-        cal.set(2007, 9, 30, 22, 2, 15);
+        cal.set(2007, Calendar.OCTOBER, 30, 22, 2, 15);
         cal.setTimeZone(TimeZone.getTimeZone("GMT+1111"));
         assertEquals("Wrong date literal (2)", "<*D2007-10-30 22:02:15 +1111>",
                 PropertyListConfiguration.formatDate(cal));