X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=src%2Fnet%2Fpterodactylus%2Fjsite%2Fcore%2FNodeManager.java;h=e8fd278576478dfb4d58a320ae2a63385c8d61de;hb=e5e14c688e13425b77ac6bf9d952af099ea52de5;hp=f032570c02a97cb9306f09405365c42ebb1cd06a;hpb=c63257e8cc0ba1a5aca9364b22171abe7279d479;p=jSite2.git diff --git a/src/net/pterodactylus/jsite/core/NodeManager.java b/src/net/pterodactylus/jsite/core/NodeManager.java index f032570..e8fd278 100644 --- a/src/net/pterodactylus/jsite/core/NodeManager.java +++ b/src/net/pterodactylus/jsite/core/NodeManager.java @@ -31,17 +31,17 @@ import java.net.UnknownHostException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Properties; +import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; -import net.pterodactylus.fcp.highlevel.HighLevelClient; -import net.pterodactylus.fcp.highlevel.HighLevelClientListener; -import net.pterodactylus.fcp.highlevel.HighLevelException; -import net.pterodactylus.fcp.highlevel.KeyGenerationResult; +import net.pterodactylus.fcp.highlevel.FcpClient; +import net.pterodactylus.fcp.highlevel.FcpException; import net.pterodactylus.jsite.util.IdGenerator; import net.pterodactylus.util.io.Closer; import net.pterodactylus.util.logging.Logging; @@ -52,7 +52,7 @@ import net.pterodactylus.util.number.Hex; * * @author David ‘Bombe’ Roden <bombe@freenetproject.org> */ -public class NodeManager implements Iterable, PropertyChangeListener, HighLevelClientListener { +public class NodeManager implements Iterable, PropertyChangeListener { /** Logger. */ private static final Logger logger = Logging.getLogger(NodeManager.class.getName()); @@ -66,20 +66,20 @@ public class NodeManager implements Iterable, PropertyChangeListener, High /** Object used for synchronization. */ private final Object syncObject = new Object(); - /** Node listeners. */ - private List nodeListeners = Collections.synchronizedList(new ArrayList()); + /** Node listener support. */ + private final NodeListenerSupport nodeListenerSupport = new NodeListenerSupport(); /** All nodes. */ - private List nodes = Collections.synchronizedList(new ArrayList()); + private final List nodes = Collections.synchronizedList(new ArrayList()); /** Map from node ID to node. */ - private Map idNodes = Collections.synchronizedMap(new HashMap()); + private final Map idNodes = Collections.synchronizedMap(new HashMap()); - /** All FCP connections. */ - private Map nodeClients = Collections.synchronizedMap(new HashMap()); + /** Map from node to client. */ + private final Map nodeClients = Collections.synchronizedMap(new HashMap()); - /** Maps nodes to high-level clients. */ - private Map clientNodes = Collections.synchronizedMap(new HashMap()); + /** Collection of currently connected nodes. */ + private final Set connectedNodes = Collections.synchronizedSet(new HashSet()); /** * Creates a new FCP collector. @@ -105,7 +105,7 @@ public class NodeManager implements Iterable, PropertyChangeListener, High * The listener to add */ public void addNodeListener(NodeListener nodeListener) { - nodeListeners.add(nodeListener); + nodeListenerSupport.addListener(nodeListener); } /** @@ -115,77 +115,7 @@ public class NodeManager implements Iterable, PropertyChangeListener, High * The listener to remove */ public void removeNodeListener(NodeListener nodeListener) { - nodeListeners.remove(nodeListener); - } - - /** - * Notifies all listeners that a node was added. - * - * @param node - * The node that was added. - */ - private void fireNodeAdded(Node node) { - logger.log(Level.FINEST, "firing nodeAdded event with [node=" + node + "]"); - for (NodeListener nodeListener : nodeListeners) { - nodeListener.nodeAdded(node); - } - } - - /** - * Notifies all listeners that a node was removed. - * - * @param node - * The node that was removed - */ - private void fireNodeRemoved(Node node) { - logger.log(Level.FINEST, "firing nodeRemoved event with [node=" + node + "]"); - for (NodeListener nodeListener : nodeListeners) { - nodeListener.nodeRemoved(node); - } - } - - /** - * Notifies all listeners that the given node was connected. - * - * @param node - * The node that is now connected - */ - private void fireNodeConnected(Node node) { - logger.log(Level.FINEST, "firing nodeConnected event with [node=" + node + "]"); - for (NodeListener nodeListener : nodeListeners) { - nodeListener.nodeConnected(node); - } - } - - /** - * Notifies all listeners that a connection to a node has failed. - * - * @param node - * The node that could not be connected - * @param cause - * The cause of the failure - */ - private void fireNodeConnectionFailed(Node node, Throwable cause) { - logger.log(Level.FINEST, "firing nodeConnectionFailed event with [node=" + node + ",cause=" + cause + "]"); - for (NodeListener nodeListener : nodeListeners) { - nodeListener.nodeConnectionFailed(node, cause); - } - } - - /** - * Notifies all listeners that the given node was disconnected. - * - * @param node - * The node that is now disconnected - * @param throwable - * The exception that caused the disconnect, or null - * if there was no exception - */ - private void fireNodeDisconnected(Node node, Throwable throwable) { - logger.log(Level.FINEST, "firing nodeDisconnected event with [node=" + node + ",throwable=" + throwable + "]"); - for (NodeListener nodeListener : nodeListeners) { - nodeListener.nodeDisconnected(node, throwable); - } + nodeListenerSupport.removeListener(nodeListener); } // @@ -214,6 +144,18 @@ public class NodeManager implements Iterable, PropertyChangeListener, High } /** + * Returns whether the given node is currently connected. + * + * @param node + * The node to check + * @return true if the node is currently connected, + * false otherwise + */ + public boolean isNodeConnected(Node node) { + return connectedNodes.contains(node); + } + + /** * {@inheritDoc} */ public Iterator iterator() { @@ -331,8 +273,8 @@ public class NodeManager implements Iterable, PropertyChangeListener, High * @see #connect(Node) * @param node * The node to connect to - * @return true if the node was added, false - * if the node was not added because it was already known + * @return true if the node was added, false if + * the node was not added because it was already known */ public boolean addNode(Node node) { logger.log(Level.FINEST, "addNode(node=" + node + ")"); @@ -341,13 +283,9 @@ public class NodeManager implements Iterable, PropertyChangeListener, High return false; } 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); - fireNodeAdded(node); + nodeListenerSupport.fireNodeAdded(node); return true; } @@ -364,13 +302,10 @@ public class NodeManager implements Iterable, PropertyChangeListener, High if (!nodes.contains(node)) { return; } - if (nodeClients.containsKey(node)) { - disconnect(node); - } nodes.remove(node); idNodes.remove(node.getId()); node.removePropertyChangeListener(this); - fireNodeRemoved(node); + nodeListenerSupport.fireNodeRemoved(node); } } @@ -382,18 +317,21 @@ public class NodeManager implements Iterable, PropertyChangeListener, High */ public void connect(Node node) { logger.log(Level.FINEST, "connect(node=" + node + ")"); - HighLevelClient highLevelClient; - highLevelClient = nodeClients.get(node); - if (highLevelClient == null) { - logger.log(Level.WARNING, "was told to connect to unknown node: " + node); + if (!nodes.contains(node)) { + logger.log(Level.WARNING, "Was told to connect to node (" + node + ") I don’t know about!"); return; } try { - highLevelClient.connect(node.getHostname(), node.getPort()); + FcpClient fcpClient = new FcpClient(clientName, node.getHostname(), node.getPort()); + fcpClient.connect(); + nodeClients.put(node, fcpClient); + nodeListenerSupport.fireNodeConnected(node); } catch (UnknownHostException uhe1) { - fireNodeConnectionFailed(node, uhe1); + nodeListenerSupport.fireNodeConnectionFailed(node, uhe1); } catch (IOException ioe1) { - fireNodeConnectionFailed(node, ioe1); + nodeListenerSupport.fireNodeConnectionFailed(node, ioe1); + } catch (FcpException fe1) { + nodeListenerSupport.fireNodeConnectionFailed(node, fe1); } } @@ -405,12 +343,9 @@ public class NodeManager implements Iterable, PropertyChangeListener, High */ public void disconnect(Node node) { logger.log(Level.FINEST, "disconnect(node=" + node + ")"); - synchronized (syncObject) { - if (!nodes.contains(node)) { - return; - } - HighLevelClient highLevelClient = nodeClients.get(node); - highLevelClient.disconnect(); + if (!nodes.contains(node)) { + logger.log(Level.WARNING, "Was told to disconnect from a node (" + node + ") I don’t know about!"); + return; } } @@ -424,36 +359,12 @@ public class NodeManager implements Iterable, PropertyChangeListener, High } /** - * Returns the high-level client for a given node. - * - * @param node - * The node to get a high-level client for - * @return The high-level client for a node, or null if the - * node was disconnected or removed - */ - public HighLevelClient getHighLevelClient(Node node) { - return nodeClients.get(node); - } - - /** - * Returns the node for a high-level client. - * - * @param highLevelClient - * The high-level client to get the node for - * @return The node for the high-level client, or null if the - * high-level client is not known - */ - public Node getNode(HighLevelClient highLevelClient) { - return clientNodes.get(highLevelClient); - } - - /** * Returns the node identified by the given ID. * * @param id * The ID of the node - * @return The node with the given ID, or null if no such - * node was found + * @return The node with the given ID, or null if no such node + * was found */ Node getNode(String id) { return idNodes.get(id); @@ -474,16 +385,6 @@ public class NodeManager implements Iterable, PropertyChangeListener, High if (nodes.isEmpty()) { throw new NoNodeException("no node configured"); } - Node node = nodes.get(0); - HighLevelClient highLevelClient = nodeClients.get(node); - try { - KeyGenerationResult keyGenerationResult = highLevelClient.generateKey().getResult(); - return new String[] { keyGenerationResult.getInsertURI(), keyGenerationResult.getRequestURI() }; - } catch (HighLevelException hle1) { - throw new BackendException(hle1); - } catch (InterruptedException e) { - /* ignore. */ - } return null; } @@ -492,38 +393,6 @@ public class NodeManager implements Iterable, PropertyChangeListener, High // // - // INTERFACE HighLevelClientListener - // - - /** - * {@inheritDoc} - */ - public void clientConnected(HighLevelClient highLevelClient) { - logger.log(Level.FINEST, "clientConnected(highLevelClient=" + highLevelClient + ")"); - Node node = clientNodes.get(highLevelClient); - if (node == null) { - logger.log(Level.WARNING, "got event for unknown client"); - return; - } - fireNodeConnected(node); - } - - /** - * {@inheritDoc} - */ - public void clientDisconnected(HighLevelClient highLevelClient, Throwable throwable) { - logger.log(Level.FINEST, "clientDisconnected(highLevelClient=" + highLevelClient + ",throwable=" + throwable + ")"); - synchronized (syncObject) { - Node node = clientNodes.get(highLevelClient); - if (node == null) { - logger.log(Level.WARNING, "got event for unknown client"); - return; - } - fireNodeDisconnected(node, throwable); - } - } - - // // INTERFACE PropertyChangeListener // @@ -535,22 +404,7 @@ public class NodeManager implements Iterable, PropertyChangeListener, High if (eventSource instanceof Node) { String propertyName = propertyChangeEvent.getPropertyName(); if ("hostname".equals(propertyName) || "port".equals(propertyName)) { - Node node = (Node) eventSource; - HighLevelClient highLevelClient = nodeClients.get(node); - if (highLevelClient == null) { - logger.log(Level.WARNING, "got property change event for unknown node: " + node); - return; - } - if (highLevelClient.isConnected()) { - highLevelClient.disconnect(); - try { - highLevelClient.connect(node.getHostname(), node.getPort()); - } catch (UnknownHostException uhe1) { - fireNodeConnectionFailed(node, uhe1); - } catch (IOException ioe1) { - fireNodeConnectionFailed(node, ioe1); - } - } + /* TODO - reconnect. */ } } }