Author: oheger
Date: Sun Sep 16 20:22:14 2018
New Revision: 1841033

URL: http://svn.apache.org/viewvc?rev=1841033&view=rev
Log:
[CONFIGURATION-712] Added a refresh() method to reloading detector.

FileHandlerReloadingDetector had the problem that the first invocation
of the isReloadingRequired() method the file's last-modified date was
initialized. So a changed file could only be recognized on a 2nd
invocation.

Now the class offers a dedicated method to initialize the
last-modified date from the underlying file.
DefaultReloadingDetectorFactory was changed to call this method after
the detector has been created. So reloading checks are active from the
very beginning.

Thanks to Rolland Hobbie for the patch.

Modified:
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/DefaultReloadingDetectorFactory.java
    
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/FileHandlerReloadingDetector.java
    
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestFileHandlerReloadingDetector.java

Modified: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/DefaultReloadingDetectorFactory.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/DefaultReloadingDetectorFactory.java?rev=1841033&r1=1841032&r2=1841033&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/DefaultReloadingDetectorFactory.java
 (original)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/builder/DefaultReloadingDetectorFactory.java
 Sun Sep 16 20:22:14 2018
@@ -42,8 +42,14 @@ public class DefaultReloadingDetectorFac
             throws ConfigurationException
     {
         Long refreshDelay = params.getReloadingRefreshDelay();
-        return (refreshDelay != null) ? new FileHandlerReloadingDetector(
+
+        FileHandlerReloadingDetector fileHandlerReloadingDetector =
+                (refreshDelay != null) ? new FileHandlerReloadingDetector(
                 handler, refreshDelay) : new FileHandlerReloadingDetector(
                 handler);
+
+        fileHandlerReloadingDetector.refresh();
+
+        return fileHandlerReloadingDetector;
     }
 }

Modified: 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/FileHandlerReloadingDetector.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/FileHandlerReloadingDetector.java?rev=1841033&r1=1841032&r2=1841033&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/FileHandlerReloadingDetector.java
 (original)
+++ 
commons/proper/configuration/trunk/src/main/java/org/apache/commons/configuration2/reloading/FileHandlerReloadingDetector.java
 Sun Sep 16 20:22:14 2018
@@ -188,6 +188,16 @@ public class FileHandlerReloadingDetecto
     }
 
     /**
+     * Tells this implementation that the internally stored state should be
+     * refreshed. This method is intended to be called after the creation
+     * of an instance.
+     */
+    public void refresh()
+    {
+        updateLastModified(getLastModificationDate());
+    }
+
+    /**
      * Returns the date of the last modification of the monitored file. A 
return
      * value of 0 indicates, that the monitored file does not exist.
      *

Modified: 
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestFileHandlerReloadingDetector.java
URL: 
http://svn.apache.org/viewvc/commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestFileHandlerReloadingDetector.java?rev=1841033&r1=1841032&r2=1841033&view=diff
==============================================================================
--- 
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestFileHandlerReloadingDetector.java
 (original)
+++ 
commons/proper/configuration/trunk/src/test/java/org/apache/commons/configuration2/reloading/TestFileHandlerReloadingDetector.java
 Sun Sep 16 20:22:14 2018
@@ -122,6 +122,46 @@ public class TestFileHandlerReloadingDet
     }
 
     /**
+     * Tests whether a changed file is detected after initialization and 
invoking
+     * refresh.
+     */
+    @Test
+    public void testRefreshIsReloadingRequiredTrue() throws Exception
+    {
+        File f = EasyMock.createMock(File.class);
+        EasyMock.expect(f.exists()).andReturn(Boolean.TRUE).anyTimes();
+        EasyMock.expect(f.lastModified()).andReturn(LAST_MODIFIED);
+        EasyMock.expect(f.lastModified()).andReturn(LAST_MODIFIED + 1);
+        EasyMock.replay(f);
+        FileHandlerReloadingDetector detector = new 
FileHandlerReloadingDetectorTestImpl(f);
+        detector.refresh();
+        assertTrue("Reloading not detected", detector.isReloadingRequired());
+    }
+
+    /**
+     * Tests a refresh cycle with a detected reload operation and a 
notification that
+     * reloading was performed.
+     */
+    @Test
+    public void testRefreshReloadingAndReset() throws Exception
+    {
+        File f = EasyMock.createMock(File.class);
+        EasyMock.expect(f.exists()).andReturn(Boolean.TRUE).anyTimes();
+        EasyMock.expect(f.lastModified()).andReturn(LAST_MODIFIED).times(2);
+        EasyMock.expect(f.lastModified()).andReturn(LAST_MODIFIED + 
1).times(3);
+        EasyMock.expect(f.lastModified()).andReturn(LAST_MODIFIED + 2);
+        EasyMock.replay(f);
+        FileHandlerReloadingDetector detector = new 
FileHandlerReloadingDetectorTestImpl(f);
+        detector.refresh();
+        assertFalse("Reloading required", detector.isReloadingRequired());
+        assertTrue("Reloading not detected", detector.isReloadingRequired());
+        detector.reloadingPerformed();
+        assertFalse("Still reloading required", 
detector.isReloadingRequired());
+        assertTrue("Next reloading not detected",
+                detector.isReloadingRequired());
+    }
+
+    /**
      * Tests whether the refresh delay is taken into account.
      */
     @Test


Reply via email to