import java.util.Map;
import java.util.Objects;
import java.util.concurrent.Flow;
+import java.util.concurrent.Flow.Publisher;
import java.util.function.Consumer;
+import java.util.function.Supplier;
/**
* Factory for Java system logging. As it has to be a public class in order to
* be exposed as a service provider, it is also the main entry point for the
* thin logging system, via static methos.
*/
-public class ThinLoggerFinder extends LoggerFinder {
+public class ThinLoggerFinder extends LoggerFinder
+ implements Consumer<Map<String, Object>>, Supplier<Flow.Publisher<Map<String, Serializable>>> {
private static ThinLogging logging;
private static ThinJavaUtilLogging javaUtilLogging;
javaUtilLogging.readConfiguration(logging.getLevels());
}
- public static Consumer<Map<String, Object>> getConfigurationConsumer() {
+ static Consumer<Map<String, Object>> getConfigurationConsumer() {
Objects.requireNonNull(logging);
return logging;
}
- public static Flow.Publisher<Map<String, Serializable>> getLogEntryPublisher() {
+ static Flow.Publisher<Map<String, Serializable>> getLogEntryPublisher() {
Objects.requireNonNull(logging);
return logging.getLogEntryPublisher();
}
+ @Override
+ public Publisher<Map<String, Serializable>> get() {
+ return getLogEntryPublisher();
+ }
+
static void update(Map<String, Object> configuration) {
if (logging == null)
throw new IllegalStateException("Thin logging must be initialized first");
static Logger getLogger(String name) {
return logging.getLogger(name, null);
}
+
+ @Override
+ public void accept(Map<String, Object> t) {
+ if (logging != null) {
+ // delegate to thin logging
+ logging.accept(t);
+ } else {
+ // ignore
+ // TODO try to congure Java logging ?
+ }
+
+ }
+
}
package org.argeo.init.osgi;
+import java.io.Serializable;
import java.lang.System.LoggerFinder;
import java.util.Collections;
import java.util.Hashtable;
import java.util.ServiceLoader;
import java.util.concurrent.Flow;
import java.util.function.Consumer;
+import java.util.function.Supplier;
import org.argeo.init.RuntimeContext;
-import org.argeo.init.logging.ThinLoggerFinder;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
// bundleContext.registerService(AbstractPreferences.class, systemRootPreferences, new Hashtable<>());
// Make sure LoggerFinder has been searched for, since it is lazily loaded
- LoggerFinder.getLoggerFinder();
-
- // logging
- bundleContext.registerService(Consumer.class, ThinLoggerFinder.getConfigurationConsumer(),
- new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.configuration")));
- bundleContext.registerService(Flow.Publisher.class, ThinLoggerFinder.getLogEntryPublisher(),
- new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.publisher")));
-
+ LoggerFinder loggerFinder = LoggerFinder.getLoggerFinder();
+
+ if (loggerFinder instanceof Consumer<?> && loggerFinder instanceof Supplier<?>) {
+ @SuppressWarnings("unchecked")
+ Consumer<Map<String, Object>> consumer = (Consumer<Map<String, Object>>) loggerFinder;
+ // ThinLoggerFinder.getConfigurationConsumer()
+ // ThinLoggerFinder.getLogEntryPublisher()
+
+ @SuppressWarnings("unchecked")
+ Supplier<Flow.Publisher<Map<String, Serializable>>> supplier = (Supplier<Flow.Publisher<Map<String, Serializable>>>) loggerFinder;
+ // logging
+ bundleContext.registerService(Consumer.class, consumer,
+ new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.configuration")));
+ bundleContext.registerService(Flow.Publisher.class, supplier.get(),
+ new Hashtable<>(Collections.singletonMap(Constants.SERVICE_PID, "argeo.logging.publisher")));
+ }
osgiBoot = new OsgiBoot(bundleContext);
osgiBoot.bootstrap(config);