/*
- * 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
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 net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.service.AbstractService;
+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
public class IdentityManager extends AbstractService {
/** Object used for synchronization. */
+ @SuppressWarnings("hiding")
private final Object syncObject = new Object() {
/* inner class for better lock names. */
};
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<String, OwnIdentity> currentOwnIdentities = new HashMap<String, OwnIdentity>();
+ private final Map<String, OwnIdentity> currentOwnIdentities = new HashMap<String, OwnIdentity>();
+
+ /** 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) {
+ @Inject
+ public IdentityManager(WebOfTrustConnector webOfTrustConnector, @Named("WebOfTrustContext") String context) {
super("Sone Identity Manager", false);
this.webOfTrustConnector = webOfTrustConnector;
+ this.context = context;
}
//
//
/**
- * 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;
}
/**
Set<OwnIdentity> allOwnIdentities = getAllOwnIdentities();
for (OwnIdentity ownIdentity : allOwnIdentities) {
if (ownIdentity.getId().equals(id)) {
- return ownIdentity;
+ return new DefaultOwnIdentity(ownIdentity);
}
}
return null;
* @return All own identities
*/
public Set<OwnIdentity> getAllOwnIdentities() {
- try {
- Set<OwnIdentity> ownIdentities = webOfTrustConnector.loadAllOwnIdentities();
- Map<String, OwnIdentity> newOwnIdentities = new HashMap<String, OwnIdentity>();
- 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<OwnIdentity>(currentOwnIdentities.values());
}
//
Map<OwnIdentity, Map<String, Identity>> oldIdentities = Collections.emptyMap();
while (!shouldStop()) {
Map<OwnIdentity, Map<String, Identity>> currentIdentities = new HashMap<OwnIdentity, Map<String, Identity>>();
- @SuppressWarnings("hiding")
Map<String, OwnIdentity> currentOwnIdentities = new HashMap<String, OwnIdentity>();
Set<OwnIdentity> ownIdentities = null;
/* load trusted identities. */
for (OwnIdentity ownIdentity : ownIdentities) {
+ currentOwnIdentities.put(ownIdentity.getId(), ownIdentity);
+ Map<String, Identity> identities = new HashMap<String, Identity>();
+ 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. */
Set<Identity> trustedIdentities = webOfTrustConnector.loadTrustedIdentities(ownIdentity, context);
- Map<String, Identity> identities = new HashMap<String, Identity>();
- 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);
}
/* 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));
}
}