diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 Binary files /dev/null and b/.DS_Store differ diff --git a/src/main/java/fucoin/actions/transaction/ActionCommitDistributedCommittedTransfer.java b/src/main/java/fucoin/actions/transaction/ActionCommitDistributedCommittedTransfer.java index 92df3ffdbafce5366480d970de6f3e6df717cbd4..085dd2a081c47376f9a9533fea7d7e7189eee179 100644 --- a/src/main/java/fucoin/actions/transaction/ActionCommitDistributedCommittedTransfer.java +++ b/src/main/java/fucoin/actions/transaction/ActionCommitDistributedCommittedTransfer.java @@ -30,7 +30,7 @@ public class ActionCommitDistributedCommittedTransfer extends ClientAction { DistributedCommittedTransferRequest outdatedRequest) { this.source = outdatedRequest.getSource(); this.target = outdatedRequest.getTarget(); - this.amount = 0; + this.amount = outdatedRequest.getAmount(); this.granted = false; this.timestamp = outdatedRequest.getTimeout(); this.id = outdatedRequest.getId(); @@ -49,14 +49,19 @@ public class ActionCommitDistributedCommittedTransfer extends ClientAction { if (source.compareTo(self) == 0) { wallet.setAmount(wallet.getAmount() - amount); - wallet.logTransaction("Sent " + amount + " FUC to " + target.path().name()); + wallet.logTransactionSuccess("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()); + wallet.logTransactionSuccess("Received " + amount + " FUC from " + source.path().name()); } } else { 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); } diff --git a/src/main/java/fucoin/actions/transaction/ActionInvokeDistributedCommittedTransfer.java b/src/main/java/fucoin/actions/transaction/ActionInvokeDistributedCommittedTransfer.java index b754ec9c0fb35479b42094a5e2ec3e862a981962..f3bf02db907f58dbe852398313c0bbc1e3cbbbd3 100644 --- a/src/main/java/fucoin/actions/transaction/ActionInvokeDistributedCommittedTransfer.java +++ b/src/main/java/fucoin/actions/transaction/ActionInvokeDistributedCommittedTransfer.java @@ -27,7 +27,7 @@ public class ActionInvokeDistributedCommittedTransfer extends CoordinatorTransac long timeout = System.currentTimeMillis() + 500; - DistributedCommittedTransferRequest ds = new DistributedCommittedTransferRequest(source, target, timeout); + DistributedCommittedTransferRequest ds = new DistributedCommittedTransferRequest(source, target, amount, timeout); superVisor.addDistributedCommitedTransferRequest(ds); ActionPrepareDistributedCommittedTransfer apdct = new ActionPrepareDistributedCommittedTransfer(source, target, amount, timeout, ds.getId()); for (ActorRef neighbor : superVisor.getKnownNeighbors().values()) { diff --git a/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransferAnswer.java b/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransferAnswer.java index 7fc3c7960f882a348bbc13b879ada6621bd603d2..a408f4f194f7fd428da7e7d89c4fabc60a46b2d2 100644 --- a/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransferAnswer.java +++ b/src/main/java/fucoin/actions/transaction/ActionPrepareDistributedCommittedTransferAnswer.java @@ -45,6 +45,7 @@ public class ActionPrepareDistributedCommittedTransferAnswer extends Coordinator }else{ //A client wants to rollback if(request!=null){ + superVisor.log("Client does not grant commit of "+amount+" FUC ("+source.path().name()+" -> "+target.path().name()+")"); ActionCommitDistributedCommittedTransfer acdct = new ActionCommitDistributedCommittedTransfer(source,target,amount,false,timestamp,id); for(ActorRef neighbor : request.getAnswers()){ neighbor.tell(acdct, self); diff --git a/src/main/java/fucoin/gui/LogCellRenderer.java b/src/main/java/fucoin/gui/LogCellRenderer.java new file mode 100644 index 0000000000000000000000000000000000000000..1c774a4297cdbc551add3c4decab6dc7cab0bd35 --- /dev/null +++ b/src/main/java/fucoin/gui/LogCellRenderer.java @@ -0,0 +1,33 @@ +package fucoin.gui; + +import javax.swing.*; +import java.awt.*; + +public class LogCellRenderer extends DefaultListCellRenderer { + + private static final Color SUCCESS_COLOR = new Color(92, 184, 92); + private static final Color FAIL_COLOR = new Color(217, 83, 79); + + @Override + public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { + super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); + + if (value instanceof LogMessage) { + LogMessage msg = (LogMessage) value; + + switch (msg.getContext()) { + + case TRANSACTION_SUCCESS: + setForeground(SUCCESS_COLOR); + break; + case TRANSACTION_FAIL: + setForeground(FAIL_COLOR); + break; + case DEBUG: + break; + } + } + + return this; + } +} diff --git a/src/main/java/fucoin/gui/LogMessage.java b/src/main/java/fucoin/gui/LogMessage.java index 8c93133e5e58d075b34835246c29a20aee5d91d8..34b3000c40a1fdc0a1c1cba43ac1bbda0e611d5f 100644 --- a/src/main/java/fucoin/gui/LogMessage.java +++ b/src/main/java/fucoin/gui/LogMessage.java @@ -3,20 +3,28 @@ package fucoin.gui; public class LogMessage { + public enum Context { + TRANSACTION_SUCCESS, TRANSACTION_FAIL, DEBUG + }; + private String message; - private boolean transactionRelated; + private Context context; + + public LogMessage(String message){ + this(message, Context.DEBUG); + } - public LogMessage(String message, boolean transactionRelated) { + public LogMessage(String message, Context context) { this.message = message; - this.transactionRelated = transactionRelated; + this.context = context; } public String getMessage() { return message; } - public boolean isTransactionRelated() { - return transactionRelated; + public Context getContext() { + return context; } @Override diff --git a/src/main/java/fucoin/gui/WalletGuiControl.java b/src/main/java/fucoin/gui/WalletGuiControl.java index d19b454540d1d399e3981da6b37b268cf4de767a..480ba08436f412e6e4c73f4016c49fb1d4896fcc 100644 --- a/src/main/java/fucoin/gui/WalletGuiControl.java +++ b/src/main/java/fucoin/gui/WalletGuiControl.java @@ -10,5 +10,7 @@ public interface WalletGuiControl { void addLogMsg(String msg); - void addTransactionLogMessage(String message); + void addTransactionLogMessageSuccess(String message); + + void addTransactionLogMessageFail(String message); } diff --git a/src/main/java/fucoin/gui/WalletGuiControlImpl.java b/src/main/java/fucoin/gui/WalletGuiControlImpl.java index 5c03f89d916b67f203b130f2882dc29052837a7d..2e93631ea53ef95e5069ec59a1236695b7e6b88c 100644 --- a/src/main/java/fucoin/gui/WalletGuiControlImpl.java +++ b/src/main/java/fucoin/gui/WalletGuiControlImpl.java @@ -132,6 +132,8 @@ public class WalletGuiControlImpl implements WalletGuiControl { }); + txtLog.setCellRenderer(new LogCellRenderer()); + btnExit.addActionListener(e -> window.dispose()); window.addWindowListener(new WindowAdapter() { @@ -171,12 +173,17 @@ public class WalletGuiControlImpl implements WalletGuiControl { @Override public void addLogMsg(String msg) { - log(new LogMessage(msg, false)); + log(new LogMessage(msg)); + } + + @Override + public void addTransactionLogMessageSuccess(String message) { + log(new LogMessage(message, LogMessage.Context.TRANSACTION_SUCCESS)); } @Override - public void addTransactionLogMessage(String message) { - log(new LogMessage(message, true)); + public void addTransactionLogMessageFail(String message) { + log(new LogMessage(message, LogMessage.Context.TRANSACTION_FAIL)); } private void log(LogMessage logMessage) { @@ -198,7 +205,8 @@ public class WalletGuiControlImpl implements WalletGuiControl { Enumeration<LogMessage> elements = log.elements(); while (elements.hasMoreElements()) { LogMessage logMessage = elements.nextElement(); - if (logMessage.isTransactionRelated()) { + LogMessage.Context context = logMessage.getContext(); + if (context == LogMessage.Context.TRANSACTION_FAIL || context == LogMessage.Context.TRANSACTION_SUCCESS) { filteredLog.addElement(logMessage); } } diff --git a/src/main/java/fucoin/supervisor/DistributedCommittedTransferRequest.java b/src/main/java/fucoin/supervisor/DistributedCommittedTransferRequest.java index 920db3602b3f8069418e0df1083c634ca79d72f8..a3958498b57ac4da673b6a616e842d3941a3677f 100644 --- a/src/main/java/fucoin/supervisor/DistributedCommittedTransferRequest.java +++ b/src/main/java/fucoin/supervisor/DistributedCommittedTransferRequest.java @@ -13,14 +13,19 @@ public class DistributedCommittedTransferRequest extends Transaction { private final static Random random = new Random(System.currentTimeMillis() + System.nanoTime()); private ActorRef source; private ActorRef target; + private int amount; + private long timeout; private long id; + private List<ActorRef> answers = new LinkedList<>(); - public DistributedCommittedTransferRequest(ActorRef source, ActorRef target, + public DistributedCommittedTransferRequest(ActorRef source, ActorRef target, int amount, long timeout) { this.source = source; this.target = target; + this.amount = amount; + this.timeout = timeout; this.id = random.nextLong(); } @@ -55,4 +60,8 @@ public class DistributedCommittedTransferRequest extends Transaction { public long getId() { return id; } + + public int getAmount(){ + return amount; + } } diff --git a/src/main/java/fucoin/wallet/AbstractWallet.java b/src/main/java/fucoin/wallet/AbstractWallet.java index 100d47242ea011a5406e0aab7b19b3cfee57390b..2c7381e250ed62c132a47f07263f06277ae23192 100644 --- a/src/main/java/fucoin/wallet/AbstractWallet.java +++ b/src/main/java/fucoin/wallet/AbstractWallet.java @@ -94,11 +94,18 @@ public abstract class AbstractWallet extends AbstractNode implements Serializabl public abstract void setRemoteSuperVisorActor(ActorRef remoteSuperVisorActor); /** - * Appends a transaction related message to the log + * Appends a message related to a successful transaction to the log * * @param msg */ - public abstract void logTransaction(String msg); + public abstract void logTransactionSuccess(String msg); + + /** + * Appends a message related to a successful transaction to the log + * + * @param msg + */ + public abstract void logTransactionFail(String msg); /** * Sends amount FUCs to the wallet with the address adress diff --git a/src/main/java/fucoin/wallet/WalletImpl.java b/src/main/java/fucoin/wallet/WalletImpl.java index c6945830f8a771aae365e68b7aba092175a00e7f..60ae569dd84a217195c247ce7471b313a381d771 100644 --- a/src/main/java/fucoin/wallet/WalletImpl.java +++ b/src/main/java/fucoin/wallet/WalletImpl.java @@ -1,9 +1,7 @@ package fucoin.wallet; import akka.actor.ActorRef; -import akka.actor.ActorSelection; import akka.actor.Props; -import akka.util.Timeout; import fucoin.actions.ClientAction; import fucoin.actions.join.ActionJoin; import fucoin.actions.join.ActionJoinAnswer; @@ -200,9 +198,19 @@ public class WalletImpl extends AbstractWallet { @Override - public void logTransaction(String msg) { + public void logTransactionSuccess(String msg) { if (gui != null) { - gui.addTransactionLogMessage(msg); + gui.addTransactionLogMessageSuccess(msg); + } else { + System.out.println(msg); + } + } + + + @Override + public void logTransactionFail(String msg) { + if (gui != null) { + gui.addTransactionLogMessageFail(msg); } else { System.out.println(msg); }