X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManagerImpl.java;fp=src%2Fmain%2Fjava%2Fnet%2Fpterodactylus%2Fsone%2Ffreenet%2Fwot%2FIdentityManagerImpl.java;h=3946c049327fc889e65d704c6b8bcf41e2755d24;hb=4469a8def6097375442a98576e07b7405e3acce3;hp=0000000000000000000000000000000000000000;hpb=471c14dabae91b2012eecb2b63be5dccb1229ff7;p=Sone.git diff --git a/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.java b/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.java new file mode 100644 index 0000000..3946c04 --- /dev/null +++ b/src/main/java/net/pterodactylus/sone/freenet/wot/IdentityManagerImpl.java @@ -0,0 +1,146 @@ +/* + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.pterodactylus.sone.freenet.wot; + +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import net.pterodactylus.sone.freenet.plugin.PluginException; +import net.pterodactylus.util.logging.Logging; +import net.pterodactylus.util.service.AbstractService; + +import com.google.common.collect.Sets; +import com.google.common.eventbus.EventBus; +import com.google.inject.Inject; + +/** + * 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 sending events to the {@link EventBus} when {@link Identity}s and + * {@link OwnIdentity}s are discovered or disappearing. + * + * @author David ‘Bombe’ Roden + */ +public class IdentityManagerImpl extends AbstractService implements IdentityManager { + + /** The logger. */ + private static final Logger logger = Logging.getLogger(IdentityManagerImpl.class); + + /** The event bus. */ + private final EventBus eventBus; + + private final IdentityLoader identityLoader; + + /** The Web of Trust connector. */ + private final WebOfTrustConnector webOfTrustConnector; + + /** The currently known own identities. */ + private final Set currentOwnIdentities = Sets.newHashSet(); + + /** + * Creates a new identity manager. + * + * @param eventBus + * The event bus + * @param webOfTrustConnector + * The Web of Trust connector + */ + @Inject + public IdentityManagerImpl(EventBus eventBus, WebOfTrustConnector webOfTrustConnector, IdentityLoader identityLoader) { + super("Sone Identity Manager", false); + this.eventBus = eventBus; + this.webOfTrustConnector = webOfTrustConnector; + this.identityLoader = identityLoader; + } + + // + // ACCESSORS + // + + /** + * Returns whether the Web of Trust plugin could be reached during the last + * try. + * + * @return {@code true} if the Web of Trust plugin is connected, + * {@code false} otherwise + */ + @Override + public boolean isConnected() { + try { + webOfTrustConnector.ping(); + return true; + } catch (PluginException pe1) { + /* not connected, ignore. */ + return false; + } + } + + /** + * Returns all own identities. + * + * @return All own identities + */ + @Override + public Set getAllOwnIdentities() { + synchronized (currentOwnIdentities) { + return new HashSet(currentOwnIdentities); + } + } + + // + // SERVICE METHODS + // + + /** + * {@inheritDoc} + */ + @Override + protected void serviceRun() { + Map> oldIdentities = new HashMap>(); + + while (!shouldStop()) { + try { + Map> currentIdentities = identityLoader.loadIdentities(); + + IdentityChangeEventSender identityChangeEventSender = new IdentityChangeEventSender(eventBus, oldIdentities); + identityChangeEventSender.detectChanges(currentIdentities); + + oldIdentities = currentIdentities; + + synchronized (currentOwnIdentities) { + currentOwnIdentities.clear(); + currentOwnIdentities.addAll(currentIdentities.keySet()); + } + } catch (WebOfTrustException wote1) { + logger.log(Level.WARNING, "WoT has disappeared!", wote1); + } + + /* wait a minute before checking again. */ + sleep(60 * 1000); + } + } + +}