import net.pterodactylus.fcp.highlevel.HighLevelClientListener;
import net.pterodactylus.fcp.highlevel.HighLevelException;
import net.pterodactylus.fcp.highlevel.KeyGenerationResult;
+import net.pterodactylus.jsite.util.IdGenerator;
import net.pterodactylus.util.io.Closer;
import net.pterodactylus.util.logging.Logging;
+import net.pterodactylus.util.number.Hex;
/**
* TODO
*
* @author David ‘Bombe’ Roden <bombe@freenetproject.org>
- * @version $Id$
*/
public class NodeManager implements Iterable<Node>, PropertyChangeListener, HighLevelClientListener {
/** All nodes. */
private List<Node> nodes = Collections.synchronizedList(new ArrayList<Node>());
+ /** Map from node ID to node. */
+ private Map<String, Node> idNodes = Collections.synchronizedMap(new HashMap<String, Node>());
+
/** All FCP connections. */
private Map<Node, HighLevelClient> nodeClients = Collections.synchronizedMap(new HashMap<Node, HighLevelClient>());
* The node that was added.
*/
private void fireNodeAdded(Node node) {
- for (NodeListener nodeListener: nodeListeners) {
+ for (NodeListener nodeListener : nodeListeners) {
nodeListener.nodeAdded(node);
}
}
* The node that was removed
*/
private void fireNodeRemoved(Node node) {
- for (NodeListener nodeListener: nodeListeners) {
+ for (NodeListener nodeListener : nodeListeners) {
nodeListener.nodeRemoved(node);
}
}
* The node that is now connected
*/
private void fireNodeConnected(Node node) {
- for (NodeListener nodeListener: nodeListeners) {
+ for (NodeListener nodeListener : nodeListeners) {
nodeListener.nodeConnected(node);
}
}
* The cause of the failure
*/
private void fireNodeConnectionFailed(Node node, Throwable cause) {
- for (NodeListener nodeListener: nodeListeners) {
+ for (NodeListener nodeListener : nodeListeners) {
nodeListener.nodeConnectionFailed(node, cause);
}
}
* if there was no exception
*/
private void fireNodeDisconnected(Node node, Throwable throwable) {
- for (NodeListener nodeListener: nodeListeners) {
+ for (NodeListener nodeListener : nodeListeners) {
nodeListener.nodeDisconnected(node, throwable);
}
}
List<Node> loadedNodes = new ArrayList<Node>();
while (nodeProperties.containsKey("nodes." + ++nodeIndex + ".name")) {
String nodePrefix = "nodes." + nodeIndex;
+ String nodeId = nodeProperties.getProperty(nodePrefix + ".id");
+ if (nodeId == null) {
+ nodeId = Hex.toHex(IdGenerator.generateId());
+ }
String nodeName = nodeProperties.getProperty(nodePrefix + ".name");
if (!Verifier.verifyNodeName(nodeName)) {
logger.log(Level.WARNING, "invalid node name “" + nodeName + "”, skipping…");
continue;
}
Node newNode = new Node();
+ newNode.setId(nodeId);
newNode.setName(nodeName);
newNode.setHostname(nodeHostname);
newNode.setPort(nodePort);
logger.fine("loaded " + loadedNodes.size() + " nodes from config");
synchronized (syncObject) {
nodes.clear();
- for (Node node: loadedNodes) {
+ for (Node node : loadedNodes) {
addNode(node);
}
}
}
Properties nodeProperties = new Properties();
int nodeIndex = -1;
- for (Node node: nodes) {
+ for (Node node : nodes) {
String nodePrefix = "nodes." + ++nodeIndex;
+ nodeProperties.setProperty(nodePrefix + ".id", node.getId());
nodeProperties.setProperty(nodePrefix + ".name", node.getName());
nodeProperties.setProperty(nodePrefix + ".hostname", node.getHostname());
nodeProperties.setProperty(nodePrefix + ".port", String.valueOf(node.getPort()));
node.addPropertyChangeListener(this);
HighLevelClient highLevelClient = new HighLevelClient(clientName);
nodes.add(node);
+ idNodes.put(node.getId(), node);
clientNodes.put(highLevelClient, node);
nodeClients.put(node, highLevelClient);
highLevelClient.addHighLevelClientListener(this);
disconnect(node);
}
nodes.remove(node);
+ idNodes.remove(node.getId());
node.removePropertyChangeListener(this);
fireNodeRemoved(node);
}
}
/**
+ * Returns the node identified by the given ID.
+ *
+ * @param id
+ * The ID of the node
+ * @return The node with the given ID, or <code>null</code> if no such
+ * node was found
+ */
+ Node getNode(String id) {
+ return idNodes.get(id);
+ }
+
+ /**
* Generates a new SSK key pair.
*
* @return An array with the private key at index <code>0</code> and the