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> allLogs() { Map> results = new HashMap<>(); if (LOGGER.isDebugEnabled()) LOGGER.debug("Collecting all logs from declarative services"); Collection logProviders = getLogProviders(); for (LogProvider logProvider : logProviders) { List logs = logProvider.get(); String key = logProvider.getClass().getSimpleName(); Collection 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 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 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; } }