package uk.nhs.kch.rassyeyanie.framework;
import java.io.InputStream;
import java.io.OutputStream;
import org.apache.camel.Exchange;
import org.apache.camel.component.hl7.HL7Constants;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.util.ExchangeHelper;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.parser.CanonicalModelClassFactory;
import ca.uhn.hl7v2.parser.PipeParser;
import ca.uhn.hl7v2.util.Terser;
import ca.uhn.hl7v2.validation.impl.NoValidation;
public class HL7VersionedDataFormat
implements DataFormat
{
private static PipeParser createVersionedParser(String version,
boolean validate)
{
CanonicalModelClassFactory canonicalModelClassFactory =
new CanonicalModelClassFactory(version);
PipeParser pipeParser = new PipeParser(canonicalModelClassFactory);
if (!validate)
{
pipeParser.setValidationContext(new NoValidation());
}
return pipeParser;
}
private boolean validate;
private String version;
public HL7VersionedDataFormat()
{
this.validate = true;
this.version = "2.4";
}
public String getVersion()
{
return this.version;
}
public boolean isValidate()
{
return this.validate;
}
@Override
public void marshal(Exchange exchange,
Object body,
OutputStream outputStream)
throws Exception
{
Message message =
ExchangeHelper
.convertToMandatoryType(exchange, Message.class, body);
PipeParser pipeParser =
createVersionedParser(this.version, this.validate);
String encoded = pipeParser.encode(message);
outputStream.write(encoded.getBytes());
}
public void setValidate(boolean validate)
{
this.validate = validate;
}
public void setVersion(String version)
{
this.version = version;
}
@Override
public Object unmarshal(Exchange exchange, InputStream inputStream)
throws Exception
{
String body =
ExchangeHelper.convertToMandatoryType(
exchange,
String.class,
inputStream);
PipeParser pipeParser =
createVersionedParser(this.version, this.validate);
body = body.replace('\n', '\r');
Message message = pipeParser.parse(body);
// add MSH fields as message out headers
Terser terser = new Terser(message);
exchange.getOut().setHeader(
HL7Constants.HL7_SENDING_APPLICATION,
terser.get("MSH-3"));
exchange.getOut().setHeader(
HL7Constants.HL7_SENDING_FACILITY,
terser.get("MSH-4"));
exchange.getOut().setHeader(
HL7Constants.HL7_RECEIVING_APPLICATION,
terser.get("MSH-5"));
exchange.getOut().setHeader(
HL7Constants.HL7_RECEIVING_FACILITY,
terser.get("MSH-6"));
exchange.getOut().setHeader(
HL7Constants.HL7_TIMESTAMP,
terser.get("MSH-7"));
exchange.getOut().setHeader(
HL7Constants.HL7_SECURITY,
terser.get("MSH-8"));
exchange.getOut().setHeader(
HL7Constants.HL7_MESSAGE_TYPE,
terser.get("MSH-9-1"));
exchange.getOut().setHeader(
HL7Constants.HL7_TRIGGER_EVENT,
terser.get("MSH-9-2"));
exchange.getOut().setHeader(
HL7Constants.HL7_MESSAGE_CONTROL,
terser.get("MSH-10"));
exchange.getOut().setHeader(
HL7Constants.HL7_PROCESSING_ID,
terser.get("MSH-11"));
exchange.getOut().setHeader(
HL7Constants.HL7_VERSION_ID,
terser.get("MSH-12"));
return message;
}
}