From 4faa09f601dceac64a92fe81adaaf921410e0e94 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Sat, 31 Oct 2020 03:47:15 +0000 Subject: [PATCH] backend plumbing for deleting collections --- .../main/groovy/com/muwire/core/Core.groovy | 2 ++ .../core/collections/CollectionManager.groovy | 30 ++++++++++++++++++- .../UICollectionDeletedEvent.groovy | 7 +++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 core/src/main/groovy/com/muwire/core/collections/UICollectionDeletedEvent.groovy diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index 575f1a92..4334af9f 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -17,6 +17,7 @@ import com.muwire.core.chat.UIConnectChatEvent import com.muwire.core.chat.UIDisconnectChatEvent import com.muwire.core.collections.CollectionManager import com.muwire.core.collections.UICollectionCreatedEvent +import com.muwire.core.collections.UICollectionDeletedEvent import com.muwire.core.connection.ConnectionAcceptor import com.muwire.core.connection.ConnectionEstablisher import com.muwire.core.connection.ConnectionEvent @@ -297,6 +298,7 @@ public class Core { eventBus.with { register(AllFilesLoadedEvent.class, collectionManager) register(UICollectionCreatedEvent.class, collectionManager) + register(UICollectionDeletedEvent.class, collectionManager) } diff --git a/core/src/main/groovy/com/muwire/core/collections/CollectionManager.groovy b/core/src/main/groovy/com/muwire/core/collections/CollectionManager.groovy index 96e6f65a..63b9f658 100644 --- a/core/src/main/groovy/com/muwire/core/collections/CollectionManager.groovy +++ b/core/src/main/groovy/com/muwire/core/collections/CollectionManager.groovy @@ -117,7 +117,7 @@ class CollectionManager { private synchronized void addToIndex(InfoHash infoHash, FileCollection collection) { rootToCollection.put(infoHash, collection) collection.files.each { - Set set = fileRootToCollections.get(it.infoHash) + Set set = fileRootToCollections.get(it.infoHash) if (set == null) { set = new HashSet<>() fileRootToCollections.put(infoHash, set) @@ -134,4 +134,32 @@ class CollectionManager { this.payload = payload } } + + void onUICollectionDeletedEvent(UICollectionDeletedEvent e) { + diskIO.execute({delete(e.collection)} as Runnable) + } + + private void delete(FileCollection collection) { + PayloadAndIH pih = infoHash(collection) + String hashB64 = Base64.encode(pih.infoHash.getRoot()) + String fileName = "${hashB64}_${collection.author.getHumanReadableName()}_${collection.timestamp}.mwcollection" + + File file = new File(localCollections, fileName) + file.delete() + + removeFromIndex(pih.infoHash, collection) + } + + private synchronized void removeFromIndex(InfoHash infoHash, FileCollection collection) { + rootToCollection.remove(infoHash) + collection.files.each { + Set set = fileRootToCollections.get(it.infoHash) + if (set == null) + return // ? + set.remove(collection) + if (set.isEmpty()) + fileRootToCollections.remove(it.infoHash) + } + } + } diff --git a/core/src/main/groovy/com/muwire/core/collections/UICollectionDeletedEvent.groovy b/core/src/main/groovy/com/muwire/core/collections/UICollectionDeletedEvent.groovy new file mode 100644 index 00000000..bc3cc396 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/collections/UICollectionDeletedEvent.groovy @@ -0,0 +1,7 @@ +package com.muwire.core.collections + +import com.muwire.core.Event + +class UICollectionDeletedEvent extends Event { + FileCollection collection +}