Author: oheger Date: Sun Jul 2 08:28:13 2006 New Revision: 418608 URL: http://svn.apache.org/viewvc?rev=418608&view=rev Log: Added clone() methods to BaseConfiguration and AbstractFileConfiguration
Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.java jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/BaseConfiguration.java jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestBaseConfiguration.java jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestFileConfiguration.java Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.java?rev=418608&r1=418607&r2=418608&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.java (original) +++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.java Sun Jul 2 08:28:13 2006 @@ -110,7 +110,7 @@ */ public AbstractFileConfiguration() { - setReloadingStrategy(new InvariantReloadingStrategy()); + initReloadingStrategy(); } /** @@ -854,5 +854,34 @@ public void setEncoding(String encoding) { this.encoding = encoding; + } + + /** + * Creates a copy of this configuration. The new configuration object will + * contain the same properties as the original, but it will lose any + * connection to a source file (if one exists); this includes setting the + * source URL, base path, and file name to <b>null</b>. This is done to + * avoid race conditions if both the original and the copy are modified and + * then saved. + * + * @return the copy + * @since 1.3 + */ + public Object clone() + { + AbstractFileConfiguration copy = (AbstractFileConfiguration) super + .clone(); + copy.setBasePath(null); + copy.setFileName(null); + copy.initReloadingStrategy(); + return copy; + } + + /** + * Helper method for initializing the reloading strategy. + */ + private void initReloadingStrategy() + { + setReloadingStrategy(new InvariantReloadingStrategy()); } } Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/BaseConfiguration.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/BaseConfiguration.java?rev=418608&r1=418607&r2=418608&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/BaseConfiguration.java (original) +++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/BaseConfiguration.java Sun Jul 2 08:28:13 2006 @@ -47,7 +47,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Oliver Heger</a> * @version $Id$ */ -public class BaseConfiguration extends AbstractConfiguration +public class BaseConfiguration extends AbstractConfiguration implements Cloneable { /** stores the configuration key-value pairs */ private Map store = new LinkedMap(); @@ -151,5 +151,28 @@ public Iterator getKeys() { return store.keySet().iterator(); + } + + /** + * Creates a copy of this object. This implementation will create a deep + * clone, i.e. the map that stores the properties is cloned, too. So changes + * performed at the copy won't affect the original and vice versa. + * + * @return the copy + * @since 1.3 + */ + public Object clone() + { + try + { + BaseConfiguration copy = (BaseConfiguration) super.clone(); + copy.store = (Map) ((LinkedMap) store).clone(); + return copy; + } + catch (CloneNotSupportedException cex) + { + // should not happen + throw new ConfigurationRuntimeException(cex); + } } } Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestBaseConfiguration.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestBaseConfiguration.java?rev=418608&r1=418607&r2=418608&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestBaseConfiguration.java (original) +++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestBaseConfiguration.java Sun Jul 2 08:28:13 2006 @@ -736,4 +736,39 @@ assertEquals("Wrong DigDecimal returned", new BigDecimal("42"), config .getBigDecimal(KEY_NUMBER)); } + + /** + * Tests cloning a BaseConfiguration. + */ + public void testClone() + { + for (int i = 0; i < 10; i++) + { + config.addProperty("key" + i, new Integer(i)); + } + BaseConfiguration config2 = (BaseConfiguration) config.clone(); + + for (Iterator it = config.getKeys(); it.hasNext();) + { + String key = (String) it.next(); + assertTrue("Key not found: " + key, config2.containsKey(key)); + assertEquals("Wrong value for key " + key, config.getProperty(key), + config2.getProperty(key)); + } + } + + /** + * Tests whether a cloned configuration is decoupled from its original. + */ + public void testCloneModify() + { + config.addProperty("original", Boolean.TRUE); + BaseConfiguration config2 = (BaseConfiguration) config.clone(); + + config2.addProperty("clone", Boolean.TRUE); + assertFalse("New key appears in original", config.containsKey("clone")); + config2.setProperty("original", Boolean.FALSE); + assertTrue("Wrong value of original property", config + .getBoolean("original")); + } } Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestFileConfiguration.java URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestFileConfiguration.java?rev=418608&r1=418607&r2=418608&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestFileConfiguration.java (original) +++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestFileConfiguration.java Sun Jul 2 08:28:13 2006 @@ -17,7 +17,6 @@ package org.apache.commons.configuration; import java.net.URL; -import java.util.Iterator; import java.util.Properties; import java.io.File; import java.io.FileInputStream; @@ -489,12 +488,34 @@ config1.load(); PropertiesConfiguration config2 = new PropertiesConfiguration( RESOURCE_NAME); + compare(config1, config2); + } - for (Iterator it = config1.getKeys(); it.hasNext();) - { - String key = (String) it.next(); - assertEquals("Wrong value for key " + key, - config1.getProperty(key), config2.getProperty(key)); - } + /** + * Tests cloning a file based configuration. + */ + public void testClone() throws ConfigurationException + { + PropertiesConfiguration config = new PropertiesConfiguration( + RESOURCE_NAME); + PropertiesConfiguration copy = (PropertiesConfiguration) config.clone(); + compare(config, copy); + assertNull("URL was not reset", copy.getURL()); + assertNull("Base path was not reset", copy.getBasePath()); + assertNull("File name was not reset", copy.getFileName()); + assertNotSame("Reloading strategy was not reset", config + .getReloadingStrategy(), copy.getReloadingStrategy()); + } + + /** + * Helper method for comparing the content of two configuration objects. + * + * @param config1 the first configuration + * @param config2 the second configuration + */ + private void compare(Configuration config1, Configuration config2) + { + StrictConfigurationComparator cc = new StrictConfigurationComparator(); + assertTrue("Configurations are different", cc.compare(config1, config2)); } } --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]