Skip to content
Snippets Groups Projects
Wallet.java 5.82 KiB
Newer Older
Michael Kmoch's avatar
Michael Kmoch committed
package fucoin;

import akka.actor.ActorRef;
import akka.actor.Props;
Michael Kmoch's avatar
Michael Kmoch committed
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;
Michael Kmoch's avatar
Michael Kmoch committed
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(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 int getAmount() {
        return 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) {
        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());
    }