From c98ffd1eb4bb62716123c38ea324420168e5f313 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 28 Feb 2021 11:45:19 +0300 Subject: [PATCH] Logging refactor. Remove Kotlin-logging from common --- build.gradle.kts | 6 +- dataforge-context/api/dataforge-context.api | 70 ++++++++++++------- dataforge-context/build.gradle.kts | 10 --- .../kotlin/hep/dataforge/context/Global.kt | 8 +++ .../hep/dataforge/context/LogManager.kt | 38 ++++++++++ .../hep/dataforge/context/PluginManager.kt | 4 +- .../kotlin/hep/dataforge/context/logging.kt | 33 --------- .../kotlin/hep/dataforge/context/loggingJs.kt | 29 +++++++- .../hep/dataforge/context/loggingJvm.kt | 29 +++++++- .../hep/dataforge/context/loggingNative.kt | 62 +++++----------- dataforge-meta/api/dataforge-meta.api | 5 -- 11 files changed, 167 insertions(+), 127 deletions(-) create mode 100644 dataforge-context/src/commonMain/kotlin/hep/dataforge/context/LogManager.kt delete mode 100644 dataforge-context/src/commonMain/kotlin/hep/dataforge/context/logging.kt diff --git a/build.gradle.kts b/build.gradle.kts index 478af371..65be5b8d 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,7 @@ plugins { allprojects { group = "hep.dataforge" - version = "0.3.1" + version = "0.4.0-dev-1" apply() } @@ -25,4 +25,8 @@ ksciencePublish { bintrayRepo = "dataforge" githubProject = "dataforge-core" spaceRepo = "https://maven.jetbrains.space/mipt-npm/p/df/maven" +} + +apiValidation{ + nonPublicMarkers.add("hep.dataforge.misc.DFExperimental") } \ No newline at end of file diff --git a/dataforge-context/api/dataforge-context.api b/dataforge-context/api/dataforge-context.api index 21ffb157..baeaad1f 100644 --- a/dataforge-context/api/dataforge-context.api +++ b/dataforge-context/api/dataforge-context.api @@ -93,15 +93,53 @@ public final class hep/dataforge/context/Global : hep/dataforge/context/Context public static synthetic fun context$default (Lhep/dataforge/context/Global;Ljava/lang/String;Lhep/dataforge/context/Context;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lhep/dataforge/context/Context; public final fun getContext (Ljava/lang/String;)Lhep/dataforge/context/Context; public fun getCoroutineContext ()Lkotlin/coroutines/CoroutineContext; + public final fun getLogger ()Lhep/dataforge/context/LogManager; } -public final class hep/dataforge/context/LoggingJvmKt { - public static final fun buildLogger (Lhep/dataforge/context/Context;Ljava/lang/String;)Lmu/KLogger; +public final class hep/dataforge/context/KLoggingManager : hep/dataforge/context/AbstractPlugin, hep/dataforge/context/LogManager { + public static final field Companion Lhep/dataforge/context/KLoggingManager$Companion; + public fun ()V + public fun getTag ()Lhep/dataforge/context/PluginTag; + public fun log (Lhep/dataforge/names/Name;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V } -public final class hep/dataforge/context/LoggingKt { - public static final fun getLogger (Lhep/dataforge/context/Context;)Lmu/KLogger; - public static final fun getLogger (Lhep/dataforge/context/ContextAware;)Lmu/KLogger; +public final class hep/dataforge/context/KLoggingManager$Companion : hep/dataforge/context/PluginFactory { + public fun getTag ()Lhep/dataforge/context/PluginTag; + public fun getType ()Lkotlin/reflect/KClass; + public fun invoke (Lhep/dataforge/meta/Meta;Lhep/dataforge/context/Context;)Lhep/dataforge/context/KLoggingManager; + public synthetic fun invoke (Lhep/dataforge/meta/Meta;Lhep/dataforge/context/Context;)Ljava/lang/Object; +} + +public abstract interface class hep/dataforge/context/LogManager : hep/dataforge/context/Plugin { + public static final field Companion Lhep/dataforge/context/LogManager$Companion; + public static final field DEBUG Ljava/lang/String; + public static final field ERROR Ljava/lang/String; + public static final field INFO Ljava/lang/String; + public static final field TRACE Ljava/lang/String; + public static final field WARNING Ljava/lang/String; + public abstract fun log (Lhep/dataforge/names/Name;Ljava/lang/String;Lkotlin/jvm/functions/Function0;)V +} + +public final class hep/dataforge/context/LogManager$Companion { + public static final field DEBUG Ljava/lang/String; + public static final field ERROR Ljava/lang/String; + public static final field INFO Ljava/lang/String; + public static final field TRACE Ljava/lang/String; + public static final field WARNING Ljava/lang/String; +} + +public final class hep/dataforge/context/LogManager$DefaultImpls { + public static fun content (Lhep/dataforge/context/LogManager;Ljava/lang/String;)Ljava/util/Map; + public static fun getDefaultChainTarget (Lhep/dataforge/context/LogManager;)Ljava/lang/String; + public static fun getDefaultTarget (Lhep/dataforge/context/LogManager;)Ljava/lang/String; + public static fun getName (Lhep/dataforge/context/LogManager;)Lhep/dataforge/names/Name; + public static fun toMeta (Lhep/dataforge/context/LogManager;)Lhep/dataforge/meta/Meta; +} + +public final class hep/dataforge/context/LogManagerKt { + public static final fun getLogger (Lhep/dataforge/context/Context;)Lhep/dataforge/context/LogManager; + public static final fun info (Lhep/dataforge/context/LogManager;Lhep/dataforge/names/Name;Lkotlin/jvm/functions/Function0;)V + public static synthetic fun info$default (Lhep/dataforge/context/LogManager;Lhep/dataforge/names/Name;Lkotlin/jvm/functions/Function0;ILjava/lang/Object;)V } public abstract interface class hep/dataforge/context/Plugin : hep/dataforge/context/ContextAware, hep/dataforge/meta/MetaRepr, hep/dataforge/misc/Named, hep/dataforge/provider/Provider { @@ -188,7 +226,6 @@ public final class hep/dataforge/context/PluginTag$Companion { public final class hep/dataforge/context/ResolveKt { public static final fun gather (Lhep/dataforge/context/Context;Ljava/lang/String;Lkotlin/reflect/KClass;Z)Ljava/util/Map; public static synthetic fun gather$default (Lhep/dataforge/context/Context;Ljava/lang/String;Lkotlin/reflect/KClass;ZILjava/lang/Object;)Ljava/util/Map; - public static final fun gatherInSequence (Lhep/dataforge/context/Context;Ljava/lang/String;Lkotlin/reflect/KClass;Z)Lkotlin/sequences/Sequence; public static synthetic fun gatherInSequence$default (Lhep/dataforge/context/Context;Ljava/lang/String;Lkotlin/reflect/KClass;ZILjava/lang/Object;)Lkotlin/sequences/Sequence; public static final fun getValues (Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; public static final fun resolve (Lhep/dataforge/context/Context;Ljava/lang/String;Lhep/dataforge/names/Name;Lkotlin/reflect/KClass;)Ljava/lang/Object; @@ -216,33 +253,12 @@ public abstract interface annotation class hep/dataforge/descriptors/ValueDef : public abstract fun type ()[Lhep/dataforge/values/ValueType; } -public final class hep/dataforge/properties/ConfigProperty : hep/dataforge/properties/Property { - public fun (Lhep/dataforge/meta/Config;Lhep/dataforge/names/Name;Lhep/dataforge/meta/transformations/MetaConverter;)V - public final fun getConfig ()Lhep/dataforge/meta/Config; - public final fun getConverter ()Lhep/dataforge/meta/transformations/MetaConverter; - public final fun getName ()Lhep/dataforge/names/Name; - public fun getValue ()Ljava/lang/Object; - public fun onChange (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V - public fun removeChangeListener (Ljava/lang/Object;)V - public fun setValue (Ljava/lang/Object;)V -} - -public abstract interface class hep/dataforge/properties/Property { - public abstract fun getValue ()Ljava/lang/Object; - public abstract fun onChange (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)V - public abstract fun removeChangeListener (Ljava/lang/Object;)V - public abstract fun setValue (Ljava/lang/Object;)V -} - public final class hep/dataforge/properties/Property$DefaultImpls { public static synthetic fun onChange$default (Lhep/dataforge/properties/Property;Ljava/lang/Object;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V public static synthetic fun removeChangeListener$default (Lhep/dataforge/properties/Property;Ljava/lang/Object;ILjava/lang/Object;)V } public final class hep/dataforge/properties/PropertyKt { - public static final fun bind (Lhep/dataforge/properties/Property;Lhep/dataforge/properties/Property;)V - public static final fun mirror (Lhep/dataforge/properties/Property;Lhep/dataforge/properties/Property;Lkotlinx/coroutines/CoroutineScope;)V - public static final fun toFlow (Lhep/dataforge/properties/Property;)Lkotlinx/coroutines/flow/StateFlow; } public final class hep/dataforge/provider/DfTypeKt { diff --git a/dataforge-context/build.gradle.kts b/dataforge-context/build.gradle.kts index 3f80796e..0eb1083e 100644 --- a/dataforge-context/build.gradle.kts +++ b/dataforge-context/build.gradle.kts @@ -28,16 +28,6 @@ kotlin { api("io.github.microutils:kotlin-logging-js:2.0.4") } } -// -// val nativeMain by getting{ -// dependsOn(commonMain) -// } -// val mingwX64Main by getting{ -// dependsOn(nativeMain) -// } -// val linuxX64Main by getting{ -// dependsOn(nativeMain) -// } } } diff --git a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/Global.kt b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/Global.kt index 0193ca4b..3d995037 100644 --- a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/Global.kt +++ b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/Global.kt @@ -7,6 +7,9 @@ import kotlinx.coroutines.SupervisorJob import kotlin.coroutines.CoroutineContext import kotlin.native.concurrent.ThreadLocal + +internal expect val globalLogger: LogManager + /** * A global root context. Closing [Global] terminates the framework. */ @@ -15,6 +18,11 @@ public object Global : Context("GLOBAL".asName(), null, Meta.EMPTY) { override val coroutineContext: CoroutineContext = GlobalScope.coroutineContext + SupervisorJob() + /** + * The default logging manager + */ + public val logger: LogManager = globalLogger + /** * Closing all contexts * diff --git a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/LogManager.kt b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/LogManager.kt new file mode 100644 index 00000000..830861b8 --- /dev/null +++ b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/LogManager.kt @@ -0,0 +1,38 @@ +package hep.dataforge.context + +import hep.dataforge.names.Name + +public interface LogManager : Plugin { + + public fun log(name: Name, tag: String, body: () -> String) + + public companion object { + public const val TRACE: String = "TRACE" + public const val INFO: String = "INFO" + public const val DEBUG: String = "DEBUG" + public const val WARNING: String = "WARNING" + public const val ERROR: String = "ERROR" + } +} + +public fun LogManager.info(name: Name = Name.EMPTY, body: () -> String): Unit = log(name,LogManager.INFO,body) + +public val Context.logger: LogManager + get() = plugins.find(inherit = true) { it is LogManager } as? LogManager ?: Global.logger + + +///** +// * The logger specific to this context +// */ +//public val Context.logger: Logger get() = buildLogger(name.toString()) +// +///** +// * The logger +// */ +//public val ContextAware.logger: Logger +// get() = if (this is Named) { +// context.buildLogger(Path(context.name, this.name).toString()) +// } else { +// context.logger +// } + diff --git a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/PluginManager.kt b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/PluginManager.kt index 4854b328..66d7e1f8 100644 --- a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/PluginManager.kt +++ b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/PluginManager.kt @@ -93,7 +93,7 @@ public class PluginManager(override val context: Context) : ContextAware, Iterab fetch(factory, meta, true) } - logger.info { "Loading plugin ${plugin.name} into ${context.name}" } + Global.logger.info { "Loading plugin ${plugin.name} into ${context.name}" } plugin.attach(context) plugins.add(plugin) return plugin @@ -114,7 +114,7 @@ public class PluginManager(override val context: Context) : ContextAware, Iterab */ public fun remove(plugin: Plugin) { if (plugins.contains(plugin)) { - logger.info { "Removing plugin ${plugin.name} from ${context.name}" } + Global.logger.info { "Removing plugin ${plugin.name} from ${context.name}" } plugin.detach() plugins.remove(plugin) } diff --git a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/logging.kt b/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/logging.kt deleted file mode 100644 index 6868e0f2..00000000 --- a/dataforge-context/src/commonMain/kotlin/hep/dataforge/context/logging.kt +++ /dev/null @@ -1,33 +0,0 @@ -package hep.dataforge.context - -import hep.dataforge.misc.Named -import hep.dataforge.provider.Path - -/** - * Part of kotlin-logging interface - */ -public expect interface Logger { - public fun trace(msg: () -> Any?) - public fun debug(msg: () -> Any?) - public fun info(msg: () -> Any?) - public fun warn(msg: () -> Any?) - public fun error(msg: () -> Any?) -} - -public expect fun Context.buildLogger(name: String): Logger - -/** - * The logger specific to this context - */ -public val Context.logger: Logger get() = buildLogger(name.toString()) - -/** - * The logger - */ -public val ContextAware.logger: Logger - get() = if (this is Named) { - context.buildLogger(Path(context.name, this.name).toString()) - } else { - context.logger - } - diff --git a/dataforge-context/src/jsMain/kotlin/hep/dataforge/context/loggingJs.kt b/dataforge-context/src/jsMain/kotlin/hep/dataforge/context/loggingJs.kt index bf2df3bb..ffeb68f6 100644 --- a/dataforge-context/src/jsMain/kotlin/hep/dataforge/context/loggingJs.kt +++ b/dataforge-context/src/jsMain/kotlin/hep/dataforge/context/loggingJs.kt @@ -1,8 +1,31 @@ package hep.dataforge.context -import mu.KLogger +import hep.dataforge.meta.Meta +import hep.dataforge.names.Name import mu.KotlinLogging +import kotlin.reflect.KClass -public actual typealias Logger = KLogger +public class KLoggingManager : AbstractPlugin(), LogManager { -public actual fun Context.buildLogger(name: String): Logger = KotlinLogging.logger(name) \ No newline at end of file + override fun log(name: Name, tag: String, body: () -> String) { + val logger = KotlinLogging.logger("[${context.name}] $name") + when (tag) { + LogManager.DEBUG -> logger.debug(body) + LogManager.INFO -> logger.info(body) + LogManager.WARNING -> logger.warn(body) + LogManager.ERROR -> logger.error(body) + else -> logger.trace(body) + } + } + + override val tag: PluginTag get() = Companion.tag + + public companion object : PluginFactory { + override fun invoke(meta: Meta, context: Context): KLoggingManager = KLoggingManager() + + override val tag: PluginTag = PluginTag(group = PluginTag.DATAFORGE_GROUP, name = "log.kotlinLogging") + override val type: KClass = KLoggingManager::class + } +} + +internal actual val globalLogger: LogManager = KLoggingManager().apply { attach(Global) } diff --git a/dataforge-context/src/jvmMain/kotlin/hep/dataforge/context/loggingJvm.kt b/dataforge-context/src/jvmMain/kotlin/hep/dataforge/context/loggingJvm.kt index bf2df3bb..ffeb68f6 100644 --- a/dataforge-context/src/jvmMain/kotlin/hep/dataforge/context/loggingJvm.kt +++ b/dataforge-context/src/jvmMain/kotlin/hep/dataforge/context/loggingJvm.kt @@ -1,8 +1,31 @@ package hep.dataforge.context -import mu.KLogger +import hep.dataforge.meta.Meta +import hep.dataforge.names.Name import mu.KotlinLogging +import kotlin.reflect.KClass -public actual typealias Logger = KLogger +public class KLoggingManager : AbstractPlugin(), LogManager { -public actual fun Context.buildLogger(name: String): Logger = KotlinLogging.logger(name) \ No newline at end of file + override fun log(name: Name, tag: String, body: () -> String) { + val logger = KotlinLogging.logger("[${context.name}] $name") + when (tag) { + LogManager.DEBUG -> logger.debug(body) + LogManager.INFO -> logger.info(body) + LogManager.WARNING -> logger.warn(body) + LogManager.ERROR -> logger.error(body) + else -> logger.trace(body) + } + } + + override val tag: PluginTag get() = Companion.tag + + public companion object : PluginFactory { + override fun invoke(meta: Meta, context: Context): KLoggingManager = KLoggingManager() + + override val tag: PluginTag = PluginTag(group = PluginTag.DATAFORGE_GROUP, name = "log.kotlinLogging") + override val type: KClass = KLoggingManager::class + } +} + +internal actual val globalLogger: LogManager = KLoggingManager().apply { attach(Global) } diff --git a/dataforge-context/src/nativeMain/kotlin/hep/dataforge/context/loggingNative.kt b/dataforge-context/src/nativeMain/kotlin/hep/dataforge/context/loggingNative.kt index 4654ebac..9caa3398 100644 --- a/dataforge-context/src/nativeMain/kotlin/hep/dataforge/context/loggingNative.kt +++ b/dataforge-context/src/nativeMain/kotlin/hep/dataforge/context/loggingNative.kt @@ -1,53 +1,29 @@ package hep.dataforge.context +import hep.dataforge.meta.Meta +import hep.dataforge.names.Name +import kotlin.reflect.KClass -public actual interface Logger { - /** - * Lazy add a log message if isTraceEnabled is true - */ - public actual fun trace(msg: () -> Any?) - /** - * Lazy add a log message if isDebugEnabled is true - */ - public actual fun debug(msg: () -> Any?) +public class NativeLogManager : AbstractPlugin(), LogManager { - /** - * Lazy add a log message if isInfoEnabled is true - */ - public actual fun info(msg: () -> Any?) + override fun log(name: Name, tag: String, body: () -> String) { + val text = try { + body() + } catch (t: Throwable){ + "Error while evaluating log string: ${t.message}" + } + println("[${context.name}] $name: $text") + } - /** - * Lazy add a log message if isWarnEnabled is true - */ - public actual fun warn(msg: () -> Any?) + override val tag: PluginTag get() = Companion.tag - /** - * Lazy add a log message if isErrorEnabled is true - */ - public actual fun error(msg: () -> Any?) + public companion object : PluginFactory { + override fun invoke(meta: Meta, context: Context): NativeLogManager = NativeLogManager() + override val tag: PluginTag = PluginTag(group = PluginTag.DATAFORGE_GROUP, name = "log.native") + override val type: KClass = NativeLogManager::class + } } -public actual fun Context.buildLogger(name: String): Logger = object :Logger{ - override fun trace(msg: () -> Any?) { - println("[TRACE] $name - ${msg()}") - } - - override fun debug(msg: () -> Any?) { - println("[DEBUG] $name - ${msg()}") - } - - override fun info(msg: () -> Any?) { - println("[INFO] $name - ${msg()}") - } - - override fun warn(msg: () -> Any?) { - println("[WARNING] $name - ${msg()}") - } - - override fun error(msg: () -> Any?) { - println("[ERROR] $name - ${msg()}") - } - -} \ No newline at end of file +internal actual val globalLogger: LogManager = NativeLogManager().apply { attach(Global) } diff --git a/dataforge-meta/api/dataforge-meta.api b/dataforge-meta/api/dataforge-meta.api index 06901639..4fcac8ce 100644 --- a/dataforge-meta/api/dataforge-meta.api +++ b/dataforge-meta/api/dataforge-meta.api @@ -175,7 +175,6 @@ public final class hep/dataforge/meta/LaminateKt { public final class hep/dataforge/meta/MapMetaKt { public static final fun toMap (Lhep/dataforge/meta/Meta;Lhep/dataforge/meta/descriptors/NodeDescriptor;)Ljava/util/Map; public static synthetic fun toMap$default (Lhep/dataforge/meta/Meta;Lhep/dataforge/meta/descriptors/NodeDescriptor;ILjava/lang/Object;)Ljava/util/Map; - public static final fun toMeta (Ljava/util/Map;Lhep/dataforge/meta/descriptors/NodeDescriptor;)Lhep/dataforge/meta/Meta; public static synthetic fun toMeta$default (Ljava/util/Map;Lhep/dataforge/meta/descriptors/NodeDescriptor;ILjava/lang/Object;)Lhep/dataforge/meta/Meta; } @@ -417,7 +416,6 @@ public final class hep/dataforge/meta/MutableMeta$DefaultImpls { public final class hep/dataforge/meta/MutableMetaKt { public static final fun append (Lhep/dataforge/meta/MutableItemProvider;Lhep/dataforge/names/Name;Ljava/lang/Object;)V public static final fun append (Lhep/dataforge/meta/MutableItemProvider;Ljava/lang/String;Ljava/lang/Object;)V - public static final fun edit (Lhep/dataforge/meta/AbstractMutableMeta;Lhep/dataforge/names/Name;Lkotlin/jvm/functions/Function1;)V } public abstract interface class hep/dataforge/meta/ObservableItemProvider : hep/dataforge/meta/ItemProvider { @@ -662,7 +660,6 @@ public final class hep/dataforge/meta/transformations/MetaTransformation { public fun equals (Ljava/lang/Object;)Z public static fun equals-impl (Ljava/util/Collection;Ljava/lang/Object;)Z public static final fun equals-impl0 (Ljava/util/Collection;Ljava/util/Collection;)Z - public static final fun generate-impl (Ljava/util/Collection;Lhep/dataforge/meta/Config;)Lhep/dataforge/meta/ObservableItemProvider; public static final fun generate-impl (Ljava/util/Collection;Lhep/dataforge/meta/Meta;)Lhep/dataforge/meta/Meta; public final fun getTransformations ()Ljava/util/Collection; public fun hashCode ()I @@ -805,9 +802,7 @@ public final class hep/dataforge/names/NameKt { } public final class hep/dataforge/names/NameMatcherKt { - public static final fun matches (Lhep/dataforge/names/Name;Lhep/dataforge/names/Name;)Z public static final fun matches (Lhep/dataforge/names/Name;Ljava/lang/String;)Z - public static final fun matches (Lhep/dataforge/names/NameToken;Lhep/dataforge/names/NameToken;)Z } public final class hep/dataforge/names/NameToken {