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 2007/09/14 22:20:36 UTC
svn commit: r575786 - in /commons/proper/configuration/trunk:
src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
xdocs/changes.xml
Author: oheger
Date: Fri Sep 14 13:20:35 2007
New Revision: 575786
URL: http://svn.apache.org/viewvc?rev=575786&view=rev
Log:
CONFIGURATION-295: HierarchicalConfiguration.subset() now sets the value of the returned configuration's root note if it can be determined
Modified:
commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
commons/proper/configuration/trunk/xdocs/changes.xml
Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java?rev=575786&r1=575785&r2=575786&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java Fri Sep 14 13:20:35 2007
@@ -458,7 +458,16 @@
* Creates a new <code>Configuration</code> object containing all keys
* that start with the specified prefix. This implementation will return a
* <code>HierarchicalConfiguration</code> object so that the structure of
- * the keys will be saved.
+ * the keys will be saved. The nodes selected by the prefix (it is possible
+ * that multiple nodes are selected) are mapped to the root node of the
+ * returned configuration, i.e. their children and attributes will become
+ * children and attributes of the new root node. However a value of the root
+ * node is only set if exactly one of the selected nodes contain a value (if
+ * multiple nodes have a value, there is simply no way to decide how these
+ * values are merged together). Note that the returned
+ * <code>Configuration</code> object is not connected to its source
+ * configuration: updates on the source configuration are not reflected in
+ * the subset and vice versa.
*
* @param prefix the prefix of the keys for the subset
* @return a new configuration object representing the selected subset
@@ -482,21 +491,37 @@
};
CloneVisitor visitor = new CloneVisitor();
+ // Initialize the new root node
+ Object value = null;
+ int valueCount = 0;
for (Iterator it = nodes.iterator(); it.hasNext();)
{
ConfigurationNode nd = (ConfigurationNode) it.next();
+ if (nd.getValue() != null)
+ {
+ value = nd.getValue();
+ valueCount++;
+ }
nd.visit(visitor);
- for (Iterator it2 = visitor.getClone().getChildren().iterator(); it2.hasNext();)
+ for (Iterator it2 = visitor.getClone().getChildren().iterator(); it2
+ .hasNext();)
{
result.getRootNode().addChild((ConfigurationNode) it2.next());
}
- for (Iterator it2 = visitor.getClone().getAttributes().iterator(); it2.hasNext();)
+ for (Iterator it2 = visitor.getClone().getAttributes().iterator(); it2
+ .hasNext();)
{
- result.getRootNode().addAttribute((ConfigurationNode) it2.next());
+ result.getRootNode().addAttribute(
+ (ConfigurationNode) it2.next());
}
}
+ // Determine the value of the new root
+ if (valueCount == 1)
+ {
+ result.getRootNode().setValue(value);
+ }
return (result.isEmpty()) ? new HierarchicalConfiguration() : result;
}
Modified: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java?rev=575786&r1=575785&r2=575786&view=diff
==============================================================================
--- commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java (original)
+++ commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java Fri Sep 14 13:20:35 2007
@@ -457,9 +457,38 @@
assertEquals(fields[0][0], subset.getProperty("name(0)"));
- // tset the subset on the field names
+ // test the subset on the field names
subset = config.subset("tables.table.fields.field.name");
assertTrue("subset is not empty", subset.isEmpty());
+ }
+
+ /**
+ * Tests the subset() method when the specified node has a value. This value
+ * must be available in the subset, too. Related to CONFIGURATION-295.
+ */
+ public void testSubsetNodeWithValue()
+ {
+ config.setProperty("tables.table(0).fields", "My fields");
+ Configuration subset = config.subset("tables.table(0).fields");
+ assertEquals("Wrong field name", fields[0][0], subset
+ .getString("field(0).name"));
+ assertEquals("Wrong value of root", "My fields", subset.getString(""));
+ }
+
+ /**
+ * Tests the subset() method when the specified key selects multiple keys.
+ * The resulting root node should have a value only if exactly one of the
+ * selected nodes has a value. Related to CONFIGURATION-295.
+ */
+ public void testSubsetMultipleNodesWithValues()
+ {
+ config.setProperty("tables.table(0).fields", "My fields");
+ Configuration subset = config.subset("tables.table.fields");
+ assertEquals("Wrong value of root", "My fields", subset.getString(""));
+ config.setProperty("tables.table(1).fields", "My other fields");
+ subset = config.subset("tables.table.fields");
+ assertNull("Root value is not null though there are multiple values",
+ subset.getString(""));
}
/**
Modified: commons/proper/configuration/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/xdocs/changes.xml?rev=575786&r1=575785&r2=575786&view=diff
==============================================================================
--- commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ commons/proper/configuration/trunk/xdocs/changes.xml Fri Sep 14 13:20:35 2007
@@ -23,6 +23,10 @@
<body>
<release version="1.5-SNAPSHOT" date="in SVN" description="">
+ <action dev="oheger" type="fix" issue="CONFIGURATION-295">
+ The subset() method of HierarchicalConfiguration now takes the value of
+ the subset's root node into account if it is not ambigous.
+ </action>
<action dev="oheger" type="fix" issue="CONFIGURATION-294">
Nodes added to a XMLConfiguration using the addNodes() method could
lose their value when the configuration was saved. This is now fixed.