diff --git a/CHANGELOG.md b/CHANGELOG.md index cfc1296..09a7f99 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ do not reflect actual schematron validation result ### Changed - engine info contains version number of the validator (configurations can output this in the report for maintainance puposes) +- Options to customize serialized report file names (cmdline only) via `--report-prefix` and `--report-postfix` ## 1.3.0 diff --git a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java index 2e254aa..9705028 100644 --- a/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java +++ b/src/main/java/de/kosit/validationtool/cmd/CommandLineApplication.java @@ -99,6 +99,12 @@ public class CommandLineApplication { private static final Option DISABLE_GUI = Option.builder("G").longOpt("disable-gui").desc("Disables the GUI of the daemon mode") .build(); + private static final Option REPORT_POSTFIX = Option.builder(null).longOpt("report-postfix").hasArg() + .desc("Postfix of the generated report name").build(); + + private static final Option REPORT_PREFIX = Option.builder(null).longOpt("report-prefix").hasArg() + .desc("Prefix of the generated report name").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(); @@ -173,7 +179,7 @@ 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, REPORT_POSTFIX, REPORT_PREFIX }; warnUnusedOptions(cmd, unavailable, true); final ConfigurationLoader config = Configuration.load(determineDefinition(cmd), determineRepository(cmd)); final Daemon validDaemon = new Daemon(determineHost(cmd), determinePort(cmd), determineThreads(cmd)); @@ -210,7 +216,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, DISABLE_GUI }; warnUnusedOptions(cmd, unavailable, false); final Configuration config = Configuration.load(determineDefinition(cmd), determineRepository(cmd)).build(); @@ -221,7 +227,7 @@ public class CommandLineApplication { if (cmd.hasOption(EXTRACT_HTML.getOpt())) { check.getCheckSteps().add(new ExtractHtmlContentAction(processor, outputDirectory)); } - check.getCheckSteps().add(new SerializeReportAction(outputDirectory, processor)); + check.getCheckSteps().add(new SerializeReportAction(outputDirectory, processor, determineNamingStrategy(cmd))); if (cmd.hasOption(SERIALIZE_REPORT_INPUT.getOpt())) { check.getCheckSteps().add(new SerializeReportInputAction(outputDirectory, check.getConversionService())); } @@ -260,6 +266,18 @@ public class CommandLineApplication { } } + private static NamingStrategy determineNamingStrategy(final CommandLine cmd) { + final DefaultNamingStrategy namingStrategy = new DefaultNamingStrategy(); + if (cmd.hasOption(REPORT_PREFIX.getLongOpt())) { + namingStrategy.setPrefix(cmd.getOptionValue(REPORT_PREFIX.getLongOpt())); + } + if (cmd.hasOption(REPORT_POSTFIX.getLongOpt())) { + namingStrategy.setPostfix(cmd.getOptionValue(REPORT_POSTFIX.getLongOpt())); + } + + return namingStrategy; + } + private static Assertions loadAssertions(final String optionValue) { final Path p = Paths.get(optionValue); Assertions a = null; @@ -385,6 +403,8 @@ public class CommandLineApplication { options.addOption(PRINT_MEM_STATS); options.addOption(WORKER_COUNT); options.addOption(DISABLE_GUI); + options.addOption(REPORT_POSTFIX); + options.addOption(REPORT_PREFIX); return options; } } diff --git a/src/main/java/de/kosit/validationtool/cmd/DefaultNamingStrategy.java b/src/main/java/de/kosit/validationtool/cmd/DefaultNamingStrategy.java new file mode 100644 index 0000000..b4ceeba --- /dev/null +++ b/src/main/java/de/kosit/validationtool/cmd/DefaultNamingStrategy.java @@ -0,0 +1,44 @@ +package de.kosit.validationtool.cmd; + +import static org.apache.commons.lang3.StringUtils.isNotEmpty; + +import org.apache.commons.lang3.StringUtils; + +import lombok.Getter; +import lombok.Setter; + +/** + * A default {@link NamingStrategy} supporting prefix and postfix configurations for generating report names + * + * @author Andreas Penski + */ +@Getter +@Setter +public class DefaultNamingStrategy implements NamingStrategy { + + private String prefix; + + private String postfix = "report"; + + @Override + public String createName(final String base) { + if (StringUtils.isEmpty(base)) { + throw new IllegalArgumentException("Can not generate name based on null input"); + } + final int index = base.lastIndexOf("."); + final StringBuilder result = new StringBuilder(); + if (isNotEmpty(this.prefix)) { + result.append(this.prefix).append("-"); + } + result.append(base, 0, index > 0 ? index : base.length()); + if (isNotEmpty(this.postfix)) { + result.append("-").append(this.postfix); + } + if (index > 0) { + result.append(base.substring(index)); + } else { + result.append(".xml"); + } + return result.toString(); + } +} diff --git a/src/main/java/de/kosit/validationtool/cmd/NamingStrategy.java b/src/main/java/de/kosit/validationtool/cmd/NamingStrategy.java new file mode 100644 index 0000000..d6cf056 --- /dev/null +++ b/src/main/java/de/kosit/validationtool/cmd/NamingStrategy.java @@ -0,0 +1,17 @@ +package de.kosit.validationtool.cmd; + +/** + * Strategy for creating names. This is used for generating the report result name. + * + * @author Andreas Penski + */ +public interface NamingStrategy { + + /** + * Create a name based on a base name + * + * @param base the base name + * @return the generated name + */ + String createName(String base); +} diff --git a/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java b/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java index cc2ef04..b9d7ec5 100644 --- a/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java +++ b/src/main/java/de/kosit/validationtool/cmd/SerializeReportAction.java @@ -43,20 +43,22 @@ class SerializeReportAction implements CheckAction { private final Processor processor; + private final NamingStrategy namingStrategy; + @Override - public void check(Bag results) { - final Path file = outputDirectory.resolve(results.getName() + "-report.xml"); + public void check(final Bag results) { + final Path file = this.outputDirectory.resolve(this.namingStrategy.createName(results.getName())); try { log.info("Serializing result to {}", file.toAbsolutePath()); - final Serializer serializer = processor.newSerializer(file.toFile()); + final Serializer serializer = this.processor.newSerializer(file.toFile()); serializer.serializeNode(results.getReport()); - } catch (SaxonApiException e) { + } catch (final SaxonApiException e) { log.error("Can not serialize result report to {}", file.toAbsolutePath(), e); } } @Override - public boolean isSkipped(Bag results) { + public boolean isSkipped(final Bag results) { if (results.getReport() == null) { log.warn("Can not serialize result report. No document found"); return true; diff --git a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java index 75548c7..59da755 100644 --- a/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java +++ b/src/test/java/de/kosit/validationtool/cmd/CommandlineApplicationTest.java @@ -128,6 +128,16 @@ public class CommandlineApplicationTest { assertThat(this.commandLine.getErrorOutput()).contains(RESULT_OUTPUT); } + @Test + public void testValidNamingConfiguration() { + final String[] args = new String[] { "-s", Paths.get(Simple.SCENARIOS).toString(), "-r", + Paths.get(Simple.REPOSITORY_URI).toString(), Paths.get(Simple.SIMPLE_VALID).toString(), "--report-prefix", "somePrefix", + "--report-postfix", "somePostfix" }; + CommandLineApplication.mainProgram(args); + assertThat(this.commandLine.getErrorOutput()).contains(RESULT_OUTPUT); + assertThat(this.commandLine.getErrorOutput()).contains("somePrefix-simple-somePostfix"); + } + @Test public void testValidMultipleInput() { final String[] args = new String[] { "-s", Paths.get(Simple.SCENARIOS).toString(), "-o", this.output.toString(), "-r", diff --git a/src/test/java/de/kosit/validationtool/cmd/SerializeReportActionTest.java b/src/test/java/de/kosit/validationtool/cmd/SerializeReportActionTest.java index 6807665..c35d23b 100644 --- a/src/test/java/de/kosit/validationtool/cmd/SerializeReportActionTest.java +++ b/src/test/java/de/kosit/validationtool/cmd/SerializeReportActionTest.java @@ -50,7 +50,8 @@ public class SerializeReportActionTest { @Before public void setup() throws IOException { this.tmpDirectory = Files.createTempDirectory("checktool"); - this.action = new SerializeReportAction(this.tmpDirectory, TestObjectFactory.createProcessor()); + final DefaultNamingStrategy namingStrategy = new DefaultNamingStrategy(); + this.action = new SerializeReportAction(this.tmpDirectory, TestObjectFactory.createProcessor(), namingStrategy); } @After