Author: oheger
Date: Thu Jul 21 10:16:22 2005
New Revision: 220143
URL: http://svn.apache.org/viewcvs?rev=220143&view=rev
Log:
Added clone method to HierarchicalConfiguration, updated javadocs of
ConfigurationUtils.copy()
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/ConfigurationUtils.java
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/ConfigurationUtils.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/ConfigurationUtils.java?rev=220143&r1=220142&r2=220143&view=diff
==============================================================================
---
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/ConfigurationUtils.java
(original)
+++
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/ConfigurationUtils.java
Thu Jul 21 10:16:22 2005
@@ -104,6 +104,11 @@
* Copy all properties from the source configuration to the target
* configuration. Properties in the target configuration are replaced with
* the properties with the same key in the source configuration.
+ * <em>Note:</em> This method won't work well on hierarchical
configurations
+ * because it is not able to copy information about the properties'
+ * structure. So when dealing with hierarchical configuration objects their
+ * <code>[EMAIL PROTECTED] HierarchicalConfiguration#clone()
clone()}</code> methods
+ * should be used.
*
* @param source the source configuration
* @param target the target configuration
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java?rev=220143&r1=220142&r2=220143&view=diff
==============================================================================
---
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
(original)
+++
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
Thu Jul 21 10:16:22 2005
@@ -92,7 +92,8 @@
* @version $Id: HierarchicalConfiguration.java,v 1.14 2004/12/02 22:05:52
* ebourg Exp $
*/
-public class HierarchicalConfiguration extends AbstractConfiguration
+public class HierarchicalConfiguration extends AbstractConfiguration implements
+ Cloneable
{
/** Constant for a new dummy key. */
private static final String NEW_KEY = "newKey";
@@ -471,6 +472,34 @@
public int getMaxIndex(String key)
{
return fetchNodeList(key).size() - 1;
+ }
+
+ /**
+ * Creates a copy of this object. This new configuration object will
contain
+ * copies of all nodes in the same structure.
+ *
+ * @return the copy
+ * @since 1.2
+ */
+ public Object clone()
+ {
+ try
+ {
+ HierarchicalConfiguration copy = (HierarchicalConfiguration) super
+ .clone();
+
+ // clone the nodes, too
+ CloneVisitor v = new CloneVisitor();
+ getRoot().visit(v, null);
+ copy.setRoot(v.getClone());
+
+ return copy;
+ }
+ catch (CloneNotSupportedException cex)
+ {
+ // should not happen
+ throw new ConfigurationRuntimeException(cex);
+ }
}
/**
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java?rev=220143&r1=220142&r2=220143&view=diff
==============================================================================
---
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
(original)
+++
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
Thu Jul 21 10:16:22 2005
@@ -528,6 +528,33 @@
throw new ConfigurationException(e.getMessage(), e);
}
}
+
+ /**
+ * Creates a copy of this object. The new configuration object will contain
+ * the same properties as the original, but it will lose any connection to
a
+ * source document (if one exists). This is to avoid race conditions if
both
+ * the original and the copy are modified and then saved.
+ *
+ * @return the copy
+ */
+ public Object clone()
+ {
+ XMLConfiguration copy = (XMLConfiguration) super.clone();
+
+ // clear document related properties
+ copy.document = null;
+ copy.delegate = copy.new FileConfigurationDelegate();
+ // clear all references in the nodes, too
+ copy.getRoot().visit(new NodeVisitor()
+ {
+ public void visitBeforeChildren(Node node, ConfigurationKey key)
+ {
+ node.setReference(null);
+ }
+ }, null);
+
+ return copy;
+ }
public String getFileName()
{
Modified:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java?rev=220143&r1=220142&r2=220143&view=diff
==============================================================================
---
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
(original)
+++
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfiguration.java
Thu Jul 21 10:16:22 2005
@@ -312,6 +312,22 @@
assertTrue("subset is not empty", conf.isEmpty());
}
+ public void testClone()
+ {
+ Configuration copy = (Configuration) config.clone();
+ assertTrue(copy instanceof HierarchicalConfiguration);
+ for (int i = 0; i < tables.length; i++)
+ {
+ assertEquals(tables[i], copy.getString("tables.table(" + i
+ + ").name"));
+ for (int j = 0; j < fields[i].length; j++)
+ {
+ assertEquals(fields[i][j], copy.getString("tables.table(" + i
+ + ").fields.field(" + j + ").name"));
+ }
+ }
+ }
+
/**
* Helper method for testing the getKeys(String) method.
* @param prefix the key to pass into getKeys()
Modified:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java?rev=220143&r1=220142&r2=220143&view=diff
==============================================================================
---
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
(original)
+++
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
Thu Jul 21 10:16:22 2005
@@ -534,4 +534,18 @@
conf.load(new File("conf/testValidateValid.xml"));
assertTrue(conf.containsKey("table.fields.field(1).type"));
}
+
+ /**
+ * Tests the clone() method.
+ */
+ public void testClone()
+ {
+ Configuration c = (Configuration) conf.clone();
+ assertTrue(c instanceof XMLConfiguration);
+ XMLConfiguration copy = (XMLConfiguration) c;
+ assertNotNull(conf.getDocument());
+ assertNull(copy.getDocument());
+ assertNotNull(conf.getFileName());
+ assertNull(copy.getFileName());
+ }
}
Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL:
http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?rev=220143&r1=220142&r2=220143&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Thu Jul 21
10:16:22 2005
@@ -23,6 +23,16 @@
<body>
<release version="1.2-dev" date="in SVN">
+ <action dev="oheger" type="update" issue="35772">
+ Because ConfigurationUtils.copy() does not fully support hierarchical
+ configurations a clone() method was added to HierarchicalConfiguration
+ that can be used instead.
+ </action>
+ <action dev="oheger" type="add" issue="31616">
+ XMLConfiguration now supports setting a custom DocumentBuilder for
+ loading XML documents. This makes it possible e.g. to enable validation
+ when a configuration file is loaded.
+ </action>
<action dev="oheger" type="update" issue="35621">
AbstractFileConfiguration now always sets a valid base path if the
configuration file could be located. This allows
PropertiesConfiguration
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]