001    package org.vmdb.hl7;
002    
003    import java.util.*;
004    
005    /**
006     * <p><Title:> PATIENT_RESULT Loop. </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>The XML representation of HL7 2.x introduces the concepts of groups and lists
011     * that, while present in the construction rules of delimited HL7, are not explicitly
012     * named or labelled in the messages themselves.  This class follows the XML
013     * version with explicitly constructed groups and lists
014     * which we've combined under the general term (borrowed from X12) of "loop."</p>
015     * <p>Most of the repetion and grouping facilitated by this "loop" logic is not
016     * used in the VMDB version of the ORU message but is maintained to retain full
017     * standard compliance and to allow extending this model without fear of losing
018     * interoperability.</p>
019     * <p>Loop and Segment Nesting:  The outline below shows how the loops and minimum
020     * required segments nest. {OBX} indicates that any number of OBX segments may
021     * appear at this location.</p>
022     *
023    <pre>
024    MSH
025    <b>PATIENT_RESULT</b>
026        PATIENT
027          PID
028          PATIENT_VISIT
029            PV1
030        ORDER_OBSERVATION
031         [ORC]
032          OBR
033            OBSERVATION
034              OBX
035    </pre>
036     * @author Michael K. Martin
037     * @version 1.0
038     */
039    
040    public class PATIENT_RESULTLoop extends HL7Loop {
041       private String sNm = "PATIENT_RESULT";
042       private String sRl = "PATIENT ORDER_OBSERVATION";
043    
044       public PATIENT_RESULTLoop() {
045          super();
046          setName( sNm );
047          setRule( sRl );
048       }
049    
050       /**
051        * Get the PATIENTLoop loop that should be nested within this loop.  If
052        * it does not exist, take the necessary steps to create it in the appropriate
053        * nested loop structure.
054        * @return PATIENTLoop object located at the appropriate place in the loop.
055        */
056       public PATIENTLoop getPATIENT() {
057          PATIENTLoop loop = null;
058          if( vSegments == null ) vSegments = new Vector();
059          for( Iterator i = vSegments.iterator(); i.hasNext(); ) {
060             HL7Object o = (HL7Object)i.next();
061             if( o.getName().equals( "PATIENT" ) ) {
062                loop = (PATIENTLoop)o;
063                break;
064             }
065          }
066          if( loop == null ) {
067             loop = new PATIENTLoop();
068             vSegments.add(0,loop);
069          }
070          return loop;
071       }
072    
073       /**
074        * Get the ORDER_OBSERVATIONLoop loop that should be nested within this loop.  If
075        * it does not exist, take the necessary steps to create it in the appropriate
076        * location.<br><br>
077        * Note: The semantics here only work correctly for segments that exist singly
078        * in a message.  We break with generic HL7 here in that only under VMDB are
079        * we restricted to a single observation request per message.  If we drop this limitation
080        * we will need to create more complex (addORDER_OBSERVATION) semantics.
081        * @return ORDER_OBSERVATIONLoop object located at the appropriate place in the loop.
082        */
083       public ORDER_OBSERVATIONLoop getORDER_OBSERVATION() {
084          ORDER_OBSERVATIONLoop loop = null;
085          if( vSegments == null ) vSegments = new Vector();
086          for( Iterator i = vSegments.iterator(); i.hasNext(); ) {
087             HL7Object o = (HL7Object)i.next();
088             if( o.getName().equals( "ORDER_OBSERVATION" ) ) {
089                loop = (ORDER_OBSERVATIONLoop)o;
090                break;
091             }
092          }
093          if( loop == null ) {
094             loop = new ORDER_OBSERVATIONLoop();
095             // locate at end
096             vSegments.add(loop);
097          }
098          return loop;
099       }
100    
101       /**
102        * Get the ORDER_OBSERVATIONLoop loop that should be nested within this loop.  If
103        * it does not exist, take the necessary steps to create it in the appropriate
104        * location.<br><br>
105        * Note: This is something of a nonsense method since we've already specified
106        * that we will have only one ORDER_OBSERVATION loop per message we shouldn't
107        * need to search for a specific OrderControl value.
108        * @return ORDER_OBSERVATIONLoop object located at the appropriate place in the loop.
109        */
110       public ORDER_OBSERVATIONLoop getORDER_OBSERVATION( String sOrderControl ) {
111          ORDER_OBSERVATIONLoop loop = null;
112          if( vSegments == null ) vSegments = new Vector();
113          for( Iterator i = vSegments.iterator(); i.hasNext(); ) {
114             HL7Object o = (HL7Object)i.next();
115             if( o.getName().equals( "ORDER_OBSERVATION" ) ) {
116                loop = (ORDER_OBSERVATIONLoop)o;
117                ORCSegment orc = loop.getORC();
118                if( orc != null ) {
119                   String sOC = orc.getOrderControl();
120                   // If there was no order control or it matches return this group
121                   if( sOC.length() == 0 || sOC.equals( sOrderControl ) )
122                      break;
123                }
124                loop = null;
125             }
126          }
127          if( loop == null ) {
128             loop = new ORDER_OBSERVATIONLoop();
129             ORCSegment orc = loop.getORC();
130             orc.setOrderControl( sOrderControl );
131             vSegments.add(0,loop);
132          }
133          return loop;
134       }
135    
136    }// End class PATIENT_RESULTLoop
137