From e4818d4f3e2f95aa1b14bf9379efde2eaa8f9185 Mon Sep 17 00:00:00 2001 From: "J. Neugebauer" Date: Thu, 7 Jul 2022 21:45:08 +0200 Subject: [PATCH] =?UTF-8?q?Abstraktion=20f=C3=BCr=20Listener=20API=20erste?= =?UTF-8?q?llt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EventGenerator soll als einheitlicher Unterbau zur Umstzung von Listener Patterns dienen. Damit sollen Listener wie AudioListener oder AnimationListener umgesetzt werden. --- src/schule/ngb/zm/events/EventGenerator.java | 50 ++++++++++++++ src/schule/ngb/zm/events/Listener.java | 7 ++ .../ngb/zm/events/EventGeneratorTest.java | 65 +++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 src/schule/ngb/zm/events/EventGenerator.java create mode 100644 src/schule/ngb/zm/events/Listener.java create mode 100644 test/src/schule/ngb/zm/events/EventGeneratorTest.java 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)); + } + +}