// Path: src/main/java/net/pterodactylus/wotns/freenet/plugin/PluginException.java
// public class PluginException extends WebOfTrustException {
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 */
// 	public PluginException() {
// 		super();
// 	}
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 *
// 	 * @param message
// 	 *            The message of the exception
// 	 */
// 	public PluginException(String message) {
// 		super(message);
// 	}
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 *
// 	 * @param cause
// 	 *            The cause of the exception
// 	 */
// 	public PluginException(Throwable cause) {
// 		super(cause);
// 	}
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 *
// 	 * @param message
// 	 *            The message of the exception
// 	 * @param cause
// 	 *            The cause of the exception
// 	 */
// 	public PluginException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// }


import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.service.AbstractService;
import net.pterodactylus.wotns.freenet.plugin.PluginException;
/*
 * Sone - IdentityManager.java - Copyright © 2010 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 <http://www.gnu.org/licenses/>.
 */

package net.pterodactylus.wotns.freenet.wot;



/**
 * 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.
 * <p>
 * It is also responsible for polling identities from the Web of Trust plugin
 * and notifying registered {@link IdentityListener}s when {@link Identity}s and
 * {@link OwnIdentity}s are discovered or disappearing.
 *
 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
 */
public class IdentityManager extends AbstractService {

	/** Object used for synchronization. */
	private final Object syncObject = new Object() {
		/* inner class for better lock names. */
	};

	/** The logger. */
	private static final Logger logger = Logging.getLogger(IdentityManager.class);

	/** The event manager. */
	private final IdentityListenerManager identityListenerManager = new IdentityListenerManager();

	/** The Web of Trust connector. */
	private final WebOfTrustConnector webOfTrustConnector;

	/** The context to filter for. */
	private volatile String context;

	/** The currently known own identities. */
	/* synchronize access on syncObject. */
	private Map<String, OwnIdentity> currentOwnIdentities = new HashMap<String, OwnIdentity>();

	/** The currently trusted identities. */
	private Map<OwnIdentity, Collection<Identity>> currentTrustedIdentities = new HashMap<OwnIdentity, Collection<Identity>>();

	/**
	 * Creates a new identity manager.
	 *
	 * @param webOfTrustConnector
	 *            The Web of Trust connector
	 */
	public IdentityManager(WebOfTrustConnector webOfTrustConnector) {
		super("Sone Identity Manager", false);
		this.webOfTrustConnector = webOfTrustConnector;
	}

	//
	// LISTENER MANAGEMENT
	//

	/**
	 * Adds a listener for identity events.
	 *
	 * @param identityListener
	 *            The listener to add
	 */
	public void addIdentityListener(IdentityListener identityListener) {
		identityListenerManager.addListener(identityListener);
	}

	/**
	 * Removes a listener for identity events.
	 *
	 * @param identityListener
	 *            The listener to remove
	 */
	public void removeIdentityListener(IdentityListener identityListener) {
		identityListenerManager.removeListener(identityListener);
	}

	//
	// ACCESSORS
	//

	/**
	 * Sets the context to filter own identities and trusted identities for.
	 *
	 * @param context
	 *            The context to filter for, or {@code null} to not filter
	 */
	public void setContext(String context) {
		this.context = context;
	}

	/**
	 * 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
	 */
	public boolean isConnected() {
		try {
			webOfTrustConnector.ping();
			return true;
// Path: src/main/java/net/pterodactylus/wotns/freenet/plugin/PluginException.java
// public class PluginException extends WebOfTrustException {
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 */
// 	public PluginException() {
// 		super();
// 	}
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 *
// 	 * @param message
// 	 *            The message of the exception
// 	 */
// 	public PluginException(String message) {
// 		super(message);
// 	}
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 *
// 	 * @param cause
// 	 *            The cause of the exception
// 	 */
// 	public PluginException(Throwable cause) {
// 		super(cause);
// 	}
// 
// 	/**
// 	 * Creates a new plugin exception.
// 	 *
// 	 * @param message
// 	 *            The message of the exception
// 	 * @param cause
// 	 *            The cause of the exception
// 	 */
// 	public PluginException(String message, Throwable cause) {
// 		super(message, cause);
// 	}
// 
// }


// Path: src/main/java/net/pterodactylus/wotns/freenet/wot/IdentityManager.java
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.pterodactylus.util.logging.Logging;
import net.pterodactylus.util.service.AbstractService;
import net.pterodactylus.wotns.freenet.plugin.PluginException;

/*
 * Sone - IdentityManager.java - Copyright © 2010 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 <http://www.gnu.org/licenses/>.
 */

package net.pterodactylus.wotns.freenet.wot;



/**
 * 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.
 * <p>
 * It is also responsible for polling identities from the Web of Trust plugin
 * and notifying registered {@link IdentityListener}s when {@link Identity}s and
 * {@link OwnIdentity}s are discovered or disappearing.
 *
 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
 */
public class IdentityManager extends AbstractService {

	/** Object used for synchronization. */
	private final Object syncObject = new Object() {
		/* inner class for better lock names. */
	};

	/** The logger. */
	private static final Logger logger = Logging.getLogger(IdentityManager.class);

	/** The event manager. */
	private final IdentityListenerManager identityListenerManager = new IdentityListenerManager();

	/** The Web of Trust connector. */
	private final WebOfTrustConnector webOfTrustConnector;

	/** The context to filter for. */
	private volatile String context;

	/** The currently known own identities. */
	/* synchronize access on syncObject. */
	private Map<String, OwnIdentity> currentOwnIdentities = new HashMap<String, OwnIdentity>();

	/** The currently trusted identities. */
	private Map<OwnIdentity, Collection<Identity>> currentTrustedIdentities = new HashMap<OwnIdentity, Collection<Identity>>();

	/**
	 * Creates a new identity manager.
	 *
	 * @param webOfTrustConnector
	 *            The Web of Trust connector
	 */
	public IdentityManager(WebOfTrustConnector webOfTrustConnector) {
		super("Sone Identity Manager", false);
		this.webOfTrustConnector = webOfTrustConnector;
	}

	//
	// LISTENER MANAGEMENT
	//

	/**
	 * Adds a listener for identity events.
	 *
	 * @param identityListener
	 *            The listener to add
	 */
	public void addIdentityListener(IdentityListener identityListener) {
		identityListenerManager.addListener(identityListener);
	}

	/**
	 * Removes a listener for identity events.
	 *
	 * @param identityListener
	 *            The listener to remove
	 */
	public void removeIdentityListener(IdentityListener identityListener) {
		identityListenerManager.removeListener(identityListener);
	}

	//
	// ACCESSORS
	//

	/**
	 * Sets the context to filter own identities and trusted identities for.
	 *
	 * @param context
	 *            The context to filter for, or {@code null} to not filter
	 */
	public void setContext(String context) {
		this.context = context;
	}

	/**
	 * 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
	 */
	public boolean isConnected() {
		try {
			webOfTrustConnector.ping();
			return true;
		} catch (PluginException pe1) {