Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support xml includes #10356

Open
xenoterracide opened this issue Jul 15, 2021 · 9 comments
Open

support xml includes #10356

xenoterracide opened this issue Jul 15, 2021 · 9 comments

Comments

@xenoterracide
Copy link

xenoterracide commented Jul 15, 2021

I want includes to work.

both the ENTITY and the xi:include would be nice. If it should work now, could you please add a howto to the documentation under configuration?

I know there are security implications, I'm not certain if you can disable the truly remote while allowing local file imports. Maybe it's something that you could enable with the API, so it could become a setting for gradle/maven etc, pre-parsing.

How it works Now:

it doesn't, do you actually need me to run the checkstyle script?

Caused by: : java.lang.NullPointerException
        at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:109)
        at groovy.util.AntBuilder.performTask(AntBuilder.java:335)
        at groovy.util.AntBuilder.nodeCompleted(AntBuilder.java:280)
        at org.gradle.api.internal.project.ant.BasicAntBuilder.nodeCompleted(BasicAntBuilder.java:90)
        at jdk.internal.reflect.GeneratedMethodAccessor1713.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:484)
        at org.gradle.internal.metaobject.BeanDynamicObject.tryInvokeMethod(BeanDynamicObject.java:196)
        at org.gradle.internal.metaobject.AbstractDynamicObject.invokeMethod(AbstractDynamicObject.java:163)
        at org.gradle.api.internal.project.antbuilder.AntBuilderDelegate.nodeCompleted(AntBuilderDelegate.java:124)
        at groovy.util.BuilderSupport.doInvokeMethod(BuilderSupport.java:160)
        at groovy.util.BuilderSupport.invokeMethod(BuilderSupport.java:74)
        at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:44)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:148)
        at org.gradle.api.plugins.quality.internal.CheckstyleInvoker$_invoke_closure1.doCall(CheckstyleInvoker.groovy:58)
        at jdk.internal.reflect.GeneratedMethodAccessor1553.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:107)
        at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:323)
        at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:263)
        at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1035)
        at groovy.lang.Closure.call(Closure.java:412)
        at groovy.lang.Closure.call(Closure.java:428)
        at org.gradle.util.internal.ClosureBackedAction.execute(ClosureBackedAction.java:72)
        at org.gradle.util.internal.ClosureBackedAction.execute(ClosureBackedAction.java:53)
        at org.gradle.api.internal.project.antbuilder.DefaultIsolatedAntBuilder$2.execute(DefaultIsolatedAntBuilder.java:160)
        at org.gradle.api.internal.project.antbuilder.DefaultIsolatedAntBuilder$2.execute(DefaultIsolatedAntBuilder.java:142)
        at org.gradle.api.internal.project.antbuilder.ClassPathToClassLoaderCache.withCachedClassLoader(ClassPathToClassLoaderCache.java:135)
        at org.gradle.api.internal.project.antbuilder.DefaultIsolatedAntBuilder.execute(DefaultIsolatedAntBuilder.java:136)
        at org.gradle.api.internal.project.IsolatedAntBuilder$execute$5.call(Unknown Source)
        at org.gradle.api.plugins.quality.internal.CheckstyleInvoker.invoke(CheckstyleInvoker.groovy:51)
        at org.gradle.api.plugins.quality.Checkstyle.run(Checkstyle.java:149)
        at jdk.internal.reflect.GeneratedMethodAccessor1334.invoke(Unknown Source)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
        at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:506)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:56)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$run$1(DefaultBuildOperationExecutor.java:74)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.runWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:45)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:74)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:491)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:474)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:106)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:271)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:249)
        at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:83)
        at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:37)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
        at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:47)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:47)
        at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:37)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
        at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:50)
        at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
        at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
        at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
        at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
        at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:54)
        at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:35)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
        at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
        at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:174)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:74)
        at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:45)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:40)
        at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:29)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
        at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:99)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:92)
        at java.base/java.util.Optional.map(Optional.java:265)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
        at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:85)
        at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:42)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:91)
        at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106)
        at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:51)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:72)
        at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:46)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:86)
        at java.base/java.util.Optional.orElseGet(Optional.java:369)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:86)
        at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:32)
        at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:43)
        at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:31)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution$2.withWorkspace(ExecuteActionsTaskExecuter.java:284)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
        at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
        at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
        at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
        at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:185)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:174)
        at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109)
        at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:75)
        at org.gradle.internal.operations.DefaultBuildOperationRunner$3.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:153)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:68)
        at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:62)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.lambda$call$2(DefaultBuildOperationExecutor.java:79)
        at org.gradle.internal.operations.UnmanagedBuildOperationWrapper.callWithUnmanagedSupport(UnmanagedBuildOperationWrapper.java:54)
        at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:79)
        at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
        at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:408)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:395)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:388)
        at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:374)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182)
        at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
        at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.NullPointerException
        at java.xml/com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDProcessor.endDTD(XMLDTDProcessor.java:1301)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.endEntity(XMLDTDScannerImpl.java:658)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.endEntity(XMLEntityManager.java:1507)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1925)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipSpaces(XMLEntityScanner.java:1664)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.skipSeparator(XMLDTDScannerImpl.java:2088)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDecls(XMLDTDScannerImpl.java:2064)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl.scanDTDExternalSubset(XMLDTDScannerImpl.java:299)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.dispatch(XMLDocumentScannerImpl.java:1165)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$DTDDriver.next(XMLDocumentScannerImpl.java:1040)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:917)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:605)
        at java.xml/com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:534)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:888)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
        at java.xml/com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1216)
        at java.xml/com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:635)
        at com.puppycrawl.tools.checkstyle.XmlLoader.parseInputSource(XmlLoader.java:86)
        at com.puppycrawl.tools.checkstyle.ConfigurationLoader.parseInputSource(ConfigurationLoader.java:198)
        at com.puppycrawl.tools.checkstyle.ConfigurationLoader.loadConfiguration(ConfigurationLoader.java:315)
        at com.puppycrawl.tools.checkstyle.ConfigurationLoader.loadConfiguration(ConfigurationLoader.java:267)
        at com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask.createRootModule(CheckstyleAntTask.java:410)
        at com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask.realExecute(CheckstyleAntTask.java:320)
        at com.puppycrawl.tools.checkstyle.ant.CheckstyleAntTask.execute(CheckstyleAntTask.java:302)
        at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:292)

Is your feature request related to a problem? Please describe.

it would be useful to be able to include additional files, this way I could, for example, have my test.xml include main.xml so I don't have to repeat myself for the majority of my config when I only need a few changes

Describe the solution you'd like

I do question if this is how this should work, I've got all of them at the root, but it's possible they should be the nested modules.

Additional context

override.xml for adding overrides for just one module

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
  "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker"/>

test.xml

<?xml version="1.0" ?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
  "https://checkstyle.org/dtds/configuration_1_3.dtd" [
  <!ENTITY chapter1 SYSTEM "main.xml">
  ]>
<module name="Checker" xmlns:xi="http://www.w3.org/2001/XInclude">
  <module name="TreeWalker">
    <!-- Checks for Naming Conventions.                  -->
    <!-- See https://checkstyle.org/config_naming.html -->
    <module name="AbstractClassName">
      <property name="format" value="^Abstract.+(?!Test)$"/>
    </module>
  </module>

  <xi:include href="override.xml">
    <xi:fallback>
      <xi:include href="./override.xml"/>
    </xi:fallback>
  </xi:include>
</module>

main.xml

<?xml version="1.0" ?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
  "https://checkstyle.org/dtds/configuration_1_3.dtd">
<!--

  Checkstyle configuration that checks the sun coding conventions from:

    - the Java Language Specification at
      https://docs.oracle.com/javase/specs/jls/se11/html/index.html

    - the Sun Code Conventions at https://www.oracle.com/java/technologies/javase/codeconventions-contents.html

    - the Javadoc guidelines at
      https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html

    - the JDK Api documentation https://docs.oracle.com/en/java/javase/11/

    - some best practices

  Checkstyle is very configurable. Be sure to read the documentation at
  https://checkstyle.org (or in your downloaded distribution).

  Most Checks are configurable, be sure to consult the documentation.

  To completely disable a check, just comment it out or delete it from the file.
  To suppress certain violations please review suppression filters.

  Finally, it is worth reading the documentation.

-->
<module name="Checker">
  <!--
      If you set the basedir property below, then all reported file
      names will be relative to the specified directory. See
      https://checkstyle.org/config.html#Checker

      <property name="basedir" value="${basedir}"/>
  -->
  <property name="severity" value="error"/>

  <property name="fileExtensions" value="java, properties, xml"/>

  <!-- Excludes all 'module-info.java' files              -->
  <!-- See https://checkstyle.org/config_filefilters.html -->
  <module name="BeforeExecutionExclusionFileFilter">
    <property name="fileNamePattern" value="module\-info\.java$"/>
  </module>

  <module name="SuppressWarningsFilter"/>

  <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
  <module name="SuppressionFilter">
    <property
      name="file"
      value="${org.checkstyle.sun.suppressionfilter.config}"
      default="checkstyle-suppressions.xml"
    />
    <property name="optional" value="true"/>
  </module>

  <!-- Checks that a package-info.java file exists for each package.     -->
  <!-- See https://checkstyle.org/config_javadoc.html#JavadocPackage -->
  <!-- <module name="JavadocPackage"/> -->

  <!-- Checks whether files end with a new line.                        -->
  <!-- See https://checkstyle.org/config_misc.html#NewlineAtEndOfFile -->
  <module name="NewlineAtEndOfFile"/>

  <!-- Checks that property files contain the same keys.         -->
  <!-- See https://checkstyle.org/config_misc.html#Translation -->
  <module name="Translation"/>

  <!-- Checks for Size Violations.                    -->
  <!-- See https://checkstyle.org/config_sizes.html -->
  <module name="FileLength">
    <property name="max" value="500"/>
    <property name="fileExtensions" value="java"/>
  </module>
  <module name="LineLength">
    <property name="max" value="100"/>
    <property name="fileExtensions" value="java"/>
  </module>

  <!-- Checks for whitespace                               -->
  <!-- See https://checkstyle.org/config_whitespace.html -->
  <module name="FileTabCharacter"/>


  <!-- Miscellaneous other checks.                   -->
  <!-- See https://checkstyle.org/config_misc.html -->
  <module name="RegexpSingleline">
    <property name="format" value="\s+$"/>
    <property name="minimum" value="0"/>
    <property name="maximum" value="0"/>
    <property name="message" value="Line has trailing spaces."/>
  </module>

  <!-- Checks for Headers                                -->
  <!-- See https://checkstyle.org/config_header.html   -->
  <!-- <module name="Header"> -->
  <!--   <property name="headerFile" value="${checkstyle.header.file}"/> -->
  <!--   <property name="fileExtensions" value="java"/> -->
  <!-- </module> -->

  <module name="TreeWalker">
    <module name="NoLineWrap"/>
    <module name="SuppressionCommentFilter"/>

    <!-- Checks for Javadoc comments.                     -->
    <!-- See https://checkstyle.org/config_javadoc.html -->
    <!--
    <module name="InvalidJavadocPosition"/>
    <module name="JavadocMethod"/>
    <module name="JavadocType"/>
    <module name="JavadocVariable"/>
    <module name="JavadocStyle"/>
    <module name="MissingJavadocMethod"/>
    -->

    <!-- Checks for Naming Conventions.                  -->
    <!-- See https://checkstyle.org/config_naming.html -->
    <module name="AbbreviationAsWordInName"/>
    <module name="ConstantName"/>
    <module name="LocalFinalVariableName"/>
    <module name="LocalVariableName"/>
    <module name="MemberName"/>
    <module name="MethodName"/>
    <module name="PackageName"/>
    <module name="ParameterName"/>
    <module name="StaticVariableName"/>
    <module name="TypeName"/>
    <module name="ParameterAssignment"/>
    <module name="ReturnCount"/>
    <module name="StringLiteralEquality"/>
    <module name="CatchParameterName"/>
    <module name="ClassTypeParameterName">
      <property name="format" value="^[A-Z]+$"/>
    </module>
    <module name="InterfaceTypeParameterName">
      <property name="format" value="^[A-Z]+$"/>
    </module>
    <module name="MethodTypeParameterName">
      <property name="format" value="^[A-Z]+$"/>
    </module>
    <module name="LambdaParameterName"/>

    <!-- Checks for imports                              -->
    <!-- See https://checkstyle.org/config_imports.html -->
    <module name="CustomImportOrder">
      <property name="customImportOrderRules"
                value="STATIC###SPECIAL_IMPORTS"/>
      <property name="specialImportsRegExp" value="^.*$"/>
      <property name="sortImportsInGroupAlphabetically" value="true"/>
    </module>
    <module name="AvoidStarImport"/>
    <module name="IllegalImport"/> <!-- defaults to sun.* packages -->
    <module name="RedundantImport"/>
    <module name="UnusedImports">
      <property name="processJavadoc" value="false"/>
    </module>

    <!-- Metrics -->
    <!-- See https://checkstyle.sourceforge.io/config_metrics.html -->
    <module name="BooleanExpressionComplexity"/>
    <module name="ClassDataAbstractionCoupling"/>
    <module name="ClassFanOutComplexity"/>
    <module name="CyclomaticComplexity"/>
    <module name="JavaNCSS"/>
    <module name="NPathComplexity"/>

    <!-- Checks for Size Violations.                    -->
    <!-- See https://checkstyle.org/config_sizes.html -->
    <module name="MethodLength"/>
    <module name="ParameterNumber"/>

    <!-- Checks for whitespace                               -->
    <!-- See https://checkstyle.org/config_whitespace.html -->
    <module name="OperatorWrap">
      <property name="tokens" value="QUESTION, COLON"/>
    </module>
    <module name="OperatorWrap">
      <property name="tokens" value="EQUAL, NOT_EQUAL, DIV, PLUS, MINUS, STAR, MOD, SR, BSR, GE, GT, SL, LE, LT, BXOR,
     BOR, LOR, BAND, LAND, TYPE_EXTENSION_AND, LITERAL_INSTANCEOF"
      />
      <property name="option" value="eol"/>
    </module>
    <module name="EmptyLineSeparator">
      <property name="allowNoEmptyLineBetweenFields" value="true"/>
      <property
        name="tokens"
        value="
      IMPORT,
      STATIC_IMPORT,
      CLASS_DEF,
      INTERFACE_DEF,
      ENUM_DEF,
      STATIC_INIT,
      INSTANCE_INIT,
      METHOD_DEF,
      CTOR_DEF,
      VARIABLE_DEF"
      />
    </module>
    <module name="EmptyForIteratorPad"/>
    <module name="GenericWhitespace"/>
    <module name="MethodParamPad"/>
    <module name="NoWhitespaceAfter"/>
    <module name="NoWhitespaceBefore"/>
    <module name="ArrayTypeStyle"/>
    <module name="CommentsIndentation"/>
    <module name="AvoidEscapedUnicodeCharacters">
      <property name="allowNonPrintableEscapes" value="true"/>
      <property name="allowByTailComment" value="true"/>
      <property name="allowEscapesForControlCharacters" value="true"/>
    </module>
    <module name="AvoidDoubleBraceInitialization"/>
    <module name="AvoidNoArgumentSuperConstructorCall"/>
    <module name="EmptyCatchBlock"/>
    <module name="DeclarationOrder"/>
    <module name="DefaultComesLast"/>

    <module name="SingleSpaceSeparator"/>
    <module name="SeparatorWrap">
      <property name="option" value="nl"/>
      <property name="tokens" value="DOT"/>
    </module>
    <module name="ParenPad"/>
    <module name="TypecastParenPad"/>
    <module name="WhitespaceAfter"/>
    <module name="WhitespaceAround">
      <property name="allowEmptyConstructors" value="true"/>
      <property name="allowEmptyTypes" value="true"/>
    </module>
    <module name="MutableException"/>
    <module name="ThrowsCount">
      <property name="ignorePrivateMethods" value="false"/>
    </module>
    <module name="UnnecessaryParentheses"/>
    <module name="UnnecessarySemicolonAfterOuterTypeDeclaration"/>
    <module name="UnnecessarySemicolonAfterTypeMemberDeclaration"/>
    <module name="UnnecessarySemicolonInEnumeration"/>
    <module name="UnnecessarySemicolonInTryWithResources"/>
    <module name="VariableDeclarationUsageDistance"/>


    <!-- Modifier Checks                                    -->
    <!-- See https://checkstyle.org/config_modifiers.html -->
    <module name="ModifierOrder"/>
    <module name="RedundantModifier"/>
    <module name="AbstractClassName"/>

    <!-- Checks for blocks. You know, those {}'s         -->
    <!-- See https://checkstyle.org/config_blocks.html -->
    <module name="AvoidNestedBlocks">
      <property name="allowInSwitchCase" value="true"/>
    </module>
    <module name="EmptyBlock"/>
    <module name="LeftCurly"/>
    <module name="NeedBraces"/>
    <module name="RightCurly"/>

    <!-- Checks for common coding problems             -->
    <!-- See https://checkstyle.org/config_coding.html -->
    <module name="EqualsAvoidNull"/>
    <module name="FallThrough"/>
    <module name="EmptyStatement"/>
    <module name="EqualsHashCode"/>
    <module name="HiddenField">
      <property name="ignoreConstructorParameter" value="true"/>
      <property name="ignoreSetter" value="true"/>
    </module>
    <module name="ExplicitInitialization"/>
    <module name="IllegalInstantiation"/>
    <module name="IllegalCatch"/>
    <module name="IllegalToken"/>
    <module name="IllegalType"/>
    <module name="InnerAssignment"/>
    <!-- error prone has got this
    <module name="MissingSwitchDefault"/>
    -->
    <module name="MultipleVariableDeclarations"/>
    <module name="SimplifyBooleanExpression"/>
    <module name="SimplifyBooleanReturn"/>
    <module name="InnerTypeLast"/>
    <module name="ModifiedControlVariable"/>
    <module name="MultipleStringLiterals"/>
    <module name="NestedForDepth"/>
    <module name="NestedIfDepth"/>
    <module name="NestedTryDepth"/>
    <module name="NoArrayTrailingComma"/>
    <module name="NoClone"/>
    <module name="NoEnumTrailingComma"/>
    <module name="NoFinalizer"/>
    <module name="OneStatementPerLine"/>
    <module name="PackageDeclaration"/>

    <!-- Checks for class design                         -->
    <!-- See https://checkstyle.org/config_design.html -->
    <module name="FinalClass"/>
    <module name="HideUtilityClassConstructor"/>
    <module name="InterfaceIsType"/>
    <module name="VisibilityModifier"/>


    <!-- Miscellaneous other checks.                   -->
    <!-- See https://checkstyle.org/config_misc.html -->
    <module name="ArrayTypeStyle"/>
    <module name="TodoComment"/>
    <module name="UpperEll"/>
    <module name="Indentation">
      <property name="basicOffset" value="2"/>
      <property name="lineWrappingIndentation" value="2"/>
      <property name="throwsIndent" value="2"/>
      <property name="caseIndent" value="2"/>
      <property name="forceStrictCondition" value="true"/>
    </module>

    <!-- https://checkstyle.org/config_filters.html#SuppressionXpathFilter -->
    <module name="SuppressionXpathFilter">
      <property
        name="file"
        value="${org.checkstyle.sun.suppressionxpathfilter.config}"
        default="checkstyle-xpath-suppressions.xml"
      />
      <property name="optional" value="true"/>
    </module>
    <module name="SuppressWarningsHolder"/>
  </module>
</module>
@romani
Copy link
Member

romani commented Jul 18, 2021

Can you review #3605

As some hacking on ENTITY is working for Android team.

Be aware that it is disabled by default https://checkstyle.org/config_system_properties.html#Enable_External_DTD_load

@xenoterracide
Copy link
Author

xenoterracide commented Jul 19, 2021

nope, same error and I copied their code.

tasks.withType<Checkstyle>().configureEach {
  configProperties = mapOf("checkstyle.enableExternalDtdLoad" to true)
  isShowViolations = true
  reports {
    html.required.set(false)
    xml.required.set(false)
  }
}
<?xml version="1.0" ?>
<!DOCTYPE module PUBLIC "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
  "https://checkstyle.org/dtds/configuration_1_3.dtd" [
  <!ENTITY defaultCopyrightCheck SYSTEM "common.xml">
  ]>
<module name="Checker">
  &defaultCopyrightCheck;
</module>
<?xml version="1.0" encoding="UTF-8"?>
<!--
  ~ Copyright (C) 2016 The Android Open Source Project
  ~
  ~ Licensed under the Apache License, Version 2.0 (the "License");
  ~ you may not use this file except in compliance with the License.
  ~ You may obtain a copy of the License at
  ~
  ~      http://www.apache.org/licenses/LICENSE-2.0
  ~
  ~ Unless required by applicable law or agreed to in writing, software
  ~ distributed under the License is distributed on an "AS IS" BASIS,
  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  ~ See the License for the specific language governing permissions and
  ~ limitations under the License.
-->
<property name="severity" value="warning"/>
<property name="charset" value="UTF-8"/>
<module name="FileTabCharacter">
<property name="severity" value="error"/>
</module>
<module name="NewlineAtEndOfFile">
<property name="severity" value="error"/>
</module>
<module name="RegexpSingleline">
<property name="severity" value="error"/>
<property name="format" value="[ \t]+$"/>
<property name="message" value="Trailing whitespace"/>
</module>

@xenoterracide
Copy link
Author

same error with 8.44 (just being sure)

@vellotis
Copy link

vellotis commented Jul 5, 2022

Be aware that it is disabled by default https://checkstyle.org/config_system_properties.html#Enable_External_DTD_load

This remark did make it work for me. 👍

@romani
Copy link
Member

romani commented Jul 5, 2022

@vellotis, if you share minimalistic example it would be awesome.

@vellotis
Copy link

vellotis commented Jul 5, 2022

Sure. Files are in the same directory.

checkstyle-common.xml

<!-- Checks whether files end with a new line.                        -->
<!-- See http://checkstyle.sf.net/config_misc.html#NewlineAtEndOfFile -->
<module name="NewlineAtEndOfFile"/>

checkstyle.xml

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
          "https://checkstyle.org/dtds/configuration_1_3.dtd" [
    <!ENTITY common SYSTEM "checkstyle-common.xml">
]>
<module name="Checker">

    &common;

    <module name="LineLength">
        <property name="max" value="120"/>
    </module>

</module>

checkstyle-test.xml

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
          "https://checkstyle.org/dtds/configuration_1_3.dtd" [
    <!ENTITY common SYSTEM "checkstyle-common.xml">
]>
<module name="Checker">

    &common;

    <module name="LineLength">
        <property name="max" value="140"/>
    </module>

</module>

So, now we have separate checkstyle configurations for main and test sources that reuse a common part of the XML.

Build needs to be started with -D checkstyle.enableExternalDtdLoad=true

@romani
Copy link
Member

romani commented Jul 6, 2022

@vellotis , thanks a lot for example.

Here is my mofigication of your example to be more reusable by CLI.

$ cat Test.java 
class Test {
  int i = 0;
}

$ cat checkstyle-common.xml 
<module name="FileLength">
  <property name="max" value="1"/>
</module>

$ cat checkstyle.xml 
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
          "https://checkstyle.org/dtds/configuration_1_3.dtd" [
    <!ENTITY common SYSTEM "checkstyle-common.xml">
]>
<module name="Checker">

    &common;

    <module name="TreeWalker">
        <module name="MemberName">
            <property name="format" value="^[a-z][a-zA-Z]+$"/>
        </module>
    </module>
</module>

$ cat checkstyle-test.xml 
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
          "https://checkstyle.org/dtds/configuration_1_3.dtd" [
    <!ENTITY common SYSTEM "checkstyle-common.xml">
]>
<module name="Checker">

    &common;

    <module name="TreeWalker">
        <module name="MemberName">
            <property name="format" value="_[a-z]"/>
        </module>
    </module>

</module>

$ java -Dcheckstyle.enableExternalDtdLoad=true -classpath checkstyle-10.2-all.jar \
        com.puppycrawl.tools.checkstyle.Main         -c checkstyle.xml Test.java 
Starting audit...
[ERROR] /var/tmp/Test.java:1: File length is 3 lines (max allowed is 1). [FileLength]
[ERROR] /var/tmp/Test.java:2:7: Name 'i' must match pattern '^[a-z][a-zA-Z]+$'. [MemberName]
Audit done.
Checkstyle ends with 2 errors.

$ java -Dcheckstyle.enableExternalDtdLoad=true -classpath checkstyle-10.2-all.jar \
          com.puppycrawl.tools.checkstyle.Main         -c checkstyle-test.xml Test.java 
Starting audit...
[ERROR] /var/tmp/Test.java:1: File length is 3 lines (max allowed is 1). [FileLength]
[ERROR] /var/tmp/Test.java:2:7: Name 'i' must match pattern '_[a-z]'. [MemberName]
Audit done.
Checkstyle ends with 2 errors.

@romani
Copy link
Member

romani commented Jul 6, 2022

@xenoterracide , is this example resolve your issue ?

xi:include

I am not sure how this works in general and is standard java xml parser support this. But I am ok extend our config loading to support some features in xml. But we need some guidance/help from community on this.

@rnveach
Copy link
Member

rnveach commented Jul 6, 2022

Just to add to the conversation (don't have more knowledge), it seems xi:include is similar to external entities. This is a known attack vector and is suggested this not be used or enabled otherwise you could put your computers at some sort of risk. This is why enableExternalDtdLoad exists and it is disabled by default.
See example https://portswigger.net/web-security/xxe/lab-xinclude-attack .

Not saying some support can't be added, but just saying it comes with risk.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants