Generate SSK key pair from first connected node.
[jSite2.git] / src / net / pterodactylus / jsite / core / NodeManager.java
index 74221d4..f7b231d 100644 (file)
@@ -40,6 +40,7 @@ import java.util.Set;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import net.pterodactylus.fcp.SSKKeypair;
 import net.pterodactylus.fcp.highlevel.FcpClient;
 import net.pterodactylus.fcp.highlevel.FcpException;
 import net.pterodactylus.jsite.util.IdGenerator;
@@ -67,7 +68,7 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
        private final Object syncObject = new Object();
 
        /** Node listener support. */
-       private final NodeListenerSupport nodeListenerSupport = new NodeListenerSupport();
+       private final NodeListenerSupport nodeListenerManager = new NodeListenerSupport();
 
        /** All nodes. */
        private final List<Node> nodes = Collections.synchronizedList(new ArrayList<Node>());
@@ -105,7 +106,7 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
         *            The listener to add
         */
        public void addNodeListener(NodeListener nodeListener) {
-               nodeListenerSupport.addListener(nodeListener);
+               nodeListenerManager.addListener(nodeListener);
        }
 
        /**
@@ -115,7 +116,7 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
         *            The listener to remove
         */
        public void removeNodeListener(NodeListener nodeListener) {
-               nodeListenerSupport.removeListener(nodeListener);
+               nodeListenerManager.removeListener(nodeListener);
        }
 
        //
@@ -285,7 +286,7 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
                node.addPropertyChangeListener(this);
                nodes.add(node);
                idNodes.put(node.getId(), node);
-               nodeListenerSupport.fireNodeAdded(node);
+               nodeListenerManager.fireNodeAdded(node);
                return true;
        }
 
@@ -305,7 +306,7 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
                        nodes.remove(node);
                        idNodes.remove(node.getId());
                        node.removePropertyChangeListener(this);
-                       nodeListenerSupport.fireNodeRemoved(node);
+                       nodeListenerManager.fireNodeRemoved(node);
                }
        }
 
@@ -325,13 +326,13 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
                        FcpClient fcpClient = new FcpClient(clientName, node.getHostname(), node.getPort());
                        fcpClient.connect();
                        nodeClients.put(node, fcpClient);
-                       nodeListenerSupport.fireNodeConnected(node);
+                       nodeListenerManager.fireNodeConnected(node);
                } catch (UnknownHostException uhe1) {
-                       nodeListenerSupport.fireNodeConnectionFailed(node, uhe1);
+                       nodeListenerManager.fireNodeConnectionFailed(node, uhe1);
                } catch (IOException ioe1) {
-                       nodeListenerSupport.fireNodeConnectionFailed(node, ioe1);
+                       nodeListenerManager.fireNodeConnectionFailed(node, ioe1);
                } catch (FcpException fe1) {
-                       nodeListenerSupport.fireNodeConnectionFailed(node, fe1);
+                       nodeListenerManager.fireNodeConnectionFailed(node, fe1);
                }
        }
 
@@ -343,6 +344,17 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
         */
        public void disconnect(Node node) {
                logger.log(Level.FINEST, "disconnect(node=" + node + ")");
+               if (!nodes.contains(node)) {
+                       logger.log(Level.WARNING, "Was told to disconnect from a node (" + node + ") I don’t know about!");
+                       return;
+               }
+               FcpClient fcpClient = nodeClients.remove(node);
+               if (fcpClient == null) {
+                       logger.log(Level.WARNING, "No FCP client for node (" + node + ")!");
+                       return;
+               }
+               fcpClient.disconnect();
+               nodeListenerManager.fireNodeDisconnected(node, null);
        }
 
        /**
@@ -374,14 +386,22 @@ public class NodeManager implements Iterable<Node>, PropertyChangeListener {
         * @throws IOException
         *             if an I/O error occurs communicating with the node
         * @throws JSiteException
-        *             if there is a problem with the node
+        *             if there is no connected node
         */
        public String[] generateKeyPair() throws IOException, JSiteException {
                logger.log(Level.FINEST, "generateKeyPair()");
                if (nodes.isEmpty()) {
                        throw new NoNodeException("no node configured");
                }
-               return null;
+               for (FcpClient fcpClient : nodeClients.values()) {
+                       try {
+                               SSKKeypair sskKeypair = fcpClient.generateKeyPair();
+                               return new String[] { sskKeypair.getInsertURI(), sskKeypair.getRequestURI() };
+                       } catch (FcpException fcpe1) {
+                               /* ignore, we’ll throw later on if needs be. */
+                       }
+               }
+               throw new JSiteException("Could not get SSK key pair from any node.");
        }
 
        //