Cosimo Damiano Prete created CAMEL-20801:
--------------------------------------------

             Summary: camel-xpath: can't customize the underlying 
CamelXmlJaxpBulkConverterLoader
                 Key: CAMEL-20801
                 URL: https://issues.apache.org/jira/browse/CAMEL-20801
             Project: Camel
          Issue Type: Bug
    Affects Versions: 4.6.0
            Reporter: Cosimo Damiano Prete


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)

Reply via email to