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