diff --git a/build.gradle b/build.gradle index b04e14e..b72d0a5 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { group 'com.bartek' version '1.0-SNAPSHOT' -sourceCompatibility = 1.8 +sourceCompatibility = 1.12 repositories { mavenCentral() @@ -22,6 +22,8 @@ dependencies { compile "io.vavr:vavr:${vavrVersion}" compile "com.github.javaparser:javaparser-core:${javaParserVersion}" compile "commons-io:commons-io:${commonsIoVersion}" + compile "org.fusesource.jansi:jansi:${jansiVersion}" + } jar { diff --git a/dependency-versions.gradle b/dependency-versions.gradle index 7faffed..0114d4f 100644 --- a/dependency-versions.gradle +++ b/dependency-versions.gradle @@ -5,4 +5,5 @@ ext { vavrVersion = '1.0.0-alpha-2' javaParserVersion = '3.13.4' commonsIoVersion = '2.6' + jansiVersion = '1.17.1' } \ No newline at end of file diff --git a/src/main/java/com/bartek/esa/formatter/archetype/Formatter.java b/src/main/java/com/bartek/esa/formatter/archetype/Formatter.java new file mode 100644 index 0000000..cac7e43 --- /dev/null +++ b/src/main/java/com/bartek/esa/formatter/archetype/Formatter.java @@ -0,0 +1,9 @@ +package com.bartek.esa.formatter.archetype; + +import com.bartek.esa.core.model.object.Issue; + +import java.util.List; + +public interface Formatter { + void format(List issues); +} diff --git a/src/main/java/com/bartek/esa/formatter/di/FormatterModule.java b/src/main/java/com/bartek/esa/formatter/di/FormatterModule.java new file mode 100644 index 0000000..e91db50 --- /dev/null +++ b/src/main/java/com/bartek/esa/formatter/di/FormatterModule.java @@ -0,0 +1,21 @@ +package com.bartek.esa.formatter.di; + +import com.bartek.esa.core.desc.provider.DescriptionProvider; +import com.bartek.esa.formatter.formatter.ColorFormatter; +import com.bartek.esa.formatter.formatter.SimpleFormatter; +import dagger.Module; +import dagger.Provides; + +@Module +public class FormatterModule { + + @Provides + public SimpleFormatter simpleFormatter(DescriptionProvider descriptionProvider) { + return new SimpleFormatter(descriptionProvider); + } + + @Provides + public ColorFormatter colorFormatter(DescriptionProvider descriptionProvider) { + return new ColorFormatter(descriptionProvider); + } +} diff --git a/src/main/java/com/bartek/esa/formatter/formatter/ColorFormatter.java b/src/main/java/com/bartek/esa/formatter/formatter/ColorFormatter.java new file mode 100644 index 0000000..daa71ed --- /dev/null +++ b/src/main/java/com/bartek/esa/formatter/formatter/ColorFormatter.java @@ -0,0 +1,90 @@ +package com.bartek.esa.formatter.formatter; + +import com.bartek.esa.core.desc.provider.DescriptionProvider; +import com.bartek.esa.core.model.object.Issue; +import com.bartek.esa.formatter.archetype.Formatter; +import org.fusesource.jansi.Ansi; +import org.fusesource.jansi.AnsiConsole; + +import javax.inject.Inject; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static org.fusesource.jansi.Ansi.Color.*; +import static org.fusesource.jansi.Ansi.ansi; + +public class ColorFormatter implements Formatter { + + private final DescriptionProvider descriptionProvider; + + @Inject + public ColorFormatter(DescriptionProvider descriptionProvider) { + this.descriptionProvider = descriptionProvider; + } + + @Override + public void format(List issues) { + AnsiConsole.systemInstall(); + String format = issues.stream() + .map(this::format) + .collect(Collectors.joining()); + + System.out.println(format.substring(0, format.length() - 2)); + AnsiConsole.systemUninstall(); + } + + private String format(Issue issue) { + Ansi ansi = ansi(); + ansi = appendDescription(issue, ansi); + ansi = appendFile(issue, ansi); + ansi = appendLine(issue, ansi); + ansi.a("\n"); + + return ansi.toString(); + } + + private Ansi appendDescription(Issue issue, Ansi ansi) { + String description = descriptionProvider.getDescriptionForIssue(issue); + + return ansi + .fg(getColorForSeverity(issue)) + .a(issue.getSeverity().name()) + .reset() + .a(": ").a(description) + .a("\n"); + } + + private Ansi appendFile(Issue issue, Ansi ansi) { + return ansi + .fg(GREEN) + .a("File: ") + .reset() + .a(issue.getFile().getAbsolutePath()) + .a("\n"); + } + + private Ansi appendLine(Issue issue, Ansi ansi) { + Optional.ofNullable(issue.getLine()) + .ifPresent(line -> { + ansi + .fg(BLUE) + .a("Line"); + Optional.ofNullable(issue.getLineNumber()).ifPresentOrElse( + number -> ansi.a(" ").a(number).a(": "), + () -> ansi.a(": ") + ); + ansi.reset().a(line).a("\n"); + }); + return ansi; + } + + private Ansi.Color getColorForSeverity(Issue issue) { + switch(issue.getSeverity()) { + case WARNING: return YELLOW; + case ERROR: return RED; + } + + return RED; + } +} diff --git a/src/main/java/com/bartek/esa/formatter/formatter/SimpleFormatter.java b/src/main/java/com/bartek/esa/formatter/formatter/SimpleFormatter.java new file mode 100644 index 0000000..d9e2933 --- /dev/null +++ b/src/main/java/com/bartek/esa/formatter/formatter/SimpleFormatter.java @@ -0,0 +1,65 @@ +package com.bartek.esa.formatter.formatter; + +import com.bartek.esa.core.desc.provider.DescriptionProvider; +import com.bartek.esa.core.model.object.Issue; +import com.bartek.esa.formatter.archetype.Formatter; + +import javax.inject.Inject; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class SimpleFormatter implements Formatter { + private final DescriptionProvider descriptionProvider; + + @Inject + public SimpleFormatter(DescriptionProvider descriptionProvider) { + this.descriptionProvider = descriptionProvider; + } + + @Override + public void format(List issues) { + String format = issues.stream() + .map(this::format) + .collect(Collectors.joining()); + + System.out.println(format.substring(0, format.length() - 2)); + } + + private String format(Issue issue) { + StringBuilder format = new StringBuilder(); + appendDescription(issue, format); + appendFile(issue, format); + appendLine(issue, format); + format.append("\n"); + + return format.toString(); + } + + private void appendDescription(Issue issue, StringBuilder format) { + String description = descriptionProvider.getDescriptionForIssue(issue); + format + .append(issue.getSeverity().name()) + .append(": ").append(description) + .append("\n"); + } + + private void appendFile(Issue issue, StringBuilder format) { + format + .append("File: ") + .append(issue.getFile().getAbsolutePath()) + .append("\n"); + } + + private void appendLine(Issue issue, StringBuilder format) { + Optional.ofNullable(issue.getLine()) + .ifPresent(line -> { + format.append("Line"); + Optional.ofNullable(issue.getLineNumber()).ifPresentOrElse( + number -> format.append(" ").append(number).append(": "), + () -> format.append(": ") + ); + format.append(line).append("\n"); + }); + } +}