X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManager.java;h=568a63735b11b689513600c758e8fee7ddf68774;hb=775d4caf9a15367785edd31d9cc411d67bdfb5ac;hp=98ba2c7c4cab998639f6bff1089e7d8017648d74;hpb=1bbbccf32d00e5d046275c63c5a2eb489f77603b;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 98ba2c7..568a637 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 David Roden + * Sone - IdentityManager.java - Copyright © 2010–2012 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 @@ -19,6 +19,7 @@ package net.pterodactylus.sone.freenet.wot; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -43,6 +44,7 @@ import net.pterodactylus.util.service.AbstractService; public class IdentityManager extends AbstractService { /** Object used for synchronization. */ + @SuppressWarnings("hiding") private final Object syncObject = new Object() { /* inner class for better lock names. */ }; @@ -57,21 +59,28 @@ public class IdentityManager extends AbstractService { 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 webOfTrustConnector * The Web of Trust connector + * @param context + * The context to focus on (may be {@code null} to ignore + * contexts) */ - public IdentityManager(WebOfTrustConnector webOfTrustConnector) { + public IdentityManager(WebOfTrustConnector webOfTrustConnector, String context) { super("Sone Identity Manager", false); this.webOfTrustConnector = webOfTrustConnector; + this.context = context; } // @@ -103,13 +112,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; } /** @@ -140,7 +149,7 @@ public class IdentityManager extends AbstractService { Set allOwnIdentities = getAllOwnIdentities(); for (OwnIdentity ownIdentity : allOwnIdentities) { if (ownIdentity.getId().equals(id)) { - return ownIdentity; + return new DefaultOwnIdentity(ownIdentity); } } return null; @@ -152,18 +161,7 @@ public class IdentityManager extends AbstractService { * @return All own identities */ public Set getAllOwnIdentities() { - try { - Set ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); - Map newOwnIdentities = new HashMap(); - for (OwnIdentity ownIdentity : ownIdentities) { - newOwnIdentities.put(ownIdentity.getId(), ownIdentity); - } - checkOwnIdentities(newOwnIdentities); - return ownIdentities; - } catch (WebOfTrustException wote1) { - logger.log(Level.WARNING, "Could not load all own identities!", wote1); - return Collections.emptySet(); - } + return new HashSet(currentOwnIdentities.values()); } // @@ -180,28 +178,42 @@ 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. */ - Set ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); + ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); - /* check for changes. */ + /* load trusted identities. */ for (OwnIdentity ownIdentity : ownIdentities) { currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); - } - checkOwnIdentities(currentOwnIdentities); + Map identities = new HashMap(); + currentIdentities.put(ownIdentity, identities); - /* now filter for context and get all identities. */ - for (OwnIdentity ownIdentity : ownIdentities) { + /* if the context doesn’t match, skip getting trusted identities. */ if ((context != null) && !ownIdentity.hasContext(context)) { continue; } + /* load trusted identities. */ Set trustedIdentities = webOfTrustConnector.loadTrustedIdentities(ownIdentity, context); - Map identities = new HashMap(); - currentIdentities.put(ownIdentity, identities); 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); + } + + if (identitiesLoaded) { + + /* check for changes. */ + checkOwnIdentities(currentOwnIdentities); + + /* now check for changes in remote identities. */ + for (OwnIdentity ownIdentity : currentOwnIdentities.values()) { /* find new identities. */ for (Identity currentIdentity : currentIdentities.get(ownIdentity).values()) { @@ -258,13 +270,10 @@ public class IdentityManager extends AbstractService { } } } - - /* remember the current set of identities. */ - oldIdentities = currentIdentities; } - } catch (WebOfTrustException wote1) { - logger.log(Level.WARNING, "WoT has disappeared!", wote1); + /* remember the current set of identities. */ + oldIdentities = currentIdentities; } /* wait a minute before checking again. */ @@ -288,15 +297,17 @@ public class IdentityManager extends AbstractService { /* find removed own identities: */ for (OwnIdentity oldOwnIdentity : currentOwnIdentities.values()) { - if (!newOwnIdentities.containsKey(oldOwnIdentity.getId())) { - identityListenerManager.fireOwnIdentityRemoved(oldOwnIdentity); + OwnIdentity newOwnIdentity = newOwnIdentities.get(oldOwnIdentity.getId()); + if ((newOwnIdentity == null) || ((context != null) && oldOwnIdentity.hasContext(context) && !newOwnIdentity.hasContext(context))) { + identityListenerManager.fireOwnIdentityRemoved(new DefaultOwnIdentity(oldOwnIdentity)); } } /* find added own identities. */ for (OwnIdentity currentOwnIdentity : newOwnIdentities.values()) { - if (!currentOwnIdentities.containsKey(currentOwnIdentity.getId())) { - identityListenerManager.fireOwnIdentityAdded(currentOwnIdentity); + 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)); } }