Skip to content
Snippets Groups Projects
ActionCommitDistributedCommittedTransfer.java 3.21 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,
                                                    ActorRef observer) {
        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();
        this.observer = outdatedRequest.getObserver();
    }

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

            if (source.compareTo(self) == 0) {
                wallet.setAmount(wallet.getAmount() - amount);
                wallet.addTransactionLogMessageSuccess("Sent " + amount + " FUC to " + target.path().name());
            } else if (target.compareTo(self) == 0) {
                wallet.setAmount(wallet.getAmount() + amount);
                wallet.addTransactionLogMessageSuccess("Received " + amount + " FUC from " + source.path().name());
                // recipient should notify a possible observer
                if (observer != null) {
                    observer.tell(new ActionNotifyObserver(source, target, amount, granted, timestamp, id), self);
            wallet.addLogMsg("abort transaction with id" + id);
            // rollback
            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.addTransactionLogMessageFail("Failed to send " + amount + " FUC to " + target.path().name() + " (Commit has not been granted)");
                if (observer != null) {
                    observer.tell(new ActionNotifyObserver(source, target, amount, granted, timestamp, id), self);
        //wallet.addLogMsg("wallet.amounts:" + wallet.amounts);