2017-02-20 93 views
1

我有一個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。這可能是由於其他原因,如修改日期格式,地址更正等。 –

回答

0

我想你需要在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