Claus Ibsen created CAMEL-23763:
-----------------------------------
Summary: camel-xml-io ModelWriter writes kamelet child element as
route attribute breaking XML round-trip
Key: CAMEL-23763
URL: https://issues.apache.org/jira/browse/CAMEL-23763
Project: Camel
Issue Type: Bug
Components: camel-core
Reporter: Claus Ibsen
When a route contains a {{<kamelet name="my-processor"/>}} child element, the
XML ModelWriter in camel-xml-io writes it back as a {{kamelet="false"}}
attribute on the {{<route>}} element instead of preserving the {{<kamelet>}}
child element. This breaks XML round-trip (parse, write, re-parse).
*Input XML:*
{code:xml}
<routes xmlns="http://camel.apache.org/schema/xml-io">
<route>
<from uri="direct:start"/>
<kamelet name="my-processor"/>
<to uri="mock:result"/>
</route>
</routes>
{code}
*Written XML (incorrect):*
{code:xml}
<route kamelet="false" xmlns="http://camel.apache.org/schema/xml-io">
<from uri="direct:start"/>
<to uri="mock:result"/>
</route>
{code}
The {{<kamelet>}} child element is lost entirely, and a spurious
{{kamelet="false"}} attribute appears on the {{<route>}} element. Re-parsing
the written XML then fails with: {{Unexpected attribute 'kamelet'}}.
*Root cause:* {{RouteDefinition}} has a boolean {{kamelet}} field that is a
runtime transient (used internally to mark whether a route originates from a
kamelet). The XML ModelWriter picks up this boolean field and writes it as an
XML attribute, while the actual {{KameletDefinition}} child element (the
Kamelet EIP) is not written. The writer should never serialize the transient
boolean and should always write the {{KameletDefinition}} child element.
*Discovered while:* adding compile-validation tests for the new Java DSL model
writer (CAMEL-23757). The kamelet XML test file had to be placed in
camel-java-io test resources instead of camel-xml-io to avoid breaking the
ModelWriterTest round-trip tests.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)