From e7eba789ff6f73609544d9d44356b6dbe5e1ce0b Mon Sep 17 00:00:00 2001
From: David Bohn <david@cancrisoft.net>
Date: Tue, 14 Jun 2016 15:41:25 +0200
Subject: [PATCH] Implemented join of remote node into network

---
 src/main/java/fucoin/AbstractNode.java              |  2 ++
 src/main/java/fucoin/Main.java                      |  4 +++-
 src/main/java/fucoin/MainRemote.java                |  2 +-
 src/main/java/fucoin/actions/join/ActionJoin.java   | 13 +++++++------
 .../java/fucoin/actions/join/ActionJoinAnswer.java  | 11 +++++++++++
 .../java/fucoin/actions/join/ServerActionJoin.java  |  2 +-
 .../actions/transaction/ActionGetAmountAnswer.java  |  2 +-
 .../ActionPrepareDistributedCommittedTransfer.java  |  6 ++++++
 src/main/java/fucoin/wallet/AbstractWallet.java     |  2 ++
 src/main/java/fucoin/wallet/WalletImpl.java         | 13 +++++++++----
 10 files changed, 43 insertions(+), 14 deletions(-)

diff --git a/src/main/java/fucoin/AbstractNode.java b/src/main/java/fucoin/AbstractNode.java
index de7f587..437262c 100644
--- a/src/main/java/fucoin/AbstractNode.java
+++ b/src/main/java/fucoin/AbstractNode.java
@@ -3,6 +3,7 @@ package fucoin;
 import akka.actor.ActorRef;
 import akka.actor.Address;
 import akka.actor.UntypedActor;
+import fucoin.actions.transaction.ActionGetAmount;
 import fucoin.wallet.AbstractWallet;
 
 import java.io.Serializable;
@@ -58,6 +59,7 @@ public abstract class AbstractNode extends UntypedActor implements Serializable
     public boolean addKnownNeighbor(String key, ActorRef value) {
         if (!knownNeighbors.containsKey(key)) {
             knownNeighbors.put(key, value);
+            value.tell(new ActionGetAmount(), getSelf());
             return true;
         }
         return false;
diff --git a/src/main/java/fucoin/Main.java b/src/main/java/fucoin/Main.java
index 36991ab..756873a 100644
--- a/src/main/java/fucoin/Main.java
+++ b/src/main/java/fucoin/Main.java
@@ -16,7 +16,7 @@ import java.util.List;
 
 public class Main {
 
-    private static int numberOfWallets = 1;
+    private static int numberOfWallets = 2;
 
     private static ActorSystem cSystem;
 
@@ -38,6 +38,8 @@ public class Main {
         //Init System Actor System
         cSystem = ActorSystem.create("Core", config);
         cSuperVisorActor = cSystem.actorOf(SuperVisorImpl.props(), "SuperVisorImpl");
+        System.out.print("Supervisor address: ");
+        System.out.println(cSuperVisorActor.path().toStringWithAddress(cSystem.provider().getDefaultAddress()));
     }
 
     public static void main(String[] args) throws InterruptedException {
diff --git a/src/main/java/fucoin/MainRemote.java b/src/main/java/fucoin/MainRemote.java
index 9080f7b..29b574c 100644
--- a/src/main/java/fucoin/MainRemote.java
+++ b/src/main/java/fucoin/MainRemote.java
@@ -34,7 +34,7 @@ public class MainRemote {
 		//System.out.println(system.actorSelection(ActorPath.fromString(path)));
 		
 		//System.out.println(ActorPath.isValidPathElement(""+address+"/user/Main"));
-		ActorRef a1 = system.actorOf(WalletImpl.props(null,"","Main2",remoteSuperVisorActor),"Main2");
+		ActorRef a1 = system.actorOf(WalletImpl.props(null,"","Remote1",remoteSuperVisorActor),"Remote1");
 		
 	}
 }
diff --git a/src/main/java/fucoin/actions/join/ActionJoin.java b/src/main/java/fucoin/actions/join/ActionJoin.java
index e224ddb..ba31e58 100644
--- a/src/main/java/fucoin/actions/join/ActionJoin.java
+++ b/src/main/java/fucoin/actions/join/ActionJoin.java
@@ -3,17 +3,18 @@ package fucoin.actions.join;
 import akka.actor.ActorRef;
 import akka.actor.UntypedActorContext;
 import fucoin.AbstractNode;
+import fucoin.actions.ClientAction;
+import fucoin.wallet.AbstractWallet;
 
 //Used to join the network (a pre known participant/WalletImpl must be known)
-public class ActionJoin extends GeneralAction {
+public class ActionJoin extends ClientAction {
 
     @Override
-    protected void onAction(ActorRef sender, ActorRef self,
-                            UntypedActorContext context, AbstractNode node) {
-        ActionJoinAnswer aja = new ActionJoinAnswer();
+    protected void onAction(ActorRef sender, ActorRef self, UntypedActorContext context, AbstractWallet node) {
+        ActionJoinAnswer aja = new ActionJoinAnswer(node.getRemoteSuperVisorActor());
         aja.someNeighbors.putAll(node.getKnownNeighbors());
-        System.out.println("Answer to "+sender.path().name());
+        System.out.println("Answer to " + sender.path().name());
         sender.tell(aja, self);
+        //node.addKnownNeighbor(sender.path().name(), sender);
     }
-
 }
diff --git a/src/main/java/fucoin/actions/join/ActionJoinAnswer.java b/src/main/java/fucoin/actions/join/ActionJoinAnswer.java
index 0f534a3..7fe4457 100644
--- a/src/main/java/fucoin/actions/join/ActionJoinAnswer.java
+++ b/src/main/java/fucoin/actions/join/ActionJoinAnswer.java
@@ -4,6 +4,7 @@ import akka.actor.ActorRef;
 import akka.actor.UntypedActorContext;
 import fucoin.actions.ClientAction;
 import fucoin.actions.persist.ActionSearchMyWallet;
+import fucoin.actions.transaction.ActionGetAmount;
 import fucoin.wallet.AbstractWallet;
 
 import java.util.HashMap;
@@ -13,6 +14,11 @@ import java.util.Map.Entry;
 // and/or local neighbors
 public class ActionJoinAnswer extends ClientAction {
     public final HashMap<String, ActorRef> someNeighbors = new HashMap<>();
+    public final ActorRef supervisor;
+
+    public ActionJoinAnswer(ActorRef supervisor) {
+        this.supervisor = supervisor;
+    }
 
     protected void onAction(ActorRef sender, ActorRef self,
                             UntypedActorContext context, AbstractWallet wallet) {
@@ -23,6 +29,11 @@ public class ActionJoinAnswer extends ClientAction {
         for (Entry<String, ActorRef> neighbor : someNeighbors.entrySet()) {
             neighbor.getValue().tell(new ActionSearchMyWallet(wallet.getName()), self);
         }
+
+        if (wallet.getRemoteSuperVisorActor() == null) {
+            wallet.setRemoteSuperVisorActor(supervisor);
+            supervisor.tell(new ServerActionJoin(wallet.getName()), self);
+        }
     }
 
 }
diff --git a/src/main/java/fucoin/actions/join/ServerActionJoin.java b/src/main/java/fucoin/actions/join/ServerActionJoin.java
index d7b78ff..7a60692 100644
--- a/src/main/java/fucoin/actions/join/ServerActionJoin.java
+++ b/src/main/java/fucoin/actions/join/ServerActionJoin.java
@@ -16,7 +16,7 @@ public class ServerActionJoin extends SuperVisorAction {
     @Override
     protected void onAction(ActorRef sender, ActorRef self,
                             UntypedActorContext context, SuperVisorImpl node) {
-        ActionJoinAnswer aja = new ActionJoinAnswer();
+        ActionJoinAnswer aja = new ActionJoinAnswer(node.getSelf());
         aja.someNeighbors.putAll(node.getKnownNeighbors());
         sender.tell(aja, self);
         node.addKnownNeighbor(name, sender);
diff --git a/src/main/java/fucoin/actions/transaction/ActionGetAmountAnswer.java b/src/main/java/fucoin/actions/transaction/ActionGetAmountAnswer.java
index f8334fb..6113cde 100644
--- a/src/main/java/fucoin/actions/transaction/ActionGetAmountAnswer.java
+++ b/src/main/java/fucoin/actions/transaction/ActionGetAmountAnswer.java
@@ -20,7 +20,7 @@ public class ActionGetAmountAnswer extends Transaction {
 	@Override
 	protected void onAction(ActorRef sender, ActorRef self,
 			UntypedActorContext context, AbstractWallet wallet) {
-
+		wallet.amounts.put(sender, amount);
 	}
 
 }
diff --git a/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransfer.java b/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransfer.java
index 7e7de88..0783189 100644
--- a/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransfer.java
+++ b/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransfer.java
@@ -32,6 +32,12 @@ public class ActionPrepareDistributedCommittedTransfer extends Transaction {
                         //sender have enough money
                         && wallet.amounts.getOrDefault(source, 0) >= amount));
 
+        if (granted) {
+            wallet.log("I do grant transaction.");
+        } else {
+            wallet.log("I do not grant.");
+        }
+
         sender.tell(new ActionPrepareDistributedCommittedTransferAnswer(source, target, amount, timestamp, granted, id), self);
     }
 
diff --git a/src/main/java/fucoin/wallet/AbstractWallet.java b/src/main/java/fucoin/wallet/AbstractWallet.java
index a9fd926..186444d 100644
--- a/src/main/java/fucoin/wallet/AbstractWallet.java
+++ b/src/main/java/fucoin/wallet/AbstractWallet.java
@@ -65,6 +65,8 @@ public abstract class AbstractWallet extends AbstractNode {
 
     public abstract ActorRef getRemoteSuperVisorActor();
 
+    public abstract void setRemoteSuperVisorActor(ActorRef remoteSuperVisorActor);
+
     public abstract void logTransaction(String msg);
 
     public abstract void send(String address, int amount);
diff --git a/src/main/java/fucoin/wallet/WalletImpl.java b/src/main/java/fucoin/wallet/WalletImpl.java
index 7efa22d..c0fdf2c 100644
--- a/src/main/java/fucoin/wallet/WalletImpl.java
+++ b/src/main/java/fucoin/wallet/WalletImpl.java
@@ -6,8 +6,10 @@ import akka.actor.Props;
 import fucoin.actions.ClientAction;
 import fucoin.actions.join.ActionJoin;
 import fucoin.actions.join.ActionJoinAnswer;
+import fucoin.actions.join.ServerActionJoin;
 import fucoin.actions.persist.ActionInvokeLeave;
 import fucoin.actions.persist.ActionInvokeRevive;
+import fucoin.actions.transaction.ActionGetAmount;
 import fucoin.actions.transaction.ActionGetAmountAnswer;
 import fucoin.actions.transaction.ActionInvokeSentMoney;
 import fucoin.gui.WalletGuiControl;
@@ -34,9 +36,10 @@ public class WalletImpl extends AbstractWallet {
         this.remoteSuperVisorActor = remoteSuperVisorActor;
 
         if(remoteSuperVisorActor == null){
-            String path = JOptionPane.showInputDialog(null, "Enter a neighbour address: ");
+            String path = JOptionPane.showInputDialog(null, "Enter a supervisor address: ");
             System.out.println(path);
             ActorSelection selection = getContext().actorSelection(path);
+            //this.setRemoteSuperVisorActor(selection.anchor());
             selection.tell(new ActionJoin(), self());
             //selection.tell("Hallo!", self());
         }
@@ -70,9 +73,9 @@ public class WalletImpl extends AbstractWallet {
             ((ClientAction) message).doAction(this);
         }
 
-        if (message instanceof ActionJoin){
+        /*if (message instanceof ActionJoin){
             ((ActionJoin) message).doAction(this);
-        }
+        }*/
 
     }
 
@@ -86,7 +89,7 @@ public class WalletImpl extends AbstractWallet {
         if (preKnownNeighbour != null) {
             addKnownNeighbor(preKnownNeighbourName, preKnownNeighbour);
             preKnownNeighbour.tell(new ActionJoin(), getSelf());
-            ActionJoinAnswer aja = new ActionJoinAnswer();
+            ActionJoinAnswer aja = new ActionJoinAnswer(this.getRemoteSuperVisorActor());
             aja.someNeighbors.putAll(getKnownNeighbors());
             aja.someNeighbors.put(name, getSelf());
             preKnownNeighbour.tell(aja, getSelf());
@@ -116,6 +119,8 @@ public class WalletImpl extends AbstractWallet {
 
     public void setAmount(int amount) {
         this.amount = amount;
+        System.out.print("Setting amount and supervisor is: ");
+        System.out.println(remoteSuperVisorActor);
         if (remoteSuperVisorActor != null) {
             remoteSuperVisorActor.tell(new ActionGetAmountAnswer(getAddress(), getName(), amount), getSelf());
         }
-- 
GitLab