You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by oh...@apache.org on 2006/12/08 19:30:17 UTC
svn commit: r484692 - in /jakarta/commons/proper/configuration/trunk:
src/java/org/apache/commons/configuration/CombinedConfiguration.java
src/test/org/apache/commons/configuration/TestCombinedConfiguration.java
xdocs/changes.xml
Author: oheger
Date: Fri Dec 8 10:30:15 2006
New Revision: 484692
URL: http://svn.apache.org/viewvc?view=rev&rev=484692
Log:
Added new forceReloadCheck property to CombinedConfiguration; fix for CONFIGURATION-240
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CombinedConfiguration.java
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCombinedConfiguration.java
jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CombinedConfiguration.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CombinedConfiguration.java?view=diff&rev=484692&r1=484691&r2=484692
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CombinedConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/CombinedConfiguration.java Fri Dec 8 10:30:15 2006
@@ -118,6 +118,9 @@
/** Constant for the default node combiner. */
private static final NodeCombiner DEFAULT_COMBINER = new UnionCombiner();
+ /** Constant for the name of the property used for the reload check.*/
+ private static final String PROP_RELOAD_CHECK = "CombinedConfigurationReloadCheck";
+
/** Stores the combiner. */
private NodeCombiner nodeCombiner;
@@ -130,6 +133,9 @@
/** Stores a map with the named configurations. */
private Map namedConfigurations;
+ /** A flag whether an enhanced reload check is to be performed.*/
+ private boolean forceReloadCheck;
+
/**
* Creates a new instance of <code>CombinedConfiguration</code> and
* initializes the combiner to be used.
@@ -186,6 +192,34 @@
}
/**
+ * Returns a flag whether an enhanced reload check must be performed.
+ *
+ * @return the force reload check flag
+ * @since 1.4
+ */
+ public boolean isForceReloadCheck()
+ {
+ return forceReloadCheck;
+ }
+
+ /**
+ * Sets the force reload check flag. If this flag is set, each property
+ * access on this configuration will cause a reload check on the contained
+ * configurations. This is a workaround for a problem with some reload
+ * implementations that only check if a reload is required when they are
+ * triggered. Per default this mode is disabled. If the force reload check
+ * flag is set to <b>true</b>, accessing properties will be less
+ * performant, but reloads on contained configurations will be detected.
+ *
+ * @param forceReloadCheck the value of the flag
+ * @since 1.4
+ */
+ public void setForceReloadCheck(boolean forceReloadCheck)
+ {
+ this.forceReloadCheck = forceReloadCheck;
+ }
+
+ /**
* Adds a new configuration to this combined configuration. It is possible
* (but not mandatory) to give the new configuration a name. This name must
* be unique, otherwise a <code>ConfigurationRuntimeException</code> will
@@ -441,6 +475,40 @@
copy.setRootNode(new DefaultConfigurationNode());
return copy;
+ }
+
+ /**
+ * Returns the value of the specified property. This implementation
+ * evaluates the <em>force reload check</em> flag. If it is set, all
+ * contained configurations will be triggered before the value of the
+ * requested property is retrieved.
+ *
+ * @param key the key of the desired property
+ * @return the value of this property
+ * @since 1.4
+ */
+ public Object getProperty(String key)
+ {
+ if (isForceReloadCheck())
+ {
+ for (Iterator it = configurations.iterator(); it.hasNext();)
+ {
+ try
+ {
+ // simply retrieve a property; this is enough for
+ // triggering a reload
+ ((ConfigData) it.next()).getConfiguration().getProperty(
+ PROP_RELOAD_CHECK);
+ }
+ catch (Exception ex)
+ {
+ // ignore all exceptions, e.g. missing property exceptions
+ ;
+ }
+ }
+ }
+
+ return super.getProperty(key);
}
/**
Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCombinedConfiguration.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCombinedConfiguration.java?view=diff&rev=484692&r1=484691&r2=484692
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCombinedConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestCombinedConfiguration.java Fri Dec 8 10:30:15 2006
@@ -16,11 +16,16 @@
*/
package org.apache.commons.configuration;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
import java.util.Collection;
import java.util.Set;
import org.apache.commons.configuration.event.ConfigurationEvent;
import org.apache.commons.configuration.event.ConfigurationListener;
+import org.apache.commons.configuration.reloading.FileAlwaysReloadingStrategy;
import org.apache.commons.configuration.tree.NodeCombiner;
import org.apache.commons.configuration.tree.UnionCombiner;
@@ -66,6 +71,7 @@
assertTrue("Wrong node combiner",
config.getNodeCombiner() instanceof UnionCombiner);
assertNull("Test config was found", config.getConfiguration(TEST_NAME));
+ assertFalse("Force reload check flag is set", config.isForceReloadCheck());
}
/**
@@ -402,6 +408,63 @@
assertTrue("Config is not empty", config.isEmpty());
listener.checkEvent(3, 2);
+ }
+
+ /**
+ * Tests if file-based configurations can be reloaded.
+ */
+ public void testReloading() throws Exception
+ {
+ config.setForceReloadCheck(true);
+ File testDir = new File("target");
+ File testXmlFile = new File(testDir, "reload.xml");
+ File testPropsFile = new File(testDir, "reload.properties");
+ writeFile(testXmlFile, "<xml><xmlReload>0</xmlReload></xml>");
+ writeFile(testPropsFile, "propsReload = 0");
+ XMLConfiguration c1 = new XMLConfiguration(testXmlFile);
+ c1.setReloadingStrategy(new FileAlwaysReloadingStrategy());
+ PropertiesConfiguration c2 = new PropertiesConfiguration(testPropsFile);
+ c2.setThrowExceptionOnMissing(true);
+ c2.setReloadingStrategy(new FileAlwaysReloadingStrategy());
+ config.addConfiguration(c1);
+ config.addConfiguration(c2);
+ assertEquals("Wrong xml reload value", 0, config.getInt("xmlReload"));
+ assertEquals("Wrong props reload value", 0, config
+ .getInt("propsReload"));
+
+ writeFile(testXmlFile, "<xml><xmlReload>1</xmlReload></xml>");
+ assertEquals("XML reload not detected", 1, config.getInt("xmlReload"));
+ config.setForceReloadCheck(false);
+ writeFile(testPropsFile, "propsReload = 1");
+ assertEquals("Props reload detected though check flag is false", 0, config
+ .getInt("propsReload"));
+
+ assertTrue("XML file cannot be removed", testXmlFile.delete());
+ assertTrue("Props file cannot be removed", testPropsFile.delete());
+ }
+
+ /**
+ * Helper method for writing a file.
+ *
+ * @param file the file to be written
+ * @param content the file's content
+ * @throws IOException if an error occurs
+ */
+ private static void writeFile(File file, String content) throws IOException
+ {
+ PrintWriter out = null;
+ try
+ {
+ out = new PrintWriter(new FileWriter(file));
+ out.print(content);
+ }
+ finally
+ {
+ if (out != null)
+ {
+ out.close();
+ }
+ }
}
/**
Modified: jakarta/commons/proper/configuration/trunk/xdocs/changes.xml
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/configuration/trunk/xdocs/changes.xml?view=diff&rev=484692&r1=484691&r2=484692
==============================================================================
--- jakarta/commons/proper/configuration/trunk/xdocs/changes.xml (original)
+++ jakarta/commons/proper/configuration/trunk/xdocs/changes.xml Fri Dec 8 10:30:15 2006
@@ -23,6 +23,16 @@
<body>
<release version="1.4-dev" date="in SVN">
+ <action dev="oheger" type="update" issue="CONFIGURATION-240">
+ File-based configurations with a reloading strategy did not work well
+ together with CombinedConfiguration because the reloading strategy is
+ only checked when its associated configuration is accessed (which does
+ not happen when only the combined configuration is queried).
+ As a workaround CombinedConfiguration now provides the boolean
+ forceReloadCheck property. If this is set to true, all contained
+ configurations will be triggered when a property is queried. This will
+ cause a reload if necessary.
+ </action>
<action dev="oheger" type="add" issue="CONFIGURATION-243">
Configuration declarations in the configuration definition file for
DefaultConfigurationBuilder that are marked as optional now support a
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org