You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2019/03/21 21:10:30 UTC

[commons-vfs] branch master updated: Test stopping file monitor (#56)

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


The following commit(s) were added to refs/heads/master by this push:
     new 79a9692  Test stopping file monitor (#56)
79a9692 is described below

commit 79a969283bc7c85f1c4d73ed45e0323e01f4e252
Author: Boris Petrov <bo...@live.com>
AuthorDate: Thu Mar 21 23:10:25 2019 +0200

    Test stopping file monitor (#56)
    
    [VFS-694] Fix inability to start the DefaultFileMonitor after it has been stopped.
    
    * Better handling of DefaultFileMonitor restart
    * Code style
---
 .../commons/vfs2/impl/DefaultFileMonitor.java      | 21 +++++++++++++-------
 .../vfs2/impl/test/DefaultFileMonitorTests.java    | 23 ++++++++++++++++++++++
 2 files changed, 37 insertions(+), 7 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 5b80845..99e1e77 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
@@ -307,8 +307,15 @@ public class DefaultFileMonitor implements Runnable, FileMonitor {
      */
     public void stop() {
         this.shouldRun = false;
-        this.monitorThread.interrupt();
-        this.monitorThread = null;
+        if (this.monitorThread != null) {
+            this.monitorThread.interrupt();
+            try {
+                this.monitorThread.join();
+            } catch (final InterruptedException e) {
+                // ignore
+            }
+            this.monitorThread = null;
+        }
     }
 
     /**
@@ -489,11 +496,11 @@ public class DefaultFileMonitor implements Runnable, FileMonitor {
                     } else {
                         // First set of children - Break out the cigars
                         if (newChildren.length > 0) {
-                        	this.children = new HashMap<>();
-                        	for (final FileObject element : newChildren) {
-                        		this.children.put(element.getName(), new Object()); // null?
-                        		this.fireAllCreate(element);
-                        	}
+                            this.children = new HashMap<>();
+                            for (final FileObject element : newChildren) {
+                                this.children.put(element.getName(), new Object()); // null?
+                                this.fireAllCreate(element);
+                            }
                         }
                     }
                 }
diff --git a/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/test/DefaultFileMonitorTests.java b/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/test/DefaultFileMonitorTests.java
index 2bfe6ea..fe55b5b 100644
--- a/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/test/DefaultFileMonitorTests.java
+++ b/commons-vfs2/src/test/java/org/apache/commons/vfs2/impl/test/DefaultFileMonitorTests.java
@@ -169,6 +169,29 @@ public class DefaultFileMonitorTests extends AbstractVfsTestCase {
         }
     }
 
+    public void testFileMonitorRestarted() throws Exception {
+        final FileObject fileObj = fsManager.resolveFile(testFile.toURI().toString());
+        final DefaultFileMonitor monitor = new DefaultFileMonitor(new TestFileListener());
+        // TestFileListener manipulates changeStatus
+        monitor.setDelay(100);
+        monitor.addFile(fileObj);
+
+        monitor.start();
+        writeToFile(testFile);
+        Thread.sleep(300);
+        monitor.stop();
+
+        monitor.start();
+        try {
+            testFile.delete();
+            Thread.sleep(300);
+            assertTrue("No event occurred", changeStatus != 0);
+            assertTrue("Incorrect event", changeStatus == 2);
+        } finally {
+            monitor.stop();
+        }
+    }
+
     private void writeToFile(final File file) throws Exception {
         final FileWriter out = new FileWriter(file);
         out.write("string=value1");