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/18 22:52:04 UTC
svn commit: r638601 - in
/commons/proper/configuration/branches/configuration2_experimental/src:
main/java/org/apache/commons/configuration2/expr/
test/java/org/apache/commons/configuration2/expr/
Author: oheger
Date: Tue Mar 18 14:52:03 2008
New Revision: 638601
URL: http://svn.apache.org/viewvc?rev=638601&view=rev
Log:
Add support for attributes with multiple values to node handlers
Modified:
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/ConfigurationNodeHandler.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeHandler.java
commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/expr/TestConfigurationNodeHandler.java
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/ConfigurationNodeHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/ConfigurationNodeHandler.java?rev=638601&r1=638600&r2=638601&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/ConfigurationNodeHandler.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/ConfigurationNodeHandler.java Tue Mar 18 14:52:03 2008
@@ -49,9 +49,9 @@
}
/**
- * Returns the value of the attribute with the given name. This
- * implementation supports only a single attribute value. If the attribute
- * is present multiple times, only the value of the first occurrence is
+ * Returns the value of the attribute with the given name. If the attribute
+ * has exactly one value, this value is returned. If the attribute
+ * is present multiple times, a collection with all values is
* returned. If the attribute cannot be found, result is <b>null</b>.
*
* @param node the node
@@ -61,7 +61,25 @@
public Object getAttributeValue(ConfigurationNode node, String name)
{
List<ConfigurationNode> attrs = node.getAttributes(name);
- return (attrs.isEmpty()) ? null : attrs.get(0).getValue();
+
+ if (attrs.isEmpty())
+ {
+ return null;
+ }
+ else if (attrs.size() == 1)
+ {
+ return attrs.get(0).getValue();
+ }
+
+ else
+ {
+ List<Object> result = new ArrayList<Object>(attrs.size());
+ for (ConfigurationNode attr : attrs)
+ {
+ result.add(attr.getValue());
+ }
+ return result;
+ }
}
/**
@@ -153,9 +171,8 @@
}
/**
- * Sets the value of the specified attribute. This implementation only
- * supports a single value per attribute. So any existing attributes with
- * the given name are removed first.
+ * Sets the value of the specified attribute. This implementation removes
+ * any existing attribute values before calling <code>addAttributeValue()</code>.
*
* @param node the node
* @param name the name of the attribute to set
@@ -165,6 +182,19 @@
Object value)
{
node.removeAttribute(name);
+ addAttributeValue(node, name, value);
+ }
+
+ /**
+ * Adds another value to an attribute. Using this method it is possible to
+ * create attributes with multiple values.
+ * @param node the parent node
+ * @param name the name of the affected attribute
+ * @param value the value to add
+ */
+ public void addAttributeValue(ConfigurationNode node, String name,
+ Object value)
+ {
ConfigurationNode attr = createNode(node, name);
attr.setValue(value);
node.addAttribute(attr);
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeHandler.java?rev=638601&r1=638600&r2=638601&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeHandler.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/expr/NodeHandler.java Tue Mar 18 14:52:03 2008
@@ -122,7 +122,9 @@
List<String> getAttributes(T node);
/**
- * Returns the value of the specified attribute from the given node.
+ * Returns the value of the specified attribute from the given node. If a
+ * concrete <code>NodeHandler</code> supports attributes with multiple
+ * values, result might be a collection.
*
* @param node the node
* @param name the name of the attribute
@@ -133,12 +135,25 @@
/**
* Sets the value of an attribute for the specified node.
*
- * @param node the node
+ * @param node the parent node
* @param name the name of the attribute
* @param value the value of the attribute
*/
void setAttributeValue(T node, String name, Object value);
+ /**
+ * Adds a value to an attribute. This method can be used to create
+ * attributes with multiple values (as far as the specific
+ * <code>NodeHandler</code> implementation supports this). In contrast to
+ * <code>setAttributeValue()</code>, an existing attribute value is not
+ * removed, but the new value is added to the existing values.
+ *
+ * @param node the parent node
+ * @param name the name of the attribute
+ * @param value the value to be added
+ */
+ void addAttributeValue(T node, String name, Object value);
+
/**
* Removes the attribute with the specified name from the given node.
*
Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/expr/TestConfigurationNodeHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/expr/TestConfigurationNodeHandler.java?rev=638601&r1=638600&r2=638601&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/expr/TestConfigurationNodeHandler.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/expr/TestConfigurationNodeHandler.java Tue Mar 18 14:52:03 2008
@@ -17,6 +17,7 @@
package org.apache.commons.configuration2.expr;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import org.apache.commons.configuration2.tree.ConfigurationNode;
@@ -222,6 +223,37 @@
}
/**
+ * Tests querying an attribute with multiple values.
+ */
+ public void testGetAttributeValueMulti()
+ {
+ final int attrCount = 10;
+ ConfigurationNode node = mockNode();
+ List<ConfigurationNode> attrs = new ArrayList<ConfigurationNode>(
+ attrCount);
+ for (int i = 0; i < attrCount; i++)
+ {
+ ConfigurationNode attr = mockNode();
+ EasyMock.expect(attr.getValue()).andReturn(
+ String.valueOf(VALUE) + i);
+ EasyMock.replay(attr);
+ attrs.add(attr);
+ }
+ EasyMock.expect(node.getAttributes(NAME)).andReturn(attrs);
+ EasyMock.replay(node);
+ Collection<?> values = (Collection<?>) handler.getAttributeValue(node,
+ NAME);
+ assertEquals("Wrong number of values", attrCount, values.size());
+ int idx = 0;
+ for (Object val : values)
+ {
+ String expected = String.valueOf(VALUE) + idx;
+ assertEquals("Wrong value at " + idx, expected, val);
+ idx++;
+ }
+ }
+
+ /**
* Tests querying the value of a non-existing attribute. Result should be
* null.
*/
@@ -248,6 +280,21 @@
List<ConfigurationNode> attrs = node.getAttributes(NAME);
assertEquals("Wrong size of attribute list", 1, attrs.size());
assertEquals("Wrong attribute value", VALUE, attrs.get(0).getValue());
+ }
+
+ /**
+ * Tests adding multiple values to an attribute.
+ */
+ public void testAddAttributeValue()
+ {
+ ConfigurationNode node = new DefaultConfigurationNode();
+ handler.addAttributeValue(node, NAME, "oldValue");
+ handler.addAttributeValue(node, NAME, VALUE);
+ List<ConfigurationNode> attrs = node.getAttributes(NAME);
+ assertEquals("Wrong size of attribute list", 2, attrs.size());
+ assertEquals("Wrong attribute value 1", "oldValue", attrs.get(0)
+ .getValue());
+ assertEquals("Wrong attribute value 2", VALUE, attrs.get(1).getValue());
}
/**