From a138bfc0285da01b0f8aedeea644db59663376f3 Mon Sep 17 00:00:00 2001
From: Luca Keidel <info@lucakeidel.de>
Date: Wed, 15 Jun 2016 19:10:44 +0200
Subject: [PATCH] Implemented colors for log messages and a log message for
 failed transactions

---
 .DS_Store                                     | Bin 0 -> 6148 bytes
 ...ionCommitDistributedCommittedTransfer.java |  11 ++++--
 ...ionInvokeDistributedCommittedTransfer.java |   2 +-
 ...areDistributedCommittedTransferAnswer.java |   1 +
 src/main/java/fucoin/gui/LogCellRenderer.java |  33 ++++++++++++++++++
 src/main/java/fucoin/gui/LogMessage.java      |  18 +++++++---
 .../java/fucoin/gui/WalletGuiControl.java     |   4 ++-
 .../java/fucoin/gui/WalletGuiControlImpl.java |  16 ++++++---
 .../DistributedCommittedTransferRequest.java  |  11 +++++-
 .../java/fucoin/wallet/AbstractWallet.java    |  11 ++++--
 src/main/java/fucoin/wallet/WalletImpl.java   |  16 ++++++---
 11 files changed, 102 insertions(+), 21 deletions(-)
 create mode 100644 .DS_Store
 create mode 100644 src/main/java/fucoin/gui/LogCellRenderer.java

diff --git a/.DS_Store b/.DS_Store
new file mode 100644
index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6
GIT binary patch
literal 6148
zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3
zem<@ulZcFPQ@L2!n>{z**<q8>++&mCkOWA81W14cNZ<zv;LbK1Poaz?KmsK2CSc!(
z0ynLxE!0092;Krf2c+FF_Fe*7ECH>lEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ
zLs35+`xjp>T0<F0fCPF1$Cyrb|F7^5{eNG?83~ZUUlGt@xh*qZDeu<Z%US-OSsOPv
j)R!Z4KLME7ReXlK;d!wEw5GODWMKRea10D2@KpjYNUI8I

literal 0
HcmV?d00001

diff --git a/src/main/java/fucoin/actions/transaction/ActionCommitDistributedCommittedTransfer.java b/src/main/java/fucoin/actions/transaction/ActionCommitDistributedCommittedTransfer.java
index 92df3ff..085dd2a 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 b754ec9..f3bf02d 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 7fc3c79..a408f4f 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 0000000..1c774a4
--- /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 8c93133..34b3000 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 d19b454..480ba08 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 5c03f89..2e93631 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 920db36..a395849 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 100d472..2c7381e 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 c694583..60ae569 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);
         }
-- 
GitLab