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.

Reply via email to