001    package org.vmdb.hl7;
002    
003    import java.util.*;
004    
005    /**
006     * <p><Title:> Repeat Element. </p>
007     * <p>Description: HL7 Network Connectivity For VMDB.  </p>
008     * <p>Copyright: Copyright (c) 2002-2003. </p>
009     * <p>Company: Veterinary Medical Database (VMDB). </p>
010     * <p>This class is an invisible element who's sole purpose is to provide a container
011     * for zero or more elements in a repeat.  It handles the details of outputting the
012     * correct delimiters in HL7 and XML tags in XML representation.
013     * @author Michael K. Martin
014     * @version 1.0
015     */
016    
017    public class RepeatElement extends HL7Element {
018       protected Vector vElements;
019    
020       private String sNm = "XX";
021       private String sRl = "";
022    
023       /**
024        * Construct a Composite ID Element using the default name and type constants.<br><br>
025        * The only level repeats occur is Field (is this correct?) so this always sets
026        * level to FIELD.  The name and type are dependent on the contained field(s) which
027        * are by definition all the same type.
028        */
029       public RepeatElement() {
030          super( FIELD );
031          setName( sNm );
032          setRule( sRl );
033          setType( "XX" );
034       }
035    
036       /**
037        * Get an Iterator over all of the repeats.
038        * @return Iterator over HL7Element derived objects or null if no values have been assigned.
039        */
040       public Iterator iterator() {
041          if( vElements == null ) return null;
042          else return vElements.iterator();
043       }
044    
045       /**
046        * Count the number of elements in the repeat.
047        * @return integer number of elements.
048        */
049       public int size() {
050          if( vElements == null )
051             return 0;
052          else
053             return vElements.size();
054       }
055    
056    
057       /**
058        * Return this element to its empty state.  In this case removing all
059        * repeating fields if any.
060        */
061       public void clear() {
062          if( vElements != null )
063             vElements.clear();
064       }
065    
066       /**
067        * Add an element to the end of the repeat.<br><br>
068        * Sets the name and type of the added element based on the name and type
069        * assigned to this repeat via its inherited setName() and setType()
070        * methods.
071        * @param hlE HL7Element derived Element object to add.
072        */
073       public void addElement( HL7Element hlE ) {
074          if( vElements == null ) {
075             vElements = new Vector();
076          }
077          hlE.setName( getName() );
078          if( hlE instanceof SimpleElement )
079             hlE.setType( getType() );
080          vElements.add( hlE );
081       }
082    
083       /**
084        * Get the first element of the repeat.<br><br>
085        * This is a convenience method useful because we sometimes just want one value
086        * and don't care if we ignore later repeating values.
087        * @return HL7Element derived object.
088        */
089       public HL7Element firstElement() {
090          if( vElements != null && vElements.elementAt(0) instanceof HL7Element )
091             return (HL7Element)vElements.elementAt(0);
092          else
093             return null;
094       }
095    
096       /**
097        * Get the value of the first element of the repeat.<br><br>
098        * This is a convenience method useful because we sometimes just want one value
099        * and don't care if we ignore later repeating values.
100        * @return HL7Element derived object.
101        */
102       public String getValue() {
103          if( vElements != null && vElements.elementAt(0) instanceof HL7Element )
104             return ((HL7Element)vElements.elementAt(0)).getValue();
105          else
106             return "";
107       }
108    
109       /**
110        * Extend the inherited toString() method to properly delimit repeating fields.
111        * @return String formatted as delimited HL7 for this field.
112        */
113       public String toString() {
114          int size = size();
115          int iField = 0;
116          if( size == 0 ) return "";
117          StringBuffer sb = new StringBuffer();
118          Iterator i = iterator();
119          while( i.hasNext() ) {
120             HL7Element eNext = (HL7Element)i.next();
121             if( iField++ > 0 && !eNext.empty() ) {
122                sb.append( getSeparator( REP_SEP ) );
123             }
124             sb.append( eNext.toString() );
125          }
126          return sb.toString();
127       }
128    
129       /**
130        * Extend the inherited toHL7String() method to properly delimit repeating fields.
131        * @return String formatted as delimited HL7 for this field.
132        */
133       public String toHL7String() {
134          int size = size();
135          int iField = 0;
136          if( size == 0 ) return "";
137          StringBuffer sb = new StringBuffer();
138          Iterator i = iterator();
139          while( i.hasNext() ) {
140             HL7Element eNext = (HL7Element)i.next();
141             if( iField++ > 0 && !eNext.empty() ) {
142                sb.append( getSeparator( REP_SEP ) );
143             }
144             sb.append( eNext.toHL7String() );
145          }
146          return sb.toString();
147       }
148    
149       /**
150        * Extend the inherited toXML() method to properly format repeating fields.
151        * @param iDepth int to determine depth to indent XML for readability.
152        * @return String formatted XML
153        */
154       public String toXML( int iDepth ) {
155          if( size() == 0 ) return "";
156          Iterator i = iterator();
157          StringBuffer sb = new StringBuffer();
158          while( i.hasNext() ) {
159             HL7Element eNext = (HL7Element)i.next();
160             sb.append( eNext.toXML( iDepth ) );
161          }
162          return sb.toString();
163       }
164    
165    }// End class RepeatElement
166