1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package ca.uhn.hl7v2.validation.builder.support;
28
29 import java.util.ArrayList;
30 import java.util.HashSet;
31 import java.util.List;
32 import java.util.Set;
33
34 import ca.uhn.hl7v2.HL7Exception;
35 import ca.uhn.hl7v2.model.Group;
36 import ca.uhn.hl7v2.model.Message;
37 import ca.uhn.hl7v2.model.Structure;
38 import ca.uhn.hl7v2.validation.MessageRule;
39 import ca.uhn.hl7v2.validation.ValidationException;
40 import ca.uhn.hl7v2.validation.impl.AbstractMessageRule;
41
42
43
44
45
46 public class ChoiceElementsRespectedRule extends AbstractMessageRule {
47
48
49 public static final MessageRule CHOICE_ELEMENTS_RESPECTED = new ChoiceElementsRespectedRule();
50
51 public ValidationException[] apply(Message theValue) {
52 List<ValidationException> exceptions = new ArrayList<>();
53 apply(theValue, exceptions);
54 return exceptions.toArray(new ValidationException[0]);
55 }
56
57 private void apply(Group theStructure, List<ValidationException> theExceptions) {
58 Set<String> choicesWithContent = null;
59
60 for (String nextName : theStructure.getNames()) {
61 try {
62 boolean nextIsChoiceElement = theStructure.isChoiceElement(nextName);
63 for (Structure nextStruct : theStructure.getAll(nextName)) {
64
65 if (nextIsChoiceElement && !nextStruct.isEmpty()) {
66 if (choicesWithContent == null) {
67 choicesWithContent = new HashSet<>();
68 }
69 choicesWithContent.add(nextName);
70 }
71
72 if (nextStruct instanceof Group) {
73 apply((Group) nextStruct, theExceptions);
74 }
75 }
76 } catch (HL7Exception e) {
77 throw new Error("Failed to find " + nextName + " in structure. This is probably a HAPI bug.");
78 }
79 }
80
81 if (choicesWithContent != null && choicesWithContent.size() > 1) {
82 theExceptions.add(new ValidationException("Structure '" + theStructure.getName() + "' must have content only in one of the following choices: " + choicesWithContent.toString()));
83 }
84
85 }
86
87 }