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 2024/06/15 07:13:00 UTC
[jira] [Commented] (CAMEL-20801) camel-xpath: can't customize the underlying CamelXmlJaxpBulkConverterLoader
[ https://issues.apache.org/jira/browse/CAMEL-20801?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17855197#comment-17855197 ]
Claus Ibsen commented on CAMEL-20801:
-------------------------------------
You can set a custom `DocumentBuilderFactory` implementation on the exchange with property `Exchange.DOCUMENT_BUILDER_FACTORY` then your factory is used instead of the default factory (that is secured out of the box)
> camel-xpath: can't customize the underlying CamelXmlJaxpBulkConverterLoader
> ---------------------------------------------------------------------------
>
> Key: CAMEL-20801
> URL: https://issues.apache.org/jira/browse/CAMEL-20801
> Project: Camel
> Issue Type: Wish
> Affects Versions: 4.6.0
> Reporter: Cosimo Damiano Prete
> Priority: Minor
>
> Hello.
> I've a route which gets in input an XML file (from a TCP connection) and I would like to dump its content on the disk, for debug purposes for example, before processing it.
> {code:java}
> @Override
> public void configure() {
> from(sourceEndpoint) // TCP connection
> .wireTap(rawMessageDumper) // File endpoint; see below
> .to(cdataWrapperEndpoint) // Saxon XSLT component to wrap some elements within CDATA
> .process(ackProcessor); // Send the ACK to the TCP client
> }{code}
> I've been implementing it with a {{wiretap}} to a {{file}} endpoint using as value for the {{fileName}} property an expression that builds the name of the file from some attributes within the XML itself:
> {code:java}
> @Bean
> public FileEndpoint rawMessageDumper(CamelContext context, MessageDumpProperties messageDumpProperties) {
> final FileComponent component = context.getComponent("file", FileComponent.class);
> final FileEndpoint endpoint = new FileEndpoint(null, component);
> endpoint.setFile(messageDumpProperties.getTargetPath());
> endpoint.setExchangePattern(InOut); // Dunno if it's really needed to keep the message also to the rest of the pipeline
> endpoint.setFileName(concatExpression(List.of(
> constantExpression("foo:"),
> xpath("/doc/fooml/@docdate", String.class),
> constantExpression(":"),
> xpath("/doc/fooml/@seq", String.class),
> constantExpression(".xml")
> )));
> return endpoint;
> } {code}
> Unfortunately, when the {{CamelXmlJaxpBulkConverterLoader}} runs to convert the String in input to a Document in order to evaluate the XPath expression, it fails because the [http://apache.org/xml/features/disallow-doctype-decl] feature is disabled and the XML has indeed a {{DOCTYPE}} declaration in it.
> The Saxon XSLT endpoint which I use in the {{to(cdataWrapperEndpoint)}} step of the pipeline is somehow able to automatically use the {{XmlInputFactory}} I've defined in the application context which solved this same issue. Below the code for some reference:
> {code:java}
> @Bean
> public XsltEndpoint cdataWrapperEndpoint(CamelContext context) {
> final XsltSaxonComponent component = context.getComponent("xslt-saxon", XsltSaxonComponent.class);
> final XsltSaxonEndpoint endpoint = new XsltSaxonEndpoint(null, component);
> endpoint.setUriResolver(new XsltUriResolver(context, XSL_FILENAME));
> // The line below is needed if you switch to the XSLT component instead of the Saxon one
> // Do not try to resolve external entities and DTDs
> //endpoint.setEntityResolver((publicId, systemId) -> new InputSource(new StringReader("")));
> return endpoint;
> }
> @Bean
> public XMLOutputFactory outputFactory() {
> return new WstxOutputFactory();
> }
> @Bean
> public XMLInputFactory inputFactory() {
> XMLInputFactory inputFactory = new WstxInputFactory();
> inputFactory.setProperty(IS_NAMESPACE_AWARE, false);
> inputFactory.setProperty(SUPPORT_DTD, false);
> inputFactory.setProperty(IS_SUPPORTING_EXTERNAL_ENTITIES, false);
> inputFactory.setProperty(IS_REPLACING_ENTITY_REFERENCES, false);
> return inputFactory;
> }{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)