/*
* Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. 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.wso2.carbon.business.messaging.hl7.message;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.parser.DefaultXMLParser;
import ca.uhn.hl7v2.parser.Parser;
import ca.uhn.hl7v2.validation.impl.NoValidation;
import org.apache.axiom.om.OMElement;
import org.apache.axis2.AxisFault;
import org.apache.axis2.builder.Builder;
import org.apache.axis2.context.MessageContext;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.business.messaging.hl7.common.HL7Constants;
import org.wso2.carbon.business.messaging.hl7.common.HL7ProcessingContext;
import org.wso2.carbon.business.messaging.hl7.common.HL7Utils;
import java.io.InputStream;
public class HL7MessageBuilder implements Builder {
private static final Log log = LogFactory.getLog(HL7MessageBuilder.class);
/** {@inheritdoc }**/
public OMElement processDocument(InputStream inputStream, String contentType,
MessageContext msgCtx) throws AxisFault {
try {
HL7ProcessingContext processingCtx = new HL7ProcessingContext(msgCtx.getAxisService());
String charset = getCharsetEncoding(contentType);
msgCtx.setProperty(HL7Constants.HL7_MESSAGE_CHARSET, charset);
String hl7String = HL7Utils.streamToString(inputStream, charset);
if (log.isDebugEnabled()) {
log.debug("HL7 String: " + hl7String);
}
Message message = processingCtx.parseMessage(hl7String);
processingCtx.initMessageContext(message, msgCtx);
processingCtx.checkConformanceProfile(message);
String hl7Xml = serializeHL7toXML(message);
return HL7Utils.generateHL7MessageElement(hl7Xml);
} catch (AxisFault e) {
throw e;
} catch (Exception e) {
throw new AxisFault(e.getMessage(), e);
}
}
private String serializeHL7toXML(Message message) throws AxisFault {
Parser xmlParser = new DefaultXMLParser();
xmlParser.setValidationContext(new NoValidation());
try {
return xmlParser.encode(message);
} catch (HL7Exception e) {
throw new AxisFault("Error on converting to HL7 XML: " + e.getMessage(), e);
}
}
private String getCharsetEncoding(String contentType) {
String[] cType = contentType.split(";");
for(String c: cType) {
c = c.trim();
if(c.startsWith("charset=")) {
if(c.substring(8).startsWith("\"")) {
return c.substring(9, c.length()-1);
} else {
return c.substring(8, c.length());
}
}
}
return null;
}
}