X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManager.java;h=16789d11119d9b23c06c5d7a84197701c3ed0c64;hb=58f449dd0b8ebad51fd8fc06c52233e9a160e0bc;hp=e416cd140db6bf00439a6d6a4ceec8feba8cc5e1;hpb=97cc5d173db6b98489c469af2b9e621030a86c53;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java b/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java index e416cd1..16789d1 100644 --- a/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java +++ b/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java @@ -25,8 +25,6 @@ import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import net.pterodactylus.util.filter.Filter; -import net.pterodactylus.util.filter.Filters; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.service.AbstractService; @@ -43,6 +41,11 @@ import net.pterodactylus.util.service.AbstractService; */ public class IdentityManager extends AbstractService { + /** Object used for synchronization. */ + private final Object syncObject = new Object() { + /* inner class for better lock names. */ + }; + /** The logger. */ private static final Logger logger = Logging.getLogger(IdentityManager.class); @@ -55,8 +58,9 @@ public class IdentityManager extends AbstractService { /** The context to filter for. */ private volatile String context; - /** Whether the Web of Trust plugin is connected. */ - private volatile boolean wotPluginConnected = false; + /** The currently known own identities. */ + /* synchronize access on syncObject. */ + private Map currentOwnIdentities = new HashMap(); /** * Creates a new identity manager. @@ -115,7 +119,13 @@ public class IdentityManager extends AbstractService { * {@code false} otherwise */ public boolean isConnected() { - return wotPluginConnected; + try { + webOfTrustConnector.ping(); + return true; + } catch (PluginException pe1) { + /* not connected, ignore. */ + return false; + } } /** @@ -142,12 +152,15 @@ public class IdentityManager extends AbstractService { */ public Set getAllOwnIdentities() { try { - Set allOwnIdentities = webOfTrustConnector.loadAllOwnIdentities(); - wotPluginConnected = true; - return allOwnIdentities; + Set ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); + Map newOwnIdentities = new HashMap(); + for (OwnIdentity ownIdentity : ownIdentities) { + newOwnIdentities.put(ownIdentity.getId(), ownIdentity); + } + checkOwnIdentities(newOwnIdentities); + return ownIdentities; } catch (PluginException pe1) { logger.log(Level.WARNING, "Could not load all own identities!", pe1); - wotPluginConnected = false; return Collections.emptySet(); } } @@ -170,11 +183,9 @@ public class IdentityManager extends AbstractService { } try { webOfTrustConnector.addContext(ownIdentity, context); - wotPluginConnected = true; ownIdentity.addContext(context); } catch (PluginException pe1) { logger.log(Level.WARNING, "Could not add context " + context + " to OwnIdentity " + ownIdentity + ".", pe1); - wotPluginConnected = false; } } @@ -192,11 +203,9 @@ public class IdentityManager extends AbstractService { } try { webOfTrustConnector.removeContext(ownIdentity, context); - wotPluginConnected = true; ownIdentity.removeContext(context); } catch (PluginException pe1) { logger.log(Level.WARNING, "Could not remove context " + context + " from OwnIdentity " + ownIdentity + ".", pe1); - wotPluginConnected = false; } } @@ -213,11 +222,9 @@ public class IdentityManager extends AbstractService { public void setProperty(OwnIdentity ownIdentity, String name, String value) { try { webOfTrustConnector.setProperty(ownIdentity, name, value); - wotPluginConnected = true; ownIdentity.setProperty(name, value); } catch (PluginException pe1) { logger.log(Level.WARNING, "Could not set property “" + name + "” to “" + value + "” for OwnIdentity: " + ownIdentity, pe1); - wotPluginConnected = false; } } @@ -232,11 +239,9 @@ public class IdentityManager extends AbstractService { public void removeProperty(OwnIdentity ownIdentity, String name) { try { webOfTrustConnector.removeProperty(ownIdentity, name); - wotPluginConnected = true; ownIdentity.removeProperty(name); } catch (PluginException pe1) { logger.log(Level.WARNING, "Could not remove property “" + name + "” from OwnIdentity: " + ownIdentity, pe1); - wotPluginConnected = false; } } @@ -250,7 +255,6 @@ public class IdentityManager extends AbstractService { @Override protected void serviceRun() { Map oldIdentities = Collections.emptyMap(); - Map oldOwnIdentities = Collections.emptyMap(); while (!shouldStop()) { Map currentIdentities = new HashMap(); Map currentOwnIdentities = new HashMap(); @@ -258,35 +262,18 @@ public class IdentityManager extends AbstractService { /* get all identities with the wanted context from WoT. */ Set ownIdentities; try { - ownIdentities = Filters.filteredSet(webOfTrustConnector.loadAllOwnIdentities(), new Filter() { - - @Override - @SuppressWarnings("synthetic-access") - public boolean filterObject(OwnIdentity ownIdentity) { - return (context == null) || ownIdentity.hasContext(context); - } - - }); + ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); for (OwnIdentity ownIdentity : ownIdentities) { + if ((context != null) && !ownIdentity.hasContext(context)) { + continue; + } currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); for (Identity identity : webOfTrustConnector.loadTrustedIdentities(ownIdentity, context)) { currentIdentities.put(identity.getId(), identity); } } - /* find removed own identities: */ - for (OwnIdentity oldOwnIdentity : oldOwnIdentities.values()) { - if (!currentOwnIdentities.containsKey(oldOwnIdentity.getId())) { - identityListenerManager.fireOwnIdentityRemoved(oldOwnIdentity); - } - } - - /* find added own identities. */ - for (OwnIdentity currentOwnIdentity : currentOwnIdentities.values()) { - if (!oldOwnIdentities.containsKey(currentOwnIdentity.getId())) { - identityListenerManager.fireOwnIdentityAdded(currentOwnIdentity); - } - } + checkOwnIdentities(currentOwnIdentities); /* find removed identities. */ for (Identity oldIdentity : oldIdentities.values()) { @@ -324,7 +311,6 @@ public class IdentityManager extends AbstractService { /* remember the current set of identities. */ oldIdentities = currentIdentities; - oldOwnIdentities = currentOwnIdentities; } catch (PluginException pe1) { logger.log(Level.WARNING, "WoT has disappeared!", pe1); @@ -335,4 +321,37 @@ public class IdentityManager extends AbstractService { } } + // + // PRIVATE METHODS + // + + /** + * Checks the given new list of own identities for added or removed own + * identities, as compared to {@link #currentOwnIdentities}. + * + * @param newOwnIdentities + * The new own identities + */ + private void checkOwnIdentities(Map newOwnIdentities) { + synchronized (syncObject) { + + /* find removed own identities: */ + for (OwnIdentity oldOwnIdentity : currentOwnIdentities.values()) { + if (!newOwnIdentities.containsKey(oldOwnIdentity.getId())) { + identityListenerManager.fireOwnIdentityRemoved(oldOwnIdentity); + } + } + + /* find added own identities. */ + for (OwnIdentity currentOwnIdentity : newOwnIdentities.values()) { + if (!currentOwnIdentities.containsKey(currentOwnIdentity.getId())) { + identityListenerManager.fireOwnIdentityAdded(currentOwnIdentity); + } + } + + currentOwnIdentities.clear(); + currentOwnIdentities.putAll(newOwnIdentities); + } + } + }