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=e7a82b51f7e9c466acfd824555dbed1384b2debc;hb=4970a2332d0295fa4e428e1f4ea54bd2d839e464;hpb=e7d03da9fe88c41edf8b3bffa7a6c0717653d834 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 e7a82b5..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,14 +19,14 @@ 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; 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.sone.freenet.plugin.PluginException; import net.pterodactylus.util.logging.Logging; import net.pterodactylus.util.service.AbstractService; @@ -43,6 +43,12 @@ 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. */ + }; + /** The logger. */ private static final Logger logger = Logging.getLogger(IdentityManager.class); @@ -55,6 +61,10 @@ public class IdentityManager extends AbstractService { /** The context to filter for. */ private volatile String context; + /** The currently known own identities. */ + /* synchronize access on syncObject. */ + private Map currentOwnIdentities = new HashMap(); + /** * Creates a new identity manager. * @@ -132,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; @@ -144,92 +154,7 @@ public class IdentityManager extends AbstractService { * @return All own identities */ public Set getAllOwnIdentities() { - try { - return webOfTrustConnector.loadAllOwnIdentities(); - } catch (PluginException pe1) { - logger.log(Level.WARNING, "Could not load all own identities!", pe1); - return Collections.emptySet(); - } - } - - // - // ACTIONS - // - - /** - * Adds a context to the given own identity. - * - * @param ownIdentity - * The own identity - * @param context - * The context to add - */ - public void addContext(OwnIdentity ownIdentity, String context) { - if (ownIdentity.hasContext(context)) { - return; - } - try { - webOfTrustConnector.addContext(ownIdentity, context); - ownIdentity.addContext(context); - } catch (PluginException pe1) { - logger.log(Level.WARNING, "Could not add context " + context + " to OwnIdentity " + ownIdentity + ".", pe1); - } - } - - /** - * Removes a context from the given own identity. - * - * @param ownIdentity - * The own identity - * @param context - * The context to remove - */ - public void removeContext(OwnIdentity ownIdentity, String context) { - if (!ownIdentity.hasContext(context)) { - return; - } - try { - webOfTrustConnector.removeContext(ownIdentity, context); - ownIdentity.removeContext(context); - } catch (PluginException pe1) { - logger.log(Level.WARNING, "Could not remove context " + context + " from OwnIdentity " + ownIdentity + ".", pe1); - } - } - - /** - * Sets the property with the given name to the given value. - * - * @param ownIdentity - * The own identity - * @param name - * The name of the property - * @param value - * The value of the property - */ - public void setProperty(OwnIdentity ownIdentity, String name, String value) { - try { - webOfTrustConnector.setProperty(ownIdentity, name, value); - ownIdentity.setProperty(name, value); - } catch (PluginException pe1) { - logger.log(Level.WARNING, "Could not set property “" + name + "” to “" + value + "” for OwnIdentity: " + ownIdentity, pe1); - } - } - - /** - * Removes the property with the given name. - * - * @param ownIdentity - * The own identity - * @param name - * The name of the property to remove - */ - public void removeProperty(OwnIdentity ownIdentity, String name) { - try { - webOfTrustConnector.removeProperty(ownIdentity, name); - ownIdentity.removeProperty(name); - } catch (PluginException pe1) { - logger.log(Level.WARNING, "Could not remove property “" + name + "” from OwnIdentity: " + ownIdentity, pe1); - } + return new HashSet(currentOwnIdentities.values()); } // @@ -241,85 +166,103 @@ public class IdentityManager extends AbstractService { */ @Override protected void serviceRun() { - Map oldIdentities = Collections.emptyMap(); - Map oldOwnIdentities = Collections.emptyMap(); + Map> oldIdentities = Collections.emptyMap(); while (!shouldStop()) { - Map currentIdentities = new HashMap(); + Map> currentIdentities = new HashMap>(); Map currentOwnIdentities = new HashMap(); - /* get all identities with the wanted context from WoT. */ - Set ownIdentities; + Set ownIdentities = null; + boolean identitiesLoaded = false; try { - ownIdentities = Filters.filteredSet(webOfTrustConnector.loadAllOwnIdentities(), new Filter() { + /* get all identities with the wanted context from WoT. */ + ownIdentities = webOfTrustConnector.loadAllOwnIdentities(); - @Override - @SuppressWarnings("synthetic-access") - public boolean filterObject(OwnIdentity ownIdentity) { - return (context == null) || ownIdentity.hasContext(context); - } - - }); + /* load trusted identities. */ for (OwnIdentity ownIdentity : ownIdentities) { - currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); - for (Identity identity : webOfTrustConnector.loadTrustedIdentities(ownIdentity, context)) { - currentIdentities.put(identity.getId(), identity); + if ((context != null) && !ownIdentity.hasContext(context)) { + continue; } - } + currentOwnIdentities.put(ownIdentity.getId(), ownIdentity); - /* find removed own identities: */ - for (OwnIdentity oldOwnIdentity : oldOwnIdentities.values()) { - if (!currentOwnIdentities.containsKey(oldOwnIdentity.getId())) { - identityListenerManager.fireOwnIdentityRemoved(oldOwnIdentity); + 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; + } catch (WebOfTrustException wote1) { + logger.log(Level.WARNING, "WoT has disappeared!", wote1); + } - /* find added own identities. */ - for (OwnIdentity currentOwnIdentity : currentOwnIdentities.values()) { - if (!oldOwnIdentities.containsKey(currentOwnIdentity.getId())) { - identityListenerManager.fireOwnIdentityAdded(currentOwnIdentity); - } - } + if (identitiesLoaded) { - /* find removed identities. */ - for (Identity oldIdentity : oldIdentities.values()) { - if (!currentIdentities.containsKey(oldIdentity.getId())) { - identityListenerManager.fireIdentityRemoved(oldIdentity); - } - } + /* check for changes. */ + checkOwnIdentities(currentOwnIdentities); - /* find new identities. */ - for (Identity currentIdentity : currentIdentities.values()) { - if (!oldIdentities.containsKey(currentIdentity.getId())) { - identityListenerManager.fireIdentityAdded(currentIdentity); - } - } + /* now check for changes in remote identities. */ + for (OwnIdentity ownIdentity : currentOwnIdentities.values()) { - /* check for changes in the properties. */ - for (Identity oldIdentity : oldIdentities.values()) { - if (!currentIdentities.containsKey(oldIdentity.getId())) { - continue; - } - Identity newIdentity = currentIdentities.get(oldIdentity.getId()); - Map oldProperties = oldIdentity.getProperties(); - Map newProperties = newIdentity.getProperties(); - if (oldProperties.size() != newProperties.size()) { - identityListenerManager.fireIdentityUpdated(newIdentity); - continue; + /* find new identities. */ + for (Identity currentIdentity : currentIdentities.get(ownIdentity).values()) { + if (!oldIdentities.containsKey(ownIdentity) || !oldIdentities.get(ownIdentity).containsKey(currentIdentity.getId())) { + identityListenerManager.fireIdentityAdded(ownIdentity, currentIdentity); + } } - for (Entry oldProperty : oldProperties.entrySet()) { - if (!newProperties.containsKey(oldProperty.getKey()) || !newProperties.get(oldProperty.getKey()).equals(oldProperty.getValue())) { - identityListenerManager.fireIdentityUpdated(newIdentity); - break; + + /* find removed identities. */ + if (oldIdentities.containsKey(ownIdentity)) { + for (Identity oldIdentity : oldIdentities.get(ownIdentity).values()) { + if (!currentIdentities.get(ownIdentity).containsKey(oldIdentity.getId())) { + identityListenerManager.fireIdentityRemoved(ownIdentity, oldIdentity); + } + } + + /* check for changes in the contexts. */ + for (Identity oldIdentity : oldIdentities.get(ownIdentity).values()) { + if (!currentIdentities.get(ownIdentity).containsKey(oldIdentity.getId())) { + continue; + } + Identity newIdentity = currentIdentities.get(ownIdentity).get(oldIdentity.getId()); + Set oldContexts = oldIdentity.getContexts(); + Set newContexts = newIdentity.getContexts(); + if (oldContexts.size() != newContexts.size()) { + identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + continue; + } + for (String oldContext : oldContexts) { + if (!newContexts.contains(oldContext)) { + identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + break; + } + } + } + + /* check for changes in the properties. */ + for (Identity oldIdentity : oldIdentities.get(ownIdentity).values()) { + if (!currentIdentities.get(ownIdentity).containsKey(oldIdentity.getId())) { + continue; + } + Identity newIdentity = currentIdentities.get(ownIdentity).get(oldIdentity.getId()); + Map oldProperties = oldIdentity.getProperties(); + Map newProperties = newIdentity.getProperties(); + if (oldProperties.size() != newProperties.size()) { + identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + continue; + } + for (Entry oldProperty : oldProperties.entrySet()) { + if (!newProperties.containsKey(oldProperty.getKey()) || !newProperties.get(oldProperty.getKey()).equals(oldProperty.getValue())) { + identityListenerManager.fireIdentityUpdated(ownIdentity, newIdentity); + break; + } + } } } } /* remember the current set of identities. */ oldIdentities = currentIdentities; - oldOwnIdentities = currentOwnIdentities; - - } catch (PluginException pe1) { - logger.log(Level.WARNING, "WoT has disappeared!", pe1); } /* wait a minute before checking again. */ @@ -327,4 +270,39 @@ 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()) { + 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()) { + 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)); + } + } + + currentOwnIdentities.clear(); + currentOwnIdentities.putAll(newOwnIdentities); + } + } + }