diff --git a/src/schule/ngb/zm/events/EventGenerator.java b/src/schule/ngb/zm/events/EventGenerator.java new file mode 100644 index 0000000..f8834a0 --- /dev/null +++ b/src/schule/ngb/zm/events/EventGenerator.java @@ -0,0 +1,50 @@ +package schule.ngb.zm.events; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.function.BiConsumer; + +public class EventGenerator> { + + private CopyOnWriteArraySet listeners; + + private ConcurrentMap> eventRegistry; + + public EventGenerator() { + listeners = new CopyOnWriteArraySet<>(); + eventRegistry = new ConcurrentHashMap<>(); + } + + public void registerEventType( String eventKey, BiConsumer dispatcher ) { + if( !eventRegistered(eventKey) ) { + eventRegistry.put(eventKey, dispatcher); + } + } + + public void addListener( L listener ) { + listeners.add(listener); + } + + public void removeListener( L listener ) { + listeners.remove(listener); + } + + public boolean hasListeners() { + return !listeners.isEmpty(); + } + + public boolean eventRegistered( String eventKey ) { + return eventRegistry.containsKey(eventKey); + } + + public void dispatchEvent( String eventKey, final E event ) { + if( eventRegistered(eventKey) ) { + final BiConsumer dispatcher = eventRegistry.get(eventKey); + listeners.stream().forEach(( listener ) -> { + dispatcher.accept(event, listener); + }); + } + } + +} diff --git a/src/schule/ngb/zm/events/Listener.java b/src/schule/ngb/zm/events/Listener.java new file mode 100644 index 0000000..54c6025 --- /dev/null +++ b/src/schule/ngb/zm/events/Listener.java @@ -0,0 +1,7 @@ +package schule.ngb.zm.events; + +public interface Listener { + + + +} diff --git a/test/src/schule/ngb/zm/events/EventGeneratorTest.java b/test/src/schule/ngb/zm/events/EventGeneratorTest.java new file mode 100644 index 0000000..f10979b --- /dev/null +++ b/test/src/schule/ngb/zm/events/EventGeneratorTest.java @@ -0,0 +1,65 @@ +package schule.ngb.zm.events; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class EventGeneratorTest { + + class TestEvent { + + private String data; + + private String type; + + public TestEvent( String data, boolean isStart ) { + this.data = data; + this.type = isStart ? "start" : "stop"; + } + + public String getData() { + return data; + } + + public String getType() { + return type; + } + + } + + interface TestListener extends Listener { + + void startEvent( TestEvent t ); + + void stopEvent( TestEvent t ); + + } + + @Test + void eventRegistry() { + EventGenerator gen = new EventGenerator<>(); + + gen.registerEventType("start", ( event, listener ) -> listener.startEvent(event)); + gen.registerEventType("stop", ( event, listener ) -> listener.stopEvent(event)); + + gen.addListener(new TestListener() { + @Override + public void startEvent( TestEvent t ) { + assertEquals("start", t.getType()); + assertTrue(t.getData().startsWith("Start Event")); + } + + @Override + public void stopEvent( TestEvent t ) { + assertEquals("stop", t.getType()); + assertTrue(t.getData().startsWith("Stop Event")); + } + }); + + gen.dispatchEvent("start", new TestEvent("Start Event 1", true)); + gen.dispatchEvent("stop", new TestEvent("Stop Event 1", false)); + gen.dispatchEvent("stop", new TestEvent("Stop Event 2", false)); + gen.dispatchEvent("start", new TestEvent("Start Event 2", true)); + } + +}