From 9669ea20fe6dfd411910e23fd448fe601fa25d70 Mon Sep 17 00:00:00 2001 From: tursom Date: Sun, 8 Mar 2020 02:26:56 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96Yaml.toYaml=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/cn/tursom/core/Parser.kt | 24 +++++++++++ .../core/ThreadLocalSimpleDateFormat.kt | 2 +- .../src/main/kotlin/cn/tursom/yaml/Yaml.kt | 43 +++++++++---------- 3 files changed, 45 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/cn/tursom/core/Parser.kt b/src/main/kotlin/cn/tursom/core/Parser.kt index b89bf1c..63e45db 100644 --- a/src/main/kotlin/cn/tursom/core/Parser.kt +++ b/src/main/kotlin/cn/tursom/core/Parser.kt @@ -4,8 +4,12 @@ import java.lang.reflect.Array import java.lang.reflect.Field import java.lang.reflect.Modifier import java.lang.reflect.ParameterizedType +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.HashSet object Parser { + private val simpleDateFormat = ThreadLocalSimpleDateFormat() private val Field.actualTypeArguments get() = (genericType as ParameterizedType).actualTypeArguments[0] as Class<*> fun parse(yaml: Any, clazz: Class): T? { @@ -26,6 +30,7 @@ object Parser { Float::class.java -> yaml.toFloat() Double::class.java -> yaml.toDouble() Boolean::class.java -> yaml.toBoolean() + Date::class.java -> yaml.toDate() getClazz() -> yaml.toInt() getClazz() -> yaml.toLong() @@ -174,4 +179,23 @@ object Parser { is Map<*, *> -> null else -> toString().toBoolean() } + + private fun Any.toDate(): Date? = when (this) { + is Number -> Date(toLong()) + is Boolean -> null + is String -> when (val time = toLongOrNull()) { + null -> simpleDateFormat.get().parse(this) + else -> Date(time) + } + is Iterable<*> -> null + is Iterator<*> -> null + is Map<*, *> -> null + else -> { + val str = toString() + when (val time = str.toLongOrNull()) { + null -> simpleDateFormat.get().parse(str) + else -> Date(time) + } + } + } } \ No newline at end of file diff --git a/src/main/kotlin/cn/tursom/core/ThreadLocalSimpleDateFormat.kt b/src/main/kotlin/cn/tursom/core/ThreadLocalSimpleDateFormat.kt index bd887d3..d7180bb 100644 --- a/src/main/kotlin/cn/tursom/core/ThreadLocalSimpleDateFormat.kt +++ b/src/main/kotlin/cn/tursom/core/ThreadLocalSimpleDateFormat.kt @@ -2,6 +2,6 @@ package cn.tursom.core import java.text.SimpleDateFormat -class ThreadLocalSimpleDateFormat(val format: String) : SimpThreadLocal({ +class ThreadLocalSimpleDateFormat(val format: String = "YYYY-MM-dd'T'HH:mm:ssZZ") : SimpThreadLocal({ SimpleDateFormat(format) }) \ No newline at end of file diff --git a/utils/yaml/src/main/kotlin/cn/tursom/yaml/Yaml.kt b/utils/yaml/src/main/kotlin/cn/tursom/yaml/Yaml.kt index 23f7e8e..c6f926b 100644 --- a/utils/yaml/src/main/kotlin/cn/tursom/yaml/Yaml.kt +++ b/utils/yaml/src/main/kotlin/cn/tursom/yaml/Yaml.kt @@ -1,13 +1,16 @@ package cn.tursom.yaml import cn.tursom.core.Parser +import cn.tursom.core.ThreadLocalSimpleDateFormat import cn.tursom.core.getClazz import org.yaml.snakeyaml.Yaml import java.lang.reflect.Modifier +import java.util.* @Suppress("MemberVisibilityCanBePrivate", "unused") object Yaml { + private val simpleDateFormat = ThreadLocalSimpleDateFormat() private val yaml = Yaml() fun toYaml(obj: Any): String { @@ -25,7 +28,19 @@ object Yaml { is Long -> stringBuilder.append(obj) is Float -> stringBuilder.append(obj) is Double -> stringBuilder.append(obj) - is String -> stringBuilder.append(obj) + is Date -> stringBuilder.append(simpleDateFormat.get().format(obj)) + is String -> when { + obj.contains('\n') -> { + stringBuilder.append("|${if (obj.endsWith('\n')) '+' else '-'}") + obj.split('\n').forEach { + stringBuilder.append("$indentation$it") + } + } + obj.startsWith('|') -> stringBuilder.append("\"$obj\"") + else -> { + stringBuilder.append(obj) + } + } is Map<*, *> -> { var first = true obj.forEach { (any, u) -> @@ -67,28 +82,10 @@ object Yaml { if ((it.modifiers and (Modifier.STATIC or Modifier.TRANSIENT)) != 0) return@forEach it.isAccessible = true val value = it.get(obj) - when (it.type) { - Byte::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - Char::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - Short::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - Int::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - Long::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - Float::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - Double::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - getClazz() -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - String::class.java -> stringBuilder.append("${getIndentation()}${it.name}: $value\n") - - else -> { - stringBuilder.append("${getIndentation()}${it.name}: ") - toYaml(value, stringBuilder, "${getIndentation()} ") - } + stringBuilder.append("${getIndentation()}${it.name}: ") + toYaml(value, stringBuilder, "${getIndentation()} ") + if (!stringBuilder.endsWith('\n')) { + stringBuilder.append("\n") } } }