From b165a56849bf6bc65572b61895a30aa23195f07c Mon Sep 17 00:00:00 2001
From: David Bohn <davbohn@googlemail.com>
Date: Wed, 13 Jul 2016 10:43:53 +0200
Subject: [PATCH] Added helper to handle cases, where label fields are not
 well-formed

---
 .../configurations/AbstractConfiguration.java | 13 ++++++++----
 .../configurations/GephiConfiguration.java    |  6 ++++--
 .../configurations/internal/NodeHelper.java   | 21 +++++++++++++++++++
 3 files changed, 34 insertions(+), 6 deletions(-)
 create mode 100644 src/main/java/fucoin/configurations/internal/NodeHelper.java

diff --git a/src/main/java/fucoin/configurations/AbstractConfiguration.java b/src/main/java/fucoin/configurations/AbstractConfiguration.java
index f4e3e7d..eba6a5e 100644
--- a/src/main/java/fucoin/configurations/AbstractConfiguration.java
+++ b/src/main/java/fucoin/configurations/AbstractConfiguration.java
@@ -14,6 +14,7 @@ import fucoin.actions.transaction.ActionGetAmount;
 import fucoin.actions.transaction.ActionGetAmountAnswer;
 import fucoin.actions.transaction.ActionNotifyObserver;
 import fucoin.configurations.internal.ConfigurationCreator;
+import fucoin.configurations.internal.NodeHelper;
 import fucoin.supervisor.SuperVisorImpl;
 import fucoin.wallet.WalletImpl;
 import org.gephi.graph.api.Edge;
@@ -98,7 +99,7 @@ public abstract class AbstractConfiguration extends AbstractNode {
     public void spawnWalletsFromNodes(Collection<Node> nodes, boolean createGUI) throws Exception {
         Future<Object> future = Patterns.ask(superVisor, new ActionAnnounceWalletCreation(nodes.size(), self()), timeout);
         for (Node node : nodes) {
-            String nameOfTheWallet = node.getLabel();
+            String nameOfTheWallet = NodeHelper.nameOfNode(node);
             createWallet(nameOfTheWallet, createGUI);
         }
         Await.result(future, timeout.duration());
@@ -108,7 +109,7 @@ public abstract class AbstractConfiguration extends AbstractNode {
      * Fetch a random wallet
      */
     public ActorRef getRandomWallet() {
-        return activeActors.get(ThreadLocalRandom.current().nextInt(activeActors.size()));
+        return wallets().get(ThreadLocalRandom.current().nextInt(activeActors.size()));
     }
 
     public List<ActorRef> wallets() {
@@ -218,7 +219,7 @@ public abstract class AbstractConfiguration extends AbstractNode {
         }
 
         nodes.stream().forEach(node -> {
-            ActorRef wallet = walletByName(node.getLabel());
+            ActorRef wallet = getWalletForNode(node);
             Edge[] edges = g.getEdges(node).toArray();
 
             // Search for all reachable neighbours of the node
@@ -229,9 +230,13 @@ public abstract class AbstractConfiguration extends AbstractNode {
                     return edge.getTarget();
                 }
                 return edge.getSource();
-            }).map(target -> walletByName(target.getLabel())).collect(Collectors.toList());
+            }).map(this::getWalletForNode).collect(Collectors.toList());
 
             wallet.tell(new ActionAddOverlayNeighbours(overlayNeighbours), self());
         });
     }
+
+    protected ActorRef getWalletForNode(Node node) {
+        return walletByName(NodeHelper.nameOfNode(node));
+    }
 }
diff --git a/src/main/java/fucoin/configurations/GephiConfiguration.java b/src/main/java/fucoin/configurations/GephiConfiguration.java
index 6347f78..bdf2360 100644
--- a/src/main/java/fucoin/configurations/GephiConfiguration.java
+++ b/src/main/java/fucoin/configurations/GephiConfiguration.java
@@ -8,9 +8,11 @@ import fucoin.actions.transaction.ActionGetAmount;
 import fucoin.actions.transaction.ActionGetAmountAnswer;
 import fucoin.configurations.internal.ConfigurationName;
 import fucoin.configurations.internal.GephiLoader;
+import fucoin.configurations.internal.NodeHelper;
 import fucoin.gui.gephi.GephiFileSelector;
 import fucoin.gui.gephi.GraphWindow;
 import org.gephi.graph.api.Graph;
+import org.gephi.graph.api.Node;
 import scala.concurrent.Future;
 import scala.concurrent.duration.Duration;
 
@@ -50,7 +52,7 @@ public class GephiConfiguration extends AbstractConfiguration {
         graphWindow.addNodeClickHandler((node, event) -> {
 
             // get associated wallet and ask for its amount
-            ActorRef wallet = walletByName(node.getLabel());
+            ActorRef wallet = getWalletForNode(node);
 
             Future<Object> future = Patterns.ask(wallet, new ActionGetAmount(), timeout);
             future.onSuccess(new OnSuccess<Object>() {
@@ -58,7 +60,7 @@ public class GephiConfiguration extends AbstractConfiguration {
                 public void onSuccess(Object result) throws Throwable {
                     // display the amount when an answer is received
                     ActionGetAmountAnswer answer = (ActionGetAmountAnswer) result;
-                    graphWindow.setInfobarText(node.getLabel()+" has "+answer.amount+" FUCs");
+                    graphWindow.setInfobarText(NodeHelper.nameOfNode(node)+" has "+answer.amount+" FUCs");
                 }
             }, context().dispatcher());
         });
diff --git a/src/main/java/fucoin/configurations/internal/NodeHelper.java b/src/main/java/fucoin/configurations/internal/NodeHelper.java
new file mode 100644
index 0000000..abb0280
--- /dev/null
+++ b/src/main/java/fucoin/configurations/internal/NodeHelper.java
@@ -0,0 +1,21 @@
+package fucoin.configurations.internal;
+
+import org.gephi.graph.api.Node;
+
+public class NodeHelper {
+
+    public static String nameOfNode(Node n) {
+        String label = n.getLabel();
+
+        if (label == null || label.isEmpty()) {
+            return "Wallet" + n.getId();
+        }
+
+        if (Character.isDigit(label.charAt(0))) {
+            return "Wallet" + label;
+        }
+
+        return label;
+    }
+
+}
-- 
GitLab