1 Reply Latest reply: Aug 22, 2011 9:05 AM by Willem Jiang RSS

    XPath on CXF payload

    Daryl Hoyt Newbie

      I have a CXF route which we are using a dataformat of PAYLOAD.  When I get the response back, I want to try to match the XML and decide where the request should then be posted to.  The problem is that I can not seem to be able to get to the XML from the PAYLOAD without first unwrapping it with a custom processor.  Below is my route and custom processor.  Is this the right way to to do it, or is there a better way (perhaps using the Simple Language).  I tried using .setBody(simple("${property.MyRequest.body}")), but that did not help.  Any thoughts are appreciated.

       

          public void configure() throws Exception

          {

              String routeIdentifier = this.getClass().getName();

               String toWebServiceURL = RouteHelper.getProperty("mainURL");

               String listenerPort = RouteHelper.getProperty("webservice.inbound.port");

               String listenerAddress = "http://0.0.0.0:" + listenerPort + "/MyService";

       

               // Listen on the following URL

              from("cxf://" + listenerAddress + //

                      "?portName=" + My_SERVICE_PORT + //

                      "&serviceName=" + My_SERVICE_NAME + //

                      "&wsdlURL=" + My_WSDL + //

                      "&dataFormat=PAYLOAD") //

       

              // Name the route so the UI displays something useful

              .routeId(routeIdentifier) //

       

              // Save the Client Request in a property for later use

              .setProperty("MyRequest", simple("${in.body}")) //

       

              // Send the Client Request

              .to("cxf://" + toWebServiceURL + //

                      "?portName=" + My_SERVICE_PORT + //

                      "&serviceName=" + My_SERVICE_NAME + //

                      "&wsdlURL=" + My_WSDL + //

                      "&dataFormat=PAYLOAD") //

       

              // Save the My Response in a property for later comparison

              .setProperty("MyResponse", simple("${in.body}")) //

       

              // Unwrap the payload

              .process(new CxfPayloadUnwrapper()) //

       

              // If the response contains a ResponseCode element with a value of 0, send it to the topic

              .choice().when(xpath("//My:ResponseCode = 0 and not(My:Error)").namespace("My", My_TARGET_NAME_SPACE)) //

       

              // Set the body back to the request so we can post it to the topic

              .setBody(property("MyRequest")) //

       

              // Unwrap the payload

              .process(new CxfPayloadUnwrapper()) //

       

              // We need to make the MEP in-only since there is no response from the topic.

              .inOnly() //

              // Posting to the topic

              .to(RouteHelper.buildTopicPublisherEndPoint(TOPIC_My_REQUEST))

              // Setting the MEP back to in-out so we can return the response back to the caller

              .inOut() //

       

              // Set the body back to the response so we can return it to the caller

              .setBody(property("MyResponse"));

          }

       

       

          public void process(Exchange exchange) throws Exception

          {

              if (exchange.getIn().getBody() instanceof CxfPayload)

              {

                  @SuppressWarnings("rawtypes")

                  CxfPayload payload = (CxfPayload) exchange.getIn().getBody();

       

                  // Grab the first CxfPayload body

                  // and make it the Exchange body.

                  for (Object o : payload.getBody())

                  {

                      exchange.getIn().setBody(o);

                      break;

                  }

              }

          }