diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..da97003 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,29 @@ +image: maven:latest + +variables: + MAVEN_CLI_OPTS: " --batch-mode -Dmaven.repo.local=repository -Dfile.encoding=UTF-8" + +cache: + paths: + - repository + +build-validator: + stage: build + script: + - mvn $MAVEN_CLI_OPTS -Pjava-11,java-8,gitlab verify + + artifacts: + name: build-results + paths: + - target/*.jar + reports: + junit: + - target/surefire-reports/*.xml + - target/failsafe-reports/*.xml + +#deploy: +# stage: deploy +# script: +# - mvn $MAVEN_CLI_OPTS deploy +# only: +# - master diff --git a/pom.xml b/pom.xml index 85bc38c..a4d0d04 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - 3.0 + 3.3.9 KoSIT XML Prüftool Implementierung @@ -48,8 +48,8 @@ UTF-8 - 0.7.9 - 1.16.16 + 0.8.3 + 1.18.6 9.9.1-1 1.7.25 localhost @@ -77,6 +77,7 @@ commons-cli commons-cli 1.4 + true org.slf4j @@ -90,6 +91,11 @@ commons-lang3 3.5 + + org.glassfish.jaxb + jaxb-runtime + 2.3.2 + org.assertj assertj-core @@ -102,7 +108,6 @@ 4.12 test - org.apache.commons commons-io @@ -112,7 +117,7 @@ io.rest-assured rest-assured - 3.3.0 + 3.2.0 test @@ -129,7 +134,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.6.1 + 3.8.0 1.8 1.8 @@ -138,57 +143,65 @@ - maven-jar-plugin - 2.3.1 - - - simplelogger.properties - de/kosit/validationtool/cmd/** - - + org.apache.maven.plugins + maven-shade-plugin + 3.2.1 + + + jdk11+ + package + + shade + + + validationtool-${project.version}-standalone + + + de.kosit.validationtool.cmd.CommandLineApplication + + + META-INF/TE-050AC.SF + + + + + + jdk8 + package + + shade + + + validationtool-${project.version}-java8-standalone + + + org.glassfish.jaxb:jaxb-runtime + com.sun.istack:istack-commons-runtime + com.sun.xml.fastinfoset:FastInfoset + jakarta.activation:jakarta.activation-api + jakarta.xml.bind:jakarta.xml.bind-api + org.jvnet.staxex:stax-ex + org.glassfish.jaxb:txw2 + + + + + de.kosit.validationtool.cmd.CommandLineApplication + + + + META-INF/TE-050AC.SF + + + + + + org.apache.maven.plugins maven-assembly-plugin - - standalone - package - - single - - - - - - de.kosit.validationtool.cmd.CommandLineApplication - - - - - src/main/assembly/assembly-standalone.xml - - - - - full - package - - single - - - - - - de.kosit.validationtool.cmd.CommandLineApplication - - - - - src/main/assembly/assembly-full.xml - - - standalone_dist package @@ -224,85 +237,6 @@ - - io.fabric8 - docker-maven-plugin - 0.28.0 - - tcp://localhost:2375 - true - true - false - - - daemon - daemon - - daemon - - - - - ${project.build.directory}/validationtool-${project.version}-standalone.jar - validationtool-standalone.jar - - - - - - - - bridge - - - 8080:8080 - - - - - - - - - - - up - pre-integration-test - - build - start - - - - post - post-integration-test - - stop - - - - - - - org.apache.maven.plugins - maven-failsafe-plugin - 2.22.1 - - - - integration-test - verify - - - - - -Ddaemon.port=8080 - -Ddaemon.host=http://localhost/ - - - - - @@ -329,7 +263,7 @@ org.jvnet.jaxb2.maven2 maven-jaxb2-plugin - 0.13.2 + 0.14.0 @@ -420,6 +354,254 @@ + + + + java-8 + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.22.1 + + + test-java8 + + integration-test + verify + + + + + -Ddaemon.port=8081 + -Ddaemon.host=http://${docker.host} + + ${project.build.directory}/failsafe-reports/failsafe-summary-java8.xml + + + + test-java-8-jdk-jaxb + + integration-test + verify + + + + + -Ddaemon.port=8082 + -Ddaemon.host=http://${docker.host} + + ${project.build.directory}/failsafe-reports/failsafe-summary-java8-jdk-jaxb.xml + + + + + + + + io.fabric8 + docker-maven-plugin + 0.28.0 + + tcp://${docker.host}:2375 + true + true + false + validator-%n-%t-%i-java8 + + + + + up8 + pre-integration-test + + build + start + + + + + daemon8 + daemon8 + + daemon + Dockerfile-java8 + + + + + + ${project.build.directory}/validationtool-${project.version}-standalone.jar + + validationtool-standalone.jar + + + + + + + + bridge + + + 8081:8080 + + + + + + + + daemon8-jdk-jaxb + daemon8-jdk-jaxb + + daemon + Dockerfile-java8-jdk-jaxb + + + + + + ${project.build.directory}/validationtool-${project.version}-java8-standalone.jar + + validationtool-standalone.jar + + + + + + + + bridge + + + 8082:8080 + + + + + + + + + + + down8 + post-integration-test + + stop + + + + + + + + + + java-11 + + true + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.22.1 + + + test-jdk11 + + integration-test + verify + + + + + -Ddaemon.port=8080 + -Ddaemon.host=http://${docker.host} + + + + + + + + io.fabric8 + docker-maven-plugin + 0.28.0 + + tcp://${docker.host}:2375 + true + true + false + validator-%n-%t-%i-java8 + + + + up11 + pre-integration-test + + build + start + + + + + daemon11 + daemon11 + + daemon + + + + + + ${project.build.directory}/validationtool-${project.version}-standalone.jar + + validationtool-standalone.jar + + + + + + + + bridge + + + 8080:8080 + + + + + + + + + + + down11 + post-integration-test + + stop + + + + + + + + + + gitlab + + host.docker.internal + + + https://github.com/itplr-kosit/validationtool.git scm:git:https://github.com/itplr-kosit/validationtool.git diff --git a/src/main/docker/daemon/Dockerfile b/src/main/docker/daemon/Dockerfile index c95f712..fc4bcec 100644 --- a/src/main/docker/daemon/Dockerfile +++ b/src/main/docker/daemon/Dockerfile @@ -1,4 +1,4 @@ -FROM openjdk:8 +FROM openjdk:11 RUN mkdir /opt/validationtool ADD maven/validationtool-standalone.jar /opt/validationtool diff --git a/src/main/docker/daemon/Dockerfile-java8 b/src/main/docker/daemon/Dockerfile-java8 new file mode 100644 index 0000000..c95f712 --- /dev/null +++ b/src/main/docker/daemon/Dockerfile-java8 @@ -0,0 +1,8 @@ +FROM openjdk:8 + +RUN mkdir /opt/validationtool +ADD maven/validationtool-standalone.jar /opt/validationtool +ADD run.sh /opt/validationtool/ +ADD config/ /opt/validationtool/ +EXPOSE 8080 +ENTRYPOINT ["bash", "/opt/validationtool/run.sh" ] \ No newline at end of file diff --git a/src/main/docker/daemon/Dockerfile-java8-jdk-jaxb b/src/main/docker/daemon/Dockerfile-java8-jdk-jaxb new file mode 100644 index 0000000..c95f712 --- /dev/null +++ b/src/main/docker/daemon/Dockerfile-java8-jdk-jaxb @@ -0,0 +1,8 @@ +FROM openjdk:8 + +RUN mkdir /opt/validationtool +ADD maven/validationtool-standalone.jar /opt/validationtool +ADD run.sh /opt/validationtool/ +ADD config/ /opt/validationtool/ +EXPOSE 8080 +ENTRYPOINT ["bash", "/opt/validationtool/run.sh" ] \ No newline at end of file diff --git a/src/main/docker/daemon/run.sh b/src/main/docker/daemon/run.sh index 3daa916..3726133 100644 --- a/src/main/docker/daemon/run.sh +++ b/src/main/docker/daemon/run.sh @@ -1,3 +1,3 @@ #!/usr/bin/env bash -cd /opt/validationtool && java -jar validationtool-standalone.jar -s scenarios.xml -D \ No newline at end of file +cd /opt/validationtool && java -jar validationtool-standalone.jar -s scenarios.xml -D -H 0.0.0.0 \ No newline at end of file diff --git a/src/main/java/de/kosit/validationtool/api/InputFactory.java b/src/main/java/de/kosit/validationtool/api/InputFactory.java index a7824b6..ba04e55 100644 --- a/src/main/java/de/kosit/validationtool/api/InputFactory.java +++ b/src/main/java/de/kosit/validationtool/api/InputFactory.java @@ -28,6 +28,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.security.DigestInputStream; @@ -226,6 +227,8 @@ public class InputFactory { byte[] hash = digest.digest(); log.debug("Generated hashcode for {} is {}", name, DatatypeConverter.printHexBinary(hash)); out.flush(); + log.info(new String(out.toByteArray(), Charset.forName("utf8")).substring(0, + out.toByteArray().length < 100 ? out.toByteArray().length : 100)); return new Input(out.toByteArray(), name, hash, digest.getAlgorithm()); } catch (IOException e) { throw new IllegalArgumentException(MESSAGE_OPEN_STREAM_ERROR + name, e); diff --git a/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java b/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java index a80dc31..79d4d24 100644 --- a/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java +++ b/src/main/java/de/kosit/validationtool/cmd/CheckAssertionAction.java @@ -50,7 +50,7 @@ import net.sf.saxon.s9api.XdmNode; */ @Slf4j @RequiredArgsConstructor -public class CheckAssertionAction implements CheckAction { +class CheckAssertionAction implements CheckAction { private final Assertions assertions; diff --git a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java index 09e4bbe..91cb851 100644 --- a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java +++ b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java @@ -135,7 +135,7 @@ public class CommandLineApplication { printHelp(options); } } - return 0; + return returnValue; } private static int determinePort(CommandLine cmd) { diff --git a/src/main/java/de/kosit/validationtool/cmd/Daemon.java b/src/main/java/de/kosit/validationtool/cmd/Daemon.java index 7f05c09..0bfaf87 100644 --- a/src/main/java/de/kosit/validationtool/cmd/Daemon.java +++ b/src/main/java/de/kosit/validationtool/cmd/Daemon.java @@ -68,6 +68,7 @@ class Daemon { @Override public void handle(HttpExchange httpExchange) throws IOException { try { + log.debug("Incoming request"); String requestMethod = httpExchange.getRequestMethod(); if (requestMethod.equals("POST")) { InputStream inputStream = httpExchange.getRequestBody(); @@ -82,7 +83,7 @@ class Daemon { } else { writeError(httpExchange, 405, "Es ist nur die POST-Methode erlaubt!"); } - } catch (TransformerException e) { + } catch (Exception e) { writeError(httpExchange, 500, "Interner Fehler bei der Verarbeitung des Requests: " + e.getMessage()); log.error("Es ist ein Fehler aufgetreten. Das Dokument kann nicht geprüft werden", e); } @@ -189,7 +190,7 @@ class Daemon { server.createContext("/health", new HealthHandler(check.getRepository().getScenarios())); server.setExecutor(Executors.newFixedThreadPool(threadCount)); server.start(); - log.info("Server ist erfolgreich gestartet"); + log.info("Server unter Port {} ist erfolgreich gestartet", port); } catch (IOException e) { log.error("Fehler beim HttpServer erstellen!", e.getMessage(), e); } diff --git a/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java b/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java index fbdb8b5..9124649 100644 --- a/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java +++ b/src/main/java/de/kosit/validationtool/cmd/ExtractHtmlContentAction.java @@ -44,7 +44,7 @@ import net.sf.saxon.s9api.XdmNode; */ @RequiredArgsConstructor @Slf4j -public class ExtractHtmlContentAction implements CheckAction { +class ExtractHtmlContentAction implements CheckAction { private static final QName NAME_ATTRIBUTE = new QName("data-report-type"); diff --git a/src/main/java/de/kosit/validationtool/cmd/PrintMemoryStats.java b/src/main/java/de/kosit/validationtool/cmd/PrintMemoryStats.java index 842a76f..313acd7 100644 --- a/src/main/java/de/kosit/validationtool/cmd/PrintMemoryStats.java +++ b/src/main/java/de/kosit/validationtool/cmd/PrintMemoryStats.java @@ -30,7 +30,7 @@ import lombok.extern.slf4j.Slf4j; * @author Andreas Penski */ @Slf4j -public class PrintMemoryStats implements de.kosit.validationtool.impl.tasks.CheckAction { +class PrintMemoryStats implements de.kosit.validationtool.impl.tasks.CheckAction { private static final int BYTES_PER_K = 1024; diff --git a/src/main/java/de/kosit/validationtool/cmd/PrintReportAction.java b/src/main/java/de/kosit/validationtool/cmd/PrintReportAction.java index 7d337d4..2c3faa2 100644 --- a/src/main/java/de/kosit/validationtool/cmd/PrintReportAction.java +++ b/src/main/java/de/kosit/validationtool/cmd/PrintReportAction.java @@ -35,7 +35,7 @@ import net.sf.saxon.s9api.Serializer; * @author Andreas Penski */ @Slf4j -public class PrintReportAction implements CheckAction { +class PrintReportAction implements CheckAction { @Override public void check(Bag results) { diff --git a/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java b/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java index 9f5afed..1c26479 100644 --- a/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java +++ b/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java @@ -37,7 +37,7 @@ import net.sf.saxon.s9api.Serializer; */ @Slf4j @RequiredArgsConstructor -public class SerializeReportAction implements CheckAction { +class SerializeReportAction implements CheckAction { private final Path outputDirectory; diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java index 9bc8313..9a314a5 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/DocumentParseAction.java @@ -70,7 +70,7 @@ public class DocumentParseAction implements CheckAction { log.debug("Exception while parsing {}", content.getName(), e); XMLSyntaxError error = new XMLSyntaxError(); error.setSeverity(XMLSyntaxErrorSeverity.SEVERITY_FATAL_ERROR); - error.setMessage(String.format("IOException while reading resource %s", content.getName())); + error.setMessage(String.format("IOException while reading resource %s: %s", content.getName(), e.getMessage())); result = new Result<>(Collections.singleton(error)); } @@ -84,6 +84,9 @@ public class DocumentParseAction implements CheckAction { results.setParserResult(parserResult); v.getXmlSyntaxError().addAll(parserResult.getErrors()); results.getReportInput().setValidationResultsWellformedness(v); + if (parserResult.isInvalid()) { + log.info("Parsing war nicht erfolgreich: {} -> {}", parserResult.getObject(), parserResult.getErrors()); + } } } diff --git a/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java b/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java index 0201c62..52b521f 100644 --- a/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java +++ b/src/test/java/de/kosit/validationtool/cmd/DaemonIT.java @@ -5,10 +5,13 @@ import static io.restassured.RestAssured.given; import java.io.IOException; import java.io.InputStream; +import org.apache.commons.io.IOUtils; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; import io.restassured.RestAssured; +import io.restassured.http.ContentType; /** * Testet the Daemon-Mode input , Methoden , Output Content-Type and the success case @@ -33,13 +36,13 @@ public class DaemonIT { if (baseHost != null) { RestAssured.baseURI = baseHost; } - + RestAssured.enableLoggingOfRequestAndResponseIfValidationFails(); } @Test public void makeSureThatSuccessTest() throws IOException { try ( InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(EXAMPLE_FILE) ) { - given().contentType(APPLICATION_XML).body(io).when().post("/").then().statusCode(200); + given().contentType(ContentType.XML).body(toContent(io)).when().post("/").then().statusCode(200); } } @@ -49,12 +52,17 @@ public class DaemonIT { } @Test + @Ignore // no default error report yet public void internalServerErrorTest() throws IOException { try ( InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(INVALID_XML) ) { - given().contentType(APPLICATION_XML).body(io).when().post("/").then().statusCode(200); + given().contentType(APPLICATION_XML).body(toContent(io)).when().post("/").then().statusCode(200); } } + private byte[] toContent(final InputStream io) throws IOException { + return IOUtils.toByteArray(io); + } + @Test public void methodNotAllowedTest() { given().when().get("/").then().statusCode(405); @@ -68,7 +76,7 @@ public class DaemonIT { @Test public void xmlResultTest() throws IOException { try ( InputStream io = DaemonIT.class.getClassLoader().getResourceAsStream(EXAMPLE_FILE) ) { - given().body(io).when().post("/").then().contentType(APPLICATION_XML).and().statusCode(200); + given().body(toContent(io)).when().post("/").then().contentType(APPLICATION_XML).and().statusCode(200); } } } diff --git a/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java b/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java index 2b528c2..e28b7ab 100644 --- a/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java +++ b/src/test/java/de/kosit/validationtool/cmd/PrintReportActionTest.java @@ -63,8 +63,8 @@ public class PrintReportActionTest { action.check(b); assertThat(b.isStopped()).isFalse(); assertThat(commandLine.getOutput()).isNotEmpty(); - assertThat(commandLine.getOutput()).startsWith("