Author: oheger
Date: Thu May 10 17:26:21 2018
New Revision: 1831358

URL: http://svn.apache.org/viewvc?rev=1831358&view=rev
Log:
CONFIGURATION-687: Changes on reloading of combined configurations.

The reloading controller of a ReloadingCombinedConfigurationBuilder is
now created only once on first access. When triggering a reloading
check it is important that all child configuration sources are
included.

Modified:
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/ReloadingCombinedConfigurationBuilder.java
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/CombinedReloadingController.java
    
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestCombinedReloadingController.java

Modified: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/ReloadingCombinedConfigurationBuilder.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/ReloadingCombinedConfigurationBuilder.java?rev=1831358&r1=1831357&r2=1831358&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/ReloadingCombinedConfigurationBuilder.java
 (original)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/combined/ReloadingCombinedConfigurationBuilder.java
 Thu May 10 17:26:21 2018
@@ -123,6 +123,21 @@ public class ReloadingCombinedConfigurat
     }
 
     /**
+     * {@inheritDoc} This implementation makes sure that the reloading state of
+     * the managed reloading controller is reset. Note that this has to be done
+     * here and not in {@link #initResultInstance(CombinedConfiguration)}
+     * because it must be outside of a synchronized block; otherwise, a
+     * dead-lock situation can occur.
+     */
+    @Override
+    public CombinedConfiguration getConfiguration() throws 
ConfigurationException
+    {
+        CombinedConfiguration result = super.getConfiguration();
+        reloadingController.resetReloadingState();
+        return result;
+    }
+
+    /**
      * {@inheritDoc} This implementation creates a builder for XML
      * configurations with reloading support.
      */
@@ -145,7 +160,10 @@ public class ReloadingCombinedConfigurat
             throws ConfigurationException
     {
         super.initResultInstance(result);
-        reloadingController = createReloadingController();
+        if (reloadingController == null)
+        {
+            reloadingController = createReloadingController();
+        }
     }
 
     /**

Modified: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/CombinedReloadingController.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/CombinedReloadingController.java?rev=1831358&r1=1831357&r2=1831358&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/CombinedReloadingController.java
 (original)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/CombinedReloadingController.java
 Thu May 10 17:26:21 2018
@@ -172,20 +172,23 @@ public class CombinedReloadingController
 
         /**
          * {@inheritDoc} This implementation delegates to the managed
-         * controllers. If one of them returns <b>true</b> from its check
-         * method, iteration is aborted, and result is <b>true</b>.
+         * controllers. For all of them the {@code checkForReloading()}
+         * method is called, giving them the chance to trigger a reload if
+         * necessary. If one of these calls returns <b>true</b>, the result of
+         * this method is <b>true</b>, otherwise <b>false</b>.
          */
         @Override
         public boolean isReloadingRequired()
         {
+            boolean result = false;
             for (ReloadingController rc : owner.getSubControllers())
             {
                 if (rc.checkForReloading(null))
                 {
-                    return true;
+                    result = true;
                 }
             }
-            return false;
+            return result;
         }
 
         /**

Modified: 
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestCombinedReloadingController.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestCombinedReloadingController.java?rev=1831358&r1=1831357&r2=1831358&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestCombinedReloadingController.java
 (original)
+++ 
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestCombinedReloadingController.java
 Thu May 10 17:26:21 2018
@@ -118,6 +118,8 @@ public class TestCombinedReloadingContro
                 Boolean.FALSE);
         EasyMock.expect(subControllers[1].checkForReloading(null)).andReturn(
                 Boolean.TRUE);
+        EasyMock.expect(subControllers[2].checkForReloading(null)).andReturn(
+                Boolean.FALSE);
         replaySubControllers();
         assertTrue("Wrong result", ctrl.checkForReloading("someData"));
         verifySubSontrollers();
@@ -149,6 +151,10 @@ public class TestCombinedReloadingContro
         CombinedReloadingController ctrl = setUpController();
         EasyMock.expect(subControllers[0].checkForReloading(null)).andReturn(
                 Boolean.TRUE);
+        EasyMock.expect(subControllers[1].checkForReloading(null)).andReturn(
+                Boolean.FALSE);
+        EasyMock.expect(subControllers[2].checkForReloading(null)).andReturn(
+                Boolean.FALSE);
         for (ReloadingController rc : subControllers)
         {
             rc.resetReloadingState();


Reply via email to