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.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 {
* 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()));
if (nodeClients.containsKey(node)) {
disconnect(node);
}
+ nodes.remove(node);
node.removePropertyChangeListener(this);
fireNodeRemoved(node);
}
* public key at index <code>1</code>
* @throws IOException
* if an I/O error occurs communicating with the node
- * @throws NoNodeException
- * if no node is configured
+ * @throws JSiteException
+ * if there is a problem with the node
*/
- public String[] generateKeyPair() throws IOException, NoNodeException {
+ public String[] generateKeyPair() throws IOException, JSiteException {
if (nodes.isEmpty()) {
throw new NoNodeException("no node configured");
}
try {
KeyGenerationResult keyGenerationResult = highLevelClient.generateKey().getResult();
return new String[] { keyGenerationResult.getInsertURI(), keyGenerationResult.getRequestURI() };
+ } catch (HighLevelException hle1) {
+ throw new BackendException(hle1);
} catch (InterruptedException e) {
/* ignore. */
}