--- /dev/null
+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;
+ }
+}