camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jason Chaffee <jchaf...@shopzilla.com>
Subject Re: Setting Header as Xpath expression
Date Tue, 04 Dec 2012 09:50:15 GMT
If I use String.class instead of Integer.class it works.  It could be an
issue with my javascript why the Integer.class didnĀ¹t work.



On 12/4/12 1:20 AM, "Jason Chaffee" <jchaffee@shopzilla.com> wrote:

>Tried that, but for some reason it fails to give me the expected results
>as it stops processing after 18,000 records whereas my "hack" finishes
>correctly after 34254 records.
>
>
>
>On 12/3/12 11:19 PM, "Willem jiang" <willem.jiang@gmail.com> wrote:
>
>>Hi,
>>
>>You should be able to set the xpath expression result like this
>>.setHeader("hasMore",
>>ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns1
>>:
>>hasMore/text()", Integer.class))
>>
>>The you don't need to header in you processor.
>>
>>-- 
>>Willem Jiang
>>
>>Red Hat, Inc.
>>FuseSource is now part of Red Hat
>>Web: http://www.fusesource.com | http://www.redhat.com
>>Blog: http://willemjiang.blogspot.com (http://willemjiang.blogspot.com/)
>>(English)
>>          http://jnn.javaeye.com (http://jnn.javaeye.com/) (Chinese)
>>Twitter: willemjiang
>>Weibo: willemjiang
>>
>>
>>
>>
>>
>>On Tuesday, December 4, 2012 at 11:00 AM, Jason Chaffee wrote:
>>
>>> 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/ns
>>>1
>>>:hasMore/text()"))
>>> .setHeader("recordsReturned",
>>>ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns
>>>1
>>>:recordsReturned/text()"))
>>> .setHeader("totalRecordsAvailable",
>>>ns.xpath("/soapenv:Envelope/soapenv:Body/ns1:getItemsResponse/ns1:out/ns
>>>1
>>>: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('Savi
>>>n
>>>gsStartIndex')) +
>>>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('totalR
>>>e
>>>cordsAvailable')) -
>>>parseInt(request.headers.get('StartIndex'))).toFixed()")
>>> .endChoice()
>>> .wireTap("seda:CreateMessage")
>>> .endChoice()
>>> .split()
>>> .tokenizeXML("ns1:items")
>>> .parallelProcessing()
>>> .streaming()
>>> .to("jms:queue:Split")
>>
>>
>>
>>
>
>


Mime
View raw message