cflint / CFLint

Static code analysis for CFML (a linter)
BSD 3-Clause "New" or "Revised" License
173 stars 84 forks source link

Exception Writing Output From API #691

Open mandrachek opened 4 years ago

mandrachek commented 4 years ago

I'm utilizing the CFLintAPI, and am attempting to call result.writeHTML("default.xsl",writer) - it doesn't matter which htmlStyle value I provide, I get:

net.sf.saxon.trans.XPathException: Values of 'standalone' and 'omit-xml-declaration' conflict

ryaneberly commented 4 years ago

Looks like that method is used two places https://github.com/cflint/CFLint/search?q=writeHTML&unscoped_q=writeHTML you tried "plain.xsl" as well?

mandrachek commented 3 years ago

Yeah, I tried all of the ones in https://github.com/cflint/CFLint/tree/master/src/main/resources/findbugs I know had a similar issue previously when working with spotbugs (which is the replacement for findbugs) - I think it might be down to changes in the XML parsing between Java 7 and Java 8.

https://github.com/spotbugs/spotbugs/pull/1000 https://github.com/spotbugs/spotbugs-gradle-plugin/issues/114

mandrachek commented 3 years ago

I get this error if I use plain.xsl or default.xsl and writeHTML or writeFindBugsXml

Error evaluating ((attr{sequence=...}, ...)) on line 13 column 42 
  SEPM0009: Values of 'standalone' and 'omit-xml-declaration' conflict
  In template rule with match="/" on line 9 of 

This is the stack trace from writeHTML():

Caused by: java.io.IOException: net.sf.saxon.trans.XPathException: Values of 'standalone' and 'omit-xml-declaration' conflict
        at com.cflint.api.CFLintResult.writeHTML(CFLintResult.java:69)
        at com.cflint.api.CFLintResult$writeHTML$0.call(Unknown Source)
        at build_btckcrxfi6v2dy709jqu7edvu$_run_closure11$_closure23.doCall(/Users/andrachekm/IdeaProjects/proj/build.gradle:191)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.doExecute(AbstractTask.java:680)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.lambda$execute$0(AbstractTask.java:667)
        at org.gradle.configuration.internal.DefaultUserCodeApplicationContext$CurrentApplication.reapply(DefaultUserCodeApplicationContext.java:86)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:667)
        at org.gradle.api.internal.AbstractTask$ClosureTaskAction.execute(AbstractTask.java:642)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:555)
        ... 90 more
Caused by: net.sf.saxon.trans.XPathException: Values of 'standalone' and 'omit-xml-declaration' conflict
        at net.sf.saxon.serialize.XMLEmitter.writeDeclaration(XMLEmitter.java:271)
        at net.sf.saxon.serialize.XMLEmitter.openDocument(XMLEmitter.java:188)
        at net.sf.saxon.serialize.XMLEmitter.startElement(XMLEmitter.java:359)
        at net.sf.saxon.serialize.XMLIndenter.startElement(XMLIndenter.java:119)
        at net.sf.saxon.event.ProxyReceiver.startElement(ProxyReceiver.java:132)
        at net.sf.saxon.event.SequenceNormalizer.startElement(SequenceNormalizer.java:88)
        at net.sf.saxon.event.NamespaceReducer.startElement(NamespaceReducer.java:75)
        at net.sf.saxon.event.ComplexContentOutputter.startContent(ComplexContentOutputter.java:640)
        at net.sf.saxon.event.ComplexContentOutputter.startElement(ComplexContentOutputter.java:271)
        at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:345)
        at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:299)
        at net.sf.saxon.expr.instruct.Block.processLeavingTail(Block.java:735)
        at net.sf.saxon.expr.instruct.Instruction.process(Instruction.java:132)
        at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:352)
        at net.sf.saxon.expr.instruct.ElementCreator.processLeavingTail(ElementCreator.java:299)
        at net.sf.saxon.expr.LetExpression.processLeavingTail(LetExpression.java:721)
        at net.sf.saxon.expr.instruct.TemplateRule.applyLeavingTail(TemplateRule.java:352)
        at net.sf.saxon.trans.Mode.applyTemplates(Mode.java:532)
        at net.sf.saxon.trans.XsltController.applyTemplates(XsltController.java:747)
        at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:347)
        at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:349)
        at net.sf.saxon.jaxp.TransformerImpl.transform(TransformerImpl.java:71)
        at com.cflint.XMLOutput.outputFindBugs(XMLOutput.java:157)
        at com.cflint.HTMLOutput.output(HTMLOutput.java:49)
        at com.cflint.api.CFLintResult.writeHTML(CFLintResult.java:67)
        ... 101 more

FWIW, I'm running this from a gradle task using Gradle 6.7:

buildscript {
    repositories {
         jcenter()
         mavenCentral()
    }
    dependencies {
                classpath 'com.github.cflint:CFLint:1.5.0'
    }
}

import com.cflint.api.CFLintAPI
import com.cflint.api.CFLintResult
import com.cflint.Levels

task cflint(group: 'verification') {

    doFirst {
        mkdir "${project.buildDir}/reports/cflint"
    }

    doLast {
        CFLintAPI api = new CFLintAPI()

        def scanFiles = new ArrayList<String>()

        fileTree("src").each {
            if (it.name.toLowerCase().endsWithAny("cfc","cfm")) {
                scanFiles.add(it.absolutePath)
            }
        }
        CFLintResult result = api.scan(scanFiles)

        result.writeXml(
                file("${project.buildDir}/reports/cflint/main.xml").newWriter()
        )

        /*
            --- these both fail ---
        result.writeHTML(
            "plain.xsl",
            file("${project.buildDir}/reports/cflint/main.html").newWriter()
        )

        result.writeFindBugsXml(file("${project.buildDir}/reports/cflint/main.xml").newWriter())
         */
    }
}