Newer
Older
package fucoin.actions.transaction;
import akka.actor.ActorRef;
import akka.actor.UntypedActorContext;
import fucoin.actions.ClientAction;
import fucoin.supervisor.DistributedCommittedTransferRequest;
Simon Könnecke
committed
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;
Luca Keidel
committed
private ActorRef observer;
public ActionCommitDistributedCommittedTransfer(ActorRef source, ActorRef target,
Luca Keidel
committed
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;
Luca Keidel
committed
this.observer = observer;
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();
Luca Keidel
committed
this.observer = outdatedRequest.getObserver();
}
@Override
protected void onAction(ActorRef sender, ActorRef self,
Simon Könnecke
committed
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());
Luca Keidel
committed
// 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)");
Luca Keidel
committed
if (observer != null){
observer.tell(new ActionNotifyObserver(source,target,amount,granted,timestamp, id), self);
}
}
//wallet.addLogMsg("wallet.amounts:" + wallet.amounts);