You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2013/02/17 19:41:51 UTC

svn commit: r1447054 - in /commons/proper/configuration/trunk/src: main/java/org/apache/commons/configuration/ test/java/org/apache/commons/configuration/ test/resources/

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