You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@nifi.apache.org by "Nico Verwer (Jira)" <ji...@apache.org> on 2019/09/04 13:18:00 UTC

[jira] [Commented] (NIFI-6498) XMLTransform processor: XSLT doesn't give detail error message with line number

    [ https://issues.apache.org/jira/browse/NIFI-6498?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16922473#comment-16922473 ] 

Nico Verwer commented on NIFI-6498:
-----------------------------------

Saxon uses an ErrorListener when compiling a stylesheet. The net.sf.saxon.lib.StandardErrorListener writes messages to System.err, if nothing else is specified. Where they end up is unclear to me.

To send the error messages to Nifi's log-file, change the following in TransformXML.java:
{code:java}
    private Templates newTemplates(final ProcessContext context, final String path) throws TransformerConfigurationException, LookupFailureException {
        final Boolean secureProcessing = context.getProperty(SECURE_PROCESSING).asBoolean();
        TransformerFactory factory = TransformerFactory.newInstance();
        final boolean isFilename = context.getProperty(XSLT_FILE_NAME).isSet();
        StringBuffer messages = new StringBuffer();        if (secureProcessing) {
            factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
            // don't be overly DTD-unfriendly forcing http://apache.org/xml/features/disallow-doctype-decl
            factory.setFeature("http://saxon.sf.net/feature/parserFeature?uri=http://xml.org/sax/features/external-parameter-entities", false);
            factory.setFeature("http://saxon.sf.net/feature/parserFeature?uri=http://xml.org/sax/features/external-general-entities", false);
        }
        ErrorListener errorListener = new ErrorListener() {
            @Override
            public void warning(TransformerException exception) throws TransformerException {
                messages.append("Warning: "+exception.getMessage()+"\n");
            }
            @Override
            public void error(TransformerException exception) throws TransformerException {
                messages.append("Error: "+exception.getMessage()+"\n");
            }
            @Override
            public void fatalError(TransformerException exception) throws TransformerException {
                messages.append("Fatal Error: "+exception.getMessage()+"\n");
            }
        };
        factory.setErrorListener(errorListener);
        try {
            if(isFilename) {
                return factory.newTemplates(new StreamSource(path));
            } else {
                final String coordinateKey = lookupService.get().getRequiredKeys().iterator().next();
                final Optional<String> attributeValue = lookupService.get().lookup(Collections.singletonMap(coordinateKey, path));
                if (attributeValue.isPresent() && StringUtils.isNotBlank(attributeValue.get())) {
                    return factory.newTemplates(new StreamSource(new ByteArrayInputStream(attributeValue.get().getBytes(StandardCharsets.UTF_8))));
                } else {
                    throw new TransformerConfigurationException("No XSLT definition is associated to " + path + " in the lookup controller service.");
                }
            }
        } catch (TransformerConfigurationException tce) {
            throw new TransformerConfigurationException("Errors compiling XSLT: "+messages.toString(), tce);
        }
    }

{code}
The important part is the addition of an ErrorListener. Then, exceptions are caught and the collected messages are added to the exception.

I would make a pull request if I could, but I have not been able to get Nifi working in Eclipse on my PC (XPS15, i7, 16GB RAM). Eclipse just keeps mavening things forever. :(

Maybe someone can test this code fragment and add it to Nifi?

> XMLTransform processor: XSLT doesn't give detail error message with line number
> -------------------------------------------------------------------------------
>
>                 Key: NIFI-6498
>                 URL: https://issues.apache.org/jira/browse/NIFI-6498
>             Project: Apache NiFi
>          Issue Type: Improvement
>          Components: Core Framework
>    Affects Versions: 1.9.2
>            Reporter: Raymond
>            Priority: Major
>
> When something is wrong with the XSLT in the XMLTransform processor you get an error, but this is only a general error without any details or the line number where the parsing error occurs. For example when using Saxon from example I get the following error:
> Error on line 17 column 5 SXXP0003: Error reported by XML parser: The element type "xsl:tomplate" must be terminated by the matching end-tag "</xsl:tomplate>".
> When using NiFi the following error is printed:
> 11:07:43 CEST
> ERROR
> 2b4c1dab-3a87-175f-f817-3f3c72af4102
> TransformXml[id=2b4c1dab-3a87-175f-f817-3f3c72af4102] Unable to transform StandardFlowFileRecord[uuid=c4dde8e5-89b0-4f29-8f2d-a97a009cf843,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1564391260760-1, container=default, section=1], offset=0, length=6380],offset=0,name=c4dde8e5-89b0-4f29-8f2d-a97a009cf843,size=6380] due to IOException thrown from TransformXml[id=2b4c1dab-3a87-175f-f817-3f3c72af4102]: java.io.IOException: java.util.concurrent.ExecutionException: javax.xml.transform.TransformerConfigurationException: net.sf.saxon.s9api.SaxonApiException: Stylesheet compilation failed: 1 error reported: org.apache.nifi.processor.exception.ProcessException: IOException thrown from TransformXml[id=2b4c1dab-3a87-175f-f817-3f3c72af4102]: java.io.IOException: java.util.concurrent.ExecutionException: javax.xml.transform.TransformerConfigurationException: net.sf.saxon.s9api.SaxonApiException: Stylesheet compilation failed: 1 error reported
> The error in NiFi gives almost no information for debugging. Would be a big improvement if the Saxon error message is catched and add to the NiFi error message (bulletin board).
>  
>  



--
This message was sent by Atlassian Jira
(v8.3.2#803003)