diff --git a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java index 4cea454..a7224d7 100644 --- a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java +++ b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.List; import java.util.stream.Collectors; import org.apache.commons.cli.CommandLine; @@ -46,7 +45,6 @@ import lombok.extern.slf4j.Slf4j; import de.kosit.validationtool.api.CheckConfiguration; import de.kosit.validationtool.api.Input; import de.kosit.validationtool.api.InputFactory; -import de.kosit.validationtool.api.Result; import de.kosit.validationtool.cmd.assertions.Assertions; import de.kosit.validationtool.impl.ConversionService; import de.kosit.validationtool.impl.ObjectFactory; @@ -59,15 +57,14 @@ import de.kosit.validationtool.impl.ObjectFactory; @Slf4j public class CommandLineApplication { - private static final Option HELP = Option.builder("?").longOpt("help").argName("Help").desc("Displays this help").build(); - private static final Option SCENARIOS = Option.builder("s").required().longOpt("scenarios").hasArg() .desc("Location of scenarios.xml e.g.").build(); private static final Option REPOSITORY = Option.builder("r").longOpt("repository").hasArg() .desc("Directory containing scenario content").build(); + private static final Option PRINT = Option.builder("p").longOpt("print").desc("Prints the check result to stdout").build(); private static final Option OUTPUT = Option.builder("o").longOpt("output-directory") @@ -78,20 +75,26 @@ public class CommandLineApplication { private static final Option DEBUG = Option.builder("d").longOpt("debug").desc("Prints some more debug information").build(); + private static final Option SERIALIZE_REPORT_INPUT = Option.builder("c").longOpt("serialize-report-input") + .desc("Serializes the report input to the cwd").build(); + private static final Option CHECK_ASSERTIONS = Option.builder("c").longOpt("check-assertions").hasArg() .desc("Check the result using defined assertions").argName("assertions-file").build(); - private static final Option SERVER = Option.builder("D").longOpt("daemon").desc("Starts a daemon listing for validation requests").build(); + + private static final Option SERVER = Option.builder("D").longOpt("daemon").desc("Starts a daemon listing for validation requests") + .build(); private static final Option HOST = Option.builder("H").longOpt("host").hasArg() .desc("The hostname / IP address to bind the daemon. Default is localhost").build(); - private static final Option PORT = Option.builder("P").longOpt("port").hasArg() - .desc("The port to bind the daemon. Default is 8080").build(); + private static final Option PORT = Option.builder("P").longOpt("port").hasArg().desc("The port to bind the daemon. Default is 8080") + .build(); + + private static final Option WORKER_COUNT = Option.builder("T").longOpt("threads").hasArg() + .desc("Number of threads processing validation requests").build(); - private static final Option WORKER_COUNT = Option.builder("T").longOpt("threads").hasArg().desc("Number of threads processing validation requests").build(); public static final int DAEMON_SIGNAL = 100; - private static final Option PRINT_MEM_STATS = Option.builder("m").longOpt("memory-stats").desc("Prints some memory stats").build(); private CommandLineApplication() { @@ -110,7 +113,6 @@ public class CommandLineApplication { } } - /** * Hauptprogramm für die Kommandozeilen-Applikation. * @@ -165,21 +167,22 @@ public class CommandLineApplication { } private static int startDaemonMode(final CommandLine cmd) { - final Option[] unavailable = new Option[]{PRINT, CHECK_ASSERTIONS, DEBUG, OUTPUT, EXTRACT_HTML}; + final Option[] unavailable = new Option[] { PRINT, CHECK_ASSERTIONS, DEBUG, OUTPUT, EXTRACT_HTML }; warnUnusedOptions(cmd, unavailable, true); - final Daemon validDaemon = new Daemon(determineDefinition(cmd), determineRepository(cmd), determineHost(cmd), determinePort(cmd), determineThreads(cmd)); + final Daemon validDaemon = new Daemon(determineDefinition(cmd), determineRepository(cmd), determineHost(cmd), determinePort(cmd), + determineThreads(cmd)); validDaemon.startServer(); return DAEMON_SIGNAL; } private static void warnUnusedOptions(final CommandLine cmd, final Option[] unavailable, final boolean daemon) { - Arrays.stream(cmd.getOptions()).filter(o -> ArrayUtils.contains(unavailable, o)).map(o -> "The option " + o.getLongOpt() + " is not available in daemon mode").forEach(log::error); + Arrays.stream(cmd.getOptions()).filter(o -> ArrayUtils.contains(unavailable, o)) + .map(o -> "The option " + o.getLongOpt() + " is not available in daemon mode").forEach(log::error); if (daemon && !cmd.getArgList().isEmpty()) { log.info("Ignoring test targets in daemon mode"); } } - private static boolean isHelpRequested(final String[] args) { final Options helpOptions = createHelpOptions(); try { @@ -198,7 +201,7 @@ public class CommandLineApplication { try { long start = System.currentTimeMillis(); - final Option[] unavailable = new Option[]{HOST, PORT, WORKER_COUNT}; + final Option[] unavailable = new Option[] { HOST, PORT, WORKER_COUNT }; warnUnusedOptions(cmd, unavailable, false); final CheckConfiguration d = new CheckConfiguration(determineDefinition(cmd)); d.setScenarioRepository(determineRepository(cmd)); @@ -209,6 +212,9 @@ public class CommandLineApplication { check.getCheckSteps().add(new ExtractHtmlContentAction(check.getContentRepository(), outputDirectory)); } check.getCheckSteps().add(new SerializeReportAction(outputDirectory)); + if (cmd.hasOption(SERIALIZE_REPORT_INPUT.getOpt())) { + check.getCheckSteps().add(new SerializeReportInputAction(outputDirectory, check.getConversionService())); + } if (cmd.hasOption(PRINT.getOpt())) { check.getCheckSteps().add(new PrintReportAction()); } @@ -224,11 +230,10 @@ public class CommandLineApplication { log.info("Setup completed in {}ms\n", System.currentTimeMillis() - start); final Collection targets = determineTestTargets(cmd); - final List results = new ArrayList<>(); start = System.currentTimeMillis(); for (final Path p : targets) { final Input input = InputFactory.read(p); - results.add(check.checkInput(input)); + check.checkInput(input); } final boolean result = check.printAndEvaluate(); log.info("Processing {} object(s) completed in {}ms", targets.size(), System.currentTimeMillis() - start); diff --git a/src/main/java/de/kosit/validationtool/cmd/SerializeReportInputAction.java b/src/main/java/de/kosit/validationtool/cmd/SerializeReportInputAction.java new file mode 100644 index 0000000..bb58ab7 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/cmd/SerializeReportInputAction.java @@ -0,0 +1,46 @@ +package de.kosit.validationtool.cmd; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import de.kosit.validationtool.impl.ConversionService; +import de.kosit.validationtool.impl.tasks.CheckAction; + +/** + * Serializes the {@link de.kosit.validationtool.model.reportInput.CreateReportInput report input} document. + * + * @author Andreas Penski + */ +@RequiredArgsConstructor +@Slf4j +public class SerializeReportInputAction implements CheckAction { + + private final Path outputDirectory; + + private final ConversionService conversionService; + + @Override + public void check(final Bag results) { + final Path file = this.outputDirectory.resolve(results.getName() + "-reportInput.xml"); + try { + log.info("Serializing result to {}", file.toAbsolutePath()); + final String xml = this.conversionService.writeXml(results.getReportInput()); + Files.write(file, xml.getBytes()); + } catch (final IOException e) { + log.error("Can not serialize result report to {}", file.toAbsolutePath(), e); + } + } + + @Override + public boolean isSkipped(final Bag results) { + if (results.getReportInput() == null) { + log.warn("Can not serialize report input. No object found"); + return true; + } + return false; + } +} diff --git a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java index db057ea..823ee18 100644 --- a/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java +++ b/src/main/java/de/kosit/validationtool/impl/DefaultCheck.java @@ -68,6 +68,7 @@ public class DefaultCheck implements Check { @Getter private final ContentRepository contentRepository; + @Getter private final ConversionService conversionService; @Getter diff --git a/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java b/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java index 2063cd7..36ae2ad 100644 --- a/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java +++ b/src/main/java/de/kosit/validationtool/impl/tasks/CheckAction.java @@ -22,6 +22,7 @@ package de.kosit.validationtool.impl.tasks; import java.util.regex.Matcher; import java.util.regex.Pattern; +import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; @@ -53,6 +54,7 @@ public interface CheckAction { private Result scenarioSelectionResult; + @Setter(AccessLevel.NONE) private CreateReportInput reportInput; /** Das finale Ergebnis */ diff --git a/src/test/java/de/kosit/validationtool/cmd/SerializeReportInputActionTest.java b/src/test/java/de/kosit/validationtool/cmd/SerializeReportInputActionTest.java new file mode 100644 index 0000000..a520643 --- /dev/null +++ b/src/test/java/de/kosit/validationtool/cmd/SerializeReportInputActionTest.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Koordinierungsstelle für IT-Standards (KoSIT) under + * one or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. KoSIT licenses this file + * to you 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. + */ + +package de.kosit.validationtool.cmd; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.apache.commons.io.FileUtils; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import de.kosit.validationtool.api.InputFactory; +import de.kosit.validationtool.impl.ConversionService; +import de.kosit.validationtool.impl.tasks.CheckAction; + +/** + * @author Andreas Penski + */ +public class SerializeReportInputActionTest { + + private Path tmpDirectory; + + private SerializeReportInputAction action; + + @Before + public void setup() throws IOException { + this.tmpDirectory = Files.createTempDirectory("validator"); + this.action = new SerializeReportInputAction(this.tmpDirectory, new ConversionService()); + } + + @After + public void tearDown() throws IOException { + FileUtils.deleteDirectory(this.tmpDirectory.toFile()); + } + + @Test + public void testSimpleSerialize() { + final CheckAction.Bag b = new CheckAction.Bag(InputFactory.read("someBytes".getBytes(), "someDoc")); + assertThat(this.action.isSkipped(b)).isFalse(); + this.action.check(b); + assertThat(this.tmpDirectory.toFile().listFiles()).hasSize(1); + } + +}