X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Fcore%2FFreenetInterface.java;h=59e790c6a09e9480b583e36f030af78335cc0439;hb=07643fdd510640d6c0b20963e4f4f36e06469fb5;hp=35ac6a19f2b883d324ec78d0c5e4d9a2f9bb4680;hpb=5c5bee980f9cab5792e34d1c9840f73b8b191830;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java b/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java index 35ac6a1..59e790c 100644 --- a/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java +++ b/src/main/java/net/pterodactylus/sone/core/FreenetInterface.java @@ -24,6 +24,7 @@ import static java.util.logging.Logger.getLogger; import java.io.IOException; import java.net.MalformedURLException; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -42,6 +43,8 @@ import net.pterodactylus.sone.data.Sone; import net.pterodactylus.sone.data.TemporaryImage; import com.google.common.base.Function; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; import com.google.common.eventbus.EventBus; import com.google.inject.Singleton; @@ -63,6 +66,7 @@ import freenet.client.async.ClientPutCallback; import freenet.client.async.ClientPutter; import freenet.client.async.SnoopMetadata; import freenet.client.async.USKCallback; +import freenet.client.async.USKManager; import freenet.keys.FreenetURI; import freenet.keys.InsertableClientSSK; import freenet.keys.USK; @@ -90,6 +94,8 @@ public class FreenetInterface { /** The node to interact with. */ private final Node node; + private final USKManager uskManager; + private final ClientContext clientContext; private final SoneUriCreator soneUriCreator; @@ -98,7 +104,7 @@ public class FreenetInterface { private final RequestClient requestClient = new RequestClientBuilder().realTime().build(); /** The USK callbacks. */ - private final Map soneUskCallbacks = new HashMap<>(); + private final Multimap soneUskCallbacks = ArrayListMultimap.create(); /** The not-Sone-related USK callbacks. */ private final Map uriUskCallbacks = Collections.synchronizedMap(new HashMap()); @@ -107,11 +113,13 @@ public class FreenetInterface { private final RequestClient imageLoader = new RequestClientBuilder().realTime().build(); @Inject - public FreenetInterface(EventBus eventBus, Node node, SoneUriCreator soneUriCreator) { + public FreenetInterface(EventBus eventBus, Node node, USKManager uskManager, ClientContext clientContext, SoneUriCreator soneUriCreator, HighLevelSimpleClientCreator highLevelSimpleClientCreator) { this.eventBus = eventBus; this.node = node; + this.uskManager = uskManager; + this.clientContext = clientContext; this.soneUriCreator = soneUriCreator; - this.client = node.clientCore.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS, false, true); + this.client = highLevelSimpleClientCreator.makeClient(RequestStarter.INTERACTIVE_PRIORITY_CLASS, false, true); } // @@ -183,7 +191,7 @@ public class FreenetInterface { try { ClientGetter clientGetter = client.fetch(uri, 2097152, callback, fetchContext, RequestStarter.INTERACTIVE_PRIORITY_CLASS); clientGetter.setMetaSnoop(snoop); - clientGetter.restart(uri, fetchContext.filterData, node.clientCore.clientContext); + clientGetter.restart(uri, fetchContext.filterData, clientContext); } catch (FetchException fe) { /* stupid exception that can not actually be thrown! */ } @@ -251,7 +259,7 @@ public class FreenetInterface { USKCallback uskCallback) { try { soneUskCallbacks.put(FreenetURIsKt.getRoutingKeyString(requestUri), uskCallback); - node.clientCore.uskManager.subscribe(create(requestUri), + uskManager.subscribe(create(requestUri), uskCallback, true, requestClient); } catch (MalformedURLException mue1) { logger.log(WARNING, format("Could not subscribe USK “%s”!", @@ -263,9 +271,7 @@ public class FreenetInterface { USKCallback uskCallback) { try { soneUskCallbacks.put(FreenetURIsKt.getRoutingKeyString(requestUri), uskCallback); - node.clientCore - .uskManager - .subscribe(create(requestUri), uskCallback, false, requestClient); + uskManager.subscribe(create(requestUri), uskCallback, false, requestClient); } catch (MalformedURLException mue1) { logger.log(WARNING, format("Could not subscribe USK “%s”!", requestUri), @@ -280,16 +286,19 @@ public class FreenetInterface { * The Sone to unregister */ public void unregisterUsk(Sone sone) { - USKCallback uskCallback = soneUskCallbacks.remove(sone.getId()); - if (uskCallback == null) { + Collection uskCallbacks = soneUskCallbacks.removeAll(sone.getId()); + if (uskCallbacks.isEmpty()) { return; } - try { - logger.log(Level.FINEST, String.format("Unsubscribing from USK for %s…", sone)); - node.clientCore.uskManager.unsubscribe(USK.create(soneUriCreator.getRequestUri(sone)), uskCallback); - } catch (MalformedURLException mue1) { - logger.log(Level.FINE, String.format("Could not unsubscribe USK “%s”!", soneUriCreator.getRequestUri(sone)), mue1); - } + logger.log(Level.FINE, String.format("Unsubscribing %d from USK for %s…", uskCallbacks.size(), sone)); + logger.log(Level.FINEST, String.format("USKs left: %d", soneUskCallbacks.size())); + uskCallbacks.forEach(uskCallback -> { + try { + uskManager.unsubscribe(USK.create(soneUriCreator.getRequestUri(sone)), uskCallback); + } catch (MalformedURLException mue1) { + logger.log(Level.FINE, String.format("Could not unsubscribe USK “%s”!", soneUriCreator.getRequestUri(sone)), mue1); + } + }); } /** @@ -321,7 +330,7 @@ public class FreenetInterface { }; try { - node.clientCore.uskManager.subscribe(USK.create(uri), uskCallback, true, requestClient); + uskManager.subscribe(USK.create(uri), uskCallback, true, requestClient); uriUskCallbacks.put(USK.create(uri).clearCopy().getURI(), uskCallback); } catch (MalformedURLException mue1) { logger.log(Level.WARNING, String.format("Could not subscribe to USK: %s", uri), mue1); @@ -341,7 +350,7 @@ public class FreenetInterface { logger.log(Level.INFO, String.format("Could not unregister unknown USK: %s", uri)); return; } - node.clientCore.uskManager.unsubscribe(USK.create(uri), uskCallback); + uskManager.unsubscribe(USK.create(uri), uskCallback); } catch (MalformedURLException mue1) { logger.log(Level.INFO, String.format("Could not unregister invalid USK: %s", uri), mue1); } @@ -429,7 +438,7 @@ public class FreenetInterface { */ @SuppressWarnings("synthetic-access") public void cancel() { - clientPutter.cancel(node.clientCore.clientContext); + clientPutter.cancel(clientContext); eventBus.post(new ImageInsertAbortedEvent(image)); bucket.free(); }