diff --git a/core/src/main/groovy/com/muwire/core/EventBus.groovy b/core/src/main/groovy/com/muwire/core/EventBus.groovy new file mode 100644 index 00000000..a02543c9 --- /dev/null +++ b/core/src/main/groovy/com/muwire/core/EventBus.groovy @@ -0,0 +1,30 @@ +package com.muwire.core + +import java.util.concurrent.CopyOnWriteArrayList + +import com.muwire.core.files.FileSharedEvent + +class EventBus { + + private Map handlers = new HashMap() + + void publish(Event e) { + def currentHandlers + final def clazz = e.getClass() + synchronized(handlers) { + currentHandlers = handlers.getOrDefault(clazz, []) + } + currentHandlers.each { + it."on${clazz.getSimpleName()}"(e) + } + } + + synchronized void register(Class eventType, def handler) { + def currentHandlers = handlers.get(eventType) + if (currentHandlers == null) { + currentHandlers = new CopyOnWriteArrayList() + handlers.put(eventType, currentHandlers) + } + currentHandlers.add handler + } +} diff --git a/core/src/test/groovy/com/muwire/core/EventBusTest.groovy b/core/src/test/groovy/com/muwire/core/EventBusTest.groovy new file mode 100644 index 00000000..e0a7577e --- /dev/null +++ b/core/src/test/groovy/com/muwire/core/EventBusTest.groovy @@ -0,0 +1,26 @@ +package com.muwire.core + +import org.junit.Test + +class EventBusTest { + + class FakeEvent extends Event {} + + class FakeEventHandler { + def onFakeEvent(FakeEvent e) { + assert e == fakeEvent + } + } + + FakeEvent fakeEvent = new FakeEvent() + + EventBus bus = new EventBus() + def handler = new FakeEventHandler() + + @Test + void testDynamicEvent() { + bus.register(FakeEvent.class, handler) + bus.publish(fakeEvent) + } + +}