Skip to content

Instantly share code, notes, and snippets.

@mlesikov
Last active March 8, 2018 13:03
Show Gist options
  • Save mlesikov/7bc02b99d9ed12aacd4c55cefad7259a to your computer and use it in GitHub Desktop.
Save mlesikov/7bc02b99d9ed12aacd4c55cefad7259a to your computer and use it in GitHub Desktop.
class PubSubsMessageHandler(val eventBus:EventBus){
fun handleMsg(json:String){
val gson = Gson()
val pubSubMsg = gson.fromJson(json, PubSubMessage::class.java)
val eventType = eventBus.typeOf(pubSubMsg.event) ?: return
val event = gson.fromJson(pubSubMsg.data, eventType)
eventBus.publish(event as Event)
}
data class PubSubMessage(val event:String, val data:String)
}
interface EventBus{
fun<T> register(eventType: Class<T>, handler: Handler<T>)
fun publish(event: Event)
fun typeOf(eventName: String): Class<*>?
}
class MyEventBus:EventBus{
val map = mutableMapOf<String, Handler<Any>>()
val types = mutableMapOf<String, Class<*>>()
override fun publish(event: Event) {
map[event::class.java.simpleName]!!.handle(event)
}
override fun <T> register(eventType: Class<T>, handler: Handler<T>) {
map[eventType.simpleName] = handler as Handler<Any>
types[eventType.simpleName] = eventType
}
override fun typeOf(eventName: String): Class<*>? = types[eventName]
}
interface Event
interface Handler<in T> {
fun handle(t: T)
}
data class SomeEvent(val id:Long) :Event
data class AnotherEvent(val id:Long):Event
class SomeEventHandler:Handler<SomeEvent> {
var event:SomeEvent? = null
override fun handle(event:SomeEvent){
this.event = event
}
}
class AnotherEventHandler:Handler<AnotherEvent> {
lateinit var event:AnotherEvent
override fun handle(event:AnotherEvent){
this.event = event
}
}
}
//object PubSubMessageBus {
// private val map = mutableMapOf<String, ConsumerV1<Any>>()
//
// fun publish(event: Any) {
// Logger.getLogger(PubSubMessageBus::class.java.simpleName).info("PUBLISHEVENT" + map[event::class.java.name])
// Logger.getLogger(PubSubMessageBus::class.java.simpleName).info("GET EVENT" + map[event::class.java.name])
// map[event::class.java.name]!!.handle(event)
// }
//
// fun <T> listen(eventType: Class<T>, consumer: ConsumerV1<T>) {
// Logger.getLogger(PubSubMessageBus::class.java.simpleName).info("AddedEVENT" + eventType)
// map.put(eventType.name, consumer as ConsumerV1<Any>)
//
// }
//}
//
//interface ConsumerV1<in T> {
// fun handle(t: T)
//}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment