@@ -2,17 +2,14 @@ package com.mapk.kmapper
22
33import com.mapk.annotations.KGetterAlias
44import com.mapk.annotations.KGetterIgnore
5- import com.mapk.core.ArgumentBucket
5+ import com.mapk.core.ArgumentAdaptor
66import com.mapk.core.KFunctionForCall
7- import com.mapk.core.getAliasOrName
8- import com.mapk.core.isUseDefaultArgument
97import com.mapk.core.toKConstructor
108import java.lang.reflect.Method
119import java.util.concurrent.ConcurrentHashMap
1210import java.util.concurrent.ConcurrentMap
1311import kotlin.reflect.KClass
1412import kotlin.reflect.KFunction
15- import kotlin.reflect.KParameter
1613import kotlin.reflect.KVisibility
1714import kotlin.reflect.full.memberProperties
1815import kotlin.reflect.jvm.javaGetter
@@ -22,28 +19,26 @@ class KMapper<T : Any> private constructor(
2219 parameterNameConverter : (String ) -> String
2320) {
2421 constructor (function: KFunction <T >, parameterNameConverter: (String ) -> String = { it }) : this (
25- KFunctionForCall (function), parameterNameConverter
22+ KFunctionForCall (function, parameterNameConverter ), parameterNameConverter
2623 )
2724
2825 constructor (clazz: KClass <T >, parameterNameConverter: (String ) -> String = { it }) : this (
29- clazz.toKConstructor(), parameterNameConverter
26+ clazz.toKConstructor(parameterNameConverter ), parameterNameConverter
3027 )
3128
32- private val parameterMap: Map <String , ParameterForMap <* >> = function.parameters
33- .filter { it.kind != KParameter .Kind .INSTANCE && ! it.isUseDefaultArgument() }
34- .associate {
35- (parameterNameConverter(it.getAliasOrName()!! )) to ParameterForMap .newInstance(it, parameterNameConverter)
36- }
29+ private val parameterMap: Map <String , ParameterForMap <* >> = function.requiredParameters.associate {
30+ it.name to ParameterForMap (it, parameterNameConverter)
31+ }
3732
3833 private val getCache: ConcurrentMap <KClass <* >, List <ArgumentBinder >> = ConcurrentHashMap ()
3934
40- private fun bindArguments (argumentBucket : ArgumentBucket , src : Any ) {
35+ private fun bindArguments (argumentAdaptor : ArgumentAdaptor , src : Any ) {
4136 val clazz = src::class
4237
4338 // キャッシュヒットしたら登録した内容に沿って取得処理を行う
4439 getCache[clazz]?.let { getters ->
4540 // 取得対象フィールドは十分絞り込んでいると考えられるため、終了判定は行わない
46- getters.forEach { it.bindArgument(src, argumentBucket ) }
41+ getters.forEach { it.bindArgument(src, argumentAdaptor ) }
4742 return
4843 }
4944
@@ -68,73 +63,75 @@ class KMapper<T : Any> private constructor(
6863
6964 val binder = ArgumentBinder (param, javaGetter)
7065
71- binder.bindArgument(src, argumentBucket )
66+ binder.bindArgument(src, argumentAdaptor )
7267 tempBinderArrayList.add(binder)
7368 // キャッシュの整合性を保つため、ここでは終了判定を行わない
7469 }
7570 }
7671 getCache.putIfAbsent(clazz, tempBinderArrayList)
7772 }
7873
79- private fun bindArguments (argumentBucket : ArgumentBucket , src : Map <* , * >) {
74+ private fun bindArguments (argumentAdaptor : ArgumentAdaptor , src : Map <* , * >) {
8075 src.forEach { (key, value) ->
8176 parameterMap[key]?.let { param ->
8277 // 取得した内容がnullでなければ適切にmapする
83- argumentBucket .putIfAbsent(param.param , value?.let { param.mapObject(value) })
78+ argumentAdaptor .putIfAbsent(param.name , value?.let { param.mapObject(value) })
8479 // 終了判定
85- if (argumentBucket.isInitialized ) return
80+ if (argumentAdaptor.isFullInitialized() ) return
8681 }
8782 }
8883 }
8984
90- private fun bindArguments (argumentBucket : ArgumentBucket , srcPair : Pair <* , * >) {
91- parameterMap[srcPair.first.toString()]?.let {
92- argumentBucket.putIfAbsent(it.param, srcPair.second?.let { value -> it.mapObject(value) })
85+ private fun bindArguments (argumentAdaptor : ArgumentAdaptor , srcPair : Pair <* , * >) {
86+ val key = srcPair.first.toString()
87+
88+ parameterMap[key]?.let {
89+ argumentAdaptor.putIfAbsent(key, srcPair.second?.let { value -> it.mapObject(value) })
9390 }
9491 }
9592
9693 fun map (srcMap : Map <String , Any ?>): T {
97- val bucket : ArgumentBucket = function.getArgumentBucket ()
98- bindArguments(bucket , srcMap)
94+ val adaptor : ArgumentAdaptor = function.getArgumentAdaptor ()
95+ bindArguments(adaptor , srcMap)
9996
100- return function.call(bucket )
97+ return function.call(adaptor )
10198 }
10299
103100 fun map (srcPair : Pair <String , Any ?>): T {
104- val bucket : ArgumentBucket = function.getArgumentBucket ()
105- bindArguments(bucket , srcPair)
101+ val adaptor : ArgumentAdaptor = function.getArgumentAdaptor ()
102+ bindArguments(adaptor , srcPair)
106103
107- return function.call(bucket )
104+ return function.call(adaptor )
108105 }
109106
110107 fun map (src : Any ): T {
111- val bucket : ArgumentBucket = function.getArgumentBucket ()
112- bindArguments(bucket , src)
108+ val adaptor : ArgumentAdaptor = function.getArgumentAdaptor ()
109+ bindArguments(adaptor , src)
113110
114- return function.call(bucket )
111+ return function.call(adaptor )
115112 }
116113
117114 fun map (vararg args : Any ): T {
118- val bucket : ArgumentBucket = function.getArgumentBucket ()
115+ val adaptor : ArgumentAdaptor = function.getArgumentAdaptor ()
119116
120117 listOf (* args).forEach { arg ->
121118 when (arg) {
122- is Map <* , * > -> bindArguments(bucket , arg)
123- is Pair <* , * > -> bindArguments(bucket , arg)
124- else -> bindArguments(bucket , arg)
119+ is Map <* , * > -> bindArguments(adaptor , arg)
120+ is Pair <* , * > -> bindArguments(adaptor , arg)
121+ else -> bindArguments(adaptor , arg)
125122 }
126123 }
127124
128- return function.call(bucket )
125+ return function.call(adaptor )
129126 }
130127}
131128
132129private class ArgumentBinder (private val param : ParameterForMap <* >, private val javaGetter : Method ) {
133- fun bindArgument (src : Any , bucket : ArgumentBucket ) {
130+ fun bindArgument (src : Any , adaptor : ArgumentAdaptor ) {
134131 // 初期化済みであれば高コストな取得処理は行わない
135- if (! bucket.containsKey (param.param )) {
132+ if (! adaptor.isInitialized (param.name )) {
136133 // javaGetterを呼び出す方が高速
137- bucket .putIfAbsent(param.param , javaGetter.invoke(src)?.let { param.mapObject(it) })
134+ adaptor .putIfAbsent(param.name , javaGetter.invoke(src)?.let { param.mapObject(it) })
138135 }
139136 }
140137}
0 commit comments