001 package ca.uhn.hl7v2.model;
002
003 import java.io.Serializable;
004 import java.util.ArrayList;
005 import java.util.List;
006
007 /**
008 * A set of "extra" components (sub-components) that are not a standard part
009 * of a field (component) but have been added at runtime. The purpose is to allow
010 * processing of locally-defined extensions to datatypes without the need for a
011 * custom message definition.
012 * Extra components are not treated uniformly with standard components (e.g.
013 * they are not accessible through methods like Primitive.getValue() and
014 * Composite.getComponent()). To do so would blur the distinction between
015 * primitive and composite types (i.e. leaf and non-leaf nodes), which seems
016 * nice and polymorphic for a moment but actually isn't helpful.
017 * Furthermore, the auto-generated classes do not define accessors to extra
018 * components, because they are meant to encourage and enforce use of the standard
019 * message structure -- stepping outside the standard structure must be
020 * deliberate.
021 * Note that a uniformity of access to standard and extra components is provided
022 * by Terser.
023 * @author Bryan Tripp
024 */
025 public class ExtraComponents implements Serializable {
026
027
028 private static final long serialVersionUID = -2614683870975956395L;
029
030 private List<Varies> comps;
031 private Message message;
032
033 /** Creates a new instance of ExtraComponents */
034 public ExtraComponents(Message message) {
035 this.comps = new ArrayList<Varies>();
036 this.message = message;
037 }
038
039 /** Returns the number of existing extra components */
040 public int numComponents() {
041 return comps.size();
042 }
043
044 /** Returns the number of existing reps of a given extra component */
045 /*public int numReps(int comp) {
046 return ((ArrayList) this.comps.get(comp)).size();
047 }*/
048
049 /**
050 * Returns the component at the given location, creating it
051 * and all preceeding components if necessary.
052 * @param comp the extra component number starting at 0 (i.e. 0 is the first
053 * extra component)
054 */
055 public Varies getComponent(int comp) {
056 ensureComponentAndPredecessorsExist(comp);
057 return this.comps.get(comp);
058 }
059
060 /**
061 * Checks that the component at the given location exists, and that
062 * all preceding components exist, creating any missing ones.
063 */
064 private void ensureComponentAndPredecessorsExist(int comp) {
065 for (int i = this.comps.size(); i <= comp; i++) {
066 this.comps.add(new Varies(message));
067 }
068 /*ArrayList reps = (ArrayList) this.comps.get(comp);
069 for (int j = reps.size(); j <= rep; j++) {
070 addRep(comp, j);
071 }*/
072 }
073
074
075 /**
076 * Clears all extra components
077 */
078 void clear() {
079 comps.clear();
080 }
081
082 /**
083 * {@inheritDoc}
084 */
085 @Override
086 public String toString() {
087 return "ExtraComponents" + comps;
088 }
089
090
091 /*private void addComp(int comp) {
092 }*/
093
094 /*private void addRep(int comp, int rep) {
095 ArrayList l = (ArrayList) this.comps.get(comp);
096 l.add(rep, new Varies());
097 }*/
098 }