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