X-Git-Url: https://git.pterodactylus.net/?p=Sone.git;a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManager.java;h=3c3c9f9221cc64e8e0c7276fe80cfb07a80a0df6;hp=dbf42065277c42a0d248857f6c81c27f15283525;hb=4970a2332d0295fa4e428e1f4ea54bd2d839e464;hpb=6ab999d8120ca28c4a1cb7370ae9e8ac61504556 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 dbf4206..3c3c9f9 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. */ }; @@ -140,7 +142,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 +154,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,21 +171,18 @@ 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(); - - /* check for changes. */ - for (OwnIdentity ownIdentity : ownIdentities) { - currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); - } - checkOwnIdentities(currentOwnIdentities); + ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); - /* now filter for context and get all identities. */ + /* load trusted identities. */ for (OwnIdentity ownIdentity : ownIdentities) { if ((context != null) && !ownIdentity.hasContext(context)) { continue; } + currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); Set trustedIdentities = webOfTrustConnector.loadTrustedIdentities(ownIdentity, context); Map identities = new HashMap(); @@ -202,18 +190,31 @@ public class IdentityManager extends AbstractService { for (Identity identity : trustedIdentities) { identities.put(identity.getId(), identity); } + } + identitiesLoaded = true; + } 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(ownIdentities).values()) { - if (!oldIdentities.containsKey(currentIdentity.getId())) { + for (Identity currentIdentity : currentIdentities.get(ownIdentity).values()) { + if (!oldIdentities.containsKey(ownIdentity) || !oldIdentities.get(ownIdentity).containsKey(currentIdentity.getId())) { identityListenerManager.fireIdentityAdded(ownIdentity, currentIdentity); } } /* find removed identities. */ if (oldIdentities.containsKey(ownIdentity)) { - for (Identity oldIdentity : oldIdentities.get(ownIdentities).values()) { - if (!currentIdentities.containsKey(oldIdentity.getId())) { + for (Identity oldIdentity : oldIdentities.get(ownIdentity).values()) { + if (!currentIdentities.get(ownIdentity).containsKey(oldIdentity.getId())) { identityListenerManager.fireIdentityRemoved(ownIdentity, oldIdentity); } } @@ -258,13 +259,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 +286,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)); } }