From a1f59e5e47bbeb13f20b58a5f9df18b2bdd7ba57 Mon Sep 17 00:00:00 2001 From: Alexander Milster Date: Fri, 3 May 2024 14:37:29 +0200 Subject: [PATCH 1/5] Added command line option for log-level --- cli/src/main/java/de/jplag/cli/CLI.java | 2 ++ cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java | 2 +- cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java | 6 ++---- cli/src/main/java/de/jplag/cli/options/CliOptions.java | 5 +++++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/cli/src/main/java/de/jplag/cli/CLI.java b/cli/src/main/java/de/jplag/cli/CLI.java index e64b811185..8f61f80993 100644 --- a/cli/src/main/java/de/jplag/cli/CLI.java +++ b/cli/src/main/java/de/jplag/cli/CLI.java @@ -11,6 +11,7 @@ import de.jplag.JPlag; import de.jplag.JPlagResult; import de.jplag.cli.logger.CollectedLoggerFactory; +import de.jplag.cli.logger.JPlagLoggerBase; import de.jplag.cli.logger.TongfeiProgressBarProvider; import de.jplag.cli.picocli.CliInputHandler; import de.jplag.exceptions.ExitException; @@ -45,6 +46,7 @@ public void executeCli() throws ExitException, IOException { logger.debug("Your version of JPlag is {}", JPlag.JPLAG_VERSION); if (!this.inputHandler.parse()) { + JPlagLoggerBase.currentLogLevel = this.inputHandler.getCliOptions().advanced.logLevel; ProgressBarLogger.setProgressBarProvider(new TongfeiProgressBarProvider()); switch (this.inputHandler.getCliOptions().mode) { diff --git a/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java b/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java index 85b40629a1..43ad6c0011 100644 --- a/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java +++ b/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java @@ -29,7 +29,7 @@ public class CollectedLogger extends JPlagLoggerBase { private final ConcurrentLinkedDeque allErrors = new ConcurrentLinkedDeque<>(); public CollectedLogger(String name) { - super(LOG_LEVEL_INFO, name); + super(name); } @Override diff --git a/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java b/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java index 34a59fedc7..8b331d5dcd 100644 --- a/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java +++ b/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java @@ -16,14 +16,12 @@ public abstract class JPlagLoggerBase extends AbstractLogger { private static final Level LOG_LEVEL_FOR_EXTERNAL_LIBRARIES = LOG_LEVEL_ERROR; - private final Level currentLogLevel; + public static Level currentLogLevel = LOG_LEVEL_INFO; /** - * @param currentLogLevel The current log level * @param name The name of the logger */ - protected JPlagLoggerBase(Level currentLogLevel, String name) { - this.currentLogLevel = currentLogLevel; + protected JPlagLoggerBase(String name) { this.name = name; } diff --git a/cli/src/main/java/de/jplag/cli/options/CliOptions.java b/cli/src/main/java/de/jplag/cli/options/CliOptions.java index d967ce6631..1467ceffc6 100644 --- a/cli/src/main/java/de/jplag/cli/options/CliOptions.java +++ b/cli/src/main/java/de/jplag/cli/options/CliOptions.java @@ -2,6 +2,8 @@ import java.io.File; +import org.slf4j.event.Level; + import de.jplag.Language; import de.jplag.clustering.ClusteringAlgorithm; import de.jplag.clustering.ClusteringOptions; @@ -98,6 +100,9 @@ public static class Advanced { @Option(names = "--csv-export", description = "Export pairwise similarity values as a CSV file.") public boolean csvExport = false; + + @Option(names = "--log-level", description = "Set the log level for the cli.") + public Level logLevel = Level.INFO; } public static class Clustering { From 51355e2f84c2a130e7964bb0948b56492984d16d Mon Sep 17 00:00:00 2001 From: Alexander Milster Date: Tue, 18 Jun 2024 09:52:09 +0200 Subject: [PATCH 2/5] Encapsulated current log level and removed the progress bar during log levels other than info --- cli/src/main/java/de/jplag/cli/CLI.java | 2 +- .../cli/logger/CliProgressBarProvider.java | 24 +++++++++++++------ .../de/jplag/cli/logger/JPlagLoggerBase.java | 12 ++++++++-- .../de/jplag/cli/logger/VoidProgressBar.java | 16 +++++++++++++ 4 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java diff --git a/cli/src/main/java/de/jplag/cli/CLI.java b/cli/src/main/java/de/jplag/cli/CLI.java index b059f3b57a..45a1e8aecc 100644 --- a/cli/src/main/java/de/jplag/cli/CLI.java +++ b/cli/src/main/java/de/jplag/cli/CLI.java @@ -46,7 +46,7 @@ public void executeCli() throws ExitException, IOException { logger.debug("Your version of JPlag is {}", JPlag.JPLAG_VERSION); if (!this.inputHandler.parse()) { - JPlagLoggerBase.currentLogLevel = this.inputHandler.getCliOptions().advanced.logLevel; + JPlagLoggerBase.setLogLevel(this.inputHandler.getCliOptions().advanced.logLevel); ProgressBarLogger.setProgressBarProvider(new CliProgressBarProvider()); switch (this.inputHandler.getCliOptions().mode) { diff --git a/cli/src/main/java/de/jplag/cli/logger/CliProgressBarProvider.java b/cli/src/main/java/de/jplag/cli/logger/CliProgressBarProvider.java index ebfd98dd9a..63a4757b05 100644 --- a/cli/src/main/java/de/jplag/cli/logger/CliProgressBarProvider.java +++ b/cli/src/main/java/de/jplag/cli/logger/CliProgressBarProvider.java @@ -1,5 +1,9 @@ package de.jplag.cli.logger; +import java.util.Set; + +import org.slf4j.event.Level; + import de.jplag.logging.ProgressBar; import de.jplag.logging.ProgressBarProvider; import de.jplag.logging.ProgressBarType; @@ -11,16 +15,22 @@ * A ProgressBar provider, that used the tongfei progress bar library underneath, to show progress bars on the cli. */ public class CliProgressBarProvider implements ProgressBarProvider { + private static final Set allowedLogLevels = Set.of(Level.INFO); + @Override public ProgressBar initProgressBar(ProgressBarType type, int totalSteps) { - if (type.isIdleBar()) { - IdleBar idleBar = new IdleBar(type.getDefaultText()); - idleBar.start(); - return idleBar; + if (allowedLogLevels.contains(JPlagLoggerBase.getLogLevel())) { + if (type.isIdleBar()) { + IdleBar idleBar = new IdleBar(type.getDefaultText()); + idleBar.start(); + return idleBar; + } else { + me.tongfei.progressbar.ProgressBar progressBar = new ProgressBarBuilder().setTaskName(type.getDefaultText()).setInitialMax(totalSteps) + .setStyle(ProgressBarStyle.ASCII).build(); + return new TongfeiProgressBar(progressBar); + } } else { - me.tongfei.progressbar.ProgressBar progressBar = new ProgressBarBuilder().setTaskName(type.getDefaultText()).setInitialMax(totalSteps) - .setStyle(ProgressBarStyle.ASCII).build(); - return new TongfeiProgressBar(progressBar); + return new VoidProgressBar(); } } } diff --git a/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java b/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java index 8b331d5dcd..e931ddd619 100644 --- a/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java +++ b/cli/src/main/java/de/jplag/cli/logger/JPlagLoggerBase.java @@ -16,7 +16,15 @@ public abstract class JPlagLoggerBase extends AbstractLogger { private static final Level LOG_LEVEL_FOR_EXTERNAL_LIBRARIES = LOG_LEVEL_ERROR; - public static Level currentLogLevel = LOG_LEVEL_INFO; + private static Level currentLogLevel = LOG_LEVEL_INFO; + + public static void setLogLevel(Level logLevel) { + currentLogLevel = logLevel; + } + + public static Level getLogLevel() { + return currentLogLevel; + } /** * @param name The name of the logger @@ -76,7 +84,7 @@ public boolean isErrorEnabled(Marker marker) { } private boolean isLogLevelEnabled(Level logLevel) { - return logLevel.toInt() >= (isJPlagLog() ? this.currentLogLevel.toInt() : LOG_LEVEL_FOR_EXTERNAL_LIBRARIES.toInt()); + return logLevel.toInt() >= (isJPlagLog() ? currentLogLevel.toInt() : LOG_LEVEL_FOR_EXTERNAL_LIBRARIES.toInt()); } private boolean isJPlagLog() { diff --git a/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java b/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java new file mode 100644 index 0000000000..6a05cb73fc --- /dev/null +++ b/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java @@ -0,0 +1,16 @@ +package de.jplag.cli.logger; + +import de.jplag.logging.ProgressBar; + +/** + * An empty {@link ProgressBar} implementation, used to hide the progress bar depending on the log level. + */ +public class VoidProgressBar implements ProgressBar { + @Override + public void step(int number) { + } + + @Override + public void dispose() { + } +} From 298b516f6cf8c77726e82afa6363434f3a625c55 Mon Sep 17 00:00:00 2001 From: Alexander Milster Date: Wed, 26 Jun 2024 17:21:21 +0200 Subject: [PATCH 3/5] Added simple test for VoidProgressBarTest.java --- .../jplag/cli/logger/VoidProgressBarTest.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 cli/src/test/java/de/jplag/cli/logger/VoidProgressBarTest.java diff --git a/cli/src/test/java/de/jplag/cli/logger/VoidProgressBarTest.java b/cli/src/test/java/de/jplag/cli/logger/VoidProgressBarTest.java new file mode 100644 index 0000000000..d3f0961b04 --- /dev/null +++ b/cli/src/test/java/de/jplag/cli/logger/VoidProgressBarTest.java @@ -0,0 +1,49 @@ +package de.jplag.cli.logger; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.slf4j.event.Level; + +import de.jplag.logging.ProgressBar; +import de.jplag.logging.ProgressBarType; + +class VoidProgressBarTest { + @Test + void testVoidProgressBarBehaviour() { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + PrintStream originalOutput = System.out; + System.setOut(new PrintStream(outputStream)); + + VoidProgressBar progressBar = new VoidProgressBar(); + progressBar.step(); + progressBar.step(2); + progressBar.dispose(); + + System.setOut(originalOutput); + + Assertions.assertEquals("", outputStream.toString()); + } + + @ParameterizedTest + @MethodSource("getRelevantLogLevels") + void testVoidProgressBarCreated(Level logLevel) { + Level originalLogLevel = JPlagLoggerBase.getLogLevel(); + JPlagLoggerBase.setLogLevel(logLevel); + + ProgressBar progressBar = new CliProgressBarProvider().initProgressBar(ProgressBarType.CLUSTERING, 10); + progressBar.dispose(); + + Assertions.assertInstanceOf(VoidProgressBar.class, progressBar); + + JPlagLoggerBase.setLogLevel(originalLogLevel); + } + + public static Level[] getRelevantLogLevels() { + return new Level[] {Level.TRACE, Level.DEBUG, Level.ERROR, Level.WARN}; + } +} From cb41f47e1ad9b9521609f00394a0e5554e4d9389 Mon Sep 17 00:00:00 2001 From: Alexander Milster Date: Wed, 26 Jun 2024 18:03:59 +0200 Subject: [PATCH 4/5] spotless --- cli/src/main/java/de/jplag/cli/CLI.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/main/java/de/jplag/cli/CLI.java b/cli/src/main/java/de/jplag/cli/CLI.java index 932aeb8e5f..a5be417426 100644 --- a/cli/src/main/java/de/jplag/cli/CLI.java +++ b/cli/src/main/java/de/jplag/cli/CLI.java @@ -4,7 +4,6 @@ import java.io.FileNotFoundException; import java.io.IOException; -import de.jplag.cli.logger.CollectedLogger; import org.slf4j.ILoggerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,6 +11,7 @@ import de.jplag.JPlag; import de.jplag.JPlagResult; import de.jplag.cli.logger.CliProgressBarProvider; +import de.jplag.cli.logger.CollectedLogger; import de.jplag.cli.logger.CollectedLoggerFactory; import de.jplag.cli.picocli.CliInputHandler; import de.jplag.exceptions.ExitException; From eb382c12c6448f1ce58c137b2dcabb05777d6ee0 Mon Sep 17 00:00:00 2001 From: Alexander Milster Date: Wed, 26 Jun 2024 18:13:06 +0200 Subject: [PATCH 5/5] Sonarcloud --- .../main/java/de/jplag/cli/logger/CollectedLogger.java | 8 ++++---- .../main/java/de/jplag/cli/logger/VoidProgressBar.java | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java b/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java index 8ae3a97c79..b93e8cacf7 100644 --- a/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java +++ b/cli/src/main/java/de/jplag/cli/logger/CollectedLogger.java @@ -20,7 +20,7 @@ public class CollectedLogger extends AbstractLogger { private static final Level LOG_LEVEL_FOR_EXTERNAL_LIBRARIES = Level.ERROR; private static final int MAXIMUM_MESSAGE_LENGTH = 32; private static final PrintStream TARGET_STREAM = System.out; - private static Level CURRENT_LOG_LEVEL = Level.INFO; + private static Level currentLogLevel = Level.INFO; private final transient SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss_SSS"); private final ConcurrentLinkedDeque allErrors = new ConcurrentLinkedDeque<>(); @@ -126,7 +126,7 @@ private boolean isJPlagLog() { } private boolean isLogLevelEnabled(Level logLevel) { - return logLevel.toInt() >= (isJPlagLog() ? CURRENT_LOG_LEVEL.toInt() : LOG_LEVEL_FOR_EXTERNAL_LIBRARIES.toInt()); + return logLevel.toInt() >= (isJPlagLog() ? currentLogLevel.toInt() : LOG_LEVEL_FOR_EXTERNAL_LIBRARIES.toInt()); } private String prepareFormattedMessage(String format, Object[] args) { @@ -156,10 +156,10 @@ private void printLogEntry(LogEntry entry) { } public static Level getLogLevel() { - return CURRENT_LOG_LEVEL; + return currentLogLevel; } public static void setLogLevel(Level logLevel) { - CURRENT_LOG_LEVEL = logLevel; + currentLogLevel = logLevel; } } diff --git a/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java b/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java index 6a05cb73fc..f1453fe392 100644 --- a/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java +++ b/cli/src/main/java/de/jplag/cli/logger/VoidProgressBar.java @@ -8,9 +8,11 @@ public class VoidProgressBar implements ProgressBar { @Override public void step(int number) { + // does nothing see class description } @Override public void dispose() { + // does nothing see class description } }