[kpm] kgp-idea: Implement IdeaKpmSerializationContext
This context shall be used to register extension points like IdeaKpmSerializationLogger or IdeaKpmExtrasSerializationExtension ^KT-52568 In Progress
This commit is contained in:
committed by
Space
parent
132743cb7a
commit
7db9a4b0b1
+46
@@ -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 <T : Any> serializer(key: Extras.Key<T>): IdeaKpmExtrasSerializer<T>?
|
||||||
|
|
||||||
|
object Empty : IdeaKpmExtrasSerializationExtension {
|
||||||
|
override fun <T : Any> serializer(key: Extras.Key<T>): IdeaKpmExtrasSerializer<T>? = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IdeaKpmExtrasSerializationExtensionBuilder {
|
||||||
|
fun <T : Any> register(key: Extras.Key<T>, serializer: IdeaKpmExtrasSerializer<T>)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun IdeaKpmExtrasSerializationExtension(
|
||||||
|
builder: IdeaKpmExtrasSerializationExtensionBuilder.() -> Unit
|
||||||
|
): IdeaKpmExtrasSerializationExtension {
|
||||||
|
return IdeaKpmExtrasSerializationExtensionImpl(
|
||||||
|
IdeaKpmExtrasSerializationExtensionBuilderImpl().apply(builder).serializers
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private class IdeaKpmExtrasSerializationExtensionBuilderImpl : IdeaKpmExtrasSerializationExtensionBuilder {
|
||||||
|
val serializers = mutableMapOf<Extras.Key<*>, IdeaKpmExtrasSerializer<*>>()
|
||||||
|
|
||||||
|
override fun <T : Any> register(key: Extras.Key<T>, serializer: IdeaKpmExtrasSerializer<T>) {
|
||||||
|
serializers[key] = serializer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private class IdeaKpmExtrasSerializationExtensionImpl(
|
||||||
|
private val map: Map<Extras.Key<*>, IdeaKpmExtrasSerializer<*>>
|
||||||
|
) : IdeaKpmExtrasSerializationExtension {
|
||||||
|
override fun <T : Any> serializer(key: Extras.Key<T>): IdeaKpmExtrasSerializer<T>? {
|
||||||
|
@Suppress("unchecked_cast")
|
||||||
|
return map[key] as? IdeaKpmExtrasSerializer<T>
|
||||||
|
}
|
||||||
|
}
|
||||||
+28
@@ -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<T : Any> {
|
||||||
|
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 <T : Any> javaIoSerializable(clazz: KClass<T>): IdeaKpmExtrasSerializer<T> {
|
||||||
|
return IdeaKpmJavaIoSerializableExtrasSerializer(clazz)
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun <reified T : Any> javaIoSerializable(): IdeaKpmExtrasSerializer<T> {
|
||||||
|
return javaIoSerializable(T::class)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+43
@@ -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<T : Any>(
|
||||||
|
private val clazz: KClass<T>
|
||||||
|
) : IdeaKpmExtrasSerializer<T> {
|
||||||
|
|
||||||
|
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"
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -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
|
||||||
|
}
|
||||||
+21
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user