diff --git a/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy b/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy index 9e3e13aa..7ef8f289 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/SearchTabController.groovy @@ -46,7 +46,7 @@ class SearchTabController { } Set uniqueHashes = results.stream().map({it.infohash}).collect(Collectors.toSet()) - results = uniqueHashes.stream().map({model.hashBucket[it].getResults().first()}).collect(Collectors.toList()) + results = uniqueHashes.stream().map({model.hashBucket[it].firstEvent()}).collect(Collectors.toList()) File downloadsFolder = application.context.get("muwire-settings").downloadLocation List targets = view.decorateResults(results) diff --git a/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy b/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy index dc0c0205..898aed5b 100644 --- a/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/SearchTabModel.groovy @@ -16,6 +16,7 @@ import griffon.metadata.ArtifactProviderFor import javax.swing.SwingWorker import javax.swing.tree.DefaultMutableTreeNode import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicReference @ArtifactProviderFor(GriffonModel) class SearchTabModel { @@ -134,15 +135,20 @@ class SearchTabModel { } private static class HashBucket { + private final AtomicReference first = new AtomicReference<>() private final Set events = new HashSet<>() private final Set senders = new HashSet<>() - private String cachedName - private long cachedSize + private void add(UIResultEvent event) { + first.compareAndSet(null, event) events.add(event) senders.add(event.sender) } + UIResultEvent firstEvent() { + first.get() + } + Set getResults() { events } @@ -152,17 +158,11 @@ class SearchTabModel { } String getName() { - if (cachedName == null) { - cachedName = events.first().name - } - cachedName + first.get().name } long getSize() { - if (cachedSize == 0) { - cachedSize = events.first().size - } - cachedSize + first.get().size } int sourceCount() { diff --git a/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy b/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy index 02f823ba..7f2b7e36 100644 --- a/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/SearchTabView.groovy @@ -163,7 +163,7 @@ class SearchTabView { scrollPane(constraints : BorderLayout.CENTER) { resultsTable2 = table(id : "results-table2", autoCreateRowSorter : true, rowHeight : rowHeight) { tableModel(list : model.results2) { - closureColumn(header : trans("NAME"), preferredWidth : 350, type : UIResultEvent, read : {model.hashBucket[it].getResults().first()}) + closureColumn(header : trans("NAME"), preferredWidth : 350, type : UIResultEvent, read : {model.hashBucket[it].firstEvent()}) closureColumn(header : trans("SIZE"), preferredWidth : 20, type : Long, read : { model.hashBucket[it].getSize() }) @@ -605,7 +605,7 @@ class SearchTabView { Persona sender = selectedSender() if (sender == null) // really shouldn't happen - return model.hashBucket[infohash].getResults().first() + return model.hashBucket[infohash].firstEvent() for (UIResultEvent candidate : model.hashBucket[infohash].getResults()) { if (candidate.sender == sender) @@ -613,7 +613,7 @@ class SearchTabView { } // also shouldn't happen - return model.hashBucket[infohash].getResults().first() + return model.hashBucket[infohash].firstEvent() } else { int[] selectedRows = resultsTable.getSelectedRows() if (selectedRows.length != 1)