Author: oheger Date: Sat Jun 4 07:21:39 2005 New Revision: 179993 URL: http://svn.apache.org/viewcvs?rev=179993&view=rev Log: Some fixes for FileChangedReloadingStrategy related to issue 34289
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/reloading/FileChangedReloadingStrategy.java jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/reloading/TestFileChangedReloadingStrategy.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=179993&r1=179992&r2=179993&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 Sat Jun 4 07:21:39 2005 @@ -467,7 +467,7 @@ * @param url the URL * @return the resulting file object */ - static File fileFromURL(URL url) + public static File fileFromURL(URL url) { if (PROTOCOL_FILE.equals(url.getProtocol())) { Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/reloading/FileChangedReloadingStrategy.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/reloading/FileChangedReloadingStrategy.java?rev=179993&r1=179992&r2=179993&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/reloading/FileChangedReloadingStrategy.java (original) +++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/reloading/FileChangedReloadingStrategy.java Sat Jun 4 07:21:39 2005 @@ -16,6 +16,11 @@ package org.apache.commons.configuration.reloading; +import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; + +import org.apache.commons.configuration.ConfigurationUtils; import org.apache.commons.configuration.FileConfiguration; /** @@ -30,6 +35,10 @@ */ public class FileChangedReloadingStrategy implements ReloadingStrategy { + /** Constant for the jar URL protocol.*/ + private static final String JAR_PROTOCOL = "jar"; + + /** Stores a reference to the configuration to be monitored.*/ protected FileConfiguration configuration; /** The last time the configuration file was modified. */ @@ -57,10 +66,13 @@ long now = System.currentTimeMillis(); - if ((now > lastChecked + refreshDelay) && hasChanged()) + if ((now > lastChecked + refreshDelay)) { lastChecked = now; - reloading = true; + if(hasChanged()) + { + reloading = true; + } } return reloading; @@ -94,7 +106,11 @@ */ protected void updateLastModified() { - lastModified = configuration.getFile().lastModified(); + File file = getFile(); + if (file != null) + { + lastModified = file.lastModified(); + } } /** @@ -102,12 +118,52 @@ */ protected boolean hasChanged() { - if (!configuration.getFile().exists()) + File file = getFile(); + if (file == null || !file.exists()) { return false; } - return (configuration.getFile().lastModified() > lastModified); + return (file.lastModified() > lastModified); + } + + /** + * Returns the file that is monitored by this strategy. Note that the return + * value can be <b>null </b> under some circumstances. + * + * @return the monitored file + */ + protected File getFile() + { + return (configuration.getURL() != null) ? fileFromURL(configuration + .getURL()) : configuration.getFile(); } + /** + * Helper method for transforming a URL into a file object. This method + * handles file: and jar: URLs. + * + * @param url the URL to be converted + * @return the resulting file or <b>null </b> + */ + private File fileFromURL(URL url) + { + if (JAR_PROTOCOL.equals(url.getProtocol())) + { + String path = url.getPath(); + try + { + return ConfigurationUtils.fileFromURL(new URL(path.substring(0, + path.indexOf('!')))); + } + catch (MalformedURLException mex) + { + return null; + } + } + else + { + return ConfigurationUtils.fileFromURL(url); + } + } } Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/reloading/TestFileChangedReloadingStrategy.java URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/reloading/TestFileChangedReloadingStrategy.java?rev=179993&r1=179992&r2=179993&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/reloading/TestFileChangedReloadingStrategy.java (original) +++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/reloading/TestFileChangedReloadingStrategy.java Sat Jun 4 07:21:39 2005 @@ -21,6 +21,7 @@ import junit.framework.TestCase; import org.apache.commons.configuration.PropertiesConfiguration; +import org.apache.commons.configuration.XMLConfiguration; /** * Test case for the ReloadableConfiguration class. @@ -102,4 +103,34 @@ assertEquals("refresh delay", 500, strategy.getRefreshDelay()); } + /** + * Tests if a file from the classpath can be monitored. + */ + public void testFromClassPath() throws Exception + { + PropertiesConfiguration config = new PropertiesConfiguration(); + config.setFileName("test.properties"); + config.load(); + assertTrue(config.getBoolean("configuration.loaded")); + FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy(); + config.setReloadingStrategy(strategy); + assertEquals(config.getURL(), strategy.getFile().toURL()); + } + + /** + * Tests to watch a configuration file in a jar. In this case the jar file + * itself should be monitored. + */ + public void testFromJar() throws Exception + { + XMLConfiguration config = new XMLConfiguration(); + config.setFileName("test-jar.xml"); + config.load(); + FileChangedReloadingStrategy strategy = new FileChangedReloadingStrategy(); + config.setReloadingStrategy(strategy); + File file = strategy.getFile(); + assertNotNull(file); + assertTrue(file.exists()); + assertEquals("resources.jar", file.getName()); + } } Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?rev=179993&r1=179992&r2=179993&view=diff ============================================================================== --- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original) +++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Sat Jun 4 07:21:39 2005 @@ -23,6 +23,16 @@ <body> <release version="1.2-dev" date="in SVN"> + <action dev="oheger" type="update" issue="34289"> + Updated FileChangedReloadingStrategy to use the file based configuration's + source URL to find the file to watch. Before that it was possible that + the strategy checked the wrong file. For configuration files loaded + from a jar FileChangedReloadingStrategy now checks the jar file itself + for changes. Finally a bug was fixed which caused the strategy to + check the watched file's last change date on every invocation of its + reloadingRequired() method ignoring its refresh delay. Thanks to Jorge + Ferrer. + </action> <action dev="oheger" type="update" issue="35118"> Fixed a bug in the collaboration between XMLConfiguration and its reloading strategy: The configuration did not check its reloading --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]