diff --git a/.gitignore b/.gitignore
index a70a722..1f05b8f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,6 +36,7 @@ src/generated
.factorypath
.idea/
.settings/
+.externalToolBuilders/
.vscode
*.code-workspace
*.xpr
@@ -46,3 +47,8 @@ xrechnung
.DS_Store
andre*-simple.xml
somePrefix*.xml
+
+# 2.0 stuff
+api/
+cli/
+core/
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 686bdd9..75032c2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,8 +1,8 @@
image: maven:latest
-
+
variables:
BUILD_PROPS: "-Dbuild.revision=$CI_COMMIT_SHA -Dbuild.branch=$CI_COMMIT_REF_NAME -Dbuild.number=$CI_PIPELINE_IID -Dfile.encoding=UTF-8 -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false"
- MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
+ MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true -Xmx6g"
MAVEN_CLI_OPTS: " --batch-mode --update-snapshots --errors --fail-at-end --show-version -s .mvn/settings.xml"
MAVEN_CLI_OPTS_CENTRAL: " --batch-mode --show-version -s .mvn/settings-maven-central.xml"
@@ -15,6 +15,7 @@ cache:
paths:
- .m2/repository
+# Basic Java build steps
.java:
stage: build
needs:
@@ -32,11 +33,6 @@ cache:
- target/surefire-reports/*.xml
- target/failsafe-reports/*.xml
-.java_extended:
- extends: .java
- rules:
- - if: $CI_PIPELINE_SOURCE == "schedule"
-
java-11:
extends: .java
image: maven:3-eclipse-temurin-11-alpine
@@ -54,10 +50,6 @@ java-11:
- target/surefire-reports/*.xml
- target/failsafe-reports/*.xml
-java-11-openj9:
- extends: .java_extended
- image: maven:3-jdk-11-openj9
-
java-17:
extends: .java
image: maven:3-eclipse-temurin-17-alpine
@@ -66,14 +58,29 @@ java-21:
extends: .java
image: maven:3-eclipse-temurin-21-alpine
-java-24:
- extends: .java_extended
- image: maven:3-eclipse-temurin-24-alpine
-
java-25:
extends: .java
image: maven:3-eclipse-temurin-25-alpine
-
+
+# Rare Java stuff
+.java_extended:
+ extends: .java
+ rules:
+ - if: $CI_PIPELINE_SOURCE == "schedule"
+
+# Note: the openj9 images don't exist for Java 17, 21 or 25
+# Removed because the latest public image is 11.0.11 which is not comaptible to the Lombok requirement of 11.0.23
+#java-11-openj9:
+# extends: .java_extended
+# image: maven:3-jdk-11-openj9
+
+# Deploy Java 11 build on Maven Central
+deploy-java-11-snapshot:
+ extends: java-11
+ script:
+ - mvn $MAVEN_CLI_OPTS_CENTRAL -P release-snapshot deploy
+
+# Deploy Java 11 build to KoSIT repository (manually)
deploy:
stage: deploy
image: maven:3-eclipse-temurin-11-alpine
@@ -81,18 +88,14 @@ deploy:
- job: java-11
script:
- export PROJECT_VERSION=$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
- - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}.zip -DgroupId=kosit -DartifactId=validator -Dclassifier="distribution" -Dversion=${PROJECT_VERSION} -Dpackaging=zip -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
- - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}.jar -DgroupId=kosit -DartifactId=validator -Dversion=${PROJECT_VERSION} -Dpackaging=jar -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
- - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}-javadoc.jar -DgroupId=kosit -DartifactId=validator -Dclassifier="javadoc" -Dversion=${PROJECT_VERSION} -Dpackaging=zip -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
- - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}-standalone.jar -DgroupId=kosit -DartifactId=validator -Dclassifier="standalone" -Dversion=${PROJECT_VERSION} -Dpackaging=jar -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
- - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}-sources.jar -DgroupId=kosit -DartifactId=validator -Dclassifier="sources" -Dversion=${PROJECT_VERSION} -Dpackaging=jar -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
+ - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}.zip -DgroupId=kosit -DartifactId=validator -Dversion=${PROJECT_VERSION} -Dclassifier="distribution" -Dpackaging=zip -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
+ - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}.jar -DgroupId=kosit -DartifactId=validator -Dversion=${PROJECT_VERSION} -Dpackaging=jar -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
+ - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}-javadoc.jar -DgroupId=kosit -DartifactId=validator -Dversion=${PROJECT_VERSION} -Dclassifier="javadoc" -Dpackaging=zip -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
+ - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}-standalone.jar -DgroupId=kosit -DartifactId=validator -Dversion=${PROJECT_VERSION} -Dclassifier="standalone" -Dpackaging=jar -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
+ - mvn $MAVEN_CLI_OPTS deploy:deploy-file -Dfile=target/validator-${PROJECT_VERSION}-sources.jar -DgroupId=kosit -DartifactId=validator -Dversion=${PROJECT_VERSION} -Dclassifier="sources" -Dpackaging=jar -DrepositoryId="gitlab-maven" -Durl=https://projekte.kosit.org/api/v4/projects/7/packages/maven
when: manual
-deploy-snapshot:
- extends: java-11
- script:
- - mvn $MAVEN_CLI_OPTS_CENTRAL -P release-snapshot deploy
-
+# Build Docker images and upload to KoSIT registry
create-build-image:
stage: deploy
image: docker:latest
@@ -108,12 +111,22 @@ create-build-image:
changes:
- .mvn/createBuildImages.sh
+# Run OWASP checks - expensive so only on main branch
owasp-check:
- extends: .java
+ stage: test
image: maven:3-eclipse-temurin-21-alpine
needs: [ ]
+ # set job timeout to 1 hour - it's required when new rules are downloaded
+ timeout: 1h
+ variables:
+ RUNNER_SCRIPT_TIMEOUT: 1h
script:
- mvn $MAVEN_CLI_OPTS $BUILD_PROPS $CI_JOB_TIMESTAMP validate -Powasp-check
+ artifacts:
+ name: artifacts
+ reports:
+ codequality:
+ - target/dependency-check-report.html
rules:
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_COMMIT_REF_NAME == "main"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ef56bf3..79f360f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,8 +6,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/)
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
-## Unreleased
+## 1.6.1 - 2026-02-05
+### Changed
+
+- (CORE) [#106](https://projekte.kosit.org/kosit/validator/-/issues/106) The `match` element in `scenarios.xml` is required to have at least one character (per XSD change)
+- (BUILD) [#176](https://projekte.kosit.org/kosit/validator/-/issues/176) The Maven Central deployed `pom.xml` properly includes runtime dependencies
+- (BUILD) [#175](https://projekte.kosit.org/kosit/validator/-/issues/175) The `.zip` file created from `maven-assembly-plugin` no longer contains the standalone validator, which reduces its size to 50%
## 1.6.0 - 2025-11-07
diff --git a/pom.xml b/pom.xml
index 5d04818..0d95a32 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.kosit
validator
- 1.6.1-SNAPSHOT
+ 1.6.2-SNAPSHOT
KoSIT XML Validator against XSD and Schematron based on defined scenarios.
@@ -80,17 +80,16 @@
${version.lombok}
provided
-
- net.sf.saxon
- Saxon-HE
- ${version.saxon-he}
- compile
-
org.slf4j
slf4j-api
${version.slf4j}
+
+ net.sf.saxon
+ Saxon-HE
+ ${version.saxon-he}
+
info.picocli
picocli
@@ -180,7 +179,7 @@
org.sonatype.central
central-publishing-maven-plugin
- 0.8.0
+ 0.10.0
true
central
@@ -275,15 +274,15 @@
org.apache.maven.plugins
maven-shade-plugin
- 3.6.0
+ 3.6.1
- jdk11+
package
shade
+ false
true
standalone
@@ -626,7 +625,8 @@
${project.basedir}/owasp-suppressions.xml
-
+
+ ${NVD_API_KEY}
diff --git a/src/assembly/assembly-dist.xml b/src/assembly/assembly-dist.xml
index 597eec6..d091b08 100644
--- a/src/assembly/assembly-dist.xml
+++ b/src/assembly/assembly-dist.xml
@@ -20,6 +20,10 @@
validator-*.jar
+
+
+ *standalone.jar
+
diff --git a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java
index be10111..042dd95 100644
--- a/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java
+++ b/src/main/java/de/kosit/validationtool/impl/CollectingErrorEventHandler.java
@@ -47,7 +47,7 @@ public class CollectingErrorEventHandler implements ValidationEventHandler, Erro
private static final int DEFAULT_ABORT_COUNT = 50;
- private static final int stopProcessCount = DEFAULT_ABORT_COUNT;
+ private final int stopProcessCount = DEFAULT_ABORT_COUNT;
private final List errors = new ArrayList<>();
diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java
index ae85023..90ad899 100644
--- a/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java
+++ b/src/main/java/de/kosit/validationtool/impl/tasks/SchematronValidationAction.java
@@ -23,9 +23,6 @@ import javax.xml.transform.dom.DOMSource;
import org.oclc.purl.dsdl.svrl.SchematronOutput;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-
import de.kosit.validationtool.impl.CollectingErrorEventHandler;
import de.kosit.validationtool.impl.ConversionService;
import de.kosit.validationtool.impl.Scenario;
@@ -33,7 +30,8 @@ import de.kosit.validationtool.impl.Scenario.Transformation;
import de.kosit.validationtool.model.reportInput.CreateReportInput;
import de.kosit.validationtool.model.reportInput.ValidationResultsSchematron;
import de.kosit.validationtool.model.reportInput.ValidationResultsSchematron.Results;
-
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import net.sf.saxon.dom.NodeOverNodeInfo;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.XdmDestination;
@@ -71,6 +69,11 @@ public class SchematronValidationAction implements CheckAction {
transformer.setInitialContextNode(document);
transformer.transform();
+ // If we reach this line, it means no Exception was thrown :-)
+ if (e.hasErrors()) {
+ log.error("XSLT errors found: " + e.getErrorDescription());
+ }
+
final ValidationResultsSchematron.Results r = new ValidationResultsSchematron.Results();
r.setSchematronOutput(this.conversionService.readDocument(
new DOMSource(NodeOverNodeInfo.wrap(result.getXdmNode().getUnderlyingNode()).getOwnerDocument()),
diff --git a/src/main/model/xsd/scenarios.xsd b/src/main/model/xsd/scenarios.xsd
index fd6d9e3..9521ceb 100644
--- a/src/main/model/xsd/scenarios.xsd
+++ b/src/main/model/xsd/scenarios.xsd
@@ -1,21 +1,4 @@
-
-
-
@@ -72,13 +55,19 @@
+
+
+
+
+
+
-
+
@@ -138,3 +127,18 @@
+
diff --git a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java
index b9b2ed8..dce14d4 100644
--- a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java
+++ b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java
@@ -139,6 +139,15 @@ public class CommandlineApplicationTest {
assertThat(CommandLine.getErrorOutput()).contains(RESULT_OUTPUT);
}
+ @Test
+ public void testValidMinimalConfigurationXSLTRuntimeError() {
+ final String[] args = { "-s", Paths.get(Simple.SCENARIOS_XSLT_RUNTIME_ERROR).toString(), "-h", "-o",
+ this.output.toAbsolutePath().toString(), "--serialize-report-input",
+ Paths.get(Simple.SIMPLE_XSLT_RUNTIME_ERROR).toString() };
+ CommandLineApplication.mainProgram(args);
+ assertThat(CommandLine.getErrorOutput()).contains(RESULT_OUTPUT);
+ }
+
@Test
public void testValidNamingConfiguration() {
final String[] args = { "-s", Paths.get(Simple.SCENARIOS).toString(), "-r", Paths.get(Simple.REPOSITORY_URI).toString(),
@@ -159,7 +168,7 @@ public class CommandlineApplicationTest {
@Test
public void testValidDirectoryInput() {
final String[] args = { "-s", Paths.get(Simple.SCENARIOS).toString(), "-o", this.output.toString(), "-r",
- Paths.get(Simple.REPOSITORY_URI).toString(), Paths.get(Simple.EXAMPLES).toString() };
+ Paths.get(Simple.REPOSITORY_URI).toString(), Paths.get(Simple.INPUT).toString() };
CommandLineApplication.mainProgram(args);
assertThat(CommandLine.getErrorOutput()).contains("Processing 9 object(s) completed");
}
diff --git a/src/test/java/de/kosit/validationtool/impl/Helper.java b/src/test/java/de/kosit/validationtool/impl/Helper.java
index 00da5a3..25d6158 100644
--- a/src/test/java/de/kosit/validationtool/impl/Helper.java
+++ b/src/test/java/de/kosit/validationtool/impl/Helper.java
@@ -49,15 +49,18 @@ public class Helper {
public static final URI ROOT = EXAMPLES_DIR.resolve("simple/");
- public static final URI EXAMPLES = ROOT.resolve("input/");
+ public static final URI INPUT = ROOT.resolve("input/");
public static final URI SIMPLE_VALID = ROOT.resolve("input/simple.xml");
+ public static final URI SIMPLE_XSLT_RUNTIME_ERROR = EXAMPLES_DIR
+ .resolve("invalid/xslt-runtime-error/input/simple-xslt-runtime-error.xml");
+
public static final URI FOO = ROOT.resolve("input/foo.xml");
- public static final URI FOO_SCHEMATRON_INVALID = EXAMPLES.resolve("foo-schematron-invalid.xml");
+ public static final URI FOO_SCHEMATRON_INVALID = INPUT.resolve("foo-schematron-invalid.xml");
- public static final URI FOO_CUSTOM_LEVEL_ERROR = EXAMPLES.resolve("foo-custom-level-error.xml");
+ public static final URI FOO_CUSTOM_LEVEL_ERROR = INPUT.resolve("foo-custom-level-error.xml");
public static final URI REJECTED = ROOT.resolve("input/withManualReject.xml");
@@ -65,6 +68,9 @@ public class Helper {
public static final URI SCENARIOS_WITH_RELATIVE_PATHS = ROOT.resolve("scenarios-with-relative-paths.xml");
+ public static final URI SCENARIOS_XSLT_RUNTIME_ERROR = EXAMPLES_DIR
+ .resolve("invalid/xslt-runtime-error/scenarios-with-xslt-runtime-error.xml");
+
public static final URI OTHER_SCENARIOS = ROOT.resolve("otherScenarios.xml");
public static final URI ERROR_SCENARIOS = ROOT.resolve("scenarios-with-errors.xml");
@@ -101,6 +107,7 @@ public class Helper {
public static class Invalid {
+ // Is the typo in the name on purpose???
public static final URI ROOT = EXAMPLES_DIR.resolve("invaid/");
public static final URI SCENARIOS = ROOT.resolve("scenarios.xml");
diff --git a/src/test/resources/examples/invalid/xslt-runtime-error/input/simple-xslt-runtime-error.xml b/src/test/resources/examples/invalid/xslt-runtime-error/input/simple-xslt-runtime-error.xml
new file mode 100644
index 0000000..cdbd1cf
--- /dev/null
+++ b/src/test/resources/examples/invalid/xslt-runtime-error/input/simple-xslt-runtime-error.xml
@@ -0,0 +1,23 @@
+
+
+ abc
+ def
+
+
+
+
+
diff --git a/src/test/resources/examples/invalid/xslt-runtime-error/repository/report.xsl b/src/test/resources/examples/invalid/xslt-runtime-error/repository/report.xsl
new file mode 100644
index 0000000..6eb7471
--- /dev/null
+++ b/src/test/resources/examples/invalid/xslt-runtime-error/repository/report.xsl
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/examples/invalid/xslt-runtime-error/repository/simple-xslt-runtime-error.xsl b/src/test/resources/examples/invalid/xslt-runtime-error/repository/simple-xslt-runtime-error.xsl
new file mode 100644
index 0000000..8a8f0de
--- /dev/null
+++ b/src/test/resources/examples/invalid/xslt-runtime-error/repository/simple-xslt-runtime-error.xsl
@@ -0,0 +1,231 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /
+
+
+
+
+
+ *:
+
+ [namespace-uri()='
+
+ ']
+
+
+
+ [
+
+ ]
+
+
+
+ /
+
+ @
+
+
+ @*[local-name()='
+
+ ' and namespace-uri()='
+
+ ']
+
+
+
+
+
+
+
+
+ /
+
+
+ [
+
+ ]
+
+
+
+ /@
+
+
+
+
+
+
+ /
+
+
+ [
+
+ ]
+
+
+
+ /@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ .
+
+
+
+
+ U
+
+ U
+
+
+
+ U.
+
+ n
+
+
+
+ U.
+
+ _
+
+ _
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Schematron Simple
+
+
+
+
+
+
+
+
+
+
+
+
+
+ content-2
+
+
+
+ The decimal value of s:inner should be 1.
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/test/resources/examples/invalid/xslt-runtime-error/repository/simple.xsd b/src/test/resources/examples/invalid/xslt-runtime-error/repository/simple.xsd
new file mode 100644
index 0000000..04d5923
--- /dev/null
+++ b/src/test/resources/examples/invalid/xslt-runtime-error/repository/simple.xsd
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/resources/examples/invalid/xslt-runtime-error/scenarios-with-xslt-runtime-error.xml b/src/test/resources/examples/invalid/xslt-runtime-error/scenarios-with-xslt-runtime-error.xml
new file mode 100644
index 0000000..f1c13a6
--- /dev/null
+++ b/src/test/resources/examples/invalid/xslt-runtime-error/scenarios-with-xslt-runtime-error.xml
@@ -0,0 +1,61 @@
+
+
+ XSLT-Runtime-Error-TestSuite
+ QA
+ 2026-03-02
+
+ Szenario für Tests
+
+
+
+ Simple
+
+ Teste Fehlerfall.
+
+ http://www.xoev.de/de/validator/framework/1/createreportinput
+ http://validator.kosit.de/test-sample
+ http://validator.kosit.de/test-report
+ /
+
+
+
+ Sample Schema
+ repository/simple.xsd
+
+
+
+
+ Sample Schematron
+ repository/simple-xslt-runtime-error.xsl
+
+
+
+
+ Report für eRechnung
+ repository/report.xsl
+
+
+
+
+
+
+ default
+ repository/report.xsl
+
+
+
+