camel-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "James Netherton (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (CAMEL-10509) ManagedCamelContextMBean - additional namespaces are removed
Date Wed, 23 Nov 2016 12:48:58 GMT

    [ https://issues.apache.org/jira/browse/CAMEL-10509?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15690019#comment-15690019
] 

James Netherton commented on CAMEL-10509:
-----------------------------------------

For me the problem is not so much that the NS is missing from the dumped output, rather there's
no logic to add them again after the original route has been removed and replaced.

As you say it's a tricky one. The NamespaceHandler stuff usually happens once when spring
/ blueprint starts. Which is why I suggested my lazy fix as a simple means of cloning the
original route namespaces so that they can be added back when a route is replaced.



> ManagedCamelContextMBean - additional namespaces are removed
> ------------------------------------------------------------
>
>                 Key: CAMEL-10509
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10509
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-core
>    Affects Versions: 2.18.0
>            Reporter: Aurelien Pupier
>
> - Use a specific namespace, declared at CamelContext level, in an Xpath expression of
a When
> something like:
> {noformat}
> <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
>     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="      
       http://www.osgi.org/xmlns/blueprint/v1.0.0 https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd
             http://camel.apache.org/schema/blueprint http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
>     <!--
>       The namespace for the camelContext element in Blueprint is 'https://camel.apache.org/schema/blueprint'.
Additionally,
>       we can also define namespace prefixes we want to use them in the XPath expressions
in our CBR.
>       While it is not required to assign id's to the <camelContext/> and <route/>
elements, it is a good idea
>       to set those for runtime management purposes (logging, JMX MBeans, ...)
>     -->
>     <camelContext id="cbr-example-context"
>         xmlns="http://camel.apache.org/schema/blueprint" xmlns:order="http://fabric8.com/examples/order/v7">
>         <!--
>           When this route is started, it will automatically create the work/cbr/input
directory where you can drop the
>           file that need to be processed.
>           The <log/> elements are used to add human-friendly business logging statements.
They make it easier to see what the
>           route is doing.
>           The <choice/> element contains the content based router. The two <when/>
clauses use XPath to define the criteria 
>           for entering that part of the route. When the country in the XML message is
set to UK or US, the file will be 
>           moved to a directory for that country. The <otherwise/> element ensures
that any file that does not meet the 
>           requirements for either of the <when/> elements will be moved to the
work/cbr/output/others directory.
>         -->
>         <route id="cbr-route">
>             <from id="_from1" uri="file:work/cbr/input"/>
>             <log id="_log1" message="Receiving order ${file:name}"/>
>             <choice id="_choice1">
>                 <when id="_when1">
>                     <xpath id="_xpath1">/order:order/order:customer/order:country
= 'UK'</xpath>
>                     <log id="_log2" message="Sending order ${file:name} to the UK"/>
>                     <to id="_to1" uri="file:work/cbr/output/uk"/>
>                 </when>
>                 <when id="_when2">
>                     <xpath id="_xpath2">/order:order/order:customer/order:country
= 'US'</xpath>
>                     <log id="_log3" message="Sending order ${file:name} to the US"/>
>                     <to id="_to2" uri="file:work/cbr/output/us"/>
>                 </when>
>                 <otherwise id="_otherwise1">
>                     <log id="_log4" message="Sending order ${file:name} to another
country"/>
>                     <to id="_to3" uri="file:work/cbr/output/others"/>
>                 </otherwise>
>             </choice>
>             <log id="_log5" message="Done processing ${file:name}"/>
>         </route>
>     </camelContext>
> </blueprint>
> {noformat}
> - Deploy the project
> - Using MBean retrieve dumpRoutesAsXml is providing a route without the additional xml
namespace provided xmlns:order="http://fabric8.com/examples/order/v7"
> {noformat}
> <?xml version="1.0" encoding="UTF-8"?>
> <routes id="cbr-example-context" xmlns="http://camel.apache.org/schema/spring">
>     <route customId="true" id="cbr-route">
>         <from customId="true" id="_from1" uri="file:work/cbr/input"/>
>         <log customId="true" id="_log1" message="XXXYYY"/>
>         <choice customId="true" id="_choice1">
>             <when customId="true" id="_when1">
>                 <xpath id="_xpath1">/order:order/order:customer/order:country =
'UK'</xpath>
>                 <log customId="true" id="_log2" message="Sending order ${file:name}
to the UK"/>
>                 <to customId="true" id="_to1" uri="file:work/cbr/output/uk"/>
>             </when>
>             <when customId="true" id="_when2">
>                 <xpath id="_xpath2">/order:order/order:customer/order:country =
'US'</xpath>
>                 <log customId="true" id="_log3" message="Sending order ${file:name}
to the US"/>
>                 <to customId="true" id="_to2" uri="file:work/cbr/output/us"/>
>             </when>
>             <otherwise customId="true" id="_otherwise1">
>                 <log customId="true" id="_log4" message="Sending order ${file:name}
to another country"/>
>                 <to customId="true" id="_to3" uri="file:work/cbr/output/others"/>
>             </otherwise>
>         </choice>
>         <log customId="true" id="_log5" message="Done processing ${file:name}"/>
>     </route>
> </routes>
> {noformat}
> - Then use addOrUpdateRoutesFromXml to upload the exact same xml, you will get exceptions
when the When code is invoked:
> {noformat}
> Message History
> ---------------------------------------------------------------------------------------------------------------------------------------
> RouteId              ProcessorId          Processor                                 
                                      Elapsed (ms)
> [cbr-route         ] [cbr-route         ] [file://work/cbr/input                    
                                    ] [         1]
> [cbr-route         ] [_log1             ] [log                                      
                                    ] [         0]
> [cbr-route         ] [_choice1          ] [when[xpath{XPath: /order:order/order:customer/order:country
= 'UK'}]choice[whe] [         1]
> Stacktrace
> ---------------------------------------------------------------------------------------------------------------------------------------
> org.apache.camel.builder.xml.InvalidXPathExpression: Invalid xpath: /order:order/order:customer/order:country
= 'UK'. Reason: javax.xml.xpath.XPathExpressionException: com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception:
Prefix must resolve to a namespace: order
> 	at org.apache.camel.builder.xml.XPathBuilder.evaluateAs(XPathBuilder.java:769)
> 	at org.apache.camel.builder.xml.XPathBuilder.matches(XPathBuilder.java:155)
> 	at org.apache.camel.processor.FilterProcessor.matches(FilterProcessor.java:65)
> 	at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:93)
> 	at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
> 	at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:468)
> 	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)
> 	at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
> 	at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
> 	at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:196)
> 	at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:454)
> 	at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:226)
> 	at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:190)
> 	at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:175)
> 	at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:102)
> 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> 	at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
> 	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
> 	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
> 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> 	at java.lang.Thread.run(Thread.java:745)
> Caused by: javax.xml.xpath.XPathExpressionException: com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception:
Prefix must resolve to a namespace: order
> 	at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(XPathImpl.java:400)
> 	at org.apache.camel.builder.xml.XPathBuilder.createXPathExpression(XPathBuilder.java:958)
> 	at org.apache.camel.builder.xml.XPathBuilder.evaluateAs(XPathBuilder.java:767)
> 	... 21 more
> Caused by: com.sun.org.apache.xpath.internal.domapi.XPathStylesheetDOM3Exception: Prefix
must resolve to a namespace: order
> 	at com.sun.org.apache.xpath.internal.compiler.XPathParser.errorForDOM3(XPathParser.java:657)
> 	at com.sun.org.apache.xpath.internal.compiler.Lexer.mapNSTokens(Lexer.java:642)
> 	at com.sun.org.apache.xpath.internal.compiler.Lexer.tokenize(Lexer.java:269)
> 	at com.sun.org.apache.xpath.internal.compiler.Lexer.tokenize(Lexer.java:100)
> 	at com.sun.org.apache.xpath.internal.compiler.XPathParser.initXPath(XPathParser.java:114)
> 	at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:180)
> 	at com.sun.org.apache.xpath.internal.XPath.<init>(XPath.java:268)
> 	at com.sun.org.apache.xpath.internal.jaxp.XPathImpl.compile(XPathImpl.java:392)
> {noformat}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message