Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.

Commit 77f11f7

Browse files
committed
デシリアライザーの取得を追加
1 parent f0d9f21 commit 77f11f7

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

src/main/kotlin/com/mapk/krowmapper/ParameterForMap.kt

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
package com.mapk.krowmapper
22

3+
import com.mapk.annotations.KColumnDeserializer
34
import com.mapk.core.EnumMapper
5+
import com.mapk.core.KFunctionWithInstance
46
import com.mapk.core.getAliasOrName
7+
import java.lang.IllegalArgumentException
58
import java.sql.ResultSet
69
import kotlin.reflect.KClass
710
import kotlin.reflect.KFunction
811
import kotlin.reflect.KParameter
12+
import kotlin.reflect.full.companionObjectInstance
13+
import kotlin.reflect.full.functions
14+
import kotlin.reflect.full.staticFunctions
15+
import kotlin.reflect.jvm.isAccessible
16+
import kotlin.reflect.jvm.jvmName
917

1018
class ParameterForMap private constructor(
1119
val param: KParameter,
@@ -16,7 +24,15 @@ class ParameterForMap private constructor(
1624
private val deserializer: KFunction<*>?
1725

1826
init {
19-
deserializer = null
27+
val deserializers = deserializerFromConstructors(kClazz) +
28+
deserializerFromStaticMethods(kClazz) +
29+
deserializerFromCompanionObject(kClazz)
30+
31+
deserializer = when {
32+
deserializers.isEmpty() -> null
33+
deserializers.size == 1 -> deserializers.single()
34+
else -> throw IllegalArgumentException("Find multiple deserializer from ${kClazz.jvmName}")
35+
}
2036
}
2137

2238
fun getObject(rs: ResultSet): Any? = when {
@@ -37,3 +53,35 @@ class ParameterForMap private constructor(
3753
}
3854
}
3955
}
56+
57+
private fun <T> Collection<KFunction<T>>.getDeserializerFromFunctions(): Collection<KFunction<T>> {
58+
return filter { it.annotations.any { annotation -> annotation is KColumnDeserializer } }
59+
.map { func ->
60+
func.isAccessible = true
61+
func
62+
}
63+
}
64+
65+
private fun <T : Any> deserializerFromConstructors(clazz: KClass<T>): Collection<KFunction<T>> {
66+
return clazz.constructors.getDeserializerFromFunctions()
67+
}
68+
69+
@Suppress("UNCHECKED_CAST")
70+
private fun <T : Any> deserializerFromStaticMethods(clazz: KClass<T>): Collection<KFunction<T>> {
71+
val staticFunctions: Collection<KFunction<T>> = clazz.staticFunctions as Collection<KFunction<T>>
72+
return staticFunctions.getDeserializerFromFunctions()
73+
}
74+
75+
@Suppress("UNCHECKED_CAST")
76+
private fun <T : Any> deserializerFromCompanionObject(clazz: KClass<T>): Collection<KFunction<T>> {
77+
return clazz.companionObjectInstance?.let { companionObject ->
78+
companionObject::class.functions
79+
.filter { it.annotations.any { annotation -> annotation is KColumnDeserializer } }
80+
.map { function ->
81+
KFunctionWithInstance(
82+
function,
83+
companionObject
84+
) as KFunction<T>
85+
}.toSet()
86+
} ?: emptySet()
87+
}

0 commit comments

Comments
 (0)