]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.logging/src/org/simantics/logging/LogCollector.java
Logging configuration via SCL and UI & saving to ZIP-archive
[simantics/platform.git] / bundles / org.simantics.logging / src / org / simantics / logging / LogCollector.java
diff --git a/bundles/org.simantics.logging/src/org/simantics/logging/LogCollector.java b/bundles/org.simantics.logging/src/org/simantics/logging/LogCollector.java
new file mode 100644 (file)
index 0000000..4d98e27
--- /dev/null
@@ -0,0 +1,65 @@
+package org.simantics.logging;
+
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.simantics.logging.internal.Activator;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class LogCollector {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(LogCollector.class);
+
+    public static Map<String, List<Path>> allLogs() {
+        Map<String, List<Path>> results = new HashMap<>();
+        if (LOGGER.isDebugEnabled())
+            LOGGER.debug("Collecting all logs from declarative services");
+
+        Collection<LogProvider> logProviders = getLogProviders();
+        for (LogProvider logProvider : logProviders) {
+            List<Path> logs = logProvider.get();
+            String key = logProvider.getClass().getSimpleName();
+            Collection<Path> existing = results.get(key);
+            if (existing != null) {
+                LOGGER.info("Duplicate log providers with name {} exist, merging logs", key);
+                logs.addAll(existing);
+            }
+            results.put(key, logs);
+        }
+        if (LOGGER.isDebugEnabled())
+            LOGGER.debug("Found logs from {} providers", results.keySet());
+        return results;
+    }
+
+    private static List<LogProvider> getLogProviders() {
+        ServiceReference<?>[] serviceReferences = new ServiceReference<?>[0];
+        String key = LogProvider.class.getName();
+        try {
+            serviceReferences = Activator.getContext().getAllServiceReferences(key, null);
+        } catch (InvalidSyntaxException e) {
+            LOGGER.error("Could not get service references for {}!", key, e);
+        }
+        if (serviceReferences.length == 0) {
+            if (LOGGER.isDebugEnabled())
+                LOGGER.debug("No service references found for {}", key);
+            return Collections.emptyList();
+        }
+
+        List<LogProvider> logProviders = new ArrayList<>(serviceReferences.length);
+        for (ServiceReference<?> reference : serviceReferences) {
+            LogProvider logProvider = (LogProvider) Activator.getContext().getService(reference);
+            logProviders.add(logProvider);
+        }
+        if (LOGGER.isDebugEnabled())
+            LOGGER.debug("Found {} log providers", logProviders);
+        return logProviders;
+    }
+}