Skip to content
Snippets Groups Projects
ActionCommitDistributedCommittedTransfer.java 2.55 KiB
Newer Older
Michael Kmoch's avatar
Michael Kmoch committed
package fucoin.actions.transaction;

import akka.actor.ActorRef;
import akka.actor.UntypedActorContext;
import fucoin.actions.ClientAction;
import fucoin.supervisor.DistributedCommittedTransferRequest;
Michael Kmoch's avatar
Michael Kmoch committed

public class ActionCommitDistributedCommittedTransfer extends ClientAction {

    private ActorRef source;
    private ActorRef target;
    protected int amount;
    private boolean granted;
    private long timestamp;
    private long id;


    public ActionCommitDistributedCommittedTransfer(ActorRef source, ActorRef target,
                                                    int amount, boolean granted, long timestamp, long id) {
        this.source = source;
        this.target = target;
        this.amount = amount;
        this.granted = granted;
        this.timestamp = timestamp;
        this.id = id;
    }

    public ActionCommitDistributedCommittedTransfer(
            DistributedCommittedTransferRequest outdatedRequest) {
        this.source = outdatedRequest.getSource();
        this.target = outdatedRequest.getTarget();
        this.amount = outdatedRequest.getAmount();
        this.granted = false;
        this.timestamp = outdatedRequest.getTimeout();
        this.id = outdatedRequest.getId();
    }

    @Override
    protected void onAction(ActorRef sender, ActorRef self,
                            UntypedActorContext context, AbstractWallet wallet) {
        wallet.log("ActionCommitDistributedCommittedTransfer is granted? " + granted);
        if (granted) {

            Integer sourceAmount = wallet.amounts.getOrDefault(source, 0);
            Integer targetAmount = wallet.amounts.getOrDefault(target, 0);
            wallet.amounts.put(source, sourceAmount - amount);
            wallet.amounts.put(target, targetAmount + amount);

            if (source.compareTo(self) == 0) {
                wallet.setAmount(wallet.getAmount() - amount);
                wallet.logTransactionSuccess("Sent " + amount + " FUC to " + target.path().name());
            } else if (target.compareTo(self) == 0) {
                wallet.setAmount(wallet.getAmount() + amount);
                wallet.logTransactionSuccess("Received " + amount + " FUC from " + source.path().name());
            wallet.log("abort transaction with id" + id);

            if (source.compareTo(self) == 0){
                wallet.logTransactionFail("Failed to send "+amount+" FUC to "+target.path().name()+" (Commit has not been granted)");
            }

        wallet.log("wallet.amounts:" + wallet.amounts);