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/09 08:43:38 UTC
svn commit: r782896 - in
/commons/proper/configuration/branches/configuration2_experimental/src:
main/java/org/apache/commons/configuration2/
main/java/org/apache/commons/configuration2/event/
main/java/org/apache/commons/configuration2/reloading/ test...
Author: rgoers
Date: Tue Jun 9 06:43:38 2009
New Revision: 782896
URL: http://svn.apache.org/viewvc?rev=782896&view=rev
Log:
VFSFileMonitorReloadingStrategy was not able to detect files with invalid urls - see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6351751. make HttpOutputStream and VFSURLStreamHandler private. Limit VerifiableOutputStream to package scope
Added:
commons/proper/configuration/branches/configuration2_experimental/src/test/resources/log4j-test.xml
commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml (with props)
Removed:
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/HttpOutputStream.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/VFSURLStreamHandler.java
Modified:
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractFileConfiguration.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalFileConfiguration.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/CombinedConfiguration.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/ConfigurationUtils.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DefaultFileSystem.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/VFSFileSystem.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/event/EventSource.java
commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/reloading/VFSFileMonitorReloadingStrategy.java
commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/ConfigurationAssert.java
commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestConfigurationFactory.java
commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestFileConfiguration.java
commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestVFSConfigurationBuilder.java
commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/reloading/TestVFSFileMonitorReloadingStrategy.java
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractFileConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractFileConfiguration.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractFileConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractFileConfiguration.java Tue Jun 9 06:43:38 2009
@@ -84,6 +84,12 @@
/** Constant for the configuration reload event.*/
public static final int EVENT_RELOAD = 20;
+ /** Constant fro the configuration changed event. */
+ public static final int EVENT_CONFIG_CHANGED = 21;
+
+ /** The root of the file scheme */
+ private static final String FILE_SCHEME = "file:";
+
/** Stores the file name.*/
protected String fileName;
@@ -555,6 +561,10 @@
*/
public void setFileName(String fileName)
{
+ if (fileName != null && fileName.startsWith(FILE_SCHEME) && !fileName.startsWith("file://"))
+ {
+ fileName = "file://" + fileName.substring(FILE_SCHEME.length());
+ }
sourceURL = null;
this.fileName = fileName;
}
@@ -588,6 +598,10 @@
*/
public void setBasePath(String basePath)
{
+ if (basePath != null && basePath.startsWith(FILE_SCHEME) && !basePath.startsWith("file://"))
+ {
+ basePath = "file://" + basePath.substring(FILE_SCHEME.length());
+ }
sourceURL = null;
this.basePath = basePath;
}
@@ -825,6 +839,14 @@
}
/**
+ * Send notification that the configuration has changed.
+ */
+ public void configurationChanged()
+ {
+ fireEvent(EVENT_CONFIG_CHANGED, null, getURL(), true);
+ }
+
+ /**
* Enters the "No reloading mode". As long as this mode is active
* no reloading will be performed. This is necessary for some
* implementations of <code>save()</code> in derived classes, which may
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalFileConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalFileConfiguration.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalFileConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/AbstractHierarchicalFileConfiguration.java Tue Jun 9 06:43:38 2009
@@ -46,7 +46,7 @@
*/
public abstract class AbstractHierarchicalFileConfiguration
extends InMemoryConfiguration
-implements FileConfiguration, ConfigurationListener
+implements FileConfiguration, ConfigurationListener, FileSystemBased
{
/** Stores the delegate used for implementing functionality related to the
* <code>FileConfiguration</code> interface.
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/CombinedConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/CombinedConfiguration.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/CombinedConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/CombinedConfiguration.java Tue Jun 9 06:43:38 2009
@@ -522,7 +522,11 @@
*/
public void configurationChanged(ConfigurationEvent event)
{
- if (!event.isBeforeUpdate())
+ if (event.getType() == AbstractFileConfiguration.EVENT_CONFIG_CHANGED)
+ {
+ fireEvent(event.getType(), event.getPropertyName(), event.getPropertyValue(), event.isBeforeUpdate());
+ }
+ else if (!event.isBeforeUpdate())
{
invalidate();
}
@@ -845,7 +849,7 @@
.convertToHierarchical(getConfiguration());
root = hc.getRootNode();
}
-
+
// Copy data of the root node to the new path
atParent.appendChildren(root);
atParent.appendAttributes(root);
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/ConfigurationUtils.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/ConfigurationUtils.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/ConfigurationUtils.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/ConfigurationUtils.java Tue Jun 9 06:43:38 2009
@@ -53,6 +53,9 @@
/** Constant for the resource path separator.*/
static final String RESOURCE_PATH_SEPARATOR = "/";
+ /** Constanct for the file URL protocol */
+ private static final String FILE_SCHEME = "file:";
+
/** Constant for the name of the clone() method.*/
private static final String METHOD_CLONE = "clone";
@@ -521,6 +524,10 @@
}
String s = url.toString();
+ if (s.startsWith(FILE_SCHEME) && !s.startsWith("file://"))
+ {
+ s = "file://" + s.substring(FILE_SCHEME.length());
+ }
if (s.endsWith("/") || StringUtils.isEmpty(url.getPath()))
{
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DefaultFileSystem.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DefaultFileSystem.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DefaultFileSystem.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DefaultFileSystem.java Tue Jun 9 06:43:38 2009
@@ -278,4 +278,69 @@
}
}
}
+
+ /**
+ * Wraps the output stream so errors can be detected in the HTTP response.
+ *
+ * @author <a
+ * href="http://commons.apache.org/configuration/team-list.html">Commons Configuration team</a>
+ * @since 1.7
+ */
+ private static class HttpOutputStream extends VerifiableOutputStream
+ {
+ /**
+ * The wrapped OutputStream
+ */
+ private final OutputStream stream;
+
+ /**
+ * The HttpURLConnection
+ */
+ private final HttpURLConnection connection;
+
+ public HttpOutputStream(OutputStream stream, HttpURLConnection connection)
+ {
+ this.stream = stream;
+ this.connection = connection;
+ }
+
+ public void write(byte[] bytes) throws IOException
+ {
+ stream.write(bytes);
+ }
+
+ public void write(byte[] bytes, int i, int i1) throws IOException
+ {
+ stream.write(bytes, i, i1);
+ }
+
+ public void flush() throws IOException
+ {
+ stream.flush();
+ }
+
+ public void close() throws IOException
+ {
+ stream.close();
+ }
+
+ public void write(int i) throws IOException
+ {
+ stream.write(i);
+ }
+
+ public String toString()
+ {
+ return stream.toString();
+ }
+
+ public void verify() throws IOException
+ {
+ if (connection.getResponseCode() >= HttpURLConnection.HTTP_BAD_REQUEST)
+ {
+ throw new IOException("HTTP Error " + connection.getResponseCode()
+ + " " + connection.getResponseMessage());
+ }
+ }
+ }
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/DynamicCombinedConfiguration.java Tue Jun 9 06:43:38 2009
@@ -610,7 +610,7 @@
return super.removeConfigurationListener(l);
}
- public Collection getConfigurationListeners()
+ public Collection<ConfigurationListener> getConfigurationListeners()
{
return super.getConfigurationListeners();
}
@@ -651,7 +651,7 @@
super.clearErrorListeners();
}
- public Collection getErrorListeners()
+ public Collection<ConfigurationErrorListener> getErrorListeners()
{
return super.getErrorListeners();
}
@@ -746,23 +746,17 @@
config.setExpressionEngine(this.getExpressionEngine());
config.setDelimiterParsingDisabled(isDelimiterParsingDisabled());
config.setListDelimiter(getListDelimiter());
- Iterator iter = config.getErrorListeners().iterator();
- while (iter.hasNext())
+ for (ConfigurationErrorListener listener : getErrorListeners())
{
- ConfigurationErrorListener listener = (ConfigurationErrorListener) iter.next();
config.addErrorListener(listener);
}
- iter = config.getConfigurationListeners().iterator();
- while (iter.hasNext())
+ for (ConfigurationListener listener : getConfigurationListeners())
{
- ConfigurationListener listener = (ConfigurationListener) iter.next();
config.addConfigurationListener(listener);
}
config.setForceReloadCheck(isForceReloadCheck());
- iter = configurations.iterator();
- while (iter.hasNext())
+ for (ConfigData data : configurations)
{
- ConfigData data = (ConfigData) iter.next();
config.addConfiguration(data.getConfiguration(), data.getName(),
data.getAt());
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/VFSFileSystem.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/VFSFileSystem.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/VFSFileSystem.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/VFSFileSystem.java Tue Jun 9 06:43:38 2009
@@ -33,9 +33,11 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.io.File;
+import java.io.IOException;
import java.net.URL;
import java.net.URLStreamHandler;
import java.net.MalformedURLException;
+import java.net.URLConnection;
import java.util.Map;
/**
@@ -426,4 +428,23 @@
}
return opts;
}
+
+ /**
+ * Stream handler required to create URL.
+ */
+ private static class VFSURLStreamHandler extends URLStreamHandler
+ {
+ /** The Protocol used */
+ private final String protocol;
+
+ public VFSURLStreamHandler(FileName file)
+ {
+ this.protocol = file.getScheme();
+ }
+
+ protected URLConnection openConnection(URL url) throws IOException
+ {
+ throw new IOException("VFS URLs can only be used with VFS APIs");
+ }
+ }
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/event/EventSource.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/event/EventSource.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/event/EventSource.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/event/EventSource.java Tue Jun 9 06:43:38 2009
@@ -70,10 +70,10 @@
public class EventSource
{
/** A collection for the registered event listeners. */
- private Collection listeners;
+ private Collection<ConfigurationListener> listeners;
/** A collection for the registered error listeners.*/
- private Collection errorListeners;
+ private Collection<ConfigurationErrorListener> errorListeners;
/** A counter for the detail events. */
private int detailEvents;
@@ -117,7 +117,7 @@
* of the currently registered listeners; manipulating it has no effect
* on this event source object)
*/
- public Collection getConfigurationListeners()
+ public Collection<ConfigurationListener> getConfigurationListeners()
{
return doGetListeners(listeners);
}
@@ -211,7 +211,7 @@
* snapshot of the currently registered listeners; it cannot be manipulated)
* @since 1.4
*/
- public Collection getErrorListeners()
+ public Collection<ConfigurationErrorListener> getErrorListeners()
{
return doGetListeners(errorListeners);
}
@@ -279,7 +279,7 @@
*/
protected void fireError(int type, String propName, Object propValue, Throwable ex)
{
- Collection listenersToCall = null;
+ Collection<ConfigurationErrorListener> listenersToCall = null;
synchronized (errorListeners)
{
@@ -287,7 +287,7 @@
{
// Copy listeners to another collection so that manipulating
// the listener list during event delivery won't cause problems
- listenersToCall = new ArrayList(errorListeners);
+ listenersToCall = new ArrayList<ConfigurationErrorListener>(errorListeners);
}
}
@@ -403,7 +403,7 @@
*/
private void initListeners()
{
- listeners = new LinkedList();
- errorListeners = new LinkedList();
+ listeners = new LinkedList<ConfigurationListener>();
+ errorListeners = new LinkedList<ConfigurationErrorListener>();
}
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/reloading/VFSFileMonitorReloadingStrategy.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/reloading/VFSFileMonitorReloadingStrategy.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/reloading/VFSFileMonitorReloadingStrategy.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/reloading/VFSFileMonitorReloadingStrategy.java Tue Jun 9 06:43:38 2009
@@ -20,6 +20,7 @@
import org.apache.commons.configuration2.ConfigurationRuntimeException;
import org.apache.commons.configuration2.FileSystem;
import org.apache.commons.configuration2.FileSystemBased;
+import org.apache.commons.configuration2.AbstractFileConfiguration;
import org.apache.commons.vfs.impl.DefaultFileMonitor;
import org.apache.commons.vfs.FileListener;
import org.apache.commons.vfs.FileChangeEvent;
@@ -113,6 +114,25 @@
{
throw new IllegalStateException("No configuration has been set for this strategy");
}
+ FileObject file;
+
+ try
+ {
+ FileSystemManager fsManager = VFS.getManager();
+ FileSystem fs = ((FileSystemBased) configuration).getFileSystem();
+ String uri = fs.getPath(null, configuration.getURL(), configuration.getBasePath(),
+ configuration.getFileName());
+ if (uri == null)
+ {
+ throw new ConfigurationRuntimeException("Unable to determine file to monitor");
+ }
+ file = fsManager.resolveFile(uri);
+ }
+ catch (FileSystemException fse)
+ {
+ String msg = "Unable to monitor " + configuration.getURL().toString();
+ throw new ConfigurationRuntimeException(msg, fse);
+ }
synchronized (INIT_GATE)
{
if (fm == null)
@@ -130,35 +150,17 @@
fm.setDelay(delay);
}
}
- }
-
- try
- {
- FileSystemManager fsManager = VFS.getManager();
- FileSystem fs = ((FileSystemBased) configuration).getFileSystem();
- String uri = fs.getPath(null, configuration.getURL(), configuration.getBasePath(),
- configuration.getFileName());
- if (uri == null)
- {
- throw new ConfigurationRuntimeException("Unable to determine file to monitor");
- }
- FileObject file = fsManager.resolveFile(uri);
file.getFileSystem().addListener(file, this);
fm.addFile(file);
strategies.put(file, this);
}
- catch (FileSystemException fse)
- {
- String msg = "Unable to monitor " + configuration.getURL().toString();
- throw new ConfigurationRuntimeException(msg, fse);
- }
}
/**
- * Shutdown the reloading strategy
+ * Shutdown all reloading strategies
*/
- public void stopMonitor()
+ public static void stopMonitor()
{
synchronized (INIT_GATE)
{
@@ -204,6 +206,7 @@
public void fileCreated(FileChangeEvent event) throws Exception
{
reloadRequired = true;
+ fireEvent();
}
/**
@@ -224,6 +227,14 @@
public void fileChanged(FileChangeEvent event) throws Exception
{
reloadRequired = true;
+ fireEvent();
}
+ private void fireEvent()
+ {
+ if (configuration instanceof AbstractFileConfiguration)
+ {
+ ((AbstractFileConfiguration) configuration).configurationChanged();
+ }
+ }
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/ConfigurationAssert.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/ConfigurationAssert.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/ConfigurationAssert.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/ConfigurationAssert.java Tue Jun 9 06:43:38 2009
@@ -33,7 +33,7 @@
public class ConfigurationAssert
{
/** Constant for the name of the directory with the test files. */
- public static final String TEST_DIR_NAME = "src/test/resources";
+ public static final String TEST_DIR_NAME = "target/test-classes";
/** Constant for the name of the directory with the output files. */
public static final String OUT_DIR_NAME = "target";
Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestConfigurationFactory.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestConfigurationFactory.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestConfigurationFactory.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestConfigurationFactory.java Tue Jun 9 06:43:38 2009
@@ -21,6 +21,7 @@
import java.io.FileWriter;
import java.util.Collection;
import java.util.List;
+import java.net.URI;
import junit.framework.TestCase;
import org.xml.sax.SAXException;
@@ -309,7 +310,7 @@
factory = new DefaultConfigurationBuilder();
factory.setURL(testDigesterFile.toURL());
- assertEquals(testDigesterFile.getParentFile().toURL().toString(), factory.getBasePath());
+ assertEquals(testDigesterFile.getParentFile().toURI(), new URI(factory.getBasePath()));
}
// Tests if system properties can be resolved in the configuration
Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestFileConfiguration.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestFileConfiguration.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestFileConfiguration.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestFileConfiguration.java Tue Jun 9 06:43:38 2009
@@ -55,9 +55,9 @@
assertEquals("base path", "http://commons.apache.org/configuration/", config.getBasePath());
assertEquals("file name", "index.html", config.getFileName());
- // file URL
+ // file URL - This url is invalid, a valid url would be file:///temp/test.properties.
config.setURL(new URL("file:/temp/test.properties"));
- assertEquals("base path", "file:/temp/", config.getBasePath());
+ assertEquals("base path", "file:///temp/", config.getBasePath());
assertEquals("file name", "test.properties", config.getFileName());
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestVFSConfigurationBuilder.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestVFSConfigurationBuilder.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestVFSConfigurationBuilder.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/TestVFSConfigurationBuilder.java Tue Jun 9 06:43:38 2009
@@ -26,13 +26,19 @@
import java.util.Collection;
import java.util.Set;
import java.util.List;
+import java.util.logging.ConsoleHandler;
+import java.util.logging.Logger;
+import java.util.logging.Level;
import junit.framework.TestCase;
import org.apache.commons.configuration2.beanutils.BeanHelper;
import org.apache.commons.configuration2.reloading.FileChangedReloadingStrategy;
+import org.apache.commons.configuration2.reloading.VFSFileMonitorReloadingStrategy;
import org.apache.commons.configuration2.tree.DefaultConfigurationNode;
import org.apache.commons.configuration2.tree.xpath.XPathExpressionEngine;
+import org.apache.commons.configuration2.event.ConfigurationListener;
+import org.apache.commons.configuration2.event.ConfigurationEvent;
/**
* Test class for DefaultConfigurationBuilder.
@@ -40,7 +46,7 @@
* @author Oliver Heger
* @version $Id$
*/
-public class TestVFSConfigurationBuilder extends TestCase
+public class TestVFSConfigurationBuilder extends TestCase implements ConfigurationListener
{
/** Test configuration definition file. */
private static final File TEST_FILE = ConfigurationAssert
@@ -88,12 +94,28 @@
private static final File FILEMONITOR_FILE = ConfigurationAssert
.getTestFile("testFileMonitorConfigurationBuilder.xml");
+ private static final File FILEMONITOR2_FILE = ConfigurationAssert
+ .getTestFile("testFileMonitorConfigurationBuilder2.xml");
+
+ private static final String FILEMONITOR_URI = "file://" + System.getProperty("user.dir")
+ + "/target/test-classes/testFileMonitorConfigurationBuilder2.xml";
+
/** Constant for the name of an optional configuration.*/
private static final String OPTIONAL_NAME = "optionalConfig";
+ /** true when a file is changed */
+ private boolean configChanged = false;
+
/** Stores the object to be tested. */
private DefaultConfigurationBuilder factory;
+ public TestVFSConfigurationBuilder()
+ {
+ super();
+ //System.setProperty("log4j.configuration", "log4j-test.xml");
+ VFSFileMonitorReloadingStrategy.stopMonitor();
+ }
+
@Override
protected void setUp() throws Exception
{
@@ -103,6 +125,7 @@
"org.apache.commons.configuration2.MockInitialContextFactory");
System.setProperty("test_file_xml", "test.xml");
System.setProperty("test_file_combine", "testcombine1.xml");
+ System.setProperty("basePath", "file://" + System.getProperty("user.dir") + "/target/test-classes");
FileSystem.setDefaultFileSystem(new VFSFileSystem());
factory = new DefaultConfigurationBuilder();
factory.clearErrorListeners(); // avoid exception messages
@@ -970,7 +993,7 @@
}
}
- public void testFileMonitor() throws Exception
+ public void testFileMonitor1() throws Exception
{
// create a new configuration
@@ -985,6 +1008,74 @@
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(output);
+ x.setProperty("rowsPerPage", "50");
+ x.save();
+
+ 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");
+ File output = new File("target/test-classes/testwrite/testMultiConfiguration_1002.xml");
+ output.delete();
+
+ factory.setFile(FILEMONITOR_FILE);
+ FileSystem.resetDefaultFileSystem();
+ System.getProperties().remove("Id");
+
+ CombinedConfiguration config = factory.getConfiguration(true);
+ config.addConfigurationListener(this);
+ assertNotNull(config);
+
+ verify("1002", config, 50);
+ Thread.sleep(1000);
+
+ output.getParentFile().mkdir();
+ copyFile(input, output);
+
+ // Allow time for the monitor to notice the change.
+ //Thread.sleep(2000);
+ waitForChange();
+ try
+ {
+ verify("1002", config, 25);
+ }
+ finally
+ {
+ output.delete();
+ VFSFileMonitorReloadingStrategy.stopMonitor();
+ }
+ }
+
+
+ public void testFileMonitor3() throws Exception
+ {
+ // create a new configuration
+ File input = new File("target/test-classes/testMultiConfiguration_1001.xml");
+ File output = new File("target/test-classes/testwrite/testMultiConfiguration_1001.xml");
+ output.delete();
+ output.getParentFile().mkdir();
+ copyFile(input, output);
+
+ factory.setFile(FILEMONITOR2_FILE);
+ FileSystem.resetDefaultFileSystem();
+ System.getProperties().remove("Id");
+
+ CombinedConfiguration config = factory.getConfiguration(true);
+ //config.setLogger(logger);
+ assertNotNull(config);
+ config.addConfigurationListener(this);
verify("1001", config, 15);
// Allow time for FileMonitor to set up.
@@ -993,8 +1084,40 @@
x.setProperty("rowsPerPage", "50");
x.save();
// Let FileMonitor detect the change.
- Thread.sleep(2000);
+ //Thread.sleep(2000);
+ waitForChange();
verify("1001", config, 50);
+ output.delete();
+ VFSFileMonitorReloadingStrategy.stopMonitor();
+ }
+
+ public void testFileMonitor4() throws Exception
+ {
+ // create a new configuration
+ File input = new File("target/test-classes/testMultiConfiguration_1002.xml");
+ File output = new File("target/test-classes/testwrite/testMultiConfiguration_1002.xml");
+ output.delete();
+
+ factory.setFileName(FILEMONITOR_URI);
+ FileSystem.resetDefaultFileSystem();
+ System.getProperties().remove("Id");
+
+ CombinedConfiguration config = factory.getConfiguration(true);
+ assertNotNull(config);
+ config.addConfigurationListener(this);
+
+ verify("1002", config, 50);
+ Thread.sleep(1000);
+
+ output.getParentFile().mkdir();
+ 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 copyFile(File input, File output) throws IOException
@@ -1018,4 +1141,39 @@
int actual = config.getInt("rowsPerPage");
assertTrue("expected: " + rows + " actual: " + actual, actual == rows);
}
+
+ 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();
+ }
+ }
+ }
}
Modified: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/reloading/TestVFSFileMonitorReloadingStrategy.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/reloading/TestVFSFileMonitorReloadingStrategy.java?rev=782896&r1=782895&r2=782896&view=diff
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/reloading/TestVFSFileMonitorReloadingStrategy.java (original)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/reloading/TestVFSFileMonitorReloadingStrategy.java Tue Jun 9 06:43:38 2009
@@ -28,6 +28,9 @@
import org.apache.commons.configuration2.XMLConfiguration;
import org.apache.commons.configuration2.FileSystem;
import org.apache.commons.configuration2.VFSFileSystem;
+import org.apache.commons.configuration2.AbstractFileConfiguration;
+import org.apache.commons.configuration2.event.ConfigurationListener;
+import org.apache.commons.configuration2.event.ConfigurationEvent;
/**
* Test case for the VFSFileMonitorReloadingStrategy class.
@@ -36,9 +39,10 @@
* @version $Revision: $
*/
public class TestVFSFileMonitorReloadingStrategy extends TestCase
+ implements ConfigurationListener
{
- /** Constant for the name of a test properties file.*/
- private static final String TEST_FILE = "test.properties";
+ /** true when a file is changed */
+ private boolean configChanged = false;
protected void setUp() throws Exception
{
@@ -106,6 +110,7 @@
PropertiesConfiguration config = new PropertiesConfiguration();
config.setFile(file);
+ config.addConfigurationListener(this);
VFSFileMonitorReloadingStrategy strategy = new VFSFileMonitorReloadingStrategy();
strategy.setDelay(500);
config.setReloadingStrategy(strategy);
@@ -118,14 +123,20 @@
out.flush();
out.close();
- Thread.sleep(2000);
+ waitForChange();
// test the automatic reloading
- assertEquals("Modified value with enabled reloading", "value1", config.getString("string"));
- strategy.stopMonitor();
- if (file.exists())
+ try
{
- file.delete();
+ assertEquals("Modified value with enabled reloading", "value1", config.getString("string"));
+ }
+ finally
+ {
+ strategy.stopMonitor();
+ if (file.exists())
+ {
+ file.delete();
+ }
}
}
@@ -179,4 +190,39 @@
file.delete();
}
}
+ 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
Added: commons/proper/configuration/branches/configuration2_experimental/src/test/resources/log4j-test.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/resources/log4j-test.xml?rev=782896&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/resources/log4j-test.xml (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/resources/log4j-test.xml Tue Jun 9 06:43:38 2009
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+ <appender name="console" class="org.apache.log4j.ConsoleAppender">
+ <param name="Target" value="System.out"/>
+ <layout class="org.apache.log4j.PatternLayout">
+ <param name="ConversionPattern" value="%-5p %c{1} - %m%n"/>
+ </layout>
+ </appender>
+
+ <root>
+ <priority value ="debug" />
+ <appender-ref ref="console" />
+ </root>
+
+</log4j:configuration>
\ No newline at end of file
Added: commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml?rev=782896&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml Tue Jun 9 06:43:38 2009
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!-- Test configuration definition file that demonstrates complex initialization -->
+<configuration>
+ <header>
+ <result delimiterParsingDisabled="true" forceReloadCheck="true"
+ config-class="org.apache.commons.configuration2.DynamicCombinedConfiguration"
+ keyPattern="$${sys:Id}">
+ <nodeCombiner config-class="org.apache.commons.configuration2.tree.MergeCombiner"/>
+ <expressionEngine
+ config-class="org.apache.commons.configuration2.tree.xpath.XPathExpressionEngine"/>
+ </result>
+ <fileSystem config-class="org.apache.commons.configuration2.VFSFileSystem"/>
+ <providers>
+ <provider config-tag="multifile"
+ config-class="org.apache.commons.configuration2.DefaultConfigurationBuilder$FileConfigurationProvider"
+ configurationClass="org.apache.commons.configuration2.MultiFileHierarchicalConfiguration"/>
+ </providers>
+ </header>
+ <override>
+ <multifile filePattern="${sys:basePath}/testwrite/testMultiConfiguration_$$${sys:Id}.xml"
+ config-name="clientConfig" delimiterParsingDisabled="true" schemaValidation="false">
+ <expressionEngine
+ config-class="org.apache.commons.configuration2.expr.xpath.XPathExpressionEngine"/>
+ <reloadingStrategy delay="500"
+ config-class="org.apache.commons.configuration2.reloading.VFSFileMonitorReloadingStrategy"/>
+ </multifile>
+ <xml fileName="testMultiConfiguration_default.xml"
+ config-name="defaultConfig" delimiterParsingDisabled="true">
+ <expressionEngine
+ config-class="org.apache.commons.configuration2.expr.xpath.XPathExpressionEngine"/>
+ <reloadingStrategy
+ config-class="org.apache.commons.configuration2.reloading.VFSFileMonitorReloadingStrategy"/>
+ </xml>
+ </override>
+</configuration>
\ No newline at end of file
Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/resources/testFileMonitorConfigurationBuilder2.xml
------------------------------------------------------------------------------
svn:mime-type = text/xml