WIP
[demos/kafka/demos-kafka-payment-system-transfer] / src / main / java / de / juplo / kafka / payment / transfer / domain / Transfer.java
index 5556a1b..86e5c03 100644 (file)
@@ -5,19 +5,31 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.LinkedList;
+import java.util.List;
+
+import static de.juplo.kafka.payment.transfer.domain.Transfer.State.*;
+
 
 @Data
 @Builder
-@EqualsAndHashCode(exclude = "state")
+@EqualsAndHashCode(exclude = { "state", "messages" })
 public class Transfer
 {
   public enum State
   {
-    SENT,
-    FAILED,
-    PENDING,
-    APPROVED,
-    REJECTED
+    CREATED(false),
+    INVALID(false),
+    CHECKED(false),
+    APPROVED(true),
+    REJECTED(true);
+
+    public final boolean foreign;
+
+    State(boolean foreign)
+    {
+      this.foreign = foreign;
+    }
   }
 
   private final long id;
@@ -26,4 +38,40 @@ public class Transfer
   private final int amount;
 
   private State state;
+
+  private final List<String> messages = new LinkedList<>();
+
+
+  public Transfer setState(State state)
+  {
+    if (state == null)
+      throw new IllegalArgumentException("State must not be null!");
+
+    switch (state)
+    {
+      case CREATED:
+        if (this.state != null)
+          throw new IllegalArgumentException("Illegal state-change " + this.state + " -> CREATED");
+        break;
+
+      case CHECKED:
+      case INVALID:
+        if (this.state != CREATED)
+          throw new IllegalArgumentException("Illegal state-change " + this.state + " -> " + state);
+        break;
+
+      default:
+          throw new IllegalArgumentException("State-change not yet considered:" + this.state + " -> " + state);
+
+    }
+
+    this.state = state;
+    return this;
+  }
+
+  public Transfer addMessage(String message)
+  {
+    messages.add(message);
+    return this;
+  }
 }