001 /**
002 The contents of this file are subject to the Mozilla Public License Version 1.1
003 (the "License"); you may not use this file except in compliance with the License.
004 You may obtain a copy of the License at http://www.mozilla.org/MPL/
005 Software distributed under the License is distributed on an "AS IS" basis,
006 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
007 specific language governing rights and limitations under the License.
008
009 The Original Code is "HL7Exception.java". Description:
010 "Represents an exception encountered while processing
011 an HL7 message"
012
013 The Initial Developer of the Original Code is University Health Network. Copyright (C)
014 2001. All Rights Reserved.
015
016 Contributor(s): ______________________________________.
017
018 Alternatively, the contents of this file may be used under the terms of the
019 GNU General Public License (the "GPL"), in which case the provisions of the GPL are
020 applicable instead of those above. If you wish to allow use of your version of this
021 file only under the terms of the GPL and not to allow others to use your version
022 of this file under the MPL, indicate your decision by deleting the provisions above
023 and replace them with the notice and other provisions required by the GPL License.
024 If you do not delete the provisions above, a recipient may use your version of
025 this file under either the MPL or the GPL.
026
027 */
028
029 package ca.uhn.hl7v2;
030
031 import ca.uhn.hl7v2.model.Segment;
032 import ca.uhn.hl7v2.util.Terser;
033
034 /**
035 * Represents an exception encountered while processing
036 * an HL7 message.
037 * @author Bryan Tripp (bryan_tripp@sourceforge.net)
038 */
039 @SuppressWarnings("serial")
040 public class HL7Exception extends Exception {
041
042 /** Original mode: Application Accept - Enhanced mode: Application acknowledgment: Accept */
043 public static final int ACK_AA = 1;
044
045 /** Original mode: Application Error - Enhanced mode: Application acknowledgment: Error */
046 public static final int ACK_AE = 2;
047
048 /** Original mode: Application Reject - Enhanced mode: Application acknowledgment: Reject */
049 public static final int ACK_AR = 3;
050
051 /** Enhanced mode: Accept acknowledgment: Commit Accept */
052 public static final int ACK_CA = 4;
053
054 /** Enhanced mode: Accept acknowledgment: Commit Error */
055 public static final int ACK_CE = 5;
056
057 /** Enhanced mode: Accept acknowledgment: Commit Reject */
058 public static final int ACK_CR = 6;
059
060
061 public static final int MESSAGE_ACCEPTED = 0;
062 public static final int SEGMENT_SEQUENCE_ERROR = 100;
063 public static final int REQUIRED_FIELD_MISSING = 101;
064 public static final int DATA_TYPE_ERROR = 102;
065 public static final int TABLE_VALUE_NOT_FOUND = 103;
066 public static final int UNSUPPORTED_MESSAGE_TYPE = 200;
067 public static final int UNSUPPORTED_EVENT_CODE = 201;
068 public static final int UNSUPPORTED_PROCESSING_ID = 202;
069 public static final int UNSUPPORTED_VERSION_ID = 203;
070 public static final int UNKNOWN_KEY_IDENTIFIER = 204;
071 public static final int DUPLICATE_KEY_IDENTIFIER = 205;
072 public static final int APPLICATION_RECORD_LOCKED = 206;
073 public static final int APPLICATION_INTERNAL_ERROR = 207;
074
075 private String segment = null;
076 private int segmentRep = -1;
077 private int fieldPosition = -1;
078 private int errCode = -1;
079
080 /**
081 * Creates an HL7Exception.
082 *
083 * @param errorCondition a code describing the the error condition, from HL7
084 * table 0357 (see section 2.16.8 of standard v 2.4) - HL7Exception defines
085 * these codes as integer constants that can be used here (e.g.
086 * HL7Exception.UNSUPPORTED_MESSAGE_TYPE)
087 *
088 * @param cause The exception that caused this exception to be thrown.
089 */
090 public HL7Exception(String message, int errorCondition, Throwable cause) {
091 super(message, cause);
092 this.errCode = errorCondition;
093 }
094
095 /**
096 * Creates an HL7Exception.
097 *
098 * @param errorCondition a code describing the the error condition, from HL7
099 * table 0357 (see section 2.16.8 of standard v 2.4) - HL7Exception defines
100 * these codes as integer constants that can be used here (e.g.
101 * HL7Exception.UNSUPPORTED_MESSAGE_TYPE)
102 */
103 public HL7Exception(String message, int errorCondition) {
104 super(message);
105 this.errCode = errorCondition;
106 }
107
108 /**
109 * Creates an HL7Exception with the code APPLICATION_INTERNAL_ERROR
110 *
111 * @param cause The excption that caused this exception tobe thrown.
112 */
113 public HL7Exception(String message, Throwable cause) {
114 super(message, cause);
115 this.errCode = HL7Exception.APPLICATION_INTERNAL_ERROR;
116 }
117
118 /**
119 * Creates an HL7Exception with the code APPLICATION_INTERNAL_ERROR
120 *
121 * @param cause The excption that caused this exception tobe thrown.
122 */
123 public HL7Exception(Throwable cause) {
124 super(cause);
125 this.errCode = HL7Exception.APPLICATION_INTERNAL_ERROR;
126 }
127
128 /**
129 * Creates an HL7Exception with the code APPLICATION_INTERNAL_ERROR
130 */
131 public HL7Exception(String message) {
132 super(message);
133 this.errCode = HL7Exception.APPLICATION_INTERNAL_ERROR;
134 }
135
136 /**
137 * Sets the name of the segment where the error occured.
138 */
139 public void setSegmentName(String segmentName) {
140 this.segment = segmentName;
141 }
142
143 /**
144 * Returns the name of the segment where the error occured, if this has been set
145 * (null otherwise).
146 */
147 public String getSegmentName() {
148 return this.segment;
149 }
150
151 /**
152 * Sets the sequence number of the segment where the error occured if there
153 * are multiplt segments with the same name (ie the sequenceNum'th segment
154 * with the name specified in <code>setSegmentName</code>). Numbering
155 * starts at 1.
156 */
157 public void setSegmentRepetition(int sequenceNum) {
158 this.segmentRep = sequenceNum;
159 }
160
161 /**
162 * Returns the sequence number of the segment where the error occured (if there
163 * are multiple segments with the same name) if this has been set, -1 otherwise -
164 * numbering starts at 1.
165 */
166 public int getSegmentRepetition() {
167 return this.segmentRep;
168 }
169
170 /**
171 * Sets the field number (within a segment) where the error occured; numbering
172 * starts at 1.
173 */
174 public void setFieldPosition(int fieldNum) {
175 this.fieldPosition = fieldNum;
176 }
177
178 /**
179 * Returns the field number within the segment where the error occured if it has been
180 * set, -1 otherwise; numbering starts at 1.
181 */
182 public int getFieldPosition() {
183 return this.fieldPosition;
184 }
185
186 /**
187 * @return Returns the error code associated with this exception, or <code>-1</code> if none
188 */
189 public int getErrorCode() {
190 return this.errCode;
191 }
192
193 /**
194 * Overrides Throwable.getMessage() to add the field location of the problem if
195 * available.
196 */
197 public String getMessage() {
198 StringBuffer msg = new StringBuffer();
199 msg.append(super.getMessage());
200 if (getSegmentName() != null) {
201 msg.append(": Segment: ");
202 msg.append(getSegmentName());
203 }
204 if (getSegmentRepetition() != -1) {
205 msg.append(" (rep ");
206 msg.append(getSegmentRepetition());
207 msg.append(")");
208 }
209 if (getFieldPosition() != -1) {
210 msg.append(" Field #");
211 msg.append(getFieldPosition());
212 }
213 return msg.toString();
214 }
215
216 /**
217 * Populates the given error segment with information from this Exception.
218 */
219 public void populate(Segment errorSegment, String theJdbcUrl) throws HL7Exception {
220 //make sure it's an ERR
221 if (!errorSegment.getName().equals("ERR"))
222 throw new HL7Exception(
223 "Can only populate an ERR segment with an exception -- got: " + errorSegment.getClass().getName());
224
225 int rep = errorSegment.getField(1).length; //append after existing reps
226
227 if (this.getSegmentName() != null)
228 Terser.set(errorSegment, 1, rep, 1, 1, this.getSegmentName());
229
230 if (this.getSegmentRepetition() >= 0)
231 Terser.set(errorSegment, 1, rep, 2, 1, String.valueOf(this.getSegmentRepetition()));
232
233 if (this.getFieldPosition() >= 0)
234 Terser.set(errorSegment, 1, rep, 3, 1, String.valueOf(this.getFieldPosition()));
235
236 Terser.set(errorSegment, 1, rep, 4, 1, String.valueOf(this.errCode));
237 Terser.set(errorSegment, 1, rep, 4, 3, "hl70357");
238 Terser.set(errorSegment, 1, rep, 4, 5, this.getMessage());
239
240 //try to get error condition text
241 // try {
242 // FIXME: make this work
243 String desc = "ERROR"; // TableRepository.getInstance(theJdbcUrl).getDescription(357, String.valueOf(this.errCode));
244 Terser.set(errorSegment, 1, rep, 4, 2, desc);
245 // }
246 // catch (LookupException e) {
247 // ourLog.debug(
248 // "Warning: LookupException getting error condition text (are we connected to a TableRepository?)", e);
249 // } catch (SQLException e) {
250 // throw new HL7Exception(e);
251 // }
252 }
253 }