From 7db9a4b0b1161666a8f9bbb6f7d0963e80295240 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Mon, 13 Jun 2022 13:55:16 +0200 Subject: [PATCH] [kpm] kgp-idea: Implement IdeaKpmSerializationContext This context shall be used to register extension points like IdeaKpmSerializationLogger or IdeaKpmExtrasSerializationExtension ^KT-52568 In Progress --- .../IdeaKpmExtrasSerializationExtension.kt | 46 +++++++++++++++++++ .../idea/serialize/IdeaKpmExtrasSerializer.kt | 28 +++++++++++ ...eaKpmJavaIoSerializableExtrasSerializer.kt | 43 +++++++++++++++++ .../serialize/IdeaKpmSerializationContext.kt | 11 +++++ .../serialize/IdeaKpmSerializationLogger.kt | 21 +++++++++ 5 files changed, 149 insertions(+) create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializationExtension.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializer.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmJavaIoSerializableExtrasSerializer.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationContext.kt create mode 100644 libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationLogger.kt diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializationExtension.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializationExtension.kt new file mode 100644 index 00000000000..b1f04638cd1 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializationExtension.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.kpm.idea.serialize + +import org.jetbrains.kotlin.tooling.core.Extras + +interface IdeaKpmExtrasSerializationExtension { + fun serializer(key: Extras.Key): IdeaKpmExtrasSerializer? + + object Empty : IdeaKpmExtrasSerializationExtension { + override fun serializer(key: Extras.Key): IdeaKpmExtrasSerializer? = null + } +} + +interface IdeaKpmExtrasSerializationExtensionBuilder { + fun register(key: Extras.Key, serializer: IdeaKpmExtrasSerializer) +} + +fun IdeaKpmExtrasSerializationExtension( + builder: IdeaKpmExtrasSerializationExtensionBuilder.() -> Unit +): IdeaKpmExtrasSerializationExtension { + return IdeaKpmExtrasSerializationExtensionImpl( + IdeaKpmExtrasSerializationExtensionBuilderImpl().apply(builder).serializers + ) +} + +private class IdeaKpmExtrasSerializationExtensionBuilderImpl : IdeaKpmExtrasSerializationExtensionBuilder { + val serializers = mutableMapOf, IdeaKpmExtrasSerializer<*>>() + + override fun register(key: Extras.Key, serializer: IdeaKpmExtrasSerializer) { + serializers[key] = serializer + } +} + + +private class IdeaKpmExtrasSerializationExtensionImpl( + private val map: Map, IdeaKpmExtrasSerializer<*>> +) : IdeaKpmExtrasSerializationExtension { + override fun serializer(key: Extras.Key): IdeaKpmExtrasSerializer? { + @Suppress("unchecked_cast") + return map[key] as? IdeaKpmExtrasSerializer + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializer.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializer.kt new file mode 100644 index 00000000000..a3e09752d1b --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmExtrasSerializer.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.kpm.idea.serialize + +import kotlin.reflect.KClass + +interface IdeaKpmExtrasSerializer { + fun serialize(context: IdeaKpmSerializationContext, value: T): ByteArray? + fun deserialize(context: IdeaKpmSerializationContext, data: ByteArray): T? + + companion object { + /** + * Returns a [IdeaKpmExtrasSerializer] based upon [java.io.Serializable] + */ + fun javaIoSerializable(clazz: KClass): IdeaKpmExtrasSerializer { + return IdeaKpmJavaIoSerializableExtrasSerializer(clazz) + } + + inline fun javaIoSerializable(): IdeaKpmExtrasSerializer { + return javaIoSerializable(T::class) + } + } +} + + diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmJavaIoSerializableExtrasSerializer.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmJavaIoSerializableExtrasSerializer.kt new file mode 100644 index 00000000000..1c7436b17c3 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmJavaIoSerializableExtrasSerializer.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.kpm.idea.serialize + +import java.io.ByteArrayInputStream +import java.io.ByteArrayOutputStream +import java.io.ObjectInputStream +import java.io.ObjectOutputStream +import kotlin.reflect.KClass + +internal class IdeaKpmJavaIoSerializableExtrasSerializer( + private val clazz: KClass +) : IdeaKpmExtrasSerializer { + + override fun serialize(context: IdeaKpmSerializationContext, value: T): ByteArray? { + return try { + ByteArrayOutputStream().use { byteArrayOutputStream -> + ObjectOutputStream(byteArrayOutputStream).use { oos -> oos.writeObject(value) } + byteArrayOutputStream.toByteArray() + } + } catch (t: Throwable) { + context.logger.error("${ErrorMessages.SERIALIZATION_FAILURE} $value", t) + null + } + } + + override fun deserialize(context: IdeaKpmSerializationContext, data: ByteArray): T? { + return try { + ObjectInputStream(ByteArrayInputStream(data)).use { stream -> clazz.java.cast(stream.readObject()) } + } catch (t: Throwable) { + context.logger.error("${ErrorMessages.DESERIALIZATION_FAILURE} ${clazz.java}", t) + null + } + } + + object ErrorMessages { + const val SERIALIZATION_FAILURE = "Failed to serialize" + const val DESERIALIZATION_FAILURE = "Failed to deserialize" + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationContext.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationContext.kt new file mode 100644 index 00000000000..32b10ce83ff --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationContext.kt @@ -0,0 +1,11 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.kpm.idea.serialize + +interface IdeaKpmSerializationContext { + val extrasSerializationExtension: IdeaKpmExtrasSerializationExtension + val logger: IdeaKpmSerializationLogger +} diff --git a/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationLogger.kt b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationLogger.kt new file mode 100644 index 00000000000..67ee68c184e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-idea/src/main/kotlin/org/jetbrains/kotlin/gradle/kpm/idea/serialize/IdeaKpmSerializationLogger.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.kpm.idea.serialize + +interface IdeaKpmSerializationLogger { + enum class Severity { + WARNING, + ERROR, + } + + fun report(severity: Severity, message: String, cause: Throwable? = null) + fun warn(message: String, cause: Throwable? = null) = report(Severity.WARNING, message, cause) + fun error(message: String, cause: Throwable? = null) = report(Severity.ERROR, message, cause) + + object None : IdeaKpmSerializationLogger { + override fun report(severity: Severity, message: String, cause: Throwable?) = Unit + } +}