View Javadoc
1   /*
2    * Copyright (C) 2022-2023 Dipl.-Inform. Kai Hofmann. All rights reserved!
3    */
4   package de.powerstat.validation.values;
5   
6   
7   import java.util.ArrayList;
8   import java.util.List;
9   import java.util.Map;
10  import java.util.concurrent.ConcurrentHashMap;
11  
12  import de.powerstat.validation.interfaces.IValueObject;
13  
14  
15  /**
16   * Blood group AB0 rhesus system.
17   *
18   * @see <a href="https://de.wikipedia.org/wiki/Blutgruppe">Blutgruppe</a>
19   *
20   * Not DSGVO relevant.
21   */
22  public enum BloodGroup implements IValueObject
23   {
24    /**
25     * 0-.
26     */
27    ON(0),
28  
29    /**
30     * 0+.
31     */
32    OP(1),
33  
34    /**
35     * A-.
36     */
37    AN(2),
38  
39    /**
40     * A+.
41     */
42    AP(3),
43  
44    /**
45     * B-.
46     */
47    BN(4),
48  
49    /**
50     * B+.
51     */
52    BP(5),
53  
54    /**
55     * AB-.
56     */
57    ABN(6),
58  
59    /**
60     * AB+.
61     */
62    ABP(7);
63  
64  
65    /**
66     * Donate to other blood group.
67     */
68    private static final Map<BloodGroup, List<BloodGroup>> DONATE_TO = new ConcurrentHashMap<>();
69  
70    /**
71     * Receive from other blood group.
72     */
73    private static final Map<BloodGroup, List<BloodGroup>> RECEIVE_FROM = new ConcurrentHashMap<>();
74  
75    /**
76     * Action number.
77     */
78    private final int action;
79  
80  
81    static
82     {
83      final List<BloodGroup> onTo = new ArrayList<>();
84      onTo.add(ABP);
85      onTo.add(ABN);
86      onTo.add(AP);
87      onTo.add(AN);
88      onTo.add(BP);
89      onTo.add(BN);
90      onTo.add(OP);
91      onTo.add(ON);
92      BloodGroup.DONATE_TO.put(ON, onTo);
93  
94      final List<BloodGroup> opTo = new ArrayList<>();
95      opTo.add(ABP);
96      opTo.add(AP);
97      opTo.add(BP);
98      opTo.add(OP);
99      BloodGroup.DONATE_TO.put(OP, opTo);
100 
101     final List<BloodGroup> bnTo = new ArrayList<>();
102     bnTo.add(ABP);
103     bnTo.add(ABN);
104     bnTo.add(BP);
105     bnTo.add(BN);
106     BloodGroup.DONATE_TO.put(BN, bnTo);
107 
108     final List<BloodGroup> bpTo = new ArrayList<>();
109     bpTo.add(ABP);
110     bpTo.add(BP);
111     BloodGroup.DONATE_TO.put(BP, bpTo);
112 
113     final List<BloodGroup> anTo = new ArrayList<>();
114     anTo.add(ABP);
115     anTo.add(ABN);
116     anTo.add(AP);
117     anTo.add(AN);
118     BloodGroup.DONATE_TO.put(AN, anTo);
119 
120     final List<BloodGroup> apTo = new ArrayList<>();
121     apTo.add(ABP);
122     apTo.add(AP);
123     BloodGroup.DONATE_TO.put(AP, apTo);
124 
125     final List<BloodGroup> abnTo = new ArrayList<>();
126     abnTo.add(ABP);
127     abnTo.add(ABN);
128     BloodGroup.DONATE_TO.put(ABN, abnTo);
129 
130     final List<BloodGroup> abpTo = new ArrayList<>();
131     abpTo.add(ABP);
132     BloodGroup.DONATE_TO.put(ABP, abpTo);
133 
134     final List<BloodGroup> abpFrom = new ArrayList<>();
135     abpFrom.add(ON);
136     abpFrom.add(OP);
137     abpFrom.add(BN);
138     abpFrom.add(BP);
139     abpFrom.add(AN);
140     abpFrom.add(AP);
141     abpFrom.add(ABN);
142     abpFrom.add(ABP);
143     BloodGroup.RECEIVE_FROM.put(ABP, abpFrom);
144 
145     final List<BloodGroup> abnFrom = new ArrayList<>();
146     abnFrom.add(ON);
147     abnFrom.add(BN);
148     abnFrom.add(AN);
149     abnFrom.add(ABN);
150     BloodGroup.RECEIVE_FROM.put(ABN, abnFrom);
151 
152     final List<BloodGroup> apFrom = new ArrayList<>();
153     apFrom.add(ON);
154     apFrom.add(OP);
155     apFrom.add(AN);
156     apFrom.add(AP);
157     BloodGroup.RECEIVE_FROM.put(AP, apFrom);
158 
159     final List<BloodGroup> anFrom = new ArrayList<>();
160     anFrom.add(ON);
161     anFrom.add(AN);
162     BloodGroup.RECEIVE_FROM.put(AN, anFrom);
163 
164     final List<BloodGroup> bpFrom = new ArrayList<>();
165     bpFrom.add(ON);
166     bpFrom.add(OP);
167     bpFrom.add(BN);
168     bpFrom.add(BP);
169     BloodGroup.RECEIVE_FROM.put(BP, bpFrom);
170 
171     final List<BloodGroup> bnFrom = new ArrayList<>();
172     bnFrom.add(ON);
173     bnFrom.add(BN);
174     BloodGroup.RECEIVE_FROM.put(BN, bnFrom);
175 
176     final List<BloodGroup> opFrom = new ArrayList<>();
177     opFrom.add(ON);
178     opFrom.add(OP);
179     BloodGroup.RECEIVE_FROM.put(OP, opFrom);
180 
181     final List<BloodGroup> onFrom = new ArrayList<>();
182     onFrom.add(ON);
183     BloodGroup.RECEIVE_FROM.put(ON, onFrom);
184    }
185 
186 
187   /**
188    * Ordinal constructor.
189    *
190    * @param action Action number
191    */
192   BloodGroup(final int action)
193    {
194     this.action = action;
195    }
196 
197 
198   /**
199    * BloodGroup factory.
200    *
201    * @param value Enum name string
202    * @return BloodGroup enum
203    */
204   public static BloodGroup of(final String value)
205    {
206     return BloodGroup.valueOf(value);
207    }
208 
209 
210   /**
211    * Get action number.
212    *
213    * @return Action number
214    */
215   public int getAction()
216    {
217     return this.action;
218    }
219 
220 
221   /**
222    * Returns the value of this BloodGroup as a string.
223    *
224    * @return The text value represented by this object after conversion to type string.
225    */
226   @Override
227   public String stringValue()
228    {
229     return this.name();
230    }
231 
232 
233   /**
234    * Could donate blood to other blood group.
235    *
236    * @param other Other blood group to donate to
237    * @return true: possible; false: not possible
238    */
239   public boolean couldDonateTo(final BloodGroup other)
240    {
241     return BloodGroup.DONATE_TO.get(this).contains(other);
242    }
243 
244 
245   /**
246    * Could receive blood from other blood group.
247    *
248    * @param other Other blood group to receive from
249    * @return true: possible; false: not possible
250    */
251   public boolean couldReceiveFrom(final BloodGroup other)
252    {
253     return BloodGroup.RECEIVE_FROM.get(this).contains(other);
254    }
255 
256  }