Skip to content

Commit 1462db5

Browse files
committed
Move mapping mediator builder into core package
1 parent 00106de commit 1462db5

File tree

5 files changed

+68
-55
lines changed

5 files changed

+68
-55
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
package com.trendyol.kediatr
22

3+
/**
4+
* Dependency provider interface.
5+
*/
36
interface DependencyProvider {
7+
/**
8+
* Gets a single instance of the specified class.
9+
*/
410
fun <T> getSingleInstanceOf(clazz: Class<T>): T
511

12+
/**
13+
* Gets all subtypes of the specified class.
14+
*/
615
fun <T> getSubTypesOf(clazz: Class<T>): Collection<Class<T>>
716
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
@file:Suppress("UNCHECKED_CAST")
2+
3+
package com.trendyol.kediatr
4+
5+
import java.lang.reflect.ParameterizedType
6+
7+
/**
8+
* Dependency provider that uses a map to resolve dependencies.
9+
* @param handlerMap A map that contains the handlers.
10+
* The key is the handler class and the value is the handler instance.
11+
* @see DependencyProvider
12+
*/
13+
class MappingDependencyProvider(
14+
private val handlerMap: HashMap<Class<*>, Any>
15+
) : DependencyProvider {
16+
override fun <T> getSingleInstanceOf(clazz: Class<T>): T = handlerMap[clazz] as T
17+
18+
override fun <T> getSubTypesOf(clazz: Class<T>): Collection<Class<T>> = handlerMap.keys
19+
.filter { isCompatibleType(it, clazz) }
20+
.map { it as Class<T> }
21+
22+
private fun <T> isCompatibleType(
23+
handler: Class<*>,
24+
interfaceOrBaseClass: Class<T>
25+
): Boolean = when {
26+
interfaceOrBaseClass.isAssignableFrom(handler) -> true
27+
handler.genericInterfaces
28+
.filterIsInstance<ParameterizedType>()
29+
.any { it.rawType == interfaceOrBaseClass } -> true
30+
31+
else -> when (val superclass = handler.genericSuperclass) {
32+
is ParameterizedType -> {
33+
val inheritedHandler = superclass.rawType as Class<*>
34+
inheritedHandler.genericInterfaces
35+
.filterIsInstance<ParameterizedType>()
36+
.any { it.rawType == interfaceOrBaseClass }
37+
}
38+
39+
is Class<*> -> interfaceOrBaseClass.isAssignableFrom(superclass)
40+
else -> false
41+
}
42+
}
43+
44+
companion object {
45+
/**
46+
* Creates a mediator with the given handlers.
47+
* @param handlers The handlers to be used by the mediator. Can also be [PipelineBehavior] instances.
48+
* @return A mediator instance.
49+
*/
50+
fun createMediator(handlers: List<Any> = emptyList()): Mediator {
51+
val provider = MappingDependencyProvider(handlers.associateBy { it.javaClass } as HashMap<Class<*>, Any>)
52+
val mediator = MediatorBuilder(provider).build()
53+
return mediator
54+
}
55+
}
56+
}

projects/kediatr-core/src/test/kotlin/com/trendyol/kediatr/MediatorTests.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
package com.trendyol.kediatr
22

3+
import com.trendyol.kediatr.MappingDependencyProvider.Companion.createMediator
34
import com.trendyol.kediatr.testing.*
45
import io.kotest.matchers.shouldBe
56
import org.junit.jupiter.api.Test
67

78
class MediatorTests : MediatorUseCases() {
89
override fun provideMediator(): Mediator = createMediator(
9-
types = listOf(
10+
handlers = listOf(
1011
TestCommandHandler(mediator = { testMediator }),
1112
TestPipelineCommandHandler(mediator = { testMediator }),
1213
TestCommandWithResultCommandHandler(mediator = { testMediator }),

projects/kediatr-core/src/testFixtures/kotlin/com/trendyol/kediatr/testing/MappingDependencyProvider.kt

Lines changed: 0 additions & 46 deletions
This file was deleted.
Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,9 @@
11
package com.trendyol.kediatr.testing
22

3-
import com.trendyol.kediatr.*
3+
import com.trendyol.kediatr.Mediator
44

5-
@Suppress("UNCHECKED_CAST")
65
abstract class MediatorTestConvention {
76
abstract fun provideMediator(): Mediator
87

98
val testMediator by lazy { provideMediator() }
10-
11-
protected fun createMediator(types: List<Any> = emptyList()): Mediator {
12-
val provider = MappingDependencyProvider(types.associateBy { it.javaClass } as HashMap<Class<*>, Any>)
13-
val mediator = MediatorBuilder(provider).build()
14-
return mediator
15-
}
169
}

0 commit comments

Comments
 (0)