You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by rg...@apache.org on 2009/06/16 19:57:42 UTC
svn commit: r785326 - in /commons/proper/configuration/trunk/src:
java/org/apache/commons/configuration/VFSFileSystem.java
test/org/apache/commons/configuration/TestWebdavConfigurationBuilder.java
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