You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by "John F. Berry" <bo...@yahoo.com.INVALID> on 2018/06/19 14:06:37 UTC

[Camel route help] HL7 listener, to parse body, to base64 decode, pdf to file on filesystem

I appologize.. Newbie here to the open source/project world.  Long time programmer in other realms.

I have a base64 encoded pdf that will be sent to me via HL7 in the OBX-5-5 field of this message body that I need to decode and create an actual pdf file on a filesystem.  I have tried various themes of attempting to access the unmarshalled structure, but that's where the trail gets cold.
I haven't attached any "code" since it is more representative of thrashing to get some sort of result rather than intelligent design.  I created two maven archetypes (Camel java DSL and Camel spring) and attempted to re-engineer the sample file read-decision-log-write route and take this one step at a time.  Currently I can receive HL7, ACK, unmarshal, log the message body, marshal, and write to entire HL7 message to a file. I wish to receive the HL7, ACK, unmarshal, isolate OBX-5-5, decode it's contents back to binary, and write this to a new file on the file system with a filename and .pdf extension, and dispose of the HL7 message (end the route here).
I've owned :"Camel in Action" for years now, but have not been able yet to apply it's wisdom to my situations.  Perhaps a little hand-holding will help me see the landscape of this technology.  I am missing something, as to what exactly, I've been struggling to figure out. 
So I've been parallel developing two maven projects, one Java DSL and one Spring.  Here's the latest skeleton I have for the Spring version:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Configures the Camel Context-->

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

<bean id="hl7decoder" class="org.apache.camel.component.hl7.HL7MLLPNettyDecoderFactory"/>
<bean id="hl7encoder" class="org.apache.camel.component.hl7.HL7MLLPNettyEncoderFactory"/>
<!--<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec"/> -->

  <camelContext xmlns="http://camel.apache.org/schema/spring">
  
   <endpoint id="hl7listener" uri="mllp://10.105.13.206:8888" />
    <route>
      <from uri="hl7listener"/>
      <convertBodyTo type="java.lang.String" />
      <unmarshal>
        <hl7 validate = "false" />
      </unmarshal>
      <log message="${body}" />
      <marshal><hl7 /> </marshal>
          <log message="Other message"/>
<!--          <convertBodyTo type="java.lang.String"/> -->
          <to uri="file:target/messages/others"/>
    </route>
  </camelContext>
      
</beans>


Ideas?  Thanks!


SOLVED: [Camel route help] HL7 listener, to parse body, to base64 decode, pdf to file on filesystem

Posted by "John F. Berry" <bo...@yahoo.com.INVALID>.
 Thank you!  This helped.
My route ended up looking like this:


package org.mainegeneral.camel;


import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import ca.uhn.hl7v2.model.Message;
import org.apache.camel.builder.RouteBuilder;
import ca.uhn.hl7v2.util.Terser;
import ca.uhn.hl7v2.DefaultHapiContext;
import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.HapiContext;
import java.util.Base64;
import org.apache.camel.spi.DataFormat;


import ca.uhn.hl7v2.parser.Parser;

public class MyRouteBuilder extends RouteBuilder {

    public void configure() {

        from("mllp://MGH16557:8888")
        .log("..Received HL7 message with control id ${header.CamelMllpMessageControlId}")
        .convertBodyTo(String.class)
        .unmarshal()
        .hl7(false)
        .process(new Processor() {
          public void process(Exchange exchange) throws Exception {
          Message message = exchange.getIn().getBody(Message.class);
          ca.uhn.hl7v2.util.Terser terser = new Terser(message);
          String obx5 = terser.get("/.OBX-5-5");
          String EDMId = terser.get("/.OBR-3") + ".pdf";
          String voucher = terser.get("/.OBR-2");

          byte[] decoded = Base64.getDecoder().decode(obx5);
          exchange.getOut().setBody(decoded);
          exchange.getOut().setHeader("voucher", voucher);
          exchange.getOut().setHeader("CamelFileName", EDMId );
            }
          } )
       .log("..Processed voucher ${header.voucher} to file ${header.CamelFileName}")
       .to("file:target/messages/others");
    }

}

    On Tuesday, June 19, 2018, 3:32:11 PM EDT, Quinn Stevenson <qu...@pronoia-solutions.com> wrote:  
 
 I’d have to work out all the XML syntax for this, but you should be able to use the HAPI Terser ( <terser> element in the XML) to extract the field you want.

I’d probably do this in a bean - it’s easy to do the HL7 Decode at that point.

Something like

String myMethod(@Body ca.uhn.hl7v2.model.Message hapiMessage) {
  ca.uhn.hl7v2.util.Terser terser = new Terser(hapiMessage);

  String obx5 = terser.get(“/OBX-5-5”);

  String decoded = Base64.getDecoder().decode(obx5);
}

I know that the above probably won’t run (just made it up for the email) - but hopefully it give’s you an idea.

> On Jun 19, 2018, at 8:06 AM, John F. Berry <bo...@yahoo.com.INVALID> wrote:
> 
> I appologize.. Newbie here to the open source/project world.  Long time programmer in other realms.
> 
> I have a base64 encoded pdf that will be sent to me via HL7 in the OBX-5-5 field of this message body that I need to decode and create an actual pdf file on a filesystem.  I have tried various themes of attempting to access the unmarshalled structure, but that's where the trail gets cold.
> I haven't attached any "code" since it is more representative of thrashing to get some sort of result rather than intelligent design.  I created two maven archetypes (Camel java DSL and Camel spring) and attempted to re-engineer the sample file read-decision-log-write route and take this one step at a time.  Currently I can receive HL7, ACK, unmarshal, log the message body, marshal, and write to entire HL7 message to a file. I wish to receive the HL7, ACK, unmarshal, isolate OBX-5-5, decode it's contents back to binary, and write this to a new file on the file system with a filename and .pdf extension, and dispose of the HL7 message (end the route here).
> I've owned :"Camel in Action" for years now, but have not been able yet to apply it's wisdom to my situations.  Perhaps a little hand-holding will help me see the landscape of this technology.  I am missing something, as to what exactly, I've been struggling to figure out. 
> So I've been parallel developing two maven projects, one Java DSL and one Spring.  Here's the latest skeleton I have for the Spring version:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <!-- Configures the Camel Context-->
> 
> <beans xmlns="http://www.springframework.org/schema/beans"
>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>        xsi:schemaLocation="
>        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
>        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
> 
> <bean id="hl7decoder" class="org.apache.camel.component.hl7.HL7MLLPNettyDecoderFactory"/>
> <bean id="hl7encoder" class="org.apache.camel.component.hl7.HL7MLLPNettyEncoderFactory"/>
> <!--<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec"/> -->
> 
>  <camelContext xmlns="http://camel.apache.org/schema/spring">
>  
>    <endpoint id="hl7listener" uri="mllp://10.105.13.206:8888" />
>    <route>
>      <from uri="hl7listener"/>
>      <convertBodyTo type="java.lang.String" />
>      <unmarshal>
>        <hl7 validate = "false" />
>      </unmarshal>
>      <log message="${body}" />
>      <marshal><hl7 /> </marshal>
>          <log message="Other message"/>
> <!--          <convertBodyTo type="java.lang.String"/> -->
>          <to uri="file:target/messages/others"/>
>    </route>
>  </camelContext>
>      
> </beans>
> 
> 
> Ideas?  Thanks!
> 
  

Re: [Camel route help] HL7 listener, to parse body, to base64 decode, pdf to file on filesystem

Posted by Quinn Stevenson <qu...@pronoia-solutions.com>.
I’d have to work out all the XML syntax for this, but you should be able to use the HAPI Terser ( <terser> element in the XML) to extract the field you want.

I’d probably do this in a bean - it’s easy to do the HL7 Decode at that point.

Something like

String myMethod(@Body ca.uhn.hl7v2.model.Message hapiMessage) {
  ca.uhn.hl7v2.util.Terser terser = new Terser(hapiMessage);

  String obx5 = terser.get(“/OBX-5-5”);

  String decoded = Base64.getDecoder().decode(obx5);
}

I know that the above probably won’t run (just made it up for the email) - but hopefully it give’s you an idea.

> On Jun 19, 2018, at 8:06 AM, John F. Berry <bo...@yahoo.com.INVALID> wrote:
> 
> I appologize.. Newbie here to the open source/project world.  Long time programmer in other realms.
> 
> I have a base64 encoded pdf that will be sent to me via HL7 in the OBX-5-5 field of this message body that I need to decode and create an actual pdf file on a filesystem.  I have tried various themes of attempting to access the unmarshalled structure, but that's where the trail gets cold.
> I haven't attached any "code" since it is more representative of thrashing to get some sort of result rather than intelligent design.  I created two maven archetypes (Camel java DSL and Camel spring) and attempted to re-engineer the sample file read-decision-log-write route and take this one step at a time.  Currently I can receive HL7, ACK, unmarshal, log the message body, marshal, and write to entire HL7 message to a file. I wish to receive the HL7, ACK, unmarshal, isolate OBX-5-5, decode it's contents back to binary, and write this to a new file on the file system with a filename and .pdf extension, and dispose of the HL7 message (end the route here).
> I've owned :"Camel in Action" for years now, but have not been able yet to apply it's wisdom to my situations.  Perhaps a little hand-holding will help me see the landscape of this technology.  I am missing something, as to what exactly, I've been struggling to figure out. 
> So I've been parallel developing two maven projects, one Java DSL and one Spring.  Here's the latest skeleton I have for the Spring version:
> 
> <?xml version="1.0" encoding="UTF-8"?>
> <!-- Configures the Camel Context-->
> 
> <beans xmlns="http://www.springframework.org/schema/beans"
>        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>        xsi:schemaLocation="
>        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
>        http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
> 
> <bean id="hl7decoder" class="org.apache.camel.component.hl7.HL7MLLPNettyDecoderFactory"/>
> <bean id="hl7encoder" class="org.apache.camel.component.hl7.HL7MLLPNettyEncoderFactory"/>
> <!--<bean id="hl7codec" class="org.apache.camel.component.hl7.HL7MLLPCodec"/> -->
> 
>   <camelContext xmlns="http://camel.apache.org/schema/spring">
>   
>    <endpoint id="hl7listener" uri="mllp://10.105.13.206:8888" />
>     <route>
>       <from uri="hl7listener"/>
>       <convertBodyTo type="java.lang.String" />
>       <unmarshal>
>         <hl7 validate = "false" />
>       </unmarshal>
>       <log message="${body}" />
>       <marshal><hl7 /> </marshal>
>           <log message="Other message"/>
> <!--          <convertBodyTo type="java.lang.String"/> -->
>           <to uri="file:target/messages/others"/>
>     </route>
>   </camelContext>
>       
> </beans>
> 
> 
> Ideas?  Thanks!
>