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]

Reply via email to