X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManager.java;h=9f9ab7fe30bdfd0872998ceefedaae4a0feebb61;hb=00a7e47e114cf24f9ab5731bcbe1abeafe435577;hp=3c3c9f9221cc64e8e0c7276fe80cfb07a80a0df6;hpb=d1e011bc62bede509d8482dfeea950823b974413;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 3c3c9f9..9f9ab7f 100644 --- a/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java +++ b/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManager.java @@ -1,5 +1,5 @@ /* - * Sone - IdentityManager.java - Copyright © 2010–2012 David Roden + * Sone - IdentityManager.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 @@ -27,16 +27,25 @@ import java.util.logging.Level; import java.util.logging.Logger; import net.pterodactylus.sone.freenet.plugin.PluginException; +import net.pterodactylus.sone.freenet.wot.event.IdentityAddedEvent; +import net.pterodactylus.sone.freenet.wot.event.IdentityRemovedEvent; +import net.pterodactylus.sone.freenet.wot.event.IdentityUpdatedEvent; +import net.pterodactylus.sone.freenet.wot.event.OwnIdentityAddedEvent; +import net.pterodactylus.sone.freenet.wot.event.OwnIdentityRemovedEvent; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.service.AbstractService; +import com.google.common.eventbus.EventBus; +import com.google.inject.Inject; +import com.google.inject.name.Named; + /** * The identity manager takes care of loading and storing identities, their * contexts, and properties. It does so in a way that does not expose errors via * exceptions but it only logs them and tries to return sensible defaults. *

* It is also responsible for polling identities from the Web of Trust plugin - * and notifying registered {@link IdentityListener}s when {@link Identity}s and + * and sending events to the {@link EventBus} when {@link Identity}s and * {@link OwnIdentity}s are discovered or disappearing. * * @author David ‘Bombe’ Roden @@ -52,52 +61,39 @@ public class IdentityManager extends AbstractService { /** The logger. */ private static final Logger logger = Logging.getLogger(IdentityManager.class); - /** The event manager. */ - private final IdentityListenerManager identityListenerManager = new IdentityListenerManager(); + /** The event bus. */ + private final EventBus eventBus; /** The Web of Trust connector. */ private final WebOfTrustConnector webOfTrustConnector; /** The context to filter for. */ - private volatile String context; + private final String context; /** The currently known own identities. */ /* synchronize access on syncObject. */ - private Map currentOwnIdentities = new HashMap(); + private final Map currentOwnIdentities = new HashMap(); + + /** The last time all identities were loaded. */ + private volatile long identitiesLastLoaded; /** * Creates a new identity manager. * + * @param eventBus + * The event bus * @param webOfTrustConnector * The Web of Trust connector + * @param context + * The context to focus on (may be {@code null} to ignore + * contexts) */ - public IdentityManager(WebOfTrustConnector webOfTrustConnector) { + @Inject + public IdentityManager(EventBus eventBus, WebOfTrustConnector webOfTrustConnector, @Named("WebOfTrustContext") String context) { super("Sone Identity Manager", false); + this.eventBus = eventBus; this.webOfTrustConnector = webOfTrustConnector; - } - - // - // LISTENER MANAGEMENT - // - - /** - * Adds a listener for identity events. - * - * @param identityListener - * The listener to add - */ - public void addIdentityListener(IdentityListener identityListener) { - identityListenerManager.addListener(identityListener); - } - - /** - * Removes a listener for identity events. - * - * @param identityListener - * The listener to remove - */ - public void removeIdentityListener(IdentityListener identityListener) { - identityListenerManager.removeListener(identityListener); + this.context = context; } // @@ -105,13 +101,13 @@ public class IdentityManager extends AbstractService { // /** - * Sets the context to filter own identities and trusted identities for. + * Returns the last time all identities were loaded. * - * @param context - * The context to filter for, or {@code null} to not filter + * @return The last time all identities were loaded (in milliseconds since + * Jan 1, 1970 UTC) */ - public void setContext(String context) { - this.context = context; + public long getIdentitiesLastLoaded() { + return identitiesLastLoaded; } /** @@ -171,27 +167,37 @@ public class IdentityManager extends AbstractService { Map> currentIdentities = new HashMap>(); Map currentOwnIdentities = new HashMap(); - Set ownIdentities = null; boolean identitiesLoaded = false; try { /* get all identities with the wanted context from WoT. */ - ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); + logger.finer("Getting all Own Identities from WoT..."); + Set ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); + logger.finest(String.format("Loaded %d Own Identities.", ownIdentities.size())); /* load trusted identities. */ for (OwnIdentity ownIdentity : ownIdentities) { + currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); + Map identities = new HashMap(); + currentIdentities.put(ownIdentity, identities); + + /* + * if the context doesn’t match, skip getting trusted + * identities. + */ if ((context != null) && !ownIdentity.hasContext(context)) { continue; } - currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); + /* load trusted identities. */ + logger.finer(String.format("Getting trusted identities for %s...", ownIdentity.getId())); Set trustedIdentities = webOfTrustConnector.loadTrustedIdentities(ownIdentity, context); - Map identities = new HashMap(); - currentIdentities.put(ownIdentity, identities); + logger.finest(String.format("Got %d trusted identities.", trustedIdentities.size())); for (Identity identity : trustedIdentities) { identities.put(identity.getId(), identity); } } identitiesLoaded = true; + identitiesLastLoaded = System.currentTimeMillis(); } catch (WebOfTrustException wote1) { logger.log(Level.WARNING, "WoT has disappeared!", wote1); } @@ -207,7 +213,8 @@ public class IdentityManager extends AbstractService { /* find new identities. */ for (Identity currentIdentity : currentIdentities.get(ownIdentity).values()) { if (!oldIdentities.containsKey(ownIdentity) || !oldIdentities.get(ownIdentity).containsKey(currentIdentity.getId())) { - identityListenerManager.fireIdentityAdded(ownIdentity, currentIdentity); + logger.finest(String.format("Identity added for %s: %s", ownIdentity.getId(), currentIdentity)); + eventBus.post(new IdentityAddedEvent(ownIdentity, currentIdentity)); } } @@ -215,7 +222,8 @@ public class IdentityManager extends AbstractService { if (oldIdentities.containsKey(ownIdentity)) { for (Identity oldIdentity : oldIdentities.get(ownIdentity).values()) { if (!currentIdentities.get(ownIdentity).containsKey(oldIdentity.getId())) { - identityListenerManager.fireIdentityRemoved(ownIdentity, oldIdentity); + logger.finest(String.format("Identity removed for %s: %s", ownIdentity.getId(), oldIdentity)); + eventBus.post(new IdentityRemovedEvent(ownIdentity, oldIdentity)); } } @@ -228,12 +236,14 @@ public class IdentityManager extends AbstractService { Set oldContexts = oldIdentity.getContexts(); Set newContexts = newIdentity.getContexts(); if (oldContexts.size() != newContexts.size()) { - identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + logger.finest(String.format("Contexts changed for %s: was: %s, is now: %s", ownIdentity.getId(), oldContexts, newContexts)); + eventBus.post(new IdentityUpdatedEvent(ownIdentity, newIdentity)); continue; } for (String oldContext : oldContexts) { if (!newContexts.contains(oldContext)) { - identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + logger.finest(String.format("Context was removed for %s: %s", ownIdentity.getId(), oldContext)); + eventBus.post(new IdentityUpdatedEvent(ownIdentity, newIdentity)); break; } } @@ -248,12 +258,14 @@ public class IdentityManager extends AbstractService { Map oldProperties = oldIdentity.getProperties(); Map newProperties = newIdentity.getProperties(); if (oldProperties.size() != newProperties.size()) { - identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + logger.finest(String.format("Properties changed for %s: was: %s, is now: %s", ownIdentity.getId(), oldProperties, newProperties)); + eventBus.post(new IdentityUpdatedEvent(ownIdentity, newIdentity)); continue; } for (Entry oldProperty : oldProperties.entrySet()) { if (!newProperties.containsKey(oldProperty.getKey()) || !newProperties.get(oldProperty.getKey()).equals(oldProperty.getValue())) { - identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + logger.finest(String.format("Property was removed for %s: %s", ownIdentity.getId(), oldProperty)); + eventBus.post(new IdentityUpdatedEvent(ownIdentity, newIdentity)); break; } } @@ -288,7 +300,8 @@ public class IdentityManager extends AbstractService { for (OwnIdentity oldOwnIdentity : currentOwnIdentities.values()) { OwnIdentity newOwnIdentity = newOwnIdentities.get(oldOwnIdentity.getId()); if ((newOwnIdentity == null) || ((context != null) && oldOwnIdentity.hasContext(context) && !newOwnIdentity.hasContext(context))) { - identityListenerManager.fireOwnIdentityRemoved(new DefaultOwnIdentity(oldOwnIdentity)); + logger.finest(String.format("Own Identity removed: %s", oldOwnIdentity)); + eventBus.post(new OwnIdentityRemovedEvent(new DefaultOwnIdentity(oldOwnIdentity))); } } @@ -296,7 +309,8 @@ public class IdentityManager extends AbstractService { for (OwnIdentity currentOwnIdentity : newOwnIdentities.values()) { OwnIdentity oldOwnIdentity = currentOwnIdentities.get(currentOwnIdentity.getId()); if (((oldOwnIdentity == null) && ((context == null) || currentOwnIdentity.hasContext(context))) || ((oldOwnIdentity != null) && (context != null) && (!oldOwnIdentity.hasContext(context) && currentOwnIdentity.hasContext(context)))) { - identityListenerManager.fireOwnIdentityAdded(new DefaultOwnIdentity(currentOwnIdentity)); + logger.finest(String.format("Own Identity added: %s", currentOwnIdentity)); + eventBus.post(new OwnIdentityAddedEvent(new DefaultOwnIdentity(currentOwnIdentity))); } }