Our team at Queensland Health in Australia is growing, and our usage of this
incredibly helpful API grows with it.
As we have delved deeper into the usage of HAPI listener applications we have
structured our set of custom messages to try to facilitate a couple of the
features we are implementing. Recently we have encountered a circumstance where
we would appreciate some clarification.
When we build a custom message we try to 'uplift' the definition to version 2.4
regardless of what the vendor message says it uses.
In an effort to have a HAPI listener 'automagically' pick up our
implementations we use code as shown in the example below. Please excuse the
fact that I have pasted the text of the code, our mail gateway does not much
like us trying to send out .zip files that contain code. The example has tests
that can be made to fail or succeed based upon the dependency libraries you
configure.
We would like to reach a point where including 'unused' dependencies can be
avoided, (the ca.uhn.hl7v2.model.231 set in this example), and wonder if there
is a feature we have overlooked that enables this.
We would also like to understand when using the packageNames =
{"ca.uhn.hl7v2.model.v24", "hapi.test"} seen in the code below, if a definition
of a message "ADT_A01" exists in both libraries why it is we have to put our
definitions last to get them to be picked up.
Code follows:
Custom message definition (much cut down just for this example):
package hapi.test.message;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.model.AbstractMessage;
import ca.uhn.hl7v2.model.v24.segment.MSH;
import ca.uhn.hl7v2.parser.DefaultModelClassFactory;
import ca.uhn.hl7v2.parser.ModelClassFactory;
public class ADT_A01 extends AbstractMessage {
private static final ModelClassFactory DEFAULT_MODEL_CLASS_FACTORY = new
DefaultModelClassFactory();
public ADT_A01() throws HL7Exception {
this(DEFAULT_MODEL_CLASS_FACTORY);
}
public ADT_A01(ModelClassFactory modelClassFactory) throws HL7Exception {
super(modelClassFactory);
this.addSegments();
}
private void addSegments() throws HL7Exception {
Class<MSH> addMsh = MSH.class;
this.add(addMsh, true, false);
}
public MSH getMSH() throws HL7Exception {
return (MSH) get("MSH");
}
}
Demonstration of success/failure with these tests:
package hapi.test;
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HapiContext;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.Varies;
import ca.uhn.hl7v2.model.v24.message.ACK;
import ca.uhn.hl7v2.parser.CustomModelClassFactory;
import ca.uhn.hl7v2.parser.GenericParser;
import ca.uhn.hl7v2.validation.builder.support.NoValidationBuilder;
import hapi.test.message.ADT_A01;
import org.junit.Test;
import java.util.HashMap;
import java.util.Map;
import static org.junit.Assert.assertTrue;
public class ADT_A01Test {
private static final HapiContext HAPI_CONTEXT = createHapiContext();
private static final String ADT_A01_HL7_EXPLICIT =
"MSH|^~\\&|ABCD|123|||20150101000000||ADT^A01^ADT_A01|1234|P|2.3.1\r";
private static final String ADT_A01_HL7_IMPLICIT =
"MSH|^~\\&|ABCD|123|||20150101000000||ADT^A01|1234|P|2.3.1\r";
private static CustomModelClassFactory getCustomModelClassFactory() {
Map<String, String[]> hl7VersionPackageNamesMap = new HashMap<String,
String[]>();
String[] packageNames = {"ca.uhn.hl7v2.model.v24", "hapi.test"};
hl7VersionPackageNamesMap.put("2.3", packageNames);
hl7VersionPackageNamesMap.put("2.3.1", packageNames);
hl7VersionPackageNamesMap.put("2.4", packageNames);
return new CustomModelClassFactory(hl7VersionPackageNamesMap);
}
private static HapiContext createHapiContext() {
System.setProperty(Varies.DEFAULT_OBX2_TYPE_PROP, "ST");
System.setProperty(Varies.INVALID_OBX2_TYPE_PROP, "ST");
HapiContext hapiContext = new DefaultHapiContext();
hapiContext.setModelClassFactory(getCustomModelClassFactory());
hapiContext.setValidationRuleBuilder(new NoValidationBuilder());
hapiContext.getParserConfiguration().setAllowUnknownVersions(true);
return hapiContext;
}
/**
* This test passes without hapi-structures-v231 as a project dependency.
*
* @throws Exception
*/
@Test
public void testHAPICanParseExplicitADT_A01() throws Exception {
GenericParser genericParser = new GenericParser(HAPI_CONTEXT);
Message adt_a01 = genericParser.parse(ADT_A01_HL7_EXPLICIT);
assertTrue("HAPI parsed HL7 to custom ADT_A01 message", adt_a01
instanceof ADT_A01);
Message ack = adt_a01.generateACK();
assertTrue("Custom ADT_A01 message generates a v24 ACK", ack instanceof
ACK);
}
/**
* This test will only pass with hapi-structures-v231 as a project
dependency.
* <p/>
* ca.uhn.hl7v2.HL7Exception: No map found for version V231. Only the
following are available: [V24]
* <p/>
* Uncomment the hapi-structures-v231 dependency in build.gradle to fix
this unit test.
*
* @throws Exception
*/
@Test
public void testHAPICanParseImplicitADT_A01() throws Exception {
GenericParser genericParser = new GenericParser(HAPI_CONTEXT);
Message adt_a01 = genericParser.parse(ADT_A01_HL7_IMPLICIT);
assertTrue("HAPI parsed HL7 to custom ADT_A01 message", adt_a01
instanceof ADT_A01);
Message ack = adt_a01.generateACK();
assertTrue("Custom ADT_A01 message generates a v24 ACK", ack instanceof
ACK);
}
}
Build.gradle showing dependencies, with comments on changes to change the
results.
apply plugin: 'java'
sourceCompatibility = 1.5
targetCompatibility = 1.5
repositories {
mavenCentral()
}
dependencies {
def hapiVersion = '2.2'
compile 'ca.uhn.hapi:hapi-base:' + hapiVersion
compile 'ca.uhn.hapi:hapi-structures-v24:' + hapiVersion
// Uncommenting the following line fixes the
testHAPICanParseImplicitADT_A01 unit test
//compile 'ca.uhn.hapi:hapi-structures-v231:' + hapiVersion
testCompile 'junit:junit:4.+'
}
Thanks for your help, and thanks again for the API. We have recently tried out
the FHIR 1.0 library at a FHIR connectathon, and found we were not alone in
using it, and that it saved us a lot of time getting underway.
Ian Vowles
Senior Systems Integrator
Department of Health
Queensland
Australia
********************************************************************************
This email, including any attachments sent with it, is confidential and for the
sole use of the intended recipient(s). This confidentiality is not waived or
lost, if you receive it and you are not the intended recipient(s), or if it is
transmitted/received in error.
Any unauthorised use, alteration, disclosure, distribution or review of this
email is strictly prohibited. The information contained in this email,
including any attachment sent with it, may be subject to a statutory duty of
confidentiality if it relates to health service matters.
If you are not the intended recipient(s), or if you have received this email in
error, you are asked to immediately notify the sender by telephone collect on
Australia +61 1800 198 175 or by return email. You should also delete this
email, and any copies, from your computer system network and destroy any hard
copies produced.
If not an intended recipient of this email, you must not copy, distribute or
take any action(s) that relies on it; any form of disclosure, modification,
distribution and/or publication of this email is also prohibited.
Although Queensland Health takes all reasonable steps to ensure this email does
not contain malicious software, Queensland Health does not accept
responsibility for the consequences if any person's computer inadvertently
suffers any disruption to services, loss of information, harm or is infected
with a virus, other malicious computer programme or code that may occur as a
consequence of receiving this email.
Unless stated otherwise, this email represents only the views of the sender and
not the views of the Queensland Government.
**********************************************************************************
------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Hl7api-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hl7api-devel