001    package org.vmdb.hl7;
002    
003    import java.util.*;
004    
005    /**
006     * <p><Title:> Query By Parameters (QBP) Message. </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 is a quickly assembled message type used to demonstrate
011     * extensibility of the general library model.  A more production ready
012     * solution would have been to develope a full, general purpose QBP/RSP
013     * pair of messages and extend them to the specific case of the QBP-Z01
014     * defined here, but the point was to show a quick and easy extension example.</p>
015     * @author Michael K. Martin
016     * @version 1.0
017     */
018    
019    public class QBPMessage extends HL7Message {
020       private String sNm = "QBP_Z01";
021       private String sRl = "MSH QPD PID OBX RCP[DSC]";
022       private static final String MESSAGE_TYPE = "QBP";
023       private static final String EVENT_TYPE = "Z01";
024    
025       /**
026        * Construct an empty QBP Message with type and event set.  This object
027        * is ready to either build via a series of set and add calls, or to read in
028        * an HL7 or XML (future) message.
029        */
030       public QBPMessage() {
031          super();
032          setName( sNm );
033          setRule( sRl );
034          setMessageName( MESSAGE_TYPE, EVENT_TYPE );
035          initialize();
036       }
037    
038       /**
039        * This is a brute-force intialization routine to create a populated
040        * message.  This is faster and easier than implementing the full
041        * getXXXToWrite() logic used in "production" message classes.
042        */
043       private void initialize() {
044          if( vSegments == null )
045             vSegments = new Vector();
046          QPDSegment qpd = new QPDSegment();
047          qpd.initialize();
048          vSegments.add( qpd );
049          PIDSegment pid = new PIDSegment();
050          pid.initialize();
051          vSegments.add( pid );
052          OBXSegment obx = new OBXSegment();
053          obx.initialize();
054          vSegments.add( obx );
055          RCPSegment rcp = new RCPSegment();
056          rcp.initialize();
057          vSegments.add( rcp );
058          CEElement ceQName = new CEElement( "Z01", "Get Prevalence", "VMDB" );
059          QPDSegment sQPD = getQPD();
060          sQPD.setQueryName( ceQName );
061          CEElement ceModality = new CEElement( "R", "Real Time", "HL7" );
062          RCPSegment sRCP = getRCP();
063          sRCP.setModality( ceModality );
064          sRCP.setPriority( "I" );
065       }
066    
067    
068       /**
069        * Get the Input Parameter Field Description and Commentary
070        * segment from this message
071        * @return QPDSegment object
072        */
073       public QPDSegment getQPD() {
074          return (QPDSegment)findSegment( "QPD" );
075       }
076    
077       /**
078        * Get the PID segment from this message.
079        * @return A reference to the PIDSegment object located at the appropriate place.
080        */
081       public PIDSegment getPID() {
082          return (PIDSegment)findSegment( "PID" );
083       }
084    
085       /**
086        * Get the Observation segment (containing results) from this message
087        * @return OBXSegment object
088        */
089       public OBXSegment getOBX() {
090          return (OBXSegment)findSegment( "OBX" );
091       }
092    
093    /**
094     * Get the Response Control Parameter segment from this message
095     * @return RCPSegment object
096     */
097       public RCPSegment getRCP() {
098          return (RCPSegment)findSegment( "RCP" );
099       }
100    
101       // The accessors and mutators are based on VMDB usage of the QBP Message
102       // and are designed to provide easy access to message details
103    
104       // MSH Field accessors inherited from HL7Message would logically
105       // appear here.
106    
107       /**
108        * Set the Medical record number.<br><br>
109        * Medical record is defined in this logic as the identifier assigned by the
110        * sending facility.  To work correctly, the sending facility identifier must
111        * be set <strong>before</strong> actions involving MRN.
112        * @param sMRN String with facility's MRN
113        */
114       public void setMedicalRecordNumber( String sMRN ) {
115          MSHSegment msh = getMSH();
116          String sThisFacility = msh.getSendingFacilityName();
117          PIDSegment pid = getPID();
118          boolean bFound = false;
119          // First try to update existing MRN
120          Iterator i = pid.listPatientIds();
121          while( i != null && i.hasNext() ) {
122             CXElement cxe = (CXElement)i.next();
123             if( cxe == null ) continue;
124             // Check assigner logic
125             String sAssigner = cxe.getAssigningAuthorityName();
126             if( sAssigner != null && sAssigner.equals( sThisFacility ) ) {
127                cxe.setIdentifier( sMRN );
128                bFound = true;
129                break;
130             }
131          }
132          // Otherwise add a new identifier
133          if( !bFound ) {
134             pid.addPatientId( sMRN, sThisFacility );
135          }
136       }
137    
138       /**
139        * Get the Medical record number.<br><br>
140        * Medical record is defined in this logic as the identifier assigned by the
141        * sending facility.  To work correctly, the sending facility identifier must
142        * be set <strong><i>before</i></strong> actions involving MRN.
143        * @return String with facility's MRN
144        */
145       public String getMedicalRecordNumber() {
146          MSHSegment msh = getMSH();
147          String sThisFacility = msh.getSendingFacilityName();
148          PIDSegment pid = getPID();
149          // First try to update existing MRN
150          Iterator i = pid.listPatientIds();
151          while( i.hasNext() ) {
152             CXElement cxe = (CXElement)i.next();
153             // Check assigner logic
154             if( cxe.getAssigningAuthorityName().equals( sThisFacility ) ) {
155                return cxe.getIdentifier();
156             }
157          }
158          return "";
159       }
160    
161       /**
162        * Set the species as a predefined CE Element.<br><br>
163        * Often uses one of the set of predefined constants.<br>
164        * Note: If populated with a constant, subsequent calls to getSpecies() will return a
165        * reference to the constant (final static object) and cannot be modified
166        * through calls to the CEElement's methods.  But why would you want to?
167        * @param ceSpecies CEElement populated with the coded species
168        */
169       public void setSpecies( CEElement ceSpecies ) {
170          PIDSegment pid = getPID();
171          pid.setSpecies( ceSpecies );
172       }
173    
174       /**
175        * Set the species as the individual components of a CE Element
176        * @param sSpeciesCode String with the code for species
177        * @param sSpeciesText String with the species spelled out
178        * @param sCodeSystem String, usually "SCT," with the type of code
179        */
180       public void setSpecies( String sSpeciesCode,
181                               String sSpeciesText,
182                               String sCodeSystem ) {
183          PIDSegment pid = getPID();
184          pid.setSpecies( sSpeciesCode, sSpeciesText, sCodeSystem );
185       }
186    
187       /**
188        * Get the species as a predefined CE Element.<br><br>
189        * Often uses one of the set of predefined constants.<br>
190        * Note: If setSpecies was called with a constant, subsequent calls to getSpecies() will return a
191        * reference to the constant (final static object) and cannot be modified
192        * through calls to the CEElement's methods.  But why would you want to?
193        * @return A reference to the CEElement populated with species
194        */
195       public CEElement getSpecies() {
196          PIDSegment pid = getPID();
197          return pid.getSpecies();
198       }
199    
200       /**
201        * Get the species text.
202        * @return String species spelled out
203        */
204       public String getSpeciesText() {
205          PIDSegment pid = getPID();
206          return pid.getSpeciesText();
207       }
208    
209       /**
210        * Set the breed as a predefined CE Element.<br><br>
211        * Often uses one of the set of predefined constants.<br>
212        * Note: If populated with a constant, subsequent calls to getBreed() will return a
213        * reference to the constant (final static object) and cannot be modified
214        * through calls to the CEElement's methods.  But why would you want to?
215        * @param ceBreed CEElement populated with breed
216        */
217       public void setBreed( CEElement ceBreed ) {
218          PIDSegment pid = getPID();
219          pid.setBreed( ceBreed );
220       }
221    
222       /**
223        * Set the breed as the individual components of a CE Element.
224        * @param sBreedCode String snomed code for breed
225        * @param sBreedText String breed spelled out
226        * @param sCodeSystem String usually SCT with type of code
227        */
228       public void setBreed( String sBreedCode,
229                             String sBreedText,
230                             String sCodeSystem ) {
231          PIDSegment pid = getPID();
232          pid.setBreed( sBreedCode, sBreedText, sCodeSystem );
233       }
234    
235       /**
236        * Get the breed as a predefined CE Element.<br><br>
237        * Often uses one of the set of predefined constants.<br>
238        * Note: If populated with a constant, subsequent calls to getBreed() will return a
239        * reference to the constant (final static object) and cannot be modified
240        * through calls to the CEElement's methods.  But why would you want to?
241        * @return A reference to the CEElement populated with breed
242        */
243       public CEElement getBreed() {
244          PIDSegment pid = getPID();
245          return pid.getBreed();
246       }
247    
248       /**
249        * Get the breed text.
250        * @return String breed spelled out
251        */
252       public String getBreedText() {
253          PIDSegment pid = getPID();
254          return pid.getBreedText();
255       }
256    
257       /**
258        * Set the date of birth as ISO format data string YYYYMMDD
259        * @param sDOB String with date of birth
260        */
261       public void setDateOfBirth( String sBDate ) {
262          PIDSegment pid = getPID();
263          pid.setDateOfBirth( sBDate );
264       }
265    
266       /**
267        * Set the date of birth as ISO format data string YYYYMMDD
268        * @param sDOB String with date of birth
269        */
270       public void setDateOfBirth( TSElement tsBDate ) {
271          PIDSegment pid = getPID();
272          pid.setDateOfBirth( tsBDate );
273       }
274    
275       /**
276        * Get the date of birth.
277        * @return String with date of birth as YYYYMMDD
278        */
279       public String getDateOfBirth() {
280          PIDSegment pid = getPID();
281          return pid.getDateOfBirth();
282       }
283    
284       /**
285        * Set the gender.
286        * @param sSex String with gender as M, C, T, F, S, O, U, H, or X
287        */
288       public void setSex( String sSex ) {
289          PIDSegment pid = getPID();
290          pid.setSex( sSex );
291       }
292    
293       /**
294        * Get the gender.
295        * @return String with gender code
296        */
297       public String getSex() {
298          PIDSegment pid = getPID();
299          return pid.getSex();
300       }
301    
302       /**
303        * Set the postal code of <strong>animal's</strong> residence.
304        * @param sPostalCode String with Zipcode or other postal code
305        */
306       public void setPatientZipcode( String sZipcode ) {
307          PIDSegment pid = getPID();
308          pid.setPatientZipcode( sZipcode );
309       }
310    
311       /**
312        * Get the postal code.
313        * @return String with Zipcode or other postal code
314        */
315       public String getPatientZipcode() {
316          PIDSegment pid = getPID();
317          return pid.getPatientZipcode();
318       }
319    
320       /**
321        * Set the Diagnosis for which we want the prevalence as a predefined CE Element.<br><br>
322        * Often uses one of the set of predefined constants
323        * @param ceDiagnosis CEElement populated with the coded Diagnosis
324        */
325       public void setDiagnosis( CEElement ceDiagnosis ) {
326          OBXSegment obx = getOBX();
327          obx.setObservationIdentifier( Loinc.DIAGNOSIS_NOM );
328          try {
329             obx.setObservationValueType( "CE" );
330             obx.setObservationValue( ceDiagnosis );
331          }
332          catch( MalformedFieldException mfe ) {
333             mfe.printStackTrace();
334          }
335       }
336    
337       /**
338        * Set the Diagnosis as a predefined CE Element.<br><br>
339        * Often uses one of the set of predefined constants
340        * @param ceDiagnosis CEElement populated with the coded Diagnosis
341        */
342       public CEElement getDiagnosis() {
343          OBXSegment obx = getOBX();
344          CEElement ce = (CEElement)obx.getObservationValue();
345          return ce;
346       }
347    
348    } // end class QBPMessage
349