package fucoin; 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.join.ServerActionJoin; import fucoin.actions.persist.ActionInvokeLeave; import fucoin.actions.persist.ActionInvokeRevive; import fucoin.actions.transaction.ActionGetAmountAnswer; import fucoin.actions.transaction.ActionInvokeSentMoney; import fucoin.gui.IWalletControle; import fucoin.gui.IWalletGuiControle; public class Wallet extends AbstractWallet implements IWalletControle{ private ActorRef preknownNeighbour; private ActorRef remoteSuperVisorActor; private IWalletGuiControle gui; private String preknownNeighbourName; private boolean isActive; public Wallet(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(message.getClass().getSimpleName()); //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(Wallet.class,new WalletCreator(preknownNeighbour,preknownNeighbourName,walletName,remoteSuperVisorActor)); } @Override public boolean equals(Object obj) { if(obj instanceof Wallet){ Wallet wobj = (Wallet) obj; return amount==wobj.amount&&name.equals(wobj.name); } return false; } public void setGui(IWalletGuiControle 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 ActorRef getPreknownNeighbour() { return preknownNeighbour; } public ActorRef getRemoteSuperVisorActor() { return remoteSuperVisorActor; } public IWalletGuiControle getGui() { return gui; } public String getPreknownNeighbourName() { return preknownNeighbourName; } public boolean isActive() { return isActive; } @Override public boolean addKnownNeighbor(String key, ActorRef value) { log(key+" is newNeighbor?"+!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; } public void setActive(boolean isActive) { this.isActive = isActive; } @Override public void send(String address, int amount) { getSelf().tell(new ActionInvokeSentMoney(address, amount), getSelf()); } }