This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-vfs.git
commit e35ecd955280ddf1451d9df9032959900f65fa1b Author: Gary Gregory <[email protected]> AuthorDate: Fri Nov 26 10:51:06 2021 -0500 DefaultFileMonitor implements AutoCloseable. --- .../commons/vfs2/impl/DefaultFileMonitor.java | 35 ++++--- .../commons/vfs2/impl/DefaultFileMonitorTest.java | 113 ++++++++------------- src/changes/changes.xml | 5 +- 3 files changed, 67 insertions(+), 86 deletions(-) diff --git a/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/DefaultFileMonitor.java b/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/DefaultFileMonitor.java index 4efb139..fa4583a 100644 --- a/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/DefaultFileMonitor.java +++ b/commons-vfs2/src/main/java/org/apache/commons/vfs2/impl/DefaultFileMonitor.java @@ -73,7 +73,8 @@ import org.apache.commons.vfs2.provider.AbstractFileSystem; * * <i>(where CustomFileListener is a class that implements the FileListener interface.)</i> */ -public class DefaultFileMonitor implements Runnable, FileMonitor { +// TODO Add a Builder so we can construct and start. +public class DefaultFileMonitor implements Runnable, FileMonitor, AutoCloseable { /** * File monitor agent. @@ -186,8 +187,7 @@ public class DefaultFileMonitor implements Runnable, FileMonitor { if (!missingChildren.empty()) { while (!missingChildren.empty()) { - final FileObject child = missingChildren.pop(); - this.fireAllCreate(child); + this.fireAllCreate(missingChildren.pop()); } } @@ -206,8 +206,8 @@ public class DefaultFileMonitor implements Runnable, FileMonitor { } /** - * Recursively fires create events for all children if recursive descent is enabled. Otherwise the create event - * is only fired for the initial FileObject. + * Recursively fires create events for all children if recursive descent is enabled. Otherwise the create event is only + * fired for the initial FileObject. * * @param child The child to add. */ @@ -357,6 +357,20 @@ public class DefaultFileMonitor implements Runnable, FileMonitor { } } + @Override + public void close() { + this.runFlag = false; + if (this.monitorThread != null) { + this.monitorThread.interrupt(); + try { + this.monitorThread.join(); + } catch (final InterruptedException e) { + // ignore + } + this.monitorThread = null; + } + } + /** * Gets the number of files to check per run. * @@ -558,15 +572,6 @@ public class DefaultFileMonitor implements Runnable, FileMonitor { * Stops monitoring the files that have been added. */ public synchronized void stop() { - this.runFlag = false; - if (this.monitorThread != null) { - this.monitorThread.interrupt(); - try { - this.monitorThread.join(); - } catch (final InterruptedException e) { - // ignore - } - this.monitorThread = null; - } + close(); } } diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/DefaultFileMonitorTest.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/DefaultFileMonitorTest.java index 9352bc7..e0a745e 100644 --- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/DefaultFileMonitorTest.java +++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/DefaultFileMonitorTest.java @@ -111,9 +111,8 @@ public class DefaultFileMonitorTest { public void ignore_testAddRemove() throws Exception { try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI().toString())) { final CountingListener listener = new CountingListener(); - final DefaultFileMonitor monitor = new DefaultFileMonitor(listener); - monitor.setDelay(DELAY_MILLIS); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(listener)) { + monitor.setDelay(DELAY_MILLIS); monitor.addFile(fileObject); monitor.removeFile(fileObject); monitor.addFile(fileObject); @@ -121,8 +120,6 @@ public class DefaultFileMonitorTest { writeToFile(testFile); Thread.sleep(DELAY_MILLIS * 3); assertEquals("Created event is only fired once", 1, listener.created.get()); - } finally { - monitor.stop(); } } } @@ -137,12 +134,9 @@ public class DefaultFileMonitorTest { public void ignore_testStartStop() throws Exception { try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI().toString())) { final CountingListener stoppedListener = new CountingListener(); - final DefaultFileMonitor stoppedMonitor = new DefaultFileMonitor(stoppedListener); - stoppedMonitor.start(); - try { + try (final DefaultFileMonitor stoppedMonitor = new DefaultFileMonitor(stoppedListener)) { + stoppedMonitor.start(); stoppedMonitor.addFile(fileObject); - } finally { - stoppedMonitor.stop(); } // Variant 1: it becomes documented behavior to manually remove all files after stop() such that all @@ -160,18 +154,15 @@ public class DefaultFileMonitorTest { // DefaultFileMonitor. final CountingListener activeListener = new CountingListener(); - final DefaultFileMonitor activeMonitor = new DefaultFileMonitor(activeListener); - activeMonitor.setDelay(DELAY_MILLIS); - activeMonitor.addFile(fileObject); - activeMonitor.start(); - try { + try (final DefaultFileMonitor activeMonitor = new DefaultFileMonitor(activeListener)) { + activeMonitor.setDelay(DELAY_MILLIS); + activeMonitor.addFile(fileObject); + activeMonitor.start(); writeToFile(testFile); Thread.sleep(DELAY_MILLIS * 10); assertEquals("The listener of the active monitor received one created event", 1, activeListener.created.get()); assertEquals("The listener of the stopped monitor received no events", 0, stoppedListener.created.get()); - } finally { - activeMonitor.stop(); } } } @@ -194,19 +185,16 @@ public class DefaultFileMonitorTest { public void testChildFileDeletedWithoutRecursiveChecking() throws Exception { writeToFile(testFile); try (final FileObject fileObject = fileSystemManager.resolveFile(testDir.toURI().toURL().toString())) { - final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - monitor.setDelay(2000); - monitor.setRecursive(false); - monitor.addFile(fileObject); - monitor.start(); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener())) { + monitor.setDelay(2000); + monitor.setRecursive(false); + monitor.addFile(fileObject); + monitor.start(); status = null; Thread.sleep(DELAY_MILLIS * 5); testFile.delete(); Thread.sleep(DELAY_MILLIS * 30); assertEquals("Event should not have occurred", null, status); - } finally { - monitor.stop(); } } } @@ -215,12 +203,11 @@ public class DefaultFileMonitorTest { public void testChildFileRecreated() throws Exception { writeToFile(testFile); try (final FileObject fileObj = fileSystemManager.resolveFile(testDir.toURI().toURL().toString())) { - final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - monitor.setDelay(2000); - monitor.setRecursive(true); - monitor.addFile(fileObj); - monitor.start(); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener())) { + monitor.setDelay(2000); + monitor.setRecursive(true); + monitor.addFile(fileObj); + monitor.start(); status = null; Thread.sleep(DELAY_MILLIS * 5); testFile.delete(); @@ -229,8 +216,6 @@ public class DefaultFileMonitorTest { Thread.sleep(DELAY_MILLIS * 5); writeToFile(testFile); waitFor(Status.CREATED, DELAY_MILLIS * 30); - } finally { - monitor.stop(); } } } @@ -238,17 +223,14 @@ public class DefaultFileMonitorTest { @Test public void testFileCreated() throws Exception { try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI().toURL().toString())) { - final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - // TestFileListener manipulates status - monitor.setDelay(DELAY_MILLIS); - monitor.addFile(fileObject); - monitor.start(); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener())) { + // TestFileListener manipulates status + monitor.setDelay(DELAY_MILLIS); + monitor.addFile(fileObject); + monitor.start(); writeToFile(testFile); Thread.sleep(DELAY_MILLIS * 5); waitFor(Status.CREATED, DELAY_MILLIS * 5); - } finally { - monitor.stop(); } } } @@ -257,16 +239,13 @@ public class DefaultFileMonitorTest { public void testFileDeleted() throws Exception { writeToFile(testFile); try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI().toString())) { - final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - // TestFileListener manipulates status - monitor.setDelay(DELAY_MILLIS); - monitor.addFile(fileObject); - monitor.start(); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener())) { + // TestFileListener manipulates status + monitor.setDelay(DELAY_MILLIS); + monitor.addFile(fileObject); + monitor.start(); testFile.delete(); waitFor(Status.DELETED, DELAY_MILLIS * 5); - } finally { - monitor.stop(); } } } @@ -275,12 +254,11 @@ public class DefaultFileMonitorTest { public void testFileModified() throws Exception { writeToFile(testFile); try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI().toURL().toString())) { - final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - // TestFileListener manipulates status - monitor.setDelay(DELAY_MILLIS); - monitor.addFile(fileObject); - monitor.start(); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener())) { + // TestFileListener manipulates status + monitor.setDelay(DELAY_MILLIS); + monitor.addFile(fileObject); + monitor.start(); // Need a long delay to insure the new timestamp doesn't truncate to be the same as // the current timestammp. Java only guarantees the timestamp will be to 1 second. Thread.sleep(DELAY_MILLIS * 10); @@ -288,8 +266,6 @@ public class DefaultFileMonitorTest { final boolean rcMillis = testFile.setLastModified(valueMillis); assertTrue("setLastModified succeeded", rcMillis); waitFor(Status.CHANGED, DELAY_MILLIS * 5); - } finally { - monitor.stop(); } } } @@ -298,12 +274,12 @@ public class DefaultFileMonitorTest { public void testFileMonitorRestarted() throws Exception { try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI().toString())) { final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - // TestFileListener manipulates status - monitor.setDelay(DELAY_MILLIS); - monitor.addFile(fileObject); - - monitor.start(); try { + // TestFileListener manipulates status + monitor.setDelay(DELAY_MILLIS); + monitor.addFile(fileObject); + + monitor.start(); writeToFile(testFile); Thread.sleep(DELAY_MILLIS * 5); } finally { @@ -323,12 +299,11 @@ public class DefaultFileMonitorTest { @Test public void testFileRecreated() throws Exception { try (final FileObject fileObject = fileSystemManager.resolveFile(testFile.toURI())) { - final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener()); - // TestFileListener manipulates status - monitor.setDelay(DELAY_MILLIS); - monitor.addFile(fileObject); - monitor.start(); - try { + try (final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener())) { + // TestFileListener manipulates status + monitor.setDelay(DELAY_MILLIS); + monitor.addFile(fileObject); + monitor.start(); writeToFile(testFile); waitFor(Status.CREATED, DELAY_MILLIS * 10); status = null; @@ -339,8 +314,6 @@ public class DefaultFileMonitorTest { monitor.addFile(fileObject); writeToFile(testFile); waitFor(Status.CREATED, DELAY_MILLIS * 10); - } finally { - monitor.stop(); } } } diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 48dd245..5f09891 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -72,9 +72,12 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Seth Falco"> Add vscode files to gitignore #205. </action> - <action type="add" dev="ggregory" due-to="Seth Falco"> + <action type="add" dev="ggregory" due-to="Gary Gregory"> Add DefaultFileMonitor.setDelay(Duration), getDelayDuration() and deprecate setDelay(long), getDelay(). </action> + <action type="add" dev="ggregory" due-to="Gary Gregory"> + DefaultFileMonitor implements AutoCloseable. + </action> <!-- UDPATE --> <action type="update" dev="ggregory" due-to="Dependabot"> Bump jakarta.mail from 1.6.7 to 2.0.1 #200.
