-
Simon Könnecke authoredSimon Könnecke authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
WalletImpl.java 5.81 KiB
package fucoin.wallet;
import akka.actor.ActorRef;
import akka.actor.Props;
import fucoin.actions.ClientAction;
import fucoin.actions.join.ActionJoin;
import fucoin.actions.join.ActionJoinAnswer;
import fucoin.actions.persist.ActionInvokeLeave;
import fucoin.actions.persist.ActionInvokeRevive;
import fucoin.actions.transaction.ActionGetAmountAnswer;
import fucoin.actions.transaction.ActionInvokeSentMoney;
import fucoin.gui.WalletController;
import fucoin.gui.WalletGuiController;
public class WalletImpl extends AbstractWallet implements WalletController {
private ActorRef preknownNeighbour;
private ActorRef remoteSuperVisorActor;
private WalletGuiController gui;
private String preknownNeighbourName;
private boolean isActive;
public WalletImpl(ActorRef preknownNeighbour, String preknownNeighbourName, String walletName, ActorRef remoteSuperVisorActor) {
super(walletName);
this.preknownNeighbourName = preknownNeighbourName;
this.preknownNeighbour = preknownNeighbour;
this.remoteSuperVisorActor = remoteSuperVisorActor;
}
public void addAmount(int amount) {
setAmount(this.amount + amount);
log(" My amount is now " + this.amount);
}
@Override
public void leave() {
getSelf().tell(new ActionInvokeLeave(), getSelf());
}
@Override
public void onReceive(Object message) {
//log(getSender().path().name() + " invokes " + getSelf().path().name() + " to do " + message.getClass().getSimpleName());
if (message instanceof ActionInvokeRevive) {
((ActionInvokeRevive) message).doAction(this);
}
if (!isActive && !(message instanceof ActionInvokeRevive)) return;
//System.out.println(message);
if (message instanceof ClientAction) {
((ClientAction) message).doAction(this);
}
}
@Override
public void preStart() throws Exception {
isActive = true;
if (gui != null) {
gui.setAddress(getAddress());
}
String path = "akka.tcp://Core@127.0.0.1:1234/user/Main";
//System.out.println(getContext().provider().getExternalAddressFor(getSelf().path().address()));
//log("my address should be "+getAddress());
//log(""+preknownNeighbour);
//knownNeighbors.put(getName(),getSelf());
//System.out.println(knownNeighbors);
if (preknownNeighbour != null) {
addKnownNeighbor(preknownNeighbourName, preknownNeighbour);
preknownNeighbour.tell(new ActionJoin(), getSelf());
ActionJoinAnswer aja = new ActionJoinAnswer();
aja.someNeighbors.putAll(getKnownNeighbors());
aja.someNeighbors.put(name, getSelf());
preknownNeighbour.tell(aja, getSelf());
}
//setAmount(100);
//remoteSuperVisorActor.tell(new ServerActionJoin(name), getSelf());
}
@Override
public void postStop() throws Exception {
leave();
super.postStop();
}
public static Props props(ActorRef preknownNeighbour, String preknownNeighbourName, String walletName, ActorRef remoteSuperVisorActor) {
return Props.create(WalletImpl.class, new WalletFactory(preknownNeighbour, preknownNeighbourName, walletName, remoteSuperVisorActor));
}
@Override
public boolean equals(Object obj) {
if (obj instanceof WalletImpl) {
WalletImpl wobj = (WalletImpl) obj;
return amount == wobj.amount && name.equals(wobj.name);
}
return false;
}
public void setGui(WalletGuiController gui) {
this.gui = gui;
}
public void setAmount(int amount) {
this.amount = amount;
if (remoteSuperVisorActor != null) {
remoteSuperVisorActor.tell(new ActionGetAmountAnswer(getAddress(), getName(), amount), getSelf());
}
if (gui != null) {
gui.setAmount(this.amount);
}
}
public int getAmount() {
return amount;
}
public ActorRef getPreknownNeighbour() {
return preknownNeighbour;
}
public ActorRef getRemoteSuperVisorActor() {
return remoteSuperVisorActor;
}
public WalletGuiController getGui() {
return gui;
}
public String getPreknownNeighbourName() {
return preknownNeighbourName;
}
public boolean isActive() {
return isActive;
}
@Override
public boolean addKnownNeighbor(String key, ActorRef value) {
System.out.println(key + " is newNeighbor of " + name + "?" + !getKnownNeighbors().containsKey(key));
if (getKnownNeighbors().containsKey(key) || key.equals(name)) {
return false;
}
boolean newNeighbor = super.addKnownNeighbor(key, value);
if (gui != null && newNeighbor) {
gui.addKnownAddress(key);
}
return newNeighbor;
}
public void setPreknownNeighbour(ActorRef preknownNeighbour) {
this.preknownNeighbour = preknownNeighbour;
}
public void setRemoteSuperVisorActor(ActorRef remoteSuperVisorActor) {
this.remoteSuperVisorActor = remoteSuperVisorActor;
}
public void setPreknownNeighbourName(String preknownNeighbourName) {
this.preknownNeighbourName = preknownNeighbourName;
}
@Override
public void log(String msg) {
if (gui != null) {
gui.addLogMsg(msg);
} else {
System.out.println(msg);
}
}
public void logTransaction(String msg) {
if (gui != null) {
gui.addTransactionLogMessage(msg);
} else {
System.out.println(msg);
}
}
public void setActive(boolean isActive) {
this.isActive = isActive;
}
@Override
public void send(String address, int amount) {
getSelf().tell(new ActionInvokeSentMoney(address, amount), getSelf());
}
}