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