You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2016/11/29 19:46:58 UTC
[jira] [Resolved] (CAMEL-10509) ManagedCamelContextMBean -
additional namespaces are removed
[ https://issues.apache.org/jira/browse/CAMEL-10509?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-10509.
---------------------------------
Resolution: Fixed
Fix Version/s: 2.18.2
> 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
> Assignee: James Netherton
> Fix For: 2.18.2, 2.19.0
>
>
> - 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)