Currently, I am using Xpath to read some elements from the body that are 
integers.  Later in the process, I need to use those integers in a scripting 
language to do some comparisons and arithmetic.  The problem I am seeing is 
that when I set the header it is a NodeList object instead of the integer or 
string from the XML, this causes the logic in the javascript to fail.  I was 
able to work around the issue, but accessing the NodeList in a Processor and 
converting it and saving it back in the header.  However, this seems very 
clunky and an extra step that I would expect to have to do.

Code example is below, is there a better or cleaner way?

    val ns: Namespaces = new Namespaces("soapenv", 
"http://schemas.xmlsoap.org/soap/envelope/";)
    ns.add("ns1", "https://foobar.com/item/v2";)


    from("seda:Soap")
      .routeId("Soap")
      .setHeader("SOAPAction", constant("\"getItems\""))
      .to("cxf://" + savingsUri.toString())
      .unmarshal().string("UTF-8")
      .setHeader("hasMore", 
ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:hasMore/text()"))
      .setHeader("recordsReturned", 
ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:recordsReturned/text()"))
      .setHeader("totalRecordsAvailable", 
ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1:totalRecordsAvailable/text()"))
      .process(new Processor {
        override def process(exchange: Exchange) {
          val message: Message = exchange.getIn()

          val hasMore: NodeList = message.getHeader("hasMore", 
classOf[NodeList])
          message.setHeader("hasMore", hasMore.item(0).getTextContent())

          val recordsReturned: NodeList = message.getHeader("recordsReturned", 
classOf[NodeList])
          message.setHeader("recordsReturned", 
recordsReturned.item(0).getTextContent())

          val totalRecordsAvailable: NodeList = 
message.getHeader("totalRecordsAvailable", classOf[NodeList])
          message.setHeader("totalRecordsAvailable", 
totalRecordsAvailable.item(0).getTextContent())
        }
      })
      .choice()
        
.when().javaScript("parseInt(request.headers.get('totalRecordsAvailable')) > 
parseInt(request.headers.get('StartIndex'))")
          
.setHeader("StartIndex").javaScript("(parseInt(request.headers.get('SavingsStartIndex'))
 + parseInt(request.headers.get('SavingsPageSize'))).toFixed()")
          .choice()
            
.when().javaScript("parseInt(request.headers.get('totalRecordsAvailable')) - 
parseInt(request.headers.get('StartIndex')) < 
parseInt(request.headers.get('PageSize'))")
              
.setHeader("PageSize").javaScript("(parseInt(request.headers.get('totalRecordsAvailable'))
 - parseInt(request.headers.get('StartIndex'))).toFixed()")
          .endChoice()
          .wireTap("seda:CreateMessage")
      .endChoice()
      .split()
        .tokenizeXML("ns1:items")
        .parallelProcessing()
        .streaming()
      .to("jms:queue:Split")

Reply via email to