X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FWebOfTrustConnector.java;h=7ce1ede788d7f56a72732c512e56933f4d60b1d5;hb=e01ceeed92f226bf74c9f516bce882b5cd816a62;hp=4ef26cba7a2e29c9c3426aab4c20c7d775c04501;hpb=61c6762ee8a788ac4c5773c79eb6ed4620b98779;p=Sone.git 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 4ef26cb..7ce1ede 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,10 +25,16 @@ 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.collect.MapMaker; +import com.google.common.eventbus.Subscribe; +import com.google.inject.Inject; + import freenet.support.SimpleFieldSet; import freenet.support.api.Bucket; @@ -51,6 +57,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. @@ -58,6 +67,7 @@ public class WebOfTrustConnector { * @param pluginConnector * The plugin connector */ + @Inject public WebOfTrustConnector(PluginConnector pluginConnector) { this.pluginConnector = pluginConnector; } @@ -67,13 +77,6 @@ public class WebOfTrustConnector { // /** - * Stops the web of trust connector. - */ - public void stop() { - /* does nothing. */ - } - - /** * Loads all own identities from the Web of Trust plugin. * * @return All own identity @@ -103,20 +106,6 @@ public class WebOfTrustConnector { /** * Loads all identities that the given identities trusts with a score of - * more than 0. - * - * @param ownIdentity - * The own identity - * @return All trusted identities - * @throws PluginException - * if an error occured talking to the Web of Trust plugin - */ - public Set loadTrustedIdentities(OwnIdentity ownIdentity) throws PluginException { - return loadTrustedIdentities(ownIdentity, null); - } - - /** - * Loads all identities that the given identities trusts with a score of * more than 0 and the (optional) given context. * * @param ownIdentity @@ -128,7 +117,7 @@ public class WebOfTrustConnector { * if an error occured talking to the Web of Trust plugin */ public Set loadTrustedIdentities(OwnIdentity ownIdentity, String context) throws PluginException { - Reply reply = performRequest(SimpleFieldSetConstructor.create().put("Message", "GetIdentitiesByScore").put("Truster", ownIdentity.getId()).put("Selection", "+").put("Context", (context == null) ? "" : context).get()); + Reply reply = performRequest(SimpleFieldSetConstructor.create().put("Message", "GetIdentitiesByScore").put("Truster", ownIdentity.getId()).put("Selection", "+").put("Context", (context == null) ? "" : context).put("WantTrustValues", "true").get()); SimpleFieldSet fields = reply.getFields(); Set identities = new HashSet(); int identityCounter = -1; @@ -142,6 +131,10 @@ 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), 0); + int rank = Numbers.safeParseInteger(fields.get("Rank" + identityCounter), 0); + identity.setTrust(ownIdentity, new Trust(trust, score, rank)); identities.add(identity); } return identities; @@ -312,7 +305,7 @@ public class WebOfTrustConnector { * The fields to parse the contexts from * @return The parsed contexts */ - private Set parseContexts(String prefix, SimpleFieldSet fields) { + private static Set parseContexts(String prefix, SimpleFieldSet fields) { Set contexts = new HashSet(); int contextCounter = -1; while (true) { @@ -334,7 +327,7 @@ public class WebOfTrustConnector { * The fields to parse the properties from * @return The parsed properties */ - private Map parseProperties(String prefix, SimpleFieldSet fields) { + private static Map parseProperties(String prefix, SimpleFieldSet fields) { Map properties = new HashMap(); int propertiesCounter = -1; while (true) { @@ -375,33 +368,26 @@ 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) { - pluginConnector.sendRequest(WOT_PLUGIN_NAME, identifier, fields, data); try { - reply.wait(); - } catch (InterruptedException ie1) { - logger.log(Level.WARNING, String.format("Got interrupted while waiting for reply on %s.", fields.get("Message")), ie1); + pluginConnector.sendRequest(WOT_PLUGIN_NAME, identifier, fields, data); + while (reply.getFields() == null) { + try { + reply.wait(); + } catch (InterruptedException ie1) { + logger.log(Level.WARNING, String.format("Got interrupted while waiting for reply on %s.", fields.get("Message")), ie1); + } + } + } finally { + replies.remove(pluginIdentifier); } } - pluginConnector.removeConnectorListener(WOT_PLUGIN_NAME, identifier, connectorListener); logger.log(Level.FINEST, String.format("Received FCP Response for %s: %s", fields.get("Message"), (reply.getFields() != null) ? reply.getFields().get("Message") : null)); if ((reply.getFields() == null) || "Error".equals(reply.getFields().get("Message"))) { throw new PluginException("Could not perform request for " + fields.get("Message")); @@ -410,6 +396,26 @@ 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.notify(); + } + } + + /** * Container for the data of the reply from a plugin. * * @author David ‘Bombe’ Roden @@ -419,9 +425,6 @@ public class WebOfTrustConnector { /** The fields of the reply. */ private SimpleFieldSet fields; - /** The payload of the reply. */ - private Bucket data; - /** Empty constructor. */ public Reply() { /* do nothing. */ @@ -446,26 +449,6 @@ public class WebOfTrustConnector { this.fields = fields; } - /** - * Returns the payload of the reply. - * - * @return The payload of the reply (may be {@code null}) - */ - @SuppressWarnings("unused") - public Bucket getData() { - return data; - } - - /** - * Sets the payload of the reply. - * - * @param data - * The payload of the reply (may be {@code null}) - */ - public void setData(Bucket data) { - this.data = data; - } - } /** @@ -544,4 +527,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); + } + + } + }