@@ -19,55 +19,64 @@ import kotlin.reflect.full.staticFunctions
19
19
import kotlin.reflect.jvm.isAccessible
20
20
import kotlin.reflect.jvm.jvmName
21
21
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
+ }
42
35
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))
60
42
}
61
43
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
+ }
63
58
64
59
companion object {
65
60
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
+ }
71
80
}
72
81
}
73
82
}
0 commit comments