Claus Ibsen created CAMEL-26282:
-----------------------------------

             Summary: camel-flowable - xml inbound channels parse events with 
the Camel XML settings
                 Key: CAMEL-26282
                 URL: https://issues.apache.org/jira/browse/CAMEL-26282
             Project: Camel
          Issue Type: Improvement
            Reporter: Claus Ibsen
            Assignee: Claus Ibsen
             Fix For: 4.24.0, 4.22.3, 4.18.6


When a Flowable event registry inbound channel of type {{camel}} uses 
{{deserializerType: xml}}, the {{flowable:}} producer hands the message body to 
Flowable's {{StringToXmlDocumentDeserializer}}. In Flowable 7.x that class 
builds a {{DocumentBuilderFactory}} with the JDK default settings, unlike the 
XML parsing elsewhere in Camel (for example {{XmlConverter}}) and unlike 
Flowable 8, which configures the factory explicitly. Camel stays on Flowable 
7.2.0 for now (Flowable 8 needs Jackson 3, see CAMEL-23143).

h3. Today

{{FlowableProducer}} passes the body unchanged to 
{{InboundChannelModel.getInboundEventProcessingPipeline()}}, and the xml 
pipeline parses it with the Flowable 7.x deserializer. DOCTYPE declarations, 
external DTDs and XInclude are processed with the JDK defaults.

h3. After the change

Inbound camel channels with the xml deserializer parse the event with the same 
settings Camel uses for its own XML parsing (and that Flowable 8 uses): secure 
processing on, external general and parameter entities off, external DTD 
loading off, entity reference expansion off, XInclude off, and 
{{ACCESS_EXTERNAL_DTD}} / {{ACCESS_EXTERNAL_SCHEMA}} set to empty. A channel 
that sets its own {{deserializerDelegateExpression}} keeps its own deserializer.

h3. Code change

* New 
{{org.apache.camel.component.flowable.CamelStringToXmlDocumentDeserializer}}, 
extending Flowable's {{StringToXmlDocumentDeserializer}} and overriding 
{{deserialize}} with a configured {{DocumentBuilderFactory}} (each feature or 
attribute set in a try/catch for parser implementations that do not support 
it). Inline, no new dependency.
* {{FlowableProducer}}: before {{eventReceived}}, when the channel's pipeline 
is a {{DefaultInboundEventProcessingPipeline}} whose deserializer is exactly 
{{StringToXmlDocumentDeserializer}} (class equality), replace it with the Camel 
deserializer via {{setInboundEventDeserializer}}. Doing it in the producer 
keeps it independent of the order of Flowable's channel model processors and 
also covers redeployed channels.
* {{flowable-component.adoc}}: a note on how xml inbound channels are parsed 
and that {{deserializerDelegateExpression}} selects a different parser; 
regenerate the catalog doc copy.
* Upgrade guide notes for 4.24.0, 4.22.3 and 4.18.6: xml events that rely on a 
DOCTYPE with external entities or an external DTD no longer have them loaded.

h3. Tests

* {{FlowableInboundXmlChannelTest#xmlEventStartsProcessWithMappedVariables}}: a 
new xml channel and event definition; an XML body starts the process with the 
mapped variables (there is no xml channel test today).
* {{FlowableInboundXmlChannelTest#xmlChannelUsesCamelXmlDeserializer}}: after a 
send, the channel pipeline uses the Camel deserializer.
* {{FlowableInboundXmlChannelTest#customXmlDeserializerIsKept}}: a channel with 
{{deserializerDelegateExpression}} keeps its own deserializer.
* 
{{CamelStringToXmlDocumentDeserializerTest#entityDeclaredInDoctypeIsNotExpandedFromFile}}:
 a body whose DOCTYPE declares an entity pointing at a file under {{target/}} 
does not get the file content in the parsed document.

Related: CAMEL-26118 changes the same producer.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to