diff --git a/src/main/java/fucoin/AbstractNode.java b/src/main/java/fucoin/AbstractNode.java index de7f5876c7ef5bd882865d7cffc72ca030b0e697..437262c5c1f4f7472674e58e445abb1104136d56 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 36991aba69288b73e9196b5b2199d35abdb90fa6..756873a3d3d8ba9599b02dc42571d6fe670c9b48 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 9080f7b4e42d96b7b62f22f6c787fd00da6efb46..29b574cc6595569b21b7d5d776c541e5ec732c7a 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 e224ddb34fd577e7e1349f31725444bfdbb27c2d..ba31e58344a8a26fb4162f6c6dd63d8357e55746 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 0f534a3e6edb22e595dd6e67e7d99919aab9a21b..7fe445708935e1fdd80bb60cd32f44f6660dcfbc 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 d7b78fff8a9b07cebea0a59d479fa8a6f27ede0d..7a606923ea9224d72e22a5e811bbf04733a0e469 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 f8334fb043c50cc1b4b66bb42786a8b2dbfb074a..6113cde0c3ceb054a314a71792192b425637060c 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 7e7de88bf5a58168b49d67a333dedd266fe90cb7..078318970b6f9ab0c92e5d932c2e51452916c6ae 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 a9fd926b303332e5b12d3549d5e1d3fb302568c1..186444d37eecdebd500f83421e842efb1bf06b12 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 7efa22df6d2615a8a31d4be0fa3474b2fa8ca2cb..c0fdf2cda5ec1256b53f7f95f6bc03411e67ec7b 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()); }