Author: oheger
Date: Sun Jun 10 09:10:17 2007
New Revision: 545904
URL: http://svn.apache.org/viewvc?view=rev&rev=545904
Log:
CONFIGURATION-280: Fixed possible data loss for file-based configurations in
auto-save mode that are associated with a reloading strategy; thanks to Roman
Kurmanowytsch
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.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/AbstractFileConfiguration.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/AbstractFileConfiguration.java?view=diff&rev=545904&r1=545903&r2=545904
==============================================================================
---
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 Jun 10 09:10:17 2007
@@ -827,6 +827,8 @@
}
fireEvent(EVENT_RELOAD, null, getURL(), true);
setDetailEvents(false);
+ boolean autoSaveBak = this.isAutoSave(); // save the
current state
+ this.setAutoSave(false); // deactivate autoSave to
prevent information loss
try
{
clear();
@@ -834,6 +836,7 @@
}
finally
{
+ this.setAutoSave(autoSaveBak); // set autoSave to
previous value
setDetailEvents(true);
}
fireEvent(EVENT_RELOAD, null, getURL(), false);
Modified:
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestXMLConfiguration.java?view=diff&rev=545904&r1=545903&r2=545904
==============================================================================
---
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
Sun Jun 10 09:10:17 2007
@@ -263,7 +263,7 @@
// set a new attribute
conf.setProperty("[EMAIL PROTECTED]", "value");
assertEquals("[EMAIL PROTECTED]", "value", conf.getProperty("[EMAIL
PROTECTED]"));
-
+
conf.setProperty("name1","value1");
assertEquals("value1",conf.getProperty("name1"));
}
@@ -352,11 +352,11 @@
assertTrue(conf.isEmpty());
conf.addProperty("test", "yes");
conf.save();
-
+
conf = new XMLConfiguration(testSaveConf);
assertEquals("yes", conf.getString("test"));
}
-
+
/**
* Tests loading a configuration from a URL.
*/
@@ -367,7 +367,7 @@
assertEquals("value", conf.getProperty("element"));
assertEquals(url, conf.getURL());
}
-
+
/**
* Tests loading from a stream.
*/
@@ -377,12 +377,12 @@
conf = new XMLConfiguration();
conf.load(new ByteArrayInputStream(xml.getBytes()));
assertEquals(1, conf.getInt("test"));
-
+
conf = new XMLConfiguration();
conf.load(new ByteArrayInputStream(xml.getBytes()), "UTF8");
assertEquals(1, conf.getInt("test"));
}
-
+
/**
* Tests loading a non well formed XML from a string.
*/
@@ -439,7 +439,7 @@
{
conf.addProperty("[EMAIL PROTECTED]", "value" + i);
}
-
+
// add comma delimited lists with escaped delimiters
conf.addProperty("split.list5", "a\\,b\\,c");
conf.setProperty("element3", "value\\,value1\\,value2");
@@ -453,7 +453,7 @@
checkConfig.setFileName(testSaveConf.getAbsolutePath());
checkSavedConfig(checkConfig);
}
-
+
/**
* Tests saving to a URL.
*/
@@ -464,7 +464,7 @@
checkConfig.setFile(testSaveConf);
checkSavedConfig(checkConfig);
}
-
+
/**
* Tests saving to a stream.
*/
@@ -485,11 +485,11 @@
out.close();
}
}
-
+
XMLConfiguration checkConfig = new XMLConfiguration();
checkConfig.setFile(testSaveConf);
checkSavedConfig(checkConfig);
-
+
try
{
out = new FileOutputStream(testSaveConf);
@@ -502,7 +502,7 @@
out.close();
}
}
-
+
checkConfig.clear();
checkSavedConfig(checkConfig);
}
@@ -518,13 +518,13 @@
// reload the configuration
XMLConfiguration conf2 = new XMLConfiguration(conf.getFile());
assertEquals("'autosave' property", "ok", conf2.getString("autosave"));
-
+
conf.clearTree("clear");
conf2 = new XMLConfiguration(conf.getFile());
Configuration sub = conf2.subset("clear");
assertTrue(sub.isEmpty());
}
-
+
/**
* Tests if a second file can be appended to a first.
*/
@@ -536,14 +536,14 @@
conf.load(testProperties2);
assertEquals("value", conf.getString("element"));
assertEquals("tasks", conf.getString("table.name"));
-
+
conf.save(testSaveConf);
conf = new XMLConfiguration(testSaveConf);
assertEquals("value", conf.getString("element"));
assertEquals("tasks", conf.getString("table.name"));
assertEquals("application", conf.getString("[EMAIL PROTECTED]"));
}
-
+
/**
* Tests saving attributes (related to issue 34442).
*/
@@ -749,12 +749,12 @@
File nonValidFile = new File("conf/testValidateInvalid.xml");
conf = new XMLConfiguration();
assertFalse(conf.isValidating());
-
+
// Load a non valid XML document. Should work for isValidating() ==
false
conf.load(nonValidFile);
assertEquals("customers", conf.getString("table.name"));
assertFalse(conf.containsKey("table.fields.field(1).type"));
-
+
// Now set the validating flag to true
conf.setValidating(true);
try
@@ -767,7 +767,7 @@
//ok
}
}
-
+
/**
* Tests handling of empty elements.
*/
@@ -778,12 +778,12 @@
conf.addProperty("empty2", "");
conf.setProperty("empty", "no more empty");
conf.save(testSaveConf);
-
+
conf = new XMLConfiguration(testSaveConf);
assertEquals("no more empty", conf.getString("empty"));
assertEquals("", conf.getProperty("empty2"));
}
-
+
/**
* Tests whether the encoding is correctly detected by the XML parser. This
* is done by loading an XML file with the encoding "UTF-16". If this
@@ -798,7 +798,7 @@
conf.load(file);
assertEquals("test3_yoge", conf.getString("yoge"));
}
-
+
/**
* Tests whether the encoding is written to the generated XML file.
*/
@@ -813,7 +813,7 @@
assertTrue("Encoding was not written to file", out.toString().indexOf(
"encoding=\"" + ENCODING + "\"") >= 0);
}
-
+
/**
* Tests whether a default encoding is used if no specific encoding is set.
* According to the XSLT specification (http://www.w3.org/TR/xslt#output)
@@ -938,7 +938,7 @@
conf.clear();
assertNull(conf.getString("test[1]/entity/@name"));
}
-
+
/**
* Tests the copy constructor.
*/
@@ -1132,6 +1132,19 @@
}
/**
+ * Tests a combination of auto save = true and an associated reloading
+ * strategy.
+ */
+ public void testAutoSaveWithReloadingStrategy() throws
ConfigurationException
+ {
+ conf.setFile(testSaveConf);
+ conf.save();
+ conf.setReloadingStrategy(new FileAlwaysReloadingStrategy());
+ conf.setAutoSave(true);
+ assertEquals("Value not found", "value", conf.getProperty("element"));
+ }
+
+ /**
* Prepares a configuration object for testing a reload operation.
*
* @return the initialized configuration
@@ -1168,12 +1181,6 @@
private void checkSavedConfig(FileConfiguration checkConfig) throws
ConfigurationException
{
checkConfig.load();
-
- for (Iterator i = conf.getKeys(); i.hasNext();)
- {
- String key = (String) i.next();
- assertTrue("The saved configuration doesn't contain the key '" +
key + "'", checkConfig.containsKey(key));
- assertEquals("Value of the '" + key + "' property",
conf.getProperty(key), checkConfig.getProperty(key));
- }
+ ConfigurationAssert.assertEquals(conf, checkConfig);
}
}
Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?view=diff&rev=545904&r1=545903&r2=545904
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Sun Jun 10
09:10:17 2007
@@ -23,6 +23,11 @@
<body>
<release version="1.5-SNAPSHOT" date="in SVN" description="">
+ <action dev="oheger" type="fix" issue="CONFIGURATION-280"
+ due-to="Roman Kurmanowytsch">
+ Using file-based configurations in auto-save mode together with a
+ reloading strategy could cause data loss. This has been fixed.
+ </action>
<action dev="oheger" type="fix" issue="CONFIGURATION-279">
A PropertiesConfiguration that was created from a non existing file
lost its content when it was saved. This problem has been solved.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]