From c4478ffd9d820b05821e1f61f89853048abc6a03 Mon Sep 17 00:00:00 2001
From: Simon Schmitt <rimesime@mi.fu-berlin.de>
Date: Fri, 12 Jun 2015 15:34:14 +0200
Subject: [PATCH] adding common interface

---
 Interface/AbstractWallet.java | 109 ++++++++++++++++++++++++++++++++++
 Interface/Wallet.java         |  55 +++++++++++++++++
 2 files changed, 164 insertions(+)
 create mode 100644 Interface/AbstractWallet.java
 create mode 100644 Interface/Wallet.java

diff --git a/Interface/AbstractWallet.java b/Interface/AbstractWallet.java
new file mode 100644
index 0000000..1cc3a43
--- /dev/null
+++ b/Interface/AbstractWallet.java
@@ -0,0 +1,109 @@
+import java.util.HashMap;
+import akka.actor.ActorRef;
+import akka.actor.UntypedActor;
+import java.io.Serializable;
+
+public abstract class AbstractWallet extends UntypedActor implements Serializable {
+    
+    // Returns some neighbors that might be used as local
+    // and/or local neighborsUntypedActor
+    public static class ActionJoin implements Serializable {}
+    public class ActionJoinAnswer implements Serializable {
+        public final HashMap<String, ActorRef> someNeighbors = new HashMap<>();
+    }
+    
+    // Used to push the state of my/a wallet to another participant
+    public static class ActionStoreOrUpdate implements Serializable {
+        public final AbstractWallet w;
+        public ActionStoreOrUpdate(AbstractWallet w) {
+            this.w = w;
+        }
+    }
+    
+    // May be used to delete a stored Wallet on another participant
+    public static class ActionInvalidate implements Serializable {
+        final String name;
+        public ActionInvalidate(String name) {
+            this.name = name;
+        }
+    }
+    
+    // Used to send (positive amount) or retreive money (negative amount) 
+    public static class ActionReceiveTransaction implements Serializable {
+        final public int amount;
+        public ActionReceiveTransaction(int amount) {
+            this.amount = amount;
+        }
+    }
+    
+    // Used to search a Wallet by name, i.e. when we want to 
+    // perform a transaction on it
+    public static class ActionSearchWalletReference implements Serializable {
+        final String name;
+        public ActionSearchWalletReference(String name) {
+            this.name = name;
+        }
+    }
+    
+    // Used to return a Wallet
+    public static class ActionSearchWalletReferenceAnswer implements Serializable {
+        final AbstractWallet w;
+        public ActionSearchWalletReferenceAnswer(AbstractWallet w) {
+            this.w = w;
+        }
+    }
+    
+    // Used to search a Wallet by name, i.e. the own wallet if we just 
+    // joined the network
+    public static class ActionSearchMyWallet implements Serializable {
+        final String name;
+        public ActionSearchMyWallet(String name) {
+            this.name = name;
+        }
+    }
+    
+    // Constructor
+    public AbstractWallet(String name) {
+        this.name = name;
+    }
+    
+    // Returns the name of this wallet, e.g. "Lieschen Müller"
+    public String getName() {
+        return this.name;
+    }
+    
+    // Returns the akka-style address as String, which 
+    // could be converted to an ActorRef object later
+    public abstract String getAddress();
+    
+    // Performs housekeeping operations, e.g. pushes 
+    // backedUpNeighbor-entries to other neighbors
+    public abstract void leave();
+    
+    // The which receives Action objects
+    public abstract void onReceive(Object message);
+    
+    // Holds references to neighbors that were in 
+    // contact with this wallet during runtime;
+    // The key corresponds to the Wallet's name
+    public transient HashMap<String, ActorRef> knownNeighbors;
+    
+    // Holds references to neighbors this wallet 
+    // synchronizes itself to (the Wallet object);
+    // The key corresponds to the Wallet's name
+    public transient HashMap<String, ActorRef> localNeighbors;
+    
+    // Holds all Wallets from network participants 
+    // which synchronize their state (Wallet object)
+    // with us;
+    // The key corresponds to the Wallet's name
+    public transient HashMap<String, AbstractWallet> backedUpNeighbors;
+    
+    // The name of this wallet (does never change, no 
+    // duplicates in network assumed)
+    public final String name;
+    
+    // The amount this wallet currently holds
+    public int amount;
+    
+}
\ No newline at end of file
diff --git a/Interface/Wallet.java b/Interface/Wallet.java
new file mode 100644
index 0000000..c3e9a35
--- /dev/null
+++ b/Interface/Wallet.java
@@ -0,0 +1,55 @@
+import akka.actor.ActorRef;
+import akka.actor.UntypedActor;
+import akka.actor.ActorSystem;
+import akka.actor.Props;
+import akka.actor.Inbox;
+
+import java.io.Serializable;
+
+public class Wallet extends AbstractWallet {
+    
+    public static void main(String[] args) {
+        // Create the 'helloakka' actor system
+        final ActorSystem system = ActorSystem.create("FuCoin");
+
+        // Create the 'greeter' actor
+        final ActorRef greeter = system.actorOf(Props.create(Wallet.class), "wallet");
+
+        // Create the "actor-in-a-box"
+        final Inbox inbox = Inbox.create(system);
+    }
+    
+    public Wallet(String name)
+    {
+        super(name);
+    }
+
+    public void onReceive(Object message) {
+        // TODO implement
+        
+        /*
+        if (message instanceof ActionReceiveTransaction)
+        {
+            System.out.println("hello, " + ((ActionReceiveTransaction) message).amount;
+        }
+        else if (message instanceof ActionReceiveTransaction) {
+            // Send the current greeting back to the sender
+            getSender().tell(new ActionReceiveTransaction(0.01), getSelf());
+        }
+        else {
+            unhandled(message);
+        }
+        */
+        
+    }
+    
+    public String getAddress() {
+        // TODO implement
+        return "";
+    }
+    
+    public void leave() {
+        // TODO implement
+    }
+    
+}
\ No newline at end of file
-- 
GitLab