From 39e3a52ba6d43ade583f654c86cba537b3e92535 Mon Sep 17 00:00:00 2001 From: Arnold Galovics Date: Mon, 10 Dec 2018 19:25:59 +0100 Subject: [PATCH] #1 Ability to use more than one reporter --- .../options/handler/OutputFormatHandler.java | 10 ++++-- .../brake/report/CheckableReporter.java | 7 ++++ .../brake/report/CompositeReporter.java | 17 ++++++++++ .../swagger/brake/report/HtmlReporter.java | 2 +- .../swagger/brake/report/JsonReporter.java | 2 +- .../swagger/brake/report/Reporter.java | 3 -- .../swagger/brake/report/ReporterFactory.java | 12 ++++--- .../swagger/brake/report/StdOutReporter.java | 2 +- .../redskap/swagger/brake/runner/Options.java | 5 ++- .../handler/OutputFormatHandlerTest.java | 34 +++++++++++++++---- .../AbstractSwaggerBrakeIntTest.java | 3 +- 11 files changed, 76 insertions(+), 21 deletions(-) create mode 100644 src/main/java/io/redskap/swagger/brake/report/CheckableReporter.java create mode 100644 src/main/java/io/redskap/swagger/brake/report/CompositeReporter.java diff --git a/src/main/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandler.java b/src/main/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandler.java index b09a7283..0c796c05 100644 --- a/src/main/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandler.java +++ b/src/main/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandler.java @@ -2,10 +2,13 @@ import static java.lang.String.format; import static java.util.stream.Collectors.toList; +import static java.util.stream.Collectors.toSet; import java.util.Arrays; import java.util.List; +import java.util.Set; +import com.google.common.collect.ImmutableSet; import io.redskap.swagger.brake.cli.options.CliOptions; import io.redskap.swagger.brake.runner.Options; import io.redskap.swagger.brake.runner.OutputFormat; @@ -18,17 +21,18 @@ public class OutputFormatHandler implements CliOptionHandler { @Override public void handle(String propertyValue, Options options) { - OutputFormat format = OutputFormat.STDOUT; + Set formats = ImmutableSet.of(OutputFormat.STDOUT); if (!StringUtils.isBlank(propertyValue)) { try { - format = OutputFormat.valueOf(propertyValue.toUpperCase()); + String[] formatStrings = propertyValue.split(","); + formats = Arrays.stream(formatStrings).map(String::trim).map(String::toUpperCase).map(OutputFormat::valueOf).collect(toSet()); } catch (IllegalArgumentException e) { log.debug("Format cannot be resolved", e); } } - options.setOutputFormat(format); + options.setOutputFormats(ImmutableSet.copyOf(formats)); } @Override diff --git a/src/main/java/io/redskap/swagger/brake/report/CheckableReporter.java b/src/main/java/io/redskap/swagger/brake/report/CheckableReporter.java new file mode 100644 index 00000000..60af9e45 --- /dev/null +++ b/src/main/java/io/redskap/swagger/brake/report/CheckableReporter.java @@ -0,0 +1,7 @@ +package io.redskap.swagger.brake.report; + +import io.redskap.swagger.brake.runner.OutputFormat; + +public interface CheckableReporter extends Reporter { + boolean canReport(OutputFormat format); +} diff --git a/src/main/java/io/redskap/swagger/brake/report/CompositeReporter.java b/src/main/java/io/redskap/swagger/brake/report/CompositeReporter.java new file mode 100644 index 00000000..55e92b7d --- /dev/null +++ b/src/main/java/io/redskap/swagger/brake/report/CompositeReporter.java @@ -0,0 +1,17 @@ +package io.redskap.swagger.brake.report; + +import java.util.Collection; + +import io.redskap.swagger.brake.core.BreakingChange; +import io.redskap.swagger.brake.runner.Options; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class CompositeReporter implements Reporter { + private final Collection delegates; + + @Override + public void report(Collection breakingChanges, Options options) { + delegates.forEach(d -> d.report(breakingChanges, options)); + } +} diff --git a/src/main/java/io/redskap/swagger/brake/report/HtmlReporter.java b/src/main/java/io/redskap/swagger/brake/report/HtmlReporter.java index d6ee6136..13e789da 100644 --- a/src/main/java/io/redskap/swagger/brake/report/HtmlReporter.java +++ b/src/main/java/io/redskap/swagger/brake/report/HtmlReporter.java @@ -20,7 +20,7 @@ @Component @Slf4j -public class HtmlReporter extends AbstractFileReporter { +public class HtmlReporter extends AbstractFileReporter implements CheckableReporter { private static final String FILENAME = "swagger-brake.html"; private final JsonConverter jsonConverter; private final MustacheContentResolver mustacheContentResolver; diff --git a/src/main/java/io/redskap/swagger/brake/report/JsonReporter.java b/src/main/java/io/redskap/swagger/brake/report/JsonReporter.java index 0ef28cdf..d8e99f88 100644 --- a/src/main/java/io/redskap/swagger/brake/report/JsonReporter.java +++ b/src/main/java/io/redskap/swagger/brake/report/JsonReporter.java @@ -16,7 +16,7 @@ @Slf4j @Component -public class JsonReporter extends AbstractFileReporter { +public class JsonReporter extends AbstractFileReporter implements CheckableReporter { private static final String FILENAME = "swagger-brake.json"; private final JsonConverter jsonConverter; diff --git a/src/main/java/io/redskap/swagger/brake/report/Reporter.java b/src/main/java/io/redskap/swagger/brake/report/Reporter.java index 898ff8a8..189c32a1 100644 --- a/src/main/java/io/redskap/swagger/brake/report/Reporter.java +++ b/src/main/java/io/redskap/swagger/brake/report/Reporter.java @@ -4,10 +4,7 @@ import io.redskap.swagger.brake.core.BreakingChange; import io.redskap.swagger.brake.runner.Options; -import io.redskap.swagger.brake.runner.OutputFormat; public interface Reporter { void report(Collection breakingChanges, Options options); - - boolean canReport(OutputFormat format); } diff --git a/src/main/java/io/redskap/swagger/brake/report/ReporterFactory.java b/src/main/java/io/redskap/swagger/brake/report/ReporterFactory.java index ed5b2fe5..dbc22184 100644 --- a/src/main/java/io/redskap/swagger/brake/report/ReporterFactory.java +++ b/src/main/java/io/redskap/swagger/brake/report/ReporterFactory.java @@ -1,6 +1,7 @@ package io.redskap.swagger.brake.report; import java.util.Collection; +import java.util.stream.Collectors; import io.redskap.swagger.brake.runner.Options; import io.redskap.swagger.brake.runner.OutputFormat; @@ -10,11 +11,14 @@ @Component @RequiredArgsConstructor public class ReporterFactory { - private final StdOutReporter stdOutReporter; - private final Collection reporters; + private final Collection reporters; public Reporter create(Options options) { - OutputFormat outputFormat = options.getOutputFormat(); - return reporters.stream().filter(r -> r.canReport(outputFormat)).findAny().orElse(stdOutReporter); + Collection reporters = options.getOutputFormats().stream().map(this::findReporter).collect(Collectors.toList()); + return new CompositeReporter(reporters); + } + + private Reporter findReporter(OutputFormat outputFormat) { + return reporters.stream().filter(r -> r.canReport(outputFormat)).findAny().orElseThrow(() -> new RuntimeException("Reporter cannot be found for format " + outputFormat)); } } diff --git a/src/main/java/io/redskap/swagger/brake/report/StdOutReporter.java b/src/main/java/io/redskap/swagger/brake/report/StdOutReporter.java index ab043670..c6bdeb73 100644 --- a/src/main/java/io/redskap/swagger/brake/report/StdOutReporter.java +++ b/src/main/java/io/redskap/swagger/brake/report/StdOutReporter.java @@ -10,7 +10,7 @@ @Component @Slf4j -public class StdOutReporter implements Reporter { +public class StdOutReporter implements Reporter, CheckableReporter { @Override public void report(Collection breakingChanges, Options options) { if (!breakingChanges.isEmpty()) { diff --git a/src/main/java/io/redskap/swagger/brake/runner/Options.java b/src/main/java/io/redskap/swagger/brake/runner/Options.java index f85a5404..7b03023c 100644 --- a/src/main/java/io/redskap/swagger/brake/runner/Options.java +++ b/src/main/java/io/redskap/swagger/brake/runner/Options.java @@ -1,5 +1,8 @@ package io.redskap.swagger.brake.runner; +import java.util.Collections; +import java.util.Set; + import lombok.Data; @Data @@ -7,7 +10,7 @@ public class Options { private String oldApiPath; private String newApiPath; - private OutputFormat outputFormat; + private Set outputFormats = Collections.emptySet(); private String outputFilePath; private String mavenRepoUrl; diff --git a/src/test/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandlerTest.java b/src/test/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandlerTest.java index 924b909f..6fe844a7 100644 --- a/src/test/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandlerTest.java +++ b/src/test/java/io/redskap/swagger/brake/cli/options/handler/OutputFormatHandlerTest.java @@ -1,5 +1,6 @@ package io.redskap.swagger.brake.cli.options.handler; +import static com.google.common.collect.ImmutableSet.of; import static org.assertj.core.api.Assertions.assertThat; import io.redskap.swagger.brake.runner.Options; @@ -16,7 +17,7 @@ public void testHandleShouldSetFormatToStandardOutWhenPropertyValueIsNull() { // when underTest.handle(null, options); // then - assertThat(options.getOutputFormat()).isEqualTo(OutputFormat.STDOUT); + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.STDOUT)); } @Test @@ -26,7 +27,7 @@ public void testHandleShouldSetFormatToStandardOutWhenPropertyValueIsEmpty() { // when underTest.handle("", options); // then - assertThat(options.getOutputFormat()).isEqualTo(OutputFormat.STDOUT); + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.STDOUT)); } @Test @@ -36,7 +37,7 @@ public void testHandleShouldSetFormatToStandardOutWhenPropertyValueIsNotMappable // when underTest.handle("something", options); // then - assertThat(options.getOutputFormat()).isEqualTo(OutputFormat.STDOUT); + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.STDOUT)); } @Test @@ -46,16 +47,37 @@ public void testHandleShouldSetFormatToStandardOutWhenPropertyValueIsStdOut() { // when underTest.handle("stdout", options); // then - assertThat(options.getOutputFormat()).isEqualTo(OutputFormat.STDOUT); + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.STDOUT)); } @Test - public void testHandleShouldSetFormatToStandardOutWhenPropertyValueIsJson() { + public void testHandleShouldSetFormatToJsonWhenPropertyValueIsJson() { // given Options options = new Options(); // when underTest.handle("json", options); // then - assertThat(options.getOutputFormat()).isEqualTo(OutputFormat.JSON); + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.JSON)); + } + + @Test + public void testHandleShouldSetFormatToJsonAndHtmlWhenValueIsJsonCommaHtml() { + // given + Options options = new Options(); + // when + underTest.handle("json,html", options); + // then + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.HTML, OutputFormat.JSON)); + } + + + @Test + public void testHandleShouldSetFormatToJsonAndHtmlWhenValueIsJsonCommaHtmlWithSpaces() { + // given + Options options = new Options(); + // when + underTest.handle("json, html", options); + // then + assertThat(options.getOutputFormats()).isEqualTo(of(OutputFormat.HTML, OutputFormat.JSON)); } } \ No newline at end of file diff --git a/src/test/java/io/redskap/swagger/brake/integration/AbstractSwaggerBrakeIntTest.java b/src/test/java/io/redskap/swagger/brake/integration/AbstractSwaggerBrakeIntTest.java index 3cbcfc00..7053a527 100644 --- a/src/test/java/io/redskap/swagger/brake/integration/AbstractSwaggerBrakeIntTest.java +++ b/src/test/java/io/redskap/swagger/brake/integration/AbstractSwaggerBrakeIntTest.java @@ -2,6 +2,7 @@ import java.util.Collection; +import com.google.common.collect.ImmutableSet; import io.redskap.swagger.brake.core.BreakingChange; import io.redskap.swagger.brake.core.CoreConfiguration; import io.redskap.swagger.brake.maven.MavenConfiguration; @@ -22,7 +23,7 @@ protected Collection execute(String oldApiPath, String newApiPat Options options = new Options(); options.setOldApiPath(oldApiPath); options.setNewApiPath(newApiPath); - options.setOutputFormat(OutputFormat.STDOUT); + options.setOutputFormats(ImmutableSet.of(OutputFormat.STDOUT)); return underTest.run(options); } }