1 package ca.uhn.hl7v2.model;
2
3 import java.io.Serializable;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 import ca.uhn.hl7v2.HL7Exception;
8
9 /**
10 * A set of "extra" components (sub-components) that are not a standard part
11 * of a field (component) but have been added at runtime. The purpose is to allow
12 * processing of locally-defined extensions to datatypes without the need for a
13 * custom message definition.
14 * Extra components are not treated uniformly with standard components (e.g.
15 * they are not accessible through methods like Primitive.getValue() and
16 * Composite.getComponent()). To do so would blur the distinction between
17 * primitive and composite types (i.e. leaf and non-leaf nodes), which seems
18 * nice and polymorphic for a moment but actually isn't helpful.
19 * Furthermore, the auto-generated classes do not define accessors to extra
20 * components, because they are meant to encourage and enforce use of the standard
21 * message structure -- stepping outside the standard structure must be
22 * deliberate.
23 * Note that a uniformity of access to standard and extra components is provided
24 * by Terser.
25 * @author Bryan Tripp
26 */
27 public class ExtraComponents implements Serializable {
28
29
30 private static final long serialVersionUID = -2614683870975956395L;
31
32 private final List<Variable> comps;
33 private final Message message;
34
35 public ExtraComponents(Message message) {
36 this.comps = new ArrayList<>();
37 this.message = message;
38 }
39
40 /**
41 * Returns the number of existing extra components
42 * @return number of existing extra components
43 */
44 public int numComponents() {
45 return comps.size();
46 }
47
48 /**
49 * Returns true if extra components are empty
50 * @return true if extra components are empty, false otherwise
51 * @throws HL7Exception
52 */
53 public boolean isEmpty() throws HL7Exception {
54 for (Variable varies : comps) {
55 if (!varies.isEmpty()) return false;
56 }
57 return true;
58 }
59
60 public Message getMessage() {
61 return message;
62 }
63
64 /**
65 * Returns the component at the given location, creating it
66 * and all preceeding components if necessary.
67 *
68 * @param comp the extra component number starting at 0 (i.e. 0 is the first
69 * extra component)
70 * @return component at the given index
71 */
72 public Variable getComponent(int comp) {
73 ensureComponentAndPredecessorsExist(comp);
74 return this.comps.get(comp);
75 }
76
77 /**
78 * Checks that the component at the given location exists, and that
79 * all preceding components exist, creating any missing ones.
80 */
81 private void ensureComponentAndPredecessorsExist(int comp) {
82 for (int i = this.comps.size(); i <= comp; i++) {
83 this.comps.add(new Varies(message));
84 }
85 }
86
87
88 /**
89 * Clears all extra components
90 */
91 void clear() {
92 comps.clear();
93 }
94
95 /**
96 * {@inheritDoc}
97 */
98 @Override
99 public String toString() {
100 return "ExtraComponents" + comps;
101 }
102
103
104
105
106 }