terser后的HAPI v2:获取整个更改的消息

问题描述:

我有一个HL7消息,其内容我正在用terser.set()方法轻微操纵。一旦我这样做了,我在调试器中看到它已经改变了我想要的方式,但我似乎无法完整恢复整个消息。我试过(例如):terser后的HAPI v2:获取整个更改的消息

HapiContext context = new DefaultHapiContext(); 
Parser  parser = context.getGenericParser(); 
Message  message = parser.parse(MESSAGE); 
Terser  terser = new Terser(message); 

terser.set("/PID-2", "XXX XX XXXX"); 

String fixedMessage = message.encode(); 

...这让我接近,因此,在刚刚竖线(管道),在各自的领域没有结束值线(段线)回来修整(垂直的酒吧简单地被丢弃)。我希望信息与我所输入的信息保持一致(如果在特定情况下我也这样做了修改)。

+0

我在这里写的是一个关于我的用户希望修改或纠正任何目的适合他或她的实际HL7消息的操作。在这个测试例子中,修改是消除SSN。这可能是由于其他原因,如修改日期格式,地址更正等。 –

我想你需要在ParserConfiguration中使用addForcedEncode。

@Test 
    public void testSetManualRepetitions() { 
    try { 
     String m = "MSH|^~\\&|hl7Integration|hl7Integration|||||ADT^A01|||2.3|\r" + 
       "EVN|A01|20130617154644\r" + 
       "PID|1|465 306 5961||407623|Wood^Patrick^^^MR||19700101|1||||||||||\r" + 
       "PV1|1||Location||||||||||||||||261938_6_201306171546|||||||||||||||||||||||||20130617134644|||||||||"; 

     HapiContext hc = new DefaultHapiContext(); 
     ExecutorService es = hc.getExecutorService(); // to avoid npe when closing context should be fixed https://sourceforge.net/p/hl7api/bugs/223/ 
     ParserConfiguration pc = hc.getParserConfiguration(); 
     PipeParser pipeParser = hc.getPipeParser(); 
     Message message = pipeParser.parse(m); 
     Terser terser = new Terser(message); 
     //Add first Address 
     terser.set("/.PID-11(0)-1", "13 Oxford Road"); 
     terser.set("/.PID-11(0)-3", "Oxford"); 
     //Add second Address 
     terser.set("/.PID-11(1)-1", "16 London Road"); 
     terser.set("/.PID-11(1)-3", "London"); 

     pc.addForcedEncode("PID-26-1"); // make sure PID has 26 fields 
     System.out.println(message.encode().replaceAll("\r", "\r\n")); 
     hc.close(); 
    } catch (HL7Exception e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

产量:

/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/bin/java -ea -Didea.launcher.port=7540 "-Didea.launcher.bin.path=/Applications/IntelliJ IDEA CE.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath "/Applications/IntelliJ IDEA CE.app/Contents/lib/idea_rt.jar:/Applications/IntelliJ IDEA CE.app/Contents/plugins/junit/lib/junit-rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_31.jdk/Contents/Home/lib/tools.jar:/Users/thomas/git/Hapi-HL7-Terser/target/test-classes:/Users/thomas/.m2/repository/junit/junit/4.4/junit-4.4.jar:/Users/thomas/.m2/repository/ca/uhn/hapi/hapi-base/2.2/hapi-base-2.2.jar:/Users/thomas/.m2/repository/ca/uhn/hapi/hapi-structures-v21/2.2/hapi-structures-v21-2.2.jar:/Users/thomas/.m2/repository/ca/uhn/hapi/hapi-structures-v23/2.2/hapi-structures-v23-2.2.jar:/Users/thomas/.m2/repository/ca/uhn/hapi/hapi-structures-v24/2.2/hapi-structures-v24-2.2.jar:/Users/thomas/.m2/repository/ca/uhn/hapi/hapi-structures-v25/2.2/hapi-structures-v25-2.2.jar:/Users/thomas/.m2/repository/org/slf4j/slf4j-simple/1.6.0/slf4j-simple-1.6.0.jar:/Users/thomas/.m2/repository/org/slf4j/slf4j-api/1.6.0/slf4j-api-1.6.0.jar:/Users/thomas/.m2/repository/org/slf4j/log4j-over-slf4j/1.6.2/log4j-over-slf4j-1.6.2.jar" com.intellij.rt.execution.application.AppMain com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 com.hl7integration.hapi.tests.SetRepetitionsTerserTest,testSetManualRepetitions 
68 [main] INFO ca.uhn.hl7v2.util.Home - hapi.home is set to /Users/thomas/git/Hapi-HL7-Terser/. 
170 [main] INFO ca.uhn.hl7v2.VersionLogger - HAPI version is: 2.2 
197 [main] INFO ca.uhn.hl7v2.VersionLogger - Default Structure libraries found for HL7 versions 2.1, 2.3, 2.4, 2.5, 
MSH|^~\&|hl7Integration|hl7Integration|||||ADT^A01|||2.3 
EVN|A01|20130617154644 
PID|1|465 306 5961||407623|Wood^Patrick^^^MR||19700101|1|||13 Oxford Road^^Oxford~16 London Road^^London||||||||||||||| 
PV1|1||Location||||||||||||||||261938_6_201306171546|||||||||||||||||||||||||20130617134644 

技术上你是不是改变的消息,你把它解析为一个Java对象,并对其进行编码返回字符串。以便您的输出消息看起来像您的输入消息。之后可能仍然存在细微的差异(例如,如果您的输入消息是动态的)。


从文档(http://hl7api.sourceforge.net/configuring_hapi.html):

强制编码

默认情况下,编码信息HAPI时不会编码任何段或没有内容的并因此具有在没有语义字段消息。

如果您需要将消息传输到希望存在某些空白内容的系统,以获得有关消息中的位置的“提示”,则会导致问题。

的addForcedEncode方法可用于添加应被强制编码的更简洁的路径:

parser.getParserConfiguration()addForcedEncode( “PATIENT_RESULT/ORDER_OBSERVATION/ORC-4”); // ORC-4将仍然存在(但为空),即使ORC没有内容 String encoded = parser.encode(message); 查看JavaDoc的示例。

+0

谢谢。 addForcedEncode()方法没有任何区别。我的输入消息是一个包含'\ r'分隔线的字符串。正如我所说的,message.encode()会产生我想要的输出,包括我的更改,除了在管道中结束的段行(包括我更改的那一行和其他所有未更改的行)(例如|,||)。或者||||||||)不再有这些空管留下,就好像机制决定修剪它们,就好像它们不超过空白区域一样。在我看来,我不应该读每一段,数空|然后再添加它们。 –

+1

我同意你的看法,你不应该计算并放回空的领域。但根据HL7标准,空字段可以省略,这正是HAPI的工作原理。 AddForcedEncode可以工作(如文档所述)。我在生产代码中使用它。我将在答案的更新版本中提供一个完整的示例。我也想“只是改变该死的消息”。 – ThomasW