Просмотр исходного кода

Repaired Finalize function of loggers

Dominik Fuchß 4 лет назад
Родитель
Сommit
af7dcbe6ee

+ 11 - 3
jplag.cli/src/main/java/de/jplag/CLI.java

@@ -12,6 +12,7 @@ import net.sourceforge.argparse4j.inf.ArgumentParser;
 import net.sourceforge.argparse4j.inf.ArgumentParserException;
 import net.sourceforge.argparse4j.inf.Namespace;
 
+import org.slf4j.ILoggerFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -20,7 +21,7 @@ import de.jplag.clustering.ClusteringOptions;
 import de.jplag.clustering.Preprocessing;
 import de.jplag.clustering.algorithm.InterClusterSimilarity;
 import de.jplag.exceptions.ExitException;
-import de.jplag.logger.CollectedLogger;
+import de.jplag.logger.CollectedLoggerFactory;
 import de.jplag.options.JPlagOptions;
 import de.jplag.options.LanguageOption;
 import de.jplag.options.SimilarityMetric;
@@ -63,14 +64,21 @@ public class CLI {
             JPlagResult result = program.run();
             Report report = new JsonReport();
             report.saveReport(result, arguments.getString(RESULT_FOLDER.flagWithoutDash()));
-            CollectedLogger.finalizeInstances();
+            finalizeLogger();
         } catch (ExitException exception) {
             logger.error(exception.getMessage(), exception);
-            CollectedLogger.finalizeInstances();
+            finalizeLogger();
             System.exit(1);
         }
     }
 
+    private static void finalizeLogger() {
+        ILoggerFactory factory = LoggerFactory.getILoggerFactory();
+        if (!(factory instanceof CollectedLoggerFactory collectedLoggerFactory))
+            return;
+        collectedLoggerFactory.finalizeInstances();
+    }
+
     /**
      * Creates the command line interface and initializes the argument parser.
      */

+ 1 - 11
jplag.cli/src/main/java/de/jplag/logger/CollectedLogger.java

@@ -5,7 +5,6 @@ import java.io.Serial;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.List;
 import java.util.concurrent.ConcurrentLinkedDeque;
 
 import org.slf4j.helpers.FormattingTuple;
@@ -19,14 +18,6 @@ import org.slf4j.spi.LocationAwareLogger;
  */
 public final class CollectedLogger extends MarkerIgnoringBase {
 
-    private static final ConcurrentLinkedDeque<CollectedLogger> instances = new ConcurrentLinkedDeque<>();
-
-    public static void finalizeInstances() {
-        List<CollectedLogger> copy = new ArrayList<>(instances);
-        copy.forEach(instances::remove);
-        copy.forEach(CollectedLogger::printAllErrorsForLogger);
-    }
-
     @Serial
     private static final long serialVersionUID = -1278670638921140275L;
 
@@ -55,7 +46,6 @@ public final class CollectedLogger extends MarkerIgnoringBase {
 
     CollectedLogger(String name) {
         this.name = name;
-        instances.add(this);
     }
 
     private void log(int level, String message, Throwable t) {
@@ -93,7 +83,7 @@ public final class CollectedLogger extends MarkerIgnoringBase {
         write(buf, t);
     }
 
-    private void printAllErrorsForLogger() {
+    void printAllErrorsForLogger() {
         this.isFinalizing = true;
         // Copy errors to prevent infinite recursion
         var errors = new ArrayList<>(this.allErrors);

+ 10 - 3
jplag.cli/src/main/java/de/jplag/logger/CollectedLoggerFactory.java

@@ -1,5 +1,7 @@
 package de.jplag.logger;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
@@ -12,7 +14,7 @@ import org.slf4j.Logger;
  */
 public final class CollectedLoggerFactory implements ILoggerFactory {
 
-    private final ConcurrentMap<String, Logger> loggerMap;
+    private final ConcurrentMap<String, CollectedLogger> loggerMap;
 
     public CollectedLoggerFactory() {
         loggerMap = new ConcurrentHashMap<>();
@@ -22,13 +24,18 @@ public final class CollectedLoggerFactory implements ILoggerFactory {
      * Return an appropriate {@link CollectedLogger} instance by name.
      */
     public Logger getLogger(String name) {
-        Logger simpleLogger = loggerMap.get(name);
+        CollectedLogger simpleLogger = loggerMap.get(name);
         if (simpleLogger != null) {
             return simpleLogger;
         } else {
-            Logger newInstance = new CollectedLogger(name);
+            CollectedLogger newInstance = new CollectedLogger(name);
             Logger oldInstance = loggerMap.putIfAbsent(name, newInstance);
             return oldInstance == null ? newInstance : oldInstance;
         }
     }
+
+    public void finalizeInstances() {
+        List<CollectedLogger> copy = new ArrayList<>(loggerMap.values());
+        copy.forEach(CollectedLogger::printAllErrorsForLogger);
+    }
 }