Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
ActionCommitDistributedCommittedTransfer.java 2.33 KiB
package fucoin.actions.transaction;

import akka.actor.ActorRef;
import akka.actor.UntypedActorContext;
import fucoin.actions.ClientAction;
import fucoin.supervisor.DistributedCommittedTransferRequest;
import fucoin.wallet.AbstractWallet;

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 = 0;
        this.granted = false;
        this.timestamp = outdatedRequest.getTimeout();
        this.id = outdatedRequest.getId();
    }

    @Override
    protected void onAction(ActorRef sender, ActorRef self,
                            UntypedActorContext context, AbstractWallet wallet) {
        System.out.println(self.path().name() + ": 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.logTransaction("Sent " + amount + " FUC to " + target.path().name());
            } else if (target.compareTo(self) == 0) {
                wallet.setAmount(wallet.getAmount() + amount);
                wallet.logTransaction("Received " + amount + " FUC from " + source.path().name());
            }

        } else {
            log("abort transaction with id" + id);
        }
        log("wallet.amounts:" + wallet.amounts);
    }

}