diff options
Diffstat (limited to 'plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt')
-rw-r--r-- | plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt b/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt new file mode 100644 index 00000000..9b656309 --- /dev/null +++ b/plugins/base/src/main/kotlin/templating/jsonMapperForPlugins.kt @@ -0,0 +1,56 @@ +package org.jetbrains.dokka.base.templating + +import com.fasterxml.jackson.core.JsonGenerator +import com.fasterxml.jackson.databind.DeserializationFeature +import com.fasterxml.jackson.databind.SerializerProvider +import com.fasterxml.jackson.databind.module.SimpleModule +import com.fasterxml.jackson.databind.ser.std.StdScalarSerializer +import com.fasterxml.jackson.databind.type.TypeFactory +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import com.fasterxml.jackson.module.kotlin.jacksonTypeRef +import org.jetbrains.dokka.base.DokkaBase +import java.io.File + +// THIS IS COPIED FROM BASE SINCE IT NEEDS TO BE INSTANTIATED ON THE SAME CLASS LOADER AS PLUGINS + +private val objectMapper = run { + val module = SimpleModule().apply { + addSerializer(FileSerializer) + } + jacksonObjectMapper() + .apply { + typeFactory = PluginTypeFactory() + } + .registerModule(module) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) +} + +@PublishedApi +internal class TypeReference<T> private constructor( + internal val jackson: com.fasterxml.jackson.core.type.TypeReference<T> +) { + companion object { + internal inline operator fun <reified T> invoke(): TypeReference<T> = TypeReference(jacksonTypeRef()) + } +} + +fun toJsonString(value: Any): String = objectMapper.writeValueAsString(value) + +inline fun <reified T : Any> parseJson(json: String): T = parseJson(json, TypeReference()) + + +@PublishedApi +internal fun <T : Any> parseJson(json: String, typeReference: TypeReference<T>): T = + objectMapper.readValue(json, typeReference.jackson) + + +private object FileSerializer : StdScalarSerializer<File>(File::class.java) { + override fun serialize(value: File, g: JsonGenerator, provider: SerializerProvider) { + g.writeString(value.path) + } +} + +private class PluginTypeFactory: TypeFactory(null) { + override fun findClass(className: String): Class<out Any>? = + Class.forName(className, true, DokkaBase::class.java.classLoader) ?: super.findClass(className) +}
\ No newline at end of file |