camel-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From titexe <tit...@yahoo.Fr>
Subject Re: camel : xpath & text()
Date Thu, 17 Dec 2009 08:34:47 GMT

thank you for your answers,

I am in testing phase, the solutions you have proposed

Claus excuse me, I have to put your code (in which file camel.xml or
activemq.xml) and in each part?

thank you



Claus Ibsen-2 wrote:
> 
> On Thu, Dec 17, 2009 at 3:25 AM, Stephen Gargan <steve.gargan@gmail.com>
> wrote:
>> I'm guessing that you expected to receive the 'ALLAH' string at your
>> endpoint and were receiving a DeferredCDATASectionImpl object instead is
>> this correct? The unit test below illustrates what is happening (it uses
>> the
>> java DSL with the first of the 3 routes being pretty much the same as
>>  what
>> your spring xml route is defining).
>>
>> The test 'testFailsDueToTypeConversion' shows that what you actually
>> receive
>> from the xpath split is a instance of DeferredCDATASectionImpl. I'm
>> guessing
>> you expected this to be a String and were trying to use value() to make
>> it
>> so. There are a couple of ways to do this as the rest of the test shows.
>>
>> First and easiest is to use a result type in your xpath expression, e.g.
>> xpath("/request/header/source/text()", String.class), this will correctly
>> extract the data from the DeferredCDATASectionImpl object. Unfortunately,
>> you cannot currently specify a result type in an XML route, though It
>> would
>> be an easy thing to add so maybe you should open a Jira ticket.
>>
> 
> Yes you can specify that in Spring XML. There is an attribute for that.
> 
>  <xs:complexType name="xPathExpression">
>     <xs:simpleContent>
>       <xs:extension base="tns:namespaceAwareExpression">
>         <xs:attribute name="resultType" type="xs:string"/>
>       </xs:extension>
>     </xs:simpleContent>
>   </xs:complexType>
> 
>> Secondly you could use an intermediate bean to grab the data from the
>> DeferredCDATASectionImpl and pass it on e.g. 'testWithBeanConversion.'
>>
>> Third and probably the best would be to add an explicit type converter
>> for
>> it. The test 'testWithRegisteredConverter' shows how using the
>> CDataTypeConverter bean below. There is excellent documentation on Type
>> converters at the Camel website
>> http://camel.apache.org/type-converter.html
>>
>> Hope this helps,
>>
>> ste
>>
>> public class CDataXPathTest extends ContextTestSupport
>> {
>>    @Override
>>    protected RouteBuilder createRouteBuilder() throws Exception
>>    {
>>        return new RouteBuilder()
>>        {
>>            @Override
>>            public void configure() throws Exception
>>            {
>>
>>
>> from("direct:xpath-no-conversion").split().xpath("/request/header/source/text()").to("mock:test");
>>
>> from("direct:xpath-with-result-type").split().xpath("/request/header/source/text()",
>> String.class).to("mock:test");
>>
>> from("direct:xpath-with-bean-converter").split().xpath("/request/header/source/text()").bean(new
>> MySourceProcessor()).to("mock:test");
>>            }
>>        };
>>    }
>>
>>    public void testFailsDueToTypeConversion() throws Exception
>>    {
>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>        mock.expectedMessageCount(1);
>>
>>        String xml =
>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>        sendBody("direct:xpath-no-conversion", xml);
>>
>>        mock.await();
>>        mock.assertIsSatisfied();
>>
>>        Object receieved =
>> ExchangeHelper.getMandatoryInBody(mock.getReceivedExchanges().get(0));
>>        assertIsInstanceOf(DeferredCDATASectionImpl.class, receieved);
>>    }
>>
>>
>>    public void testWithResultTypeConversion() throws Exception
>>    {
>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>        mock.expectedBodiesReceived("ALLAH");
>>
>>        String xml =
>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>        sendBody("direct:xpath-with-result-type", xml);
>>
>>        mock.await();
>>        mock.assertIsSatisfied();
>>    }
>>
>>    public void testWithBeanConversion() throws Exception
>>    {
>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>        mock.expectedBodiesReceived("ALLAH");
>>
>>        String xml =
>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>        sendBody("direct:xpath-with-bean-converter", xml);
>>
>>        mock.await();
>>        mock.assertIsSatisfied();
>>    }
>>
>>    public void testWithRegisteredConverter() throws Exception
>>    {
>>        context.getTypeConverterRegistry().addTypeConverter(String.class,
>> DeferredCDATASectionImpl.class, new CDataTypeConverter());
>>        MockEndpoint mock = getMockEndpoint("mock:test");
>>        mock.expectedBodiesReceived("ALLAH");
>>
>>        String xml =
>> "<request><header><source><![CDATA[ALLAH]]></source></header></request>";
>>        sendBody("direct:xpath-no-conversion", xml);
>>
>>        mock.await();
>>        mock.assertIsSatisfied();
>>    }
>>
>>    public static class MySourceProcessor
>>    {
>>        public String handleCdata(DeferredCDATASectionImpl payload)
>>        {
>>            return payload.getData();
>>        }
>>    }
>>
>>    public static class CDataTypeConverter implements TypeConverter
>>    {
>>        public <T> T convertTo(Class<T> type, Object value) {
>>            DeferredCDATASectionImpl cdata =
>> (DeferredCDATASectionImpl)value;
>>            return (T) cdata.getData();
>>        }
>>
>>        public <T> T convertTo(Class<T> type, Exchange exchange, Object
>> value) {
>>            return convertTo(type, value);
>>        }
>>
>>        public <T> T mandatoryConvertTo(Class<T> type, Object value)
{
>>            return convertTo(type, value);
>>        }
>>
>>        public <T> T mandatoryConvertTo(Class<T> type, Exchange exchange,
>> Object value) {
>>            return convertTo(type, value);
>>        }
>>    }
>> }
>>
>> On Wed, Dec 16, 2009 at 9:27 AM, titexe <titexe@yahoo.fr> wrote:
>>
>>>
>>> hello,
>>>
>>> my xpath query does not work, when I put the text value () to finish:
>>>
>>> /request/header/source/text()
>>>
>>> body of my message :
>>>
>>> <?xml version="1.0" encoding="UTF-8"?>
>>> <request>
>>>        <header>
>>>                <source><![CDATA[ALLAH]]></source>
>>>        </header>
>>> </request>
>>>
>>>
>>> my route :
>>>
>>> <route>
>>> <from uri="activemq:queue:IN1"/>
>>> <split>
>>> <xpath>/request/header/source/text()</ xpath>
>>>
>>> <t uri="activemq:queue:XML"/>
>>> </ Split>
>>> <t uri="activemq:queue:RESULT"/>
>>> </ route>
>>>
>>> any idea?
>>>
>>> thanks in advance,
>>>
>>> titexe
>>> --
>>> View this message in context:
>>> http://old.nabble.com/camel-%3A-xpath---text%28%29-tp26815065p26815065.html
>>> Sent from the Camel - Users mailing list archive at Nabble.com.
>>>
>>>
>>
> 
> 
> 
> -- 
> Claus Ibsen
> Apache Camel Committer
> 
> Author of Camel in Action: http://www.manning.com/ibsen/
> Open Source Integration: http://fusesource.com
> Blog: http://davsclaus.blogspot.com/
> Twitter: http://twitter.com/davsclaus
> 
> 

-- 
View this message in context: http://old.nabble.com/camel-%3A-xpath---text%28%29-tp26815065p26824799.html
Sent from the Camel - Users mailing list archive at Nabble.com.


Mime
View raw message