@@ -19,55 +19,64 @@ import kotlin.reflect.full.staticFunctions
1919import kotlin.reflect.jvm.isAccessible
2020import kotlin.reflect.jvm.jvmName
2121
22- internal class ParameterForMap private constructor(
23- val param : KParameter ,
24- name : String ,
25- parameterKClazz : KClass <* >
26- ) {
27- private val objectGetter: (ResultSet ) -> Any?
28-
29- init {
30- val deserializerFromParameter = param.getDeserializer()
31- if (deserializerFromParameter != null ) {
32- val deserialize = deserializerFromParameter::deserialize
33-
34- objectGetter = {
35- deserialize.call(it.getObject(name, deserializerFromParameter.srcClass))
36- }
37- } else {
38- val deserializer = parameterKClazz.getDeserializer()
39-
40- if (deserializer != null ) {
41- val targetClass = deserializer.parameters.single().type.classifier as KClass <* >
22+ internal sealed class ParameterForMap {
23+ abstract val param: KParameter
24+ abstract val name: String
25+ abstract val clazz: Class <* >
26+ abstract fun getObject (rs : ResultSet ): Any?
27+
28+ private class Plain (
29+ override val param : KParameter ,
30+ override val name : String ,
31+ override val clazz : Class <* >
32+ ) : ParameterForMap() {
33+ override fun getObject (rs : ResultSet ): Any? = rs.getObject(name, clazz)
34+ }
4235
43- objectGetter = {
44- deserializer.call(it.getObject(name, targetClass.javaObjectType))
45- }
46- } else {
47- val clazz = parameterKClazz.javaObjectType
48-
49- objectGetter = if (clazz.isEnum) {
50- {
51- EnumMapper .getEnum(clazz, it.getString(name))
52- }
53- } else {
54- {
55- it.getObject(name, clazz)
56- }
57- }
58- }
59- }
36+ private class Enum (
37+ override val param : KParameter ,
38+ override val name : String ,
39+ override val clazz : Class <* >
40+ ) : ParameterForMap() {
41+ override fun getObject (rs : ResultSet ): Any? = EnumMapper .getEnum(clazz, rs.getString(name))
6042 }
6143
62- fun getObject (rs : ResultSet ): Any? = objectGetter(rs)
44+ private class Deserializer (
45+ override val param : KParameter ,
46+ override val name : String ,
47+ override val clazz : Class <* >,
48+ private val deserializer : KFunction <* >
49+ ) : ParameterForMap() {
50+ constructor (
51+ param: KParameter ,
52+ name: String ,
53+ deserializer: AbstractKColumnDeserializer <* , * , * >
54+ ) : this (param, name, deserializer.srcClass, deserializer::deserialize)
55+
56+ override fun getObject (rs : ResultSet ): Any? = deserializer.call(rs.getObject(name, clazz))
57+ }
6358
6459 companion object {
6560 fun newInstance (param : KParameter , parameterNameConverter : (String ) -> String ): ParameterForMap {
66- return ParameterForMap (
67- param,
68- parameterNameConverter(param.getAliasOrName()!! ),
69- param.type.classifier as KClass <* >
70- )
61+ val name = parameterNameConverter(param.getAliasOrName()!! )
62+
63+ param.getDeserializer()?.let {
64+ return Deserializer (param, name, it)
65+ }
66+
67+ val parameterKClazz = param.type.classifier as KClass <* >
68+
69+ parameterKClazz.getDeserializer()?.let {
70+ val targetClass = (it.parameters.single().type.classifier as KClass <* >).javaObjectType
71+ return Deserializer (param, name, targetClass, it)
72+ }
73+
74+ return parameterKClazz.javaObjectType.let {
75+ when (it.isEnum) {
76+ true -> Enum (param, name, it)
77+ false -> Plain (param, name, it)
78+ }
79+ }
7180 }
7281 }
7382}
0 commit comments