WIP
[demos/kafka/demos-kafka-payment-system-transfer] / src / main / java / de / juplo / kafka / payment / transfer / domain / Transfer.java
1 package de.juplo.kafka.payment.transfer.domain;
2
3
4 import lombok.Builder;
5 import lombok.Data;
6 import lombok.EqualsAndHashCode;
7
8 import java.util.LinkedList;
9 import java.util.List;
10
11 import static de.juplo.kafka.payment.transfer.domain.Transfer.State.*;
12
13
14 @Data
15 @Builder
16 @EqualsAndHashCode(exclude = { "state", "messages" })
17 public class Transfer
18 {
19   public enum State
20   {
21     CREATED(false),
22     INVALID(false),
23     CHECKED(false),
24     APPROVED(true),
25     REJECTED(true);
26
27     public final boolean foreign;
28
29     State(boolean foreign)
30     {
31       this.foreign = foreign;
32     }
33   }
34
35   private final long id;
36   private final long payer;
37   private final long payee;
38   private final int amount;
39
40   private State state;
41
42   private final List<String> messages = new LinkedList<>();
43
44
45   public Transfer setState(State state)
46   {
47     if (state == null)
48       throw new IllegalArgumentException("State must not be null!");
49
50     switch (state)
51     {
52       case CREATED:
53         if (this.state != null)
54           throw new IllegalArgumentException("Illegal state-change " + this.state + " -> CREATED");
55         break;
56
57       case CHECKED:
58       case INVALID:
59         if (this.state != CREATED)
60           throw new IllegalArgumentException("Illegal state-change " + this.state + " -> " + state);
61         break;
62
63       default:
64           throw new IllegalArgumentException("State-change not yet considered:" + this.state + " -> " + state);
65
66     }
67
68     this.state = state;
69     return this;
70   }
71
72   public Transfer addMessage(String message)
73   {
74     messages.add(message);
75     return this;
76   }
77 }