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 "GroupPointer.java". Description:
010 "A GroupPointer is used when parsing traditionally encoded HL7 messages"
011
012 The Initial Developer of the Original Code is University Health Network. Copyright (C)
013 2001. All Rights Reserved.
014
015 Contributor(s): ______________________________________.
016
017 Alternatively, the contents of this file may be used under the terms of the
018 GNU General Public License (the "GPL"), in which case the provisions of the GPL are
019 applicable instead of those above. If you wish to allow use of your version of this
020 file only under the terms of the GPL and not to allow others to use your version
021 of this file under the MPL, indicate your decision by deleting the provisions above
022 and replace them with the notice and other provisions required by the GPL License.
023 If you do not delete the provisions above, a recipient may use your version of
024 this file under either the MPL or the GPL.
025
026 */
027
028
029
030 package ca.uhn.hl7v2.parser;
031
032 import ca.uhn.hl7v2.HL7Exception;
033 import ca.uhn.hl7v2.model.Message;
034
035
036
037 /**
038 * Represents the set of special characters used to encode traditionally
039 * encoded HL7 messages.
040 *
041 * @author Bryan Tripp (bryan_tripp@sourceforge.net)
042 */
043
044 public class EncodingCharacters extends Object implements Cloneable {
045
046 private char fieldSep;
047 private char[] encChars;
048
049 /**
050 * Creates new EncodingCharacters object with the given character
051 * values. If the encodingCharacters argument is null, the default
052 * values are used.
053 *
054 * @param encodingCharacters consists of the characters that appear in
055 * MSH-2 (see section 2.8 of the HL7 spec). The characters are
056 * Component Separator, Repetition Separator, Escape Character, and
057 * Subcomponent Separator (in that order).
058 */
059
060 public EncodingCharacters(char fieldSeparator, String encodingCharacters) {
061 this.fieldSep = fieldSeparator;
062 this.encChars = new char[4];
063
064 if (encodingCharacters == null) {
065 this.encChars[0] = '^';
066 this.encChars[1] = '~';
067 this.encChars[2] = '\\';
068 this.encChars[3] = '&';
069 } else {
070 encodingCharacters.getChars(0, 4, this.encChars, 0);
071 }
072
073 }
074
075 /**
076 * Returns an instance using the MSH-1 and MSH-2 values of the given message
077 *
078 * @throws HL7Exception If either MSH-1 or MSH-2 are not populated
079 * @since 1.0
080 */
081 public static EncodingCharacters getInstance(Message message) throws HL7Exception {
082
083 final String encodingCharactersValue = message.getEncodingCharactersValue();
084 if (encodingCharactersValue == null || encodingCharactersValue.length() == 0) {
085 throw new HL7Exception("encoding characters not populated");
086 }
087
088 final Character fieldSeparatorValue = message.getFieldSeparatorValue();
089 if (fieldSeparatorValue == null) {
090 throw new HL7Exception("Field separator not populated");
091 }
092
093 return new EncodingCharacters(fieldSeparatorValue, encodingCharactersValue);
094 }
095
096
097
098 public EncodingCharacters(char fieldSeparator, char componentSeparator, char repetitionSeparator, char escapeCharacter, char subcomponentSeparator)
099 {
100 this(fieldSeparator, String.valueOf(componentSeparator) + repetitionSeparator + escapeCharacter + subcomponentSeparator);
101 }
102
103
104
105 /** copies contents of "other" */
106
107 public EncodingCharacters(EncodingCharacters other)
108 {
109 this.fieldSep = other.getFieldSeparator();
110 this.encChars = new char[4];
111 this.encChars[0] = other.getComponentSeparator();
112 this.encChars[1] = other.getRepetitionSeparator();
113 this.encChars[2] = other.getEscapeCharacter();
114 this.encChars[3] = other.getSubcomponentSeparator();
115 }
116
117 /**
118 *
119 * Returns the field separator.
120 *
121 */
122 public char getFieldSeparator() {
123 return this.fieldSep;
124 }
125
126 /**
127 *
128 * Returns the component separator.
129 *
130 */
131 public char getComponentSeparator() {
132 return this.encChars[0];
133 }
134
135 /**
136 *
137 * Returns the repetition separator.
138 *
139 */
140 public char getRepetitionSeparator() {
141 return this.encChars[1];
142 }
143
144 /**
145 * Returns the escape character.
146 */
147 public char getEscapeCharacter() {
148 return this.encChars[2];
149 }
150
151 /**
152 * Returns the subcomponent separator.
153 */
154 public char getSubcomponentSeparator() {
155 return this.encChars[3];
156 }
157
158 /**
159 * Returns the encoding characters (not including field separator)
160 * as a string.
161 */
162 public String toString() {
163 StringBuffer ret = new StringBuffer();
164 for (int i = 0; i < this.encChars.length; i++) {
165 ret.append(this.encChars[i]);
166 }
167
168 return ret.toString();
169 }
170
171 public Object clone()
172 {
173 return new EncodingCharacters(this);
174 }
175
176 public void setFieldSeparator(char newFieldSep) {
177 this.fieldSep = newFieldSep;
178 }
179
180 public void setComponentSeparator(char newComponentSep) {
181 this.encChars[0] = newComponentSep;
182 }
183
184 public void setRepetitionSeparator(char newRepetitionSep) {
185 this.encChars[1] = newRepetitionSep;
186 }
187
188 public void setEscapeCharacter(char newEscapeChar) {
189 this.encChars[2] = newEscapeChar;
190 }
191
192 public void setSubcomponentSeparator(char newSubcomponentSep) {
193 this.encChars[3] = newSubcomponentSep;
194 }
195
196 /** @see java.lang.Object#equals */
197 public boolean equals(Object o) {
198 if (o instanceof EncodingCharacters) {
199 EncodingCharacters other = (EncodingCharacters) o;
200 if (this.getFieldSeparator() == other.getFieldSeparator()
201 && this.getComponentSeparator() == other.getComponentSeparator()
202 && this.getEscapeCharacter() == other.getEscapeCharacter()
203 && this.getRepetitionSeparator() == other.getRepetitionSeparator()
204 && this.getSubcomponentSeparator() == other.getSubcomponentSeparator()) {
205 return true;
206 } else {
207 return false;
208 }
209 } else {
210 return false;
211 }
212 }
213
214 /** @see java.lang.Object#hashCode */
215 public int hashCode() {
216 return 7 * (int) this.getComponentSeparator()
217 * (int) this.getEscapeCharacter()
218 * (int) this.getFieldSeparator()
219 * (int) this.getRepetitionSeparator()
220 * (int) this.getSubcomponentSeparator();
221 }
222
223 /**
224 *
225 * Test harness ...
226 *
227 */
228
229 /*
230
231 public static void main(String args[]) {
232
233 String testChars = "^~\\&";
234
235 String testChars2 = "$%*+";
236
237
238
239 EncodingCharacters ec = new EncodingCharacters('|', testChars);
240
241 System.out.println("test 1: " + ec.getFieldSeparator() + ec.toString());
242
243 ec = new EncodingCharacters('|', testChars2);
244
245 System.out.println("test 2: " + ec.getFieldSeparator() + ec.getComponentSeparator() + ec.getRepetitionSeparator() + ec.getEscapeCharacter() + ec.getSubcomponentSeparator());
246
247 ec = new EncodingCharacters('[', null);
248
249 System.out.println("test 3: " + ec.getFieldSeparator() + ec.toString());
250
251 }*/
252
253 }
254