From bd9315954a2af3169e7b3b1767d1691bec3f35f7 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Wed, 25 Mar 2020 08:09:45 +0000 Subject: [PATCH] add a positive tree so that deleting of shared directories can be detected --- .../core/files/DirectoryUnsharedEvent.groovy | 3 +- .../muwire/core/files/DirectoryWatcher.groovy | 4 ++ .../com/muwire/core/files/FileManager.groovy | 50 ++++++++++++++++--- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/files/DirectoryUnsharedEvent.groovy b/core/src/main/groovy/com/muwire/core/files/DirectoryUnsharedEvent.groovy index f330d40e..31bb9efd 100644 --- a/core/src/main/groovy/com/muwire/core/files/DirectoryUnsharedEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/files/DirectoryUnsharedEvent.groovy @@ -4,8 +4,9 @@ import com.muwire.core.Event class DirectoryUnsharedEvent extends Event { File directory + boolean deleted public String toString() { - super.toString() + " unshared directory "+ directory.toString() + super.toString() + " unshared directory "+ directory.toString() + " deleted $deleted" } } diff --git a/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy b/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy index b5d1e5db..54d2a592 100644 --- a/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy +++ b/core/src/main/groovy/com/muwire/core/files/DirectoryWatcher.groovy @@ -133,6 +133,10 @@ class DirectoryWatcher { SharedFile sf = fileManager.fileToSharedFile.get(f) if (sf != null) eventBus.publish(new FileUnsharedEvent(unsharedFile : sf, deleted : true)) + else if (muOptions.watchedDirectories.contains(f.toString())) + eventBus.publish(new DirectoryUnsharedEvent(directory : f, deleted : true)) + else + log.fine("Entry was not relevant"); } private static File join(Path parent, Path path) { diff --git a/core/src/main/groovy/com/muwire/core/files/FileManager.groovy b/core/src/main/groovy/com/muwire/core/files/FileManager.groovy index b6bcf3a9..7601fde4 100644 --- a/core/src/main/groovy/com/muwire/core/files/FileManager.groovy +++ b/core/src/main/groovy/com/muwire/core/files/FileManager.groovy @@ -28,6 +28,7 @@ class FileManager { final Map> commentToFile = new HashMap<>() final SearchIndex index = new SearchIndex() final FileTree negativeTree = new FileTree<>() + final FileTree positiveTree = new FileTree<>() final Set sideCarFiles = new HashSet<>() FileManager(EventBus eventBus, MuWireSettings settings) { @@ -87,6 +88,7 @@ class FileManager { } existing.add(sf) fileToSharedFile.put(sf.file, sf) + positiveTree.add(sf.file, sf); negativeTree.remove(sf.file) String parent = sf.getFile().getParent() @@ -130,6 +132,7 @@ class FileManager { } fileToSharedFile.remove(sf.file) + positiveTree.remove(sf.file) if (!e.deleted && negativeTree.fileToNode.containsKey(sf.file.getParentFile())) { negativeTree.add(sf.file,null) saveNegativeTree() @@ -246,14 +249,26 @@ class FileManager { void onDirectoryUnsharedEvent(DirectoryUnsharedEvent e) { negativeTree.remove(e.directory) saveNegativeTree() - e.directory.listFiles().each { - if (it.isDirectory()) - eventBus.publish(new DirectoryUnsharedEvent(directory : it)) - else { - SharedFile sf = fileToSharedFile.get(it) - if (sf != null) - eventBus.publish(new FileUnsharedEvent(unsharedFile : sf)) + if (!e.deleted) { + e.directory.listFiles().each { + if (it.isDirectory()) + eventBus.publish(new DirectoryUnsharedEvent(directory : it)) + else { + SharedFile sf = fileToSharedFile.get(it) + if (sf != null) + eventBus.publish(new FileUnsharedEvent(unsharedFile : sf)) + } } + } else { + def cb = new DirDeletionCallback() + positiveTree.traverse(e.directory, cb) + positiveTree.remove(e.directory) + cb.unsharedFiles.each { + eventBus.publish(new FileUnsharedEvent(unsharedFile : it, deleted: true)) + } + cb.subDirs.each { + eventBus.publish(new DirectoryUnsharedEvent(directory : it, deleted : true)) + } } } @@ -270,4 +285,25 @@ class FileManager { collect(Collectors.toList()) } } + + private static class DirDeletionCallback implements FileTreeCallback { + + final List subDirs = new ArrayList<>() + final List unsharedFiles = new ArrayList<>() + + @Override + public void onDirectoryEnter(File file) { + subDirs.add(file) + } + + @Override + public void onDirectoryLeave() { + } + + @Override + public void onFile(File file, SharedFile value) { + unsharedFiles << value + } + + } }