From 0873d472e8ff6b96c209fdc90f6abe90398ad545 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 20 Oct 2020 06:02:22 +0100 Subject: [PATCH] pass browse UUID from UI for correct dispatching. Allow multiple concurrent browses --- .../groovy/com/muwire/core/search/BrowseManager.groovy | 10 +++++----- .../groovy/com/muwire/core/search/UIBrowseEvent.groovy | 1 + .../controllers/com/muwire/gui/BrowseController.groovy | 9 +++++---- .../models/com/muwire/gui/BrowseModel.groovy | 2 +- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/src/main/groovy/com/muwire/core/search/BrowseManager.groovy b/core/src/main/groovy/com/muwire/core/search/BrowseManager.groovy index 23f60815..70a1249f 100644 --- a/core/src/main/groovy/com/muwire/core/search/BrowseManager.groovy +++ b/core/src/main/groovy/com/muwire/core/search/BrowseManager.groovy @@ -25,7 +25,7 @@ class BrowseManager { private final EventBus eventBus private final Persona me - private final Executor browserThread = Executors.newSingleThreadExecutor() + private final Executor browserThread = Executors.newCachedThreadPool() BrowseManager(I2PConnector connector, EventBus eventBus, Persona me) { this.connector = connector @@ -37,7 +37,7 @@ class BrowseManager { browserThread.execute({ Endpoint endpoint = null try { - eventBus.publish(new BrowseStatusEvent(host : e.host, status : BrowseStatus.CONNECTING)) + eventBus.publish(new BrowseStatusEvent(host : e.host, status : BrowseStatus.CONNECTING, uuid: e.uuid)) endpoint = connector.connect(e.host.destination) OutputStream os = endpoint.getOutputStream() os.write("BROWSE\r\n".getBytes(StandardCharsets.US_ASCII)) @@ -60,7 +60,7 @@ class BrowseManager { boolean chat = headers.containsKey("Chat") && Boolean.parseBoolean(headers['Chat']) // at this stage, start pulling the results - UUID uuid = UUID.randomUUID() + UUID uuid = e.uuid eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FETCHING, totalResults : results, uuid : uuid)) log.info("Starting to fetch $results results with uuid $uuid") @@ -90,11 +90,11 @@ class BrowseManager { } } - eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FINISHED)) + eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FINISHED, uuid : uuid)) } catch (Exception bad) { log.log(Level.WARNING, "browse failed", bad) - eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FAILED)) + eventBus.publish(new BrowseStatusEvent(host: e.host, status : BrowseStatus.FAILED, uuid : e.uuid)) } finally { endpoint?.close() } diff --git a/core/src/main/groovy/com/muwire/core/search/UIBrowseEvent.groovy b/core/src/main/groovy/com/muwire/core/search/UIBrowseEvent.groovy index 81beb51b..2d9d97b0 100644 --- a/core/src/main/groovy/com/muwire/core/search/UIBrowseEvent.groovy +++ b/core/src/main/groovy/com/muwire/core/search/UIBrowseEvent.groovy @@ -4,5 +4,6 @@ import com.muwire.core.Event import com.muwire.core.Persona class UIBrowseEvent extends Event { + UUID uuid Persona host } diff --git a/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy b/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy index 03f5f11e..25278aa7 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/BrowseController.groovy @@ -30,7 +30,8 @@ class BrowseController { void register() { core.eventBus.register(BrowseStatusEvent.class, this) core.eventBus.register(UIResultBatchEvent.class, this) - core.eventBus.publish(new UIBrowseEvent(host : model.host)) + model.uuid = UUID.randomUUID() + core.eventBus.publish(new UIBrowseEvent(host : model.host, uuid: model.uuid)) } void mvcGroupDestroy() { @@ -39,12 +40,12 @@ class BrowseController { } void onBrowseStatusEvent(BrowseStatusEvent e) { + if (e.uuid != model.uuid) + return runInsideUIAsync { model.status = e.status - if (e.status == BrowseStatus.FETCHING) { + if (e.status == BrowseStatus.FETCHING) model.totalResults = e.totalResults - model.uuid = e.uuid - } } } diff --git a/gui/griffon-app/models/com/muwire/gui/BrowseModel.groovy b/gui/griffon-app/models/com/muwire/gui/BrowseModel.groovy index e33d389b..dce71a70 100644 --- a/gui/griffon-app/models/com/muwire/gui/BrowseModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/BrowseModel.groovy @@ -18,7 +18,7 @@ class BrowseModel { @Observable boolean chatActionEnabled @Observable int totalResults @Observable int resultCount - UUID uuid + volatile UUID uuid def results = [] } \ No newline at end of file