View Javadoc
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 }