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 2008/03/19 21:58:25 UTC

svn commit: r639014 - in /commons/proper/configuration/branches/configuration2_experimental/src: main/java/org/apache/commons/configuration2/ test/java/org/apache/commons/configuration2/

Author: oheger
Date: Wed Mar 19 13:58:23 2008
New Revision: 639014

URL: http://svn.apache.org/viewvc?rev=639014&view=rev
Log:
Added support for attributes with multiple values to AbstractHierarchicalConfiguration. Now InMemoryConfiguration should be a full replacement for HierarchicalConfiguration.

Modified:
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/InMemoryConfiguration.java
    commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java

Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java?rev=639014&r1=639013&r2=639014&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalConfiguration.java Wed Mar 19 13:58:23 2008
@@ -17,6 +17,7 @@
 package org.apache.commons.configuration2;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
@@ -176,7 +177,15 @@
                 Object value = nodes.getValue(i, getNodeHandler());
                 if (value != null)
                 {
-                    list.add(value);
+                    if (value instanceof Collection)
+                    {
+                        // there may be multiple values
+                        list.addAll((Collection<?>) value);
+                    }
+                    else
+                    {
+                        list.add(value);
+                    }
                 }
             }
 
@@ -579,7 +588,24 @@
      */
     public int getMaxIndex(String key)
     {
-        return fetchNodeList(key).size() - 1;
+        NodeList<T> nodes = fetchNodeList(key);
+        int cnt = 0;
+
+        for (int index = 0; index < nodes.size(); index++)
+        {
+            Object value = nodes.getValue(index, getNodeHandler());
+            if (value instanceof Collection)
+            {
+                // if there are multiple values, count them all
+                cnt += ((Collection<?>) value).size();
+            }
+            else
+            {
+                cnt++;
+            }
+        }
+
+        return cnt - 1;
     }
 
     /**
@@ -709,7 +735,7 @@
         // Add the new property
         if (data.isAttribute())
         {
-            getNodeHandler().setAttributeValue(node, data.getNewNodeName(),
+            getNodeHandler().addAttributeValue(node, data.getNewNodeName(),
                     value);
             return null;
         }

Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/InMemoryConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/InMemoryConfiguration.java?rev=639014&r1=639013&r2=639014&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/InMemoryConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/InMemoryConfiguration.java Wed Mar 19 13:58:23 2008
@@ -27,7 +27,6 @@
 import org.apache.commons.configuration2.expr.NodeAddData;
 import org.apache.commons.configuration2.expr.NodeHandler;
 import org.apache.commons.configuration2.expr.NodeList;
-import org.apache.commons.configuration2.expr.NodeVisitor;
 import org.apache.commons.configuration2.expr.NodeVisitorAdapter;
 import org.apache.commons.configuration2.tree.ConfigurationNode;
 import org.apache.commons.configuration2.tree.DefaultConfigurationNode;
@@ -147,7 +146,7 @@
      * @param c the configuration that is to be copied (if <b>null</b>, this
      * constructor will behave like the standard constructor)
      */
-    public InMemoryConfiguration(InMemoryConfiguration c)
+    public InMemoryConfiguration(AbstractHierarchicalConfiguration<? extends ConfigurationNode> c)
     {
         this();
         if (c != null)
@@ -233,18 +232,6 @@
             parent = processNodeAddData(addData, null);
         }
 
-        // a visitor to ensure that the nodes' references are cleared; this is
-        // necessary if the nodes are moved from another configuration
-        NodeVisitor<ConfigurationNode> clearRefVisitor = new NodeVisitorAdapter<ConfigurationNode>()
-        {
-            @Override
-            public void visitBeforeChildren(ConfigurationNode node,
-                    NodeHandler<ConfigurationNode> handler)
-            {
-                node.setReference(null);
-            }
-        };
-
         for (ConfigurationNode child : nodes)
         {
             if (child.isAttribute())
@@ -255,7 +242,7 @@
             {
                 parent.addChild(child);
             }
-            visit(child, clearRefVisitor);
+            clearReferences(child);
         }
         fireEvent(EVENT_ADD_NODES, key, nodes, false);
     }
@@ -414,6 +401,10 @@
                     NodeHandler<ConfigurationNode> handler)
             {
                 node.setReference(null);
+                for (ConfigurationNode attr : node.getAttributes())
+                {
+                    attr.setReference(null);
+                }
             }
         });
     }

Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java?rev=639014&r1=639013&r2=639014&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestInMemoryConfiguration.java Wed Mar 19 13:58:23 2008
@@ -419,6 +419,17 @@
         }
     }
 
+    /**
+     * Tests querying the maximum index for attributes with multiple values.
+     */
+    public void testGetMaxIndexAttributesMultipleValues()
+    {
+        config.addProperty("tables.table(0)[@mode]", "test");
+        config.addProperty("tables.table(0)[@mode]", "production");
+        config.addProperty("tables.table(1)[@mode]", "staging");
+        assertEquals("Wrong max index", 2, config.getMaxIndex("tables.table[@mode]"));
+    }
+
     public void testSubset()
     {
         // test the subset on the first table
@@ -914,6 +925,49 @@
 	    InMemoryConfiguration copy = new InMemoryConfiguration(null);
 		assertTrue("Configuration not empty", copy.isEmpty());
 	}
+
+	/**
+     * Tests adding multiple values to an attribute.
+     */
+    public void testAddMultipleAttributeValues()
+    {
+        final String attrKey = "tables.table(0)[@mode]";
+        config.addProperty(attrKey, "system");
+        config.addProperty(attrKey, "security");
+        assertEquals("Wrong first attribute", "system", config
+                .getString(attrKey));
+        List<?> values = config.getList(attrKey);
+        assertEquals("Wrong number of values", 2, values.size());
+        assertEquals("Wrong value 1", "system", values.get(0));
+        assertEquals("Wrong value 2", "security", values.get(1));
+    }
+
+    /**
+     * Tests overriding an attribute with multiple values.
+     */
+    public void testOverrideMultipleAttributeValues()
+    {
+        final String attrKey = "tables.table(0)[@mode]";
+        testAddMultipleAttributeValues(); // set attribute values
+        config.setProperty(attrKey, "NewValue");
+        List<?> values = config.getList(attrKey);
+        assertEquals("Wrong number of values", 1, values.size());
+        assertEquals("Wrong value 1", "NewValue", values.get(0));
+    }
+
+    /**
+     * Tests querying attributes with multiple values.
+     */
+    public void testQueryMultipleAttributeValues()
+    {
+        testAddMultipleAttributeValues();  // add attribute values
+        config.addProperty("tables.table(1)[@mode]", "test");
+        List<?> values = config.getList("tables.table[@mode]");
+        assertEquals("Wrong number of values", 3, values.size());
+        assertEquals("Wrong value 1", "system", values.get(0));
+        assertEquals("Wrong value 2", "security", values.get(1));
+        assertEquals("Wrong value 3", "test", values.get(2));
+    }
 
 	/**
      * Helper method for testing the getKeys(String) method.