Author: oheger Date: Sun Feb 17 18:41:51 2013 New Revision: 1447054 URL: http://svn.apache.org/r1447054 Log: Reworked tests for DynamicCombinedConfiguration to use the new builder classes rather than DefaultConfigurationBuilder. This required minor changes on the interpolation handling.
Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestDynamicCombinedConfiguration.java commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder4.xml commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder5.xml Modified: commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java?rev=1447054&r1=1447053&r2=1447054&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java (original) +++ commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration/DynamicCombinedConfiguration.java Sun Feb 17 18:41:51 2013 @@ -32,6 +32,7 @@ import java.util.concurrent.ConcurrentMa import org.apache.commons.configuration.event.ConfigurationErrorListener; import org.apache.commons.configuration.event.ConfigurationListener; import org.apache.commons.configuration.interpol.ConfigurationInterpolator; +import org.apache.commons.configuration.interpol.Lookup; import org.apache.commons.configuration.tree.ConfigurationNode; import org.apache.commons.configuration.tree.ExpressionEngine; import org.apache.commons.configuration.tree.NodeCombiner; @@ -856,14 +857,24 @@ public class DynamicCombinedConfiguratio /** * Creates a {@code ConfigurationInterpolator} instance for performing local - * variable substitutions. + * variable substitutions. This implementation returns an object which + * shares the prefix lookups from this configuration's + * {@code ConfigurationInterpolator}, but does not define any other lookups. * * @return the {@code ConfigurationInterpolator} */ private ConfigurationInterpolator initLocalInterpolator() { - ConfigurationInterpolator ci = new ConfigurationInterpolator(); - ci.registerLookups(getInterpolator().getLookups()); + ConfigurationInterpolator ci = new ConfigurationInterpolator() + { + @Override + protected Lookup fetchLookupForPrefix(String prefix) + { + return ConfigurationInterpolator + .nullSafeLookup(getInterpolator().getLookups().get( + prefix)); + } + }; return ci; } Modified: commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestDynamicCombinedConfiguration.java URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestDynamicCombinedConfiguration.java?rev=1447054&r1=1447053&r2=1447054&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestDynamicCombinedConfiguration.java (original) +++ commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration/TestDynamicCombinedConfiguration.java Sun Feb 17 18:41:51 2013 @@ -28,10 +28,18 @@ import java.io.FileWriter; import java.io.IOException; import java.io.Reader; import java.io.Writer; +import java.util.Random; +import org.apache.commons.configuration.builder.BuilderConfigurationWrapperFactory; +import org.apache.commons.configuration.builder.ConfigurationBuilder; +import org.apache.commons.configuration.builder.FileBasedBuilderParametersImpl; +import org.apache.commons.configuration.builder.combined.CombinedConfigurationBuilder; +import org.apache.commons.configuration.builder.combined.MultiFileConfigurationBuilder; +import org.apache.commons.configuration.builder.combined.ReloadingCombinedConfigurationBuilder; +import org.apache.commons.configuration.builder.fluent.Parameters; +import org.apache.commons.configuration.interpol.ConfigurationInterpolator; import org.apache.commons.configuration.interpol.Lookup; import org.apache.commons.configuration.tree.xpath.XPathExpressionEngine; -import org.junit.Ignore; import org.junit.Test; public class TestDynamicCombinedConfiguration @@ -58,9 +66,20 @@ public class TestDynamicCombinedConfigur config.setExpressionEngine(engine); config.setKeyPattern(PATTERN); config.setDelimiterParsingDisabled(true); - MultiFileHierarchicalConfiguration multi = new MultiFileHierarchicalConfiguration(PATTERN1); - multi.setExpressionEngine(engine); - config.addConfiguration(multi, "Multi"); + ConfigurationBuilder<XMLConfiguration> multiBuilder = + new MultiFileConfigurationBuilder<XMLConfiguration>( + XMLConfiguration.class).configure(Parameters + .multiFile() + .setFilePattern(PATTERN1) + .setPrefixLookups( + ConfigurationInterpolator + .getDefaultPrefixLookups()) + .setManagedBuilderParameters( + Parameters.xml().setExpressionEngine(engine))); + BuilderConfigurationWrapperFactory wrapFactory = + new BuilderConfigurationWrapperFactory(); + config.addConfiguration(wrapFactory.createBuilderConfigurationWrapper( + HierarchicalConfiguration.class, multiBuilder), "Multi"); XMLConfiguration xml = new XMLConfiguration(); xml.setExpressionEngine(engine); xml.setDelimiterParsingDisabled(true); @@ -84,17 +103,17 @@ public class TestDynamicCombinedConfigur public void testConcurrentGetAndReload() throws Exception { System.getProperties().remove("Id"); - DefaultConfigurationBuilder factory = new DefaultConfigurationBuilder(); - factory.setFile(MULTI_TENENT_FILE); - CombinedConfiguration config = factory.getConfiguration(true); + CombinedConfigurationBuilder builder = new CombinedConfigurationBuilder(); + builder.configure(Parameters.fileBased().setFile(MULTI_TENENT_FILE)); + CombinedConfiguration config = builder.getConfiguration(); - assertEquals(config.getString("rowsPerPage"), "50"); + assertEquals("Wrong value", "50", config.getString("rowsPerPage")); Thread testThreads[] = new Thread[THREAD_COUNT]; int failures[] = new int[THREAD_COUNT]; for (int i = 0; i < testThreads.length; ++i) { - testThreads[i] = new ReloadThread(config, failures, i, LOOP_COUNT, false, null, "50"); + testThreads[i] = new ReloadThread(builder, failures, i, LOOP_COUNT, false, null, "50"); testThreads[i].start(); } @@ -104,26 +123,26 @@ public class TestDynamicCombinedConfigur testThreads[i].join(); totalFailures += failures[i]; } - assertTrue(totalFailures + " failures Occurred", totalFailures == 0); + assertEquals(totalFailures + " failures Occurred", 0, totalFailures); } - @Test @Ignore + @Test public void testConcurrentGetAndReload2() throws Exception { System.getProperties().remove("Id"); - DefaultConfigurationBuilder factory = new DefaultConfigurationBuilder(); - factory.setFile(MULTI_TENENT_FILE); - DynamicCombinedConfiguration config = (DynamicCombinedConfiguration) factory.getConfiguration(true); + CombinedConfigurationBuilder builder = new CombinedConfigurationBuilder(); + builder.configure(Parameters.fileBased().setFile(MULTI_TENENT_FILE)); + CombinedConfiguration config = builder.getConfiguration(); assertEquals(config.getString("rowsPerPage"), "50"); Thread testThreads[] = new Thread[THREAD_COUNT]; int failures[] = new int[THREAD_COUNT]; System.setProperty("Id", "2002"); - assertEquals(config.getString("rowsPerPage"), "25"); + assertEquals("Wrong value", "25", config.getString("rowsPerPage")); for (int i = 0; i < testThreads.length; ++i) { - testThreads[i] = new ReloadThread(config, failures, i, LOOP_COUNT, false, null, "25"); + testThreads[i] = new ReloadThread(builder, failures, i, LOOP_COUNT, false, null, "25"); testThreads[i].start(); } @@ -134,16 +153,16 @@ public class TestDynamicCombinedConfigur totalFailures += failures[i]; } System.getProperties().remove("Id"); - assertTrue(totalFailures + " failures Occurred", totalFailures == 0); + assertEquals(totalFailures + " failures Occurred", 0, totalFailures); } - @Test @Ignore + @Test public void testConcurrentGetAndReloadMultipleClients() throws Exception { System.getProperties().remove("Id"); - DefaultConfigurationBuilder factory = new DefaultConfigurationBuilder(); - factory.setFile(MULTI_TENENT_FILE); - CombinedConfiguration config = factory.getConfiguration(true); + CombinedConfigurationBuilder builder = new CombinedConfigurationBuilder(); + builder.configure(Parameters.fileBased().setFile(MULTI_TENENT_FILE)); + CombinedConfiguration config = builder.getConfiguration(); assertEquals(config.getString("rowsPerPage"), "50"); @@ -153,7 +172,7 @@ public class TestDynamicCombinedConfigur String[] expected = new String[] {"50", "25", "15", "25", "50"}; for (int i = 0; i < testThreads.length; ++i) { - testThreads[i] = new ReloadThread(config, failures, i, LOOP_COUNT, true, ids[i], expected[i]); + testThreads[i] = new ReloadThread(builder, failures, i, LOOP_COUNT, true, ids[i], expected[i]); testThreads[i].start(); } @@ -172,11 +191,11 @@ public class TestDynamicCombinedConfigur System.out.println("Thread " + i + " " + failures[i]); } } - assertTrue(totalFailures + " failures Occurred", totalFailures == 0); + assertEquals(totalFailures + " failures Occurred", 0, totalFailures); } @Test - public void testConcurrentGetAndReloadFile() throws Exception + public void testConcurrentGetAndReloadFile() throws Exception { final int threadCount = 25; System.getProperties().remove("Id"); @@ -187,29 +206,33 @@ public class TestDynamicCombinedConfigur output.getParentFile().mkdir(); copyFile(input, output); - DefaultConfigurationBuilder factory = new DefaultConfigurationBuilder(); - factory.setFile(MULTI_DYNAMIC_FILE); - CombinedConfiguration config = factory.getConfiguration(true); - - assertEquals(config.getString("Product/FIIndex/FI[@id='123456781']"), "ID0001"); + ReloadingCombinedConfigurationBuilder builder = new ReloadingCombinedConfigurationBuilder(); + builder.configure(new FileBasedBuilderParametersImpl().setFile(MULTI_DYNAMIC_FILE)); + CombinedConfiguration config = builder.getConfiguration(); + assertEquals("Wrong property value (1)", "ID0001", + config.getString("Product/FIIndex/FI[@id='123456781']")); ReaderThread testThreads[] = new ReaderThread[threadCount]; for (int i = 0; i < testThreads.length; ++i) { - testThreads[i] = new ReaderThread(config); + testThreads[i] = new ReaderThread(builder); testThreads[i].start(); } + builder.getReloadingController().checkForReloading(null); Thread.sleep(2000); input = new File("target/test-classes/testMultiDynamic_default2.xml"); copyFile(input, output); Thread.sleep(2000); + assertTrue("Changed file not detected", builder + .getReloadingController().checkForReloading(null)); + config = builder.getConfiguration(); String id = config.getString("Product/FIIndex/FI[@id='123456782']"); assertNotNull("File did not reload, id is null", id); String rows = config.getString("rowsPerPage"); - assertTrue("Incorrect value for rowsPerPage", "25".equals(rows)); + assertEquals("Incorrect value for rowsPerPage", "25", rows); for (int i = 0; i < testThreads.length; ++i) { @@ -227,25 +250,28 @@ public class TestDynamicCombinedConfigur private class ReloadThread extends Thread { - CombinedConfiguration combined; - int[] failures; - int index; - int count; - String expected; - String id; - boolean useId; + private final CombinedConfigurationBuilder builder; + private final int[] failures; + private final int index; + private final int count; + private final String expected; + private final String id; + private final boolean useId; + private final Random random; - ReloadThread(CombinedConfiguration config, int[] failures, int index, int count, + ReloadThread(CombinedConfigurationBuilder b, int[] failures, int index, int count, boolean useId, String id, String expected) { - combined = config; + builder = b; this.failures = failures; this.index = index; this.count = count; this.expected = expected; this.id = id; this.useId = useId; + random = new Random(); } + @Override public void run() { @@ -259,6 +285,12 @@ public class TestDynamicCombinedConfigur { try { + if(random.nextBoolean()) + { + // simulate a reload + builder.resetResult(); + } + CombinedConfiguration combined = builder.getConfiguration(); String value = combined.getString("rowsPerPage", null); if (value == null || !value.equals(expected)) { @@ -275,34 +307,43 @@ public class TestDynamicCombinedConfigur private class ReaderThread extends Thread { - private boolean running = true; - private boolean failed = false; - CombinedConfiguration combined; + private volatile boolean running = true; + private volatile boolean failed = false; + private final CombinedConfigurationBuilder builder; - public ReaderThread(CombinedConfiguration c) + public ReaderThread(CombinedConfigurationBuilder b) { - combined = c; + builder = b; } @Override public void run() { - while (running) + try { - String bcId = combined.getString("Product/FIIndex/FI[@id='123456781']"); - if ("ID0001".equalsIgnoreCase(bcId)) + while (running) { - if (failed) + CombinedConfiguration combined = builder.getConfiguration(); + String bcId = + combined.getString("Product/FIIndex/FI[@id='123456781']"); + if ("ID0001".equalsIgnoreCase(bcId)) { - System.out.println("Thread failed, but recovered"); + if (failed) + { + System.out.println("Thread failed, but recovered"); + } + failed = false; + } + else + { + failed = true; } - failed = false; - } - else - { - failed = true; } } + catch (ConfigurationException cex) + { + failed = true; + } } public boolean failed() Modified: commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder4.xml URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder4.xml?rev=1447054&r1=1447053&r2=1447054&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder4.xml (original) +++ commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder4.xml Sun Feb 17 18:41:51 2013 @@ -15,7 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. --> -<!-- Test configuration definition file that demonstrates complex initialization --> +<!-- Test configuration definition for testing DynamicCombinedConfiguration. + $Id$ +--> <configuration> <header> <result delimiterParsingDisabled="true" forceReloadCheck="true" loggerName="TestLogger" @@ -30,26 +32,19 @@ config-class="org.apache.commons.configuration.TestDynamicCombinedConfiguration$ThreadLookup"/> </lookups> <entity-resolver catalogFiles="catalog.xml"/> - <providers> - <provider config-tag="multifile" - config-class="org.apache.commons.configuration.DefaultConfigurationBuilder$FileConfigurationProvider" - configurationClass="org.apache.commons.configuration.MultiFileHierarchicalConfiguration"/> - </providers> </header> <override> - <multifile filePattern="testMultiConfiguration_$$${test:Id}.xml" - config-name="clientConfig" delimiterParsingDisabled="true" schemaValidation="true"> + <multiXml filePattern="testMultiConfiguration_$${test:Id}.xml" + config-name="clientConfig" config-optional="true" + config-forceCreate="true" delimiterParsingDisabled="true" + schemaValidation="true"> <expressionEngine config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/> - <reloadingStrategy refreshDelay="500" - config-class="org.apache.commons.configuration.reloading.FileRandomReloadingStrategy"/> - </multifile> + </multiXml> <xml fileName="testMultiConfiguration_default.xml" config-name="defaultConfig" delimiterParsingDisabled="true" schemaValidation="true"> <expressionEngine config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/> - <reloadingStrategy refreshDelay="500" - config-class="org.apache.commons.configuration.reloading.FileRandomReloadingStrategy"/> </xml> </override> </configuration> \ No newline at end of file Modified: commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder5.xml URL: http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder5.xml?rev=1447054&r1=1447053&r2=1447054&view=diff ============================================================================== --- commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder5.xml (original) +++ commons/proper/configuration/trunk/src/test/resources/testMultiTenentConfigurationBuilder5.xml Sun Feb 17 18:41:51 2013 @@ -15,7 +15,11 @@ See the License for the specific language governing permissions and limitations under the License. --> -<!-- Test configuration definition file that demonstrates complex initialization --> +<!-- Test configuration definition for testing DynamicCombinedConfiguration + together with reloading. This file defines a configuration which will be + rewritten during a test run. This should trigger a reload. + $Id: testCCMultiTenent.xml 1439172 2013-01-27 20:40:33Z oheger $ +--> <configuration> <header> <result delimiterParsingDisabled="true" forceReloadCheck="true" loggerName="TestLogger" @@ -26,26 +30,20 @@ config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/> </result> <entity-resolver catalogFiles="catalog.xml"/> - <providers> - <provider config-tag="multifile" - config-class="org.apache.commons.configuration.DefaultConfigurationBuilder$FileConfigurationProvider" - configurationClass="org.apache.commons.configuration.MultiFileHierarchicalConfiguration"/> - </providers> </header> <override> - <multifile filePattern="testwrite/testMultiConfiguration_$$${sys:Id}.xml" - config-name="clientConfig" delimiterParsingDisabled="true" schemaValidation="false"> + <multiXml filePattern="testwrite/testMultiConfiguration_$${sys:Id}.xml" + config-name="clientConfig" config-optional="true" + config-forceCreate="true" delimiterParsingDisabled="true" + schemaValidation="false"> <expressionEngine config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/> - <reloadingStrategy refreshDelay="500" - config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/> - </multifile> + </multiXml> <xml fileName="testwrite/testMultiDynamic_default.xml" - config-name="defaultConfig" delimiterParsingDisabled="true" schemaValidation="false"> + config-name="defaultConfig" config-reload="true" + delimiterParsingDisabled="true" schemaValidation="false"> <expressionEngine config-class="org.apache.commons.configuration.tree.xpath.XPathExpressionEngine"/> - <reloadingStrategy refreshDelay="500" - config-class="org.apache.commons.configuration.reloading.FileChangedReloadingStrategy"/> </xml> </override> </configuration> \ No newline at end of file