X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FWebOfTrustConnector.java;h=d3e8747fe521807c5dbfea8f5718f2a3010531e1;hp=53a45b1739d6f10a582d4c1a8b8a9e01d07ae28c;hb=d5efb086bee8f103cbe90c7a953ffbb7ff27b689;hpb=76a966d422ff271ced1fbacfb9a3dfaadf47b294 diff --git a/src/main/java/net/pterodactylus/sone/freenet/wot/WebOfTrustConnector.java b/src/main/java/net/pterodactylus/sone/freenet/wot/WebOfTrustConnector.java index 53a45b1..d3e8747 100644 --- a/src/main/java/net/pterodactylus/sone/freenet/wot/WebOfTrustConnector.java +++ b/src/main/java/net/pterodactylus/sone/freenet/wot/WebOfTrustConnector.java @@ -1,5 +1,5 @@ /* - * Sone - WebOfTrustConnector.java - Copyright © 2010–2012 David Roden + * Sone - WebOfTrustConnector.java - Copyright © 2010–2013 David Roden * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,11 +25,17 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.logging.Level; import java.util.logging.Logger; -import net.pterodactylus.sone.freenet.plugin.ConnectorListener; import net.pterodactylus.sone.freenet.plugin.PluginConnector; import net.pterodactylus.sone.freenet.plugin.PluginException; +import net.pterodactylus.sone.freenet.plugin.event.ReceivedReplyEvent; import net.pterodactylus.util.logging.Logging; -import net.pterodactylus.util.number.Numbers; + +import com.google.common.base.Optional; +import com.google.common.collect.MapMaker; +import com.google.common.eventbus.Subscribe; +import com.google.common.primitives.Ints; +import com.google.inject.Inject; + import freenet.support.SimpleFieldSet; import freenet.support.api.Bucket; @@ -52,6 +58,9 @@ public class WebOfTrustConnector { /** The plugin connector. */ private final PluginConnector pluginConnector; + /** Map for replies. */ + private final Map replies = new MapMaker().makeMap(); + /** * Creates a new Web of Trust connector that uses the given plugin * connector. @@ -59,6 +68,7 @@ public class WebOfTrustConnector { * @param pluginConnector * The plugin connector */ + @Inject public WebOfTrustConnector(PluginConnector pluginConnector) { this.pluginConnector = pluginConnector; } @@ -143,9 +153,9 @@ public class WebOfTrustConnector { DefaultIdentity identity = new DefaultIdentity(id, nickname, requestUri); identity.setContexts(parseContexts("Contexts" + identityCounter + ".", fields)); identity.setProperties(parseProperties("Properties" + identityCounter + ".", fields)); - Integer trust = Numbers.safeParseInteger(fields.get("Trust" + identityCounter), null); - int score = Numbers.safeParseInteger(fields.get("Score" + identityCounter)); - int rank = Numbers.safeParseInteger(fields.get("Rank" + identityCounter)); + Integer trust = Ints.tryParse(fields.get("Trust" + identityCounter)); + int score = Optional.fromNullable(Ints.tryParse(fields.get("Score" + identityCounter))).or(0); + int rank = Optional.fromNullable(Ints.tryParse(fields.get("Rank" + identityCounter))).or(0); identity.setTrust(ownIdentity, new Trust(trust, score, rank)); identities.add(identity); } @@ -380,24 +390,12 @@ public class WebOfTrustConnector { * if the request could not be sent */ private Reply performRequest(SimpleFieldSet fields, Bucket data) throws PluginException { - final String identifier = "FCP-Command-" + System.currentTimeMillis() + "-" + counter.getAndIncrement(); - final Reply reply = new Reply(); + String identifier = "FCP-Command-" + System.currentTimeMillis() + "-" + counter.getAndIncrement(); + Reply reply = new Reply(); + PluginIdentifier pluginIdentifier = new PluginIdentifier(WOT_PLUGIN_NAME, identifier); + replies.put(pluginIdentifier, reply); + logger.log(Level.FINE, String.format("Sending FCP Request: %s", fields.get("Message"))); - ConnectorListener connectorListener = new ConnectorListener() { - - @Override - @SuppressWarnings("synthetic-access") - public void receivedReply(PluginConnector pluginConnector, SimpleFieldSet fields, Bucket data) { - String messageName = fields.get("Message"); - logger.log(Level.FINEST, String.format("Received Reply from Plugin: %s", messageName)); - synchronized (reply) { - reply.setFields(fields); - reply.setData(data); - reply.notify(); - } - } - }; - pluginConnector.addConnectorListener(WOT_PLUGIN_NAME, identifier, connectorListener); synchronized (reply) { try { pluginConnector.sendRequest(WOT_PLUGIN_NAME, identifier, fields, data); @@ -409,7 +407,7 @@ public class WebOfTrustConnector { } } } finally { - pluginConnector.removeConnectorListener(WOT_PLUGIN_NAME, identifier, connectorListener); + replies.remove(pluginIdentifier); } } logger.log(Level.FINEST, String.format("Received FCP Response for %s: %s", fields.get("Message"), (reply.getFields() != null) ? reply.getFields().get("Message") : null)); @@ -420,6 +418,27 @@ public class WebOfTrustConnector { } /** + * Notifies the connector that a plugin reply was received. + * + * @param receivedReplyEvent + * The event + */ + @Subscribe + public void receivedReply(ReceivedReplyEvent receivedReplyEvent) { + PluginIdentifier pluginIdentifier = new PluginIdentifier(receivedReplyEvent.pluginName(), receivedReplyEvent.identifier()); + Reply reply = replies.remove(pluginIdentifier); + if (reply == null) { + return; + } + logger.log(Level.FINEST, String.format("Received Reply from Plugin: %s", receivedReplyEvent.fieldSet().get("Message"))); + synchronized (reply) { + reply.setFields(receivedReplyEvent.fieldSet()); + reply.setData(receivedReplyEvent.data()); + reply.notify(); + } + } + + /** * Container for the data of the reply from a plugin. * * @author David ‘Bombe’ Roden @@ -554,4 +573,57 @@ public class WebOfTrustConnector { } + /** + * Container for identifying plugins. Plugins are identified by their plugin + * name and their unique identifier. + * + * @author David Roden + */ + private static class PluginIdentifier { + + /** The plugin name. */ + private final String pluginName; + + /** The plugin identifier. */ + private final String identifier; + + /** + * Creates a new plugin identifier. + * + * @param pluginName + * The name of the plugin + * @param identifier + * The identifier of the plugin + */ + public PluginIdentifier(String pluginName, String identifier) { + this.pluginName = pluginName; + this.identifier = identifier; + } + + // + // OBJECT METHODS + // + + /** + * {@inheritDoc} + */ + @Override + public int hashCode() { + return pluginName.hashCode() ^ identifier.hashCode(); + } + + /** + * {@inheritDoc} + */ + @Override + public boolean equals(Object object) { + if (!(object instanceof PluginIdentifier)) { + return false; + } + PluginIdentifier pluginIdentifier = (PluginIdentifier) object; + return pluginName.equals(pluginIdentifier.pluginName) && identifier.equals(pluginIdentifier.identifier); + } + + } + }