Author: rgoers Date: Tue Jun 16 17:57:42 2009 New Revision: 785326 URL: http://svn.apache.org/viewvc?rev=785326&view=rev Log: VFSFileReloadingStrategy fails when filename is a full url
Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/VFSFileSystem.java commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestWebdavConfigurationBuilder.java Modified: commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/VFSFileSystem.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/VFSFileSystem.java?rev=785326&r1=785325&r2=785326&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/VFSFileSystem.java (original) +++ commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/VFSFileSystem.java Tue Jun 16 17:57:42 2009 @@ -196,7 +196,11 @@ } } - if (basePath != null) + if (UriParser.extractScheme(fileName) != null) + { + return fileName; + } + else if (basePath != null) { FileName base = fsManager.resolveURI(basePath); return fsManager.resolveName(base, fileName).getURI(); Modified: commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestWebdavConfigurationBuilder.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestWebdavConfigurationBuilder.java?rev=785326&r1=785325&r2=785326&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestWebdavConfigurationBuilder.java (original) +++ commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestWebdavConfigurationBuilder.java Tue Jun 16 17:57:42 2009 @@ -18,6 +18,11 @@ import java.io.File; import java.io.IOException; +import java.io.Reader; +import java.io.FileReader; +import java.io.Writer; +import java.io.FileWriter; +import java.io.OutputStreamWriter; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -27,8 +32,17 @@ import org.apache.commons.configuration.beanutils.BeanHelper; import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy; +import org.apache.commons.configuration.reloading.VFSFileMonitorReloadingStrategy; import org.apache.commons.configuration.tree.DefaultConfigurationNode; import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine; +import org.apache.commons.configuration.event.ConfigurationEvent; +import org.apache.commons.configuration.event.ConfigurationListener; +import org.apache.commons.vfs.FileObject; +import org.apache.commons.vfs.FileSystemManager; +import org.apache.commons.vfs.VFS; +import org.apache.commons.vfs.FileName; +import org.apache.commons.vfs.FileSystemOptions; +import org.apache.commons.vfs.FileContent; /** * Test class for DefaultConfigurationBuilder. @@ -36,7 +50,8 @@ * @author Oliver Heger * @version $Id$ */ -public class TestWebdavConfigurationBuilder extends TestCase implements FileOptionsProvider +public class TestWebdavConfigurationBuilder extends TestCase + implements FileOptionsProvider, ConfigurationListener { /** Test configuration definition file. */ private static final String TEST_FILE = @@ -78,6 +93,15 @@ private static final String MULTI_TENENT_FILE = "testMultiTenentConfigurationBuilder.xml"; + private static final String FILEMONITOR2_FILE = + "testFileMonitorConfigurationBuilder2.xml"; + + private static final String FILEMONITOR_1001_FILE = + "testwrite/testMultiConfiguration_1001.xml"; + + private static final String FILEMONITOR_1002_FILE = + "testwrite/testMultiConfiguration_1002.xml"; + private static final String TEST_PROPERTIES = "test.properties.xml"; private static final String TEST_SAVE = "testsave.xml"; @@ -87,6 +111,9 @@ private Map options; + /** true when a file is changed */ + private boolean configChanged = false; + /** Stores the object to be tested. */ DefaultConfigurationBuilder factory; @@ -105,6 +132,7 @@ "org.apache.commons.configuration.MockInitialContextFactory"); System.setProperty("test_file_xml", "test.xml"); System.setProperty("test_file_combine", "testcombine1.xml"); + System.setProperty("basePath", getBasePath()); FileSystem fs = new VFSFileSystem(); fs.setFileOptionsProvider(this); FileSystem.setDefaultFileSystem(fs); @@ -872,6 +900,66 @@ verify("1005", config, 50); } + public void testFileMonitor1() throws Exception + { + // create a new configuration + File input = new File("target/test-classes/testMultiConfiguration_1001.xml"); + FileObject output = getFile(getBasePath() + FILEMONITOR_1001_FILE); + output.delete(); + output.getParent().createFolder(); + copyFile(input, output); + + factory.setFileName(getBasePath() + FILEMONITOR2_FILE); + System.getProperties().remove("Id"); + + CombinedConfiguration config = factory.getConfiguration(true); + assertNotNull(config); + config.addConfigurationListener(this); + verify("1001", config, 15); + + // Allow time for FileMonitor to set up. + Thread.sleep(1000); + XMLConfiguration x = new XMLConfiguration(getBasePath() + FILEMONITOR_1001_FILE); + x.setProperty("rowsPerPage", "50"); + x.save(); + // Let FileMonitor detect the change. + //Thread.sleep(2000); + waitForChange(); + verify("1001", config, 50); + output.delete(); + VFSFileMonitorReloadingStrategy.stopMonitor(); + } + + public void testFileMonitor2() throws Exception + { + // create a new configuration + File input = new File("target/test-classes/testMultiConfiguration_1002.xml"); + FileObject output = getFile(getBasePath() + FILEMONITOR_1002_FILE); + output.delete(); + + factory.setFileName(getBasePath() + FILEMONITOR2_FILE); + System.getProperties().remove("Id"); + + CombinedConfiguration config = factory.getConfiguration(true); + assertNotNull(config); + config.addConfigurationListener(this); + + verify("1002", config, 50); + Thread.sleep(1000); + + output.getParent().createFolder(); + copyFile(input, output); + + // Allow time for the monitor to notice the change. + //Thread.sleep(2000); + waitForChange(); + verify("1002", config, 25); + output.delete(); + VFSFileMonitorReloadingStrategy.stopMonitor(); + } + + + private void verify(String key, CombinedConfiguration config, int rows) { System.setProperty("Id", key); @@ -897,4 +985,63 @@ newConfig.load(); ConfigurationAssert.assertEquals(conf, newConfig); } + + private FileObject getFile(String fileName) throws Exception + { + FileSystemManager manager = VFS.getManager(); + FileName file = manager.resolveURI(fileName); + FileName base = file.getParent(); + FileName path = manager.resolveName(base, file.getBaseName()); + FileSystemOptions opts = new FileSystemOptions(); + return manager.resolveFile(path.getURI(), opts); + } + + private void copyFile(File input, FileObject output) throws IOException + { + Reader reader = new FileReader(input); + Writer writer = new OutputStreamWriter(output.getContent().getOutputStream()); + char[] buffer = new char[4096]; + int n = 0; + while (-1 != (n = reader.read(buffer))) + { + writer.write(buffer, 0, n); + } + reader.close(); + writer.close(); + } + + private void waitForChange() + { + synchronized(this) + { + try + { + int count = 0; + while (!configChanged && count++ <= 3) + { + this.wait(5000); + } + } + catch (InterruptedException ie) + { + throw new IllegalStateException("wait timed out"); + } + finally + { + configChanged = false; + } + } + } + + public void configurationChanged(ConfigurationEvent event) + { + if (event.getType() == AbstractFileConfiguration.EVENT_CONFIG_CHANGED) + { + synchronized(this) + { + configChanged = true; + this.notify(); + } + } + } } \ No newline at end of file