1 /**
2 * The contents of this file are subject to the Mozilla Public License Version 1.1
3 * (the "License"); you may not use this file except in compliance with the License.
4 * You may obtain a copy of the License at http://www.mozilla.org/MPL/
5 * Software distributed under the License is distributed on an "AS IS" basis,
6 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
7 * specific language governing rights and limitations under the License.
8 *
9 * The Original Code is "MessageValidation.java". Description:
10 * "Example Code"
11 *
12 * The Initial Developer of the Original Code is University Health Network. Copyright (C)
13 * 2001. All Rights Reserved.
14 *
15 * Contributor(s): James Agnew
16 *
17 * Alternatively, the contents of this file may be used under the terms of the
18 * GNU General Public License (the �GPL�), in which case the provisions of the GPL are
19 * applicable instead of those above. If you wish to allow use of your version of this
20 * file only under the terms of the GPL and not to allow others to use your version
21 * of this file under the MPL, indicate your decision by deleting the provisions above
22 * and replace them with the notice and other provisions required by the GPL License.
23 * If you do not delete the provisions above, a recipient may use your version of
24 * this file under either the MPL or the GPL.
25 *
26 */
27 package ca.uhn.hl7v2.examples;
28
29 import ca.uhn.hl7v2.DefaultHapiContext;
30 import ca.uhn.hl7v2.HL7Exception;
31 import ca.uhn.hl7v2.HapiContext;
32 import ca.uhn.hl7v2.model.Message;
33 import ca.uhn.hl7v2.parser.PipeParser;
34 import ca.uhn.hl7v2.validation.impl.ValidationContextFactory;
35
36 /**
37 * Message Validation using the provided ValidationContext implementations
38 *
39 * @author <a href="mailto:jamesagnew@sourceforge.net">James Agnew</a>
40 * @version $Revision: 1.3 $ updated on $Date: 2009-08-09 13:59:46 $ by $Author:
41 * jamesagnew $
42 */
43 public class MessageValidation {
44
45 /**
46 * @param args
47 */
48 public static void main(String[] args) {
49
50 /*
51 * In this example, we are looking at a few aspects of message
52 * validation using HAPI.
53 *
54 * The following message will be used in the examples:
55 *
56 * MSH|^~\&|MedSeries|CAISI_1-2|PLS|3910|200903230934||ADT^A31^ADT_A05|75535037-1237815294895|P^T|2.4
57 * EVN|A31|200903230934
58 * PID|1||29^^CAISI_1-2^PI~""||Test300^Leticia^^^^^L||19770202|M||||||||||||||||||||||
59 */
60 String validMessage = "MSH|^~\\&|MedSeries|CAISI_1-2|PLS|3910|200903230934||ADT^A31^ADT_A05|75535037-1237815294895|P^T|2.4\r\n"
61 + "EVN|A31|200903230934\r\n"
62 + "PID|1||29^^CAISI_1-2^PI~\"\"||Test300^Leticia^^^^^L||19770202|M||||||||||||||||||||||";
63
64 /*
65 * Let's start by constructing a parser using default settings. By
66 * default, a parser has certain validation settings, as defined by the
67 * DefaultValidation class.
68 */
69 HapiContext context = new DefaultHapiContext();
70
71 /*
72 * This is actually redundant, since this is the default
73 * validator. The default validation includes a number of sensible
74 * defaults including maximum lengths on string types, formats for
75 * telephone numbers and timestamps, etc.
76 */
77 context.setValidationContext(ValidationContextFactory.defaultValidation());
78
79 // Let's try parsing the valid message:
80 PipeParser parser = context.getPipeParser();
81 try {
82 parser.parse(validMessage);
83 System.out.println("Successfully parsed valid message");
84 } catch (HL7Exception e) {
85 // This shouldn't happen!
86 System.out.println("Something went wrong!");
87 System.exit(-1);
88 }
89
90 /*
91 * Next, let's set EVN-2 to a string that is longer than 200 chars.
92 * DefaultValidation specified that ID datatypes must not exceed this
93 *length
94 */
95 String invalidMessage = "MSH|^~\\&|MedSeries|CAISI_1-2|PLS|3910|200903230934||ADT^A31^ADT_A05|75535037-1237815294895|P^T|2.4\r\n"
96 + "EVN|0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789|200903230934\r\n"
97 + "PID|1||29^^CAISI_1-2^PI~\"\"||Test300^Leticia^^^^^L||19770202|M||||||||||||||||||||||";
98
99 // Let's try parsing the valid message:
100 try {
101 parser.parse(invalidMessage);
102 } catch (HL7Exception e) {
103 // This time, we are expecting an exception, because the message
104 // should fail validation.
105 System.out.println("As expected, the message did not validate: "
106 + e.getMessage());
107 /*
108 * Prints:
109 * As expected, the message did not validate: Failed validation rule: Maxumim size <= 200 characters: Segment: EVN (rep 0) Field #1
110 */
111 }
112
113 /*
114 * The ValidationContext is used during parsing and well as during
115 * validation using {@link ca.uhn.hl7v2.validation.Validator} objects.
116 * Sometimes we want parsing without validation followed by a
117 * separate validation step. We can still use a single HapiContext.
118 */
119
120 context.getParserConfiguration().setValidating(false);
121 try {
122 parser.parse(invalidMessage);
123 System.out.println("Successfully parsed valid message");
124 } catch (HL7Exception e) {
125 // This shouldn't happen!
126 System.out.println("Something went wrong!");
127 System.exit(-1);
128 }
129
130 /*
131 * Now, suppose we want to throw caution to the wind, and not do
132 * any validation. This is fairly common practice in the real
133 * world, since sending systems don't always behave as nicely as
134 * we might want.
135 */
136 context.setValidationContext(ValidationContextFactory.noValidation());
137
138 try {
139 parser.parse(invalidMessage);
140 System.out.println("Successfully parsed invalid message");
141 } catch (HL7Exception e) {
142 // This shouldn't happen!
143 System.out.println("Something went wrong!");
144 System.exit(-1);
145 }
146
147 /*
148 * One important thing to note is that NoValidation still includes one
149 * rule: A rule which strips leading space from FT, ST, and trailing
150 * space from TX fields.
151 *
152 * Let's add some leading space to MSH-10 (this isn't something you would
153 * want to do normally, but it does demonstrate leading space trimming from
154 * ST datatypes)
155 */
156 invalidMessage = "MSH|^~\\&|MedSeries|CAISI_1-2|PLS|3910|200903230934||ADT^A31^ADT_A05| CONTROLID|P^T|2.4\r\n"
157 + "EVN|A03|200903230934\r\n"
158 + "PID|1||29^^CAISI_1-2^PI~\"\"||Test300^Leticia^^^^^L||19770202|M||||||||||||||||||||||";
159 try {
160 Message parsedMessage = parser.parse(invalidMessage);
161
162 // Print the message back out
163 System.out.println(parser.encode(parsedMessage));
164
165 /*
166 * MSH|^~\&|MedSeries|CAISI_1-2|PLS|3910|200903230934||ADT^A31^ADT_A05|CONTROLID|P^T|2.4
167 * EVN|A03|200903230934
168 * PID|1||29^^CAISI_1-2^PI~""||Test300^Leticia^^^^^L||19770202|M
169 */
170
171 } catch (HL7Exception e) {
172 e.printStackTrace();
173 }
174
175 }
176
177 }