XDS Tutorial: error when calling ITI-41 with ProvideAndRegisterDocumentSetRequestType via custom route

51 views
Skip to first unread message

Jake Smolka

unread,
Aug 24, 2018, 12:18:21 PM8/24/18
to ipf-user
I have a problem when extending IPF's XDS tutorial to create customized ITI-41 requests. To see if IPF fits into my actual use-case I tried to write the following small prototype:

Based on the XDS tutorial I added routes with an additional RouteBuilder, to accept messages over another interface and pipe them to ITI-41 like so:

class CustomRouteBuilder extends RouteBuilder {
    private final static Logger log = LoggerFactory.getLogger(CustomRouteBuilder.class)

    @Override
    public void configure() throws Exception {
        errorHandler(noErrorHandler())

        restConfiguration()
            .component("restlet")
            .host("localhost").port("8088")

        // Entry point for POSTing compositions
        rest().post("/ehr/{ehr_id}/composition")
            .to("direct:postComposition")

        from("direct:postComposition")
            .process(new CustomProcessor())
            .convertBodyTo(ProvideAndRegisterDocumentSetRequestType.class)
// Debugging           
.process(iti41RequestValidator())
            .log(log) { 'sending iti41: ' + it.in.getBody(ProvideAndRegisterDocumentSet.class) }
        // Forward to XDS web service
            .to('xds-iti41:xds-iti41')
        // Create success response
            .transform ( constant(new Response(Status.SUCCESS)) )
    }
}

This router works fine and all three steps: processing, converting, validating are executed just fine. But when the messages arrives in the tutorial's ITI-41 route following error is thrown:

16:51:10.435 [Restlet-1019887229] WARN org.apache.cxf.phase.PhaseInterceptorChain - Interceptor for {urn:ihe:iti:xds-b:2007}DocumentRepository_Service#{urn:ihe:iti:xds-b:2007}DocumentRepository_ProvideAndRegisterDocumentSet-b has thrown exception, unwinding now
org
.apache.cxf.interceptor.Fault: Marshalling Error: xds-iti41
...

Several lines later I can read the following, showing the message gets trough (and additional information about the error, with complete stack at the end of this email):

Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId              ProcessorId          Processor                                                                        Elapsed (ms)
[route2            ] [route2            ] [restlet://http://localhost:8088/ehr/{ehr_id}/composition?restletMethods=POST  ] [       566]
[route2            ] [to43              ] [direct:postComposition                                                        ] [       551]
[route38           ] [process43         ] [Processor@0x5b3b1619                                                          ] [        19]
[route38           ] [process44         ] [Processor@0x5f1946dc                                                          ] [       210]
[route38           ] [convertBodyTo2    ] [convertBodyTo[org.openehealth.ipf.commons.ihe.xds.core.ebxml.ebxml30.ProvideAn] [        28]
[route38           ] [process45         ] [Processor@0x5600bd9d                                                          ] [        37]
[route38           ] [process46         ] [Processor@0x5346381a                                                          ] [        15]
[route38           ] [to41              ] [xds-iti41:xds-iti41                                                           ] [       237]

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
javax
.xml.ws.soap.SOAPFaultException: Marshalling Error: xds-iti41

So, am I right assuming that means the message should at the tutorial's original ITI-41 route, i.e. successfully went through my routes? If that's true, I don't understand why a ProvideAndRegisterDocumentSetRequestType produces problems with marshalling. Technically that class is a correct input to ITI-41, right? So the data has to be wrong. But the only thing the processor does is ditching the POST input and creating a sample ProvideAndRegisterDocumentSet like in the tutorial's test cases:

public class CustomProcessor implements Processor{
    private final static Logger log = LoggerFactory.getLogger(CustomProcessor.class)

    public void process(Exchange exchange) throws Exception {
        // exactly like in test case
        def provideAndRegisterDocSet = SampleData.createProvideAndRegisterDocumentSet()
        def docEntry = provideAndRegisterDocSet.documents[0].documentEntry
        def patientId = docEntry.patientId
        patientId.id = UUID.randomUUID().toString()
        docEntry.uniqueId = '4.3.2.1'
        docEntry.hash = ContentUtils.sha1(provideAndRegisterDocSet.documents[0].getContent(DataHandler))
        docEntry.size = ContentUtils.size(provideAndRegisterDocSet.documents[0].getContent(DataHandler))

        exchange.getIn().setBody(provideAndRegisterDocSet)
    }
}

Can you point me out how to correctly invoke the ITI-41 route in this example?

Best regards,
Jake


PS: Complete stack:

Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
javax.xml.ws.soap.SOAPFaultException: Marshalling Error: xds-iti41
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:161)
    at com.sun.proxy.$Proxy78.documentRepositoryProvideAndRegisterDocumentSetB(Unknown Source)
    at org.openehealth.ipf.platform.camel.ihe.xds.iti41.Iti41Producer.callService(Iti41Producer.java:40)
    at org.openehealth.ipf.platform.camel.ihe.xds.iti41.Iti41Producer.callService(Iti41Producer.java:1)
    at org.openehealth.ipf.platform.camel.ihe.ws.AbstractWsProducer.process(AbstractWsProducer.java:143)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:110)
    at org.apache.camel.builder.NoErrorHandlerBuilder$1.process(NoErrorHandlerBuilder.java:40)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:138)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:101)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.component.direct.DirectBlockingProducer.process(DirectBlockingProducer.java:53)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:148)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:548)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:201)
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97)
    at org.apache.camel.component.restlet.RestletConsumer$1.handle(RestletConsumer.java:68)
    at org.apache.camel.component.restlet.MethodBasedRouter.handle(MethodBasedRouter.java:58)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:641)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Router.doHandle(Router.java:422)
    at org.restlet.routing.Router.handle(Router.java:641)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.engine.application.StatusFilter.doHandle(StatusFilter.java:140)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.routing.Filter.doHandle(Filter.java:150)
    at org.restlet.routing.Filter.handle(Filter.java:197)
    at org.restlet.engine.CompositeHelper.handle(CompositeHelper.java:202)
    at org.restlet.Component.handle(Component.java:408)
    at org.restlet.Server.handle(Server.java:507)
    at org.restlet.engine.connector.ServerHelper.handle(ServerHelper.java:63)
    at org.restlet.engine.adapter.HttpServerHelper.handle(HttpServerHelper.java:143)
    at org.restlet.engine.connector.HttpServerHelper$1.handle(HttpServerHelper.java:79)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
    at sun.net.httpserver.AuthFilter.doFilter(AuthFilter.java:83)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:82)
    at sun.net.httpserver.ServerImpl$Exchange$LinkHandler.handle(ServerImpl.java:675)
    at com.sun.net.httpserver.Filter$Chain.doFilter(Filter.java:79)
    at sun.net.httpserver.ServerImpl$Exchange.run(ServerImpl.java:647)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.xml.bind.MarshalException: null
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:335)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:183)
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.writeObject(JAXBEncoderDecoder.java:614)
    at org.apache.cxf.jaxb.JAXBEncoderDecoder.marshall(JAXBEncoderDecoder.java:243)
    at org.apache.cxf.jaxb.io.DataWriterImpl.write(DataWriterImpl.java:239)
    at org.apache.cxf.interceptor.AbstractOutDatabindingInterceptor.writeParts(AbstractOutDatabindingInterceptor.java:137)
    at org.apache.cxf.wsdl.interceptors.BareOutInterceptor.handleMessage(BareOutInterceptor.java:68)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:308)
    at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:442)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:343)
    at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296)
    at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
    at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:139)
    ... 48 common frames omitted
Caused by: com.ctc.wstx.exc.WstxIOException: xds-iti41
    at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteAttr(BaseNsStreamWriter.java:537)
    at com.ctc.wstx.sw.BaseNsStreamWriter.writeAttribute(BaseNsStreamWriter.java:233)
    at com.sun.xml.bind.v2.runtime.output.XMLStreamWriterOutput.attribute(XMLStreamWriterOutput.java:146)
    at com.sun.xml.bind.v2.runtime.output.XmlOutputAbstractImpl.attribute(XmlOutputAbstractImpl.java:110)
    at com.sun.xml.bind.v2.runtime.output.MTOMXmlOutput.attribute(MTOMXmlOutput.java:97)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.attribute(XMLSerializer.java:446)
    at com.sun.xml.bind.v2.runtime.property.AttributeProperty.serializeAttributes(AttributeProperty.java:103)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeAttributes(ClassBeanInfoImpl.java:383)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:689)
    at com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69)
    at com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172)
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:351)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:160)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75)
    at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:118)
    at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158)
    at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696)
    at com.sun.xml.bind.v2.runtime.property.SingleElementNodeProperty.serializeBody(SingleElementNodeProperty.java:158)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:160)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl$1.serializeBody(ElementBeanInfoImpl.java:130)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeBody(ElementBeanInfoImpl.java:332)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:339)
    at com.sun.xml.bind.v2.runtime.ElementBeanInfoImpl.serializeRoot(ElementBeanInfoImpl.java:75)
    at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494)
    at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:328)
    ... 61 common frames omitted
Caused by: java.net.UnknownHostException: xds-iti41
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at sun.net.NetworkClient.doConnect(NetworkClient.java:175)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:463)
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:558)
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:242)
    at sun.net.www.http.HttpClient.New(HttpClient.java:339)
    at sun.net.www.http.HttpClient.New(HttpClient.java:357)
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1220)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1199)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1050)
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:984)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1334)
    at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1309)
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.setupWrappedStream(URLConnectionHTTPConduit.java:275)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1345)
    at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1306)
    at org.apache.cxf.transport.http.URLConnectionHTTPConduit$URLConnectionWrappedOutputStream.onFirstWrite(URLConnectionHTTPConduit.java:307)
    at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:47)
    at org.apache.cxf.io.AbstractThresholdOutputStream.unBuffer(AbstractThresholdOutputStream.java:89)
    at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:63)
    at com.ctc.wstx.io.UTF8Writer.write(UTF8Writer.java:143)
    at com.ctc.wstx.sw.BufferingXmlWriter.flushBuffer(BufferingXmlWriter.java:1416)
    at com.ctc.wstx.sw.BufferingXmlWriter.writeAttrValue(BufferingXmlWriter.java:1155)
    at com.ctc.wstx.sw.BufferingXmlWriter.writeAttribute(BufferingXmlWriter.java:961)
    at com.ctc.wstx.sw.BaseNsStreamWriter.doWriteAttr(BaseNsStreamWriter.java:526)
    ... 99 common frames omitted

Dmytro Rud

unread,
Aug 25, 2018, 3:56:21 PM8/25/18
to ipf-...@googlegroups.com
Hello Jake

The URI of the producer endpoint (in .to()) shall be
"xds-iti41://hostname:port/path/to/service[?parameters]". See
http://oehf.github.io/ipf/ipf-platform-camel-ihe-xds/iti41.html.

Best regards
Dmytro
> --
> You received this message because you are subscribed to the Google Groups "ipf-user" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to ipf-user+u...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.

Jake Smolka

unread,
Aug 26, 2018, 4:54:38 AM8/26/18
to ipf-user
Thanks, that works! I though details like hostname wouldn't be necessary from inside the same server.

Best regards,
Jake
Reply all
Reply to author
Forward
0 new messages