001 package org.vmdb.hl7;
002
003 import java.util.*;
004
005 /**
006 * <p><Title:> Query By Pattern Response (RSP) 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 RSPMessage extends HL7Message {
020 private String sNm = "RSP_Z01";
021 private String sRl = "MSH MSA[ERR]QAK QPD OBX[DSC]";
022 private static final String MESSAGE_TYPE = "RSP";
023 private static final String EVENT_TYPE = "Z01";
024
025 /**
026 * Construct an empty RSP 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 RSPMessage() {
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 * getXXX() logic used in "production" message classes. Note
042 * that the getXXX() method implementation could be extended
043 * without changing the interface.
044 */
045 private void initialize() {
046 if( vSegments == null )
047 vSegments = new Vector();
048 MSASegment msa = new MSASegment();
049 msa.initialize();
050 vSegments.add( msa );
051 QAKSegment qak = new QAKSegment();
052 qak.initialize();
053 vSegments.add( qak );
054 QPDSegment qpd = new QPDSegment();
055 qpd.initialize();
056 vSegments.add( qpd );
057 OBXSegment obx = new OBXSegment();
058 obx.initialize();
059 vSegments.add( obx );
060 CEElement ceQName = new CEElement( "Z01", "Get Prevalence", "VMDB" );
061 QPDSegment sQPD = getQPD();
062 sQPD.setQueryName( ceQName );
063 QAKSegment sQAK = getQAK();
064 sQAK.setQueryName( ceQName );
065 }
066
067 /**
068 * Get the Message Acknowledgment segment from this message
069 * @return MSASegment object
070 */
071 public MSASegment getMSA() {
072 return (MSASegment)findSegment( "MSA" );
073 }
074
075 /**
076 * Get the Error segment from this message
077 * @return ErrSegment object
078 */
079 public ERRSegment getERR() {
080 ERRSegment sErr = (ERRSegment)findSegment( "ERR" );
081 if( sErr == null ) {
082 sErr = new ERRSegment();
083 sErr.initialize();
084 vSegments.insertElementAt(sErr, 2);
085 }
086 return sErr;
087 }
088
089 /**
090 * Get the Query Acknowledgment segment from this message
091 * @return QAKSegment object
092 */
093 public QAKSegment getQAK() {
094 return (QAKSegment)findSegment( "QAK" );
095 }
096
097 /**
098 * Get the Input Parameter Field Description and Commentary
099 * segment from this message
100 * @return QPDSegment object
101 */
102 public QPDSegment getQPD() {
103 return (QPDSegment)findSegment( "QPD" );
104 }
105
106 /**
107 * Get the Observation segment (containing results) from this message
108 * @return OBXSegment object
109 */
110 public OBXSegment getOBX() {
111 return (OBXSegment)findSegment( "OBX" );
112 }
113
114 // The accessors and mutators are based on VMDB usage of the RSP Message
115 // and are designed to provide easy access to message details
116
117 /**
118 * Set the message Acknowledgment Code.
119 * @param sMessageId String with unique identifier
120 */
121 public void setAcknowledgmentCode( String sAcknowledgmentCode ) {
122 MSASegment msa = getMSA();
123 msa.setAcknowledgmentCode( sAcknowledgmentCode );
124 }
125
126 /**
127 * Get the message Acknowledgment Code.
128 * @return String with unique identifier
129 */
130 public String getAcknowledgmentCode() {
131 MSASegment msa = getMSA();
132 return msa.getAcknowledgmentCode();
133 }
134
135 /**
136 * Set the message control id in the MSA (ie sender's mcId).
137 * @param sMessageId String with unique identifier
138 */
139 public void setOriginalMessageControlId( String sMessageControlId ) {
140 MSASegment msa = getMSA();
141 msa.setMessageControlId( sMessageControlId );
142 }
143
144 /**
145 * Get the message control id in the MSA (ie sender's mcId).
146 * @return String with unique identifier
147 */
148 public String getOriginalMessageControlId() {
149 MSASegment msa = getMSA();
150 return msa.getMessageControlId();
151 }
152
153 /**
154 * Set the value in the observation segment which in this case
155 * is defined to include the prevalence of the submitted diagnosis in
156 * animals like the one described in the submitted PID segment.
157 * @param dPrev The prevalence rate as a double type numeric.
158 */
159 public void setPrevalenceRate( double dPrev ) {
160 try {
161 String sPrev = Double.toString( dPrev );
162 OBXSegment obx = getOBX();
163 CEElement obsId = new CEElement( "","Prevalence Rate","" );
164 obx.setObservationIdentifier( obsId );
165 obx.setObservationValueType("NM");
166 obx.setObservationValue( sPrev );
167 } catch( MalformedFieldException mse ) {
168 mse.printStackTrace();
169 }
170 }
171
172
173 /**
174 * Get the value in the observation segment which in this case
175 * is defined to include the prevalence of the submitted diagnosis in
176 * animals like the one described in the submitted PID segment.
177 * @return The prevalence rate as a double type numeric. Returns negative
178 * one for errors or no value.
179 */
180 public double getPrevalenceRate() {
181 double dPrev = -1.0;
182 try {
183 OBXSegment obx = getOBX();
184 String sPrev = obx.getObservationValue().getValue();
185 dPrev = Double.parseDouble( sPrev );
186 } catch( NumberFormatException nfe ) {
187 nfe.printStackTrace();
188 }
189 return dPrev;
190 }
191
192 } // end class RSPMessage
193