/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.hl7; import java.io.UnsupportedEncodingException; import ca.uhn.hl7v2.HL7Exception; import ca.uhn.hl7v2.model.Message; import ca.uhn.hl7v2.model.Segment; import ca.uhn.hl7v2.preparser.PreParser; import org.apache.camel.Exchange; import org.apache.camel.util.IOHelper; /** * This enumerates the defined charsets for HL7 as defined in Table 0211, * mapping them to the Java charset names and back */ public enum HL7Charset { ISO_8859_1("8859/1", "ISO-8859-1"), ISO_8859_2("8859/2", "ISO-8859-2"), ISO_8859_3("8859/3", "ISO-8859-3"), ISO_8859_4("8859/4", "ISO-8859-4"), ISO_8859_5("8859/5", "ISO-8859-5"), ISO_8859_6("8859/1", "ISO-8859-6"), ISO_8859_7("8859/1", "ISO-8859-7"), ISO_8859_8("8859/1", "ISO-8859-8"), ISO_8859_9("8859/1", "ISO-8859-9"), ASCII("ASCII", "US-ASCII"), BIG_5("BIG-5", "Big5"), CNS("CNS 11643-1992", "ISO-2022-CN"), GB_1830_2000("GB 18030-2000", ""), ISO_IR14("ISO IR14", "ISO-2022-JP"), ISO_IR159("ISO IR159", "EUC-JP"), ISO_IR87("ISO IR87", "EUC-JP"), KS_X_1001("KS X 1001", "EUC-KR"), UNICODE("UNICODE", "UTF-8"), UTF_16("UNICODE UTF-16", "UTF-16"), UTF_32("UNICODE UTF-32", "UTF-32"), UTF_8("UNICODE UTF-8", "UTF-8"); private String hl7CharsetName; private String javaCharsetName; HL7Charset(String hl7CharsetName, String javaCharsetName) { this.hl7CharsetName = hl7CharsetName; this.javaCharsetName = javaCharsetName; } public String getHL7CharsetName() { return hl7CharsetName; } public String getJavaCharsetName() { return javaCharsetName; } /** * Returns the HL7Charset that matches the parameter * * @param s charset string * @return HL7Charset enum */ public static HL7Charset getHL7Charset(String s) { if (s != null && s.length() > 0) { for (HL7Charset charset : HL7Charset.values()) { if (charset.hl7CharsetName.equals(s) || charset.javaCharsetName.equals(s)) { return charset; } } } return null; } /** * Returns the charset to be used for marshalling HL7 messages. If MSH-18 is empty, * the charset configured in Camel's charset properties/headers is returned. * * @param message HL7 message * @param exchange Exchange * @return Java charset name */ public static String getCharsetName(Message message, Exchange exchange) throws HL7Exception { String defaultCharsetName = IOHelper.getCharsetName(exchange); String msh18 = ((Segment)message.get("MSH")).getField(18, 0).toString(); return getCharsetName(msh18, defaultCharsetName); } /** * Returns the charset to be used for unmarshalling HL7 messages. If MSH-18 is empty, * the temporary charset name is returned. * * @param bytes HL7 message as byte array * @param guessedCharsetName the temporary charset guessed to be able to read MSH-18 * @return Java charset name * * @see org.apache.camel.component.hl7.HL7DataFormat#guessCharsetName(byte[], org.apache.camel.Exchange) */ public static String getCharsetName(byte[] bytes, String guessedCharsetName) throws UnsupportedEncodingException, HL7Exception { String tmp = new String(bytes, guessedCharsetName); String msh18 = PreParser.getFields(tmp, "MSH-18")[0]; return getCharsetName(msh18, guessedCharsetName); } private static String getCharsetName(String msh18, String defaultCharsetName) { HL7Charset charset = HL7Charset.getHL7Charset(msh18); return charset != null ? charset.getJavaCharsetName() : defaultCharsetName; } }