From 883069a78754a3f152c5b0b7aae8455ae40be6b7 Mon Sep 17 00:00:00 2001 From: Alex <22rial1mpg@hft-stuttgart.de> Date: Thu, 18 Jul 2024 16:03:46 +0200 Subject: [PATCH] Added basis for Eventbus implementation --- .../EventBusListenerTemplate.java | 34 +++++++++++ .../citydoctor2/eventbus/CDEvent.java | 15 +++++ .../citydoctor2/eventbus/CDEventId.java | 60 +++++++++++++++++++ .../citydoctor2/eventbus/EventBus.java | 38 ++++++++++++ .../eventbus/EventBusListener.java | 30 ++++++++++ .../events/CItyModelLoadedEvent.java | 43 +++++++++++++ .../citydoctor2/events/EventTemplate.java | 35 +++++++++++ 7 files changed, 255 insertions(+) create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventListeners/EventBusListenerTemplate.java create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEvent.java create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEventId.java create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBus.java create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBusListener.java create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/CItyModelLoadedEvent.java create mode 100644 CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/EventTemplate.java diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventListeners/EventBusListenerTemplate.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventListeners/EventBusListenerTemplate.java new file mode 100644 index 0000000..b74f74e --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventListeners/EventBusListenerTemplate.java @@ -0,0 +1,34 @@ +package de.hft.stuttgart.citydoctor2.eventListeners; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Set; + +import de.hft.stuttgart.citydoctor2.eventbus.CDEvent; +import de.hft.stuttgart.citydoctor2.eventbus.CDEventId; +import de.hft.stuttgart.citydoctor2.eventbus.EventBusListener; + +public final class EventBusListenerTemplate extends EventBusListener{ + + private static final Set<CDEventId> registeredEvents; + + static { + Set<CDEventId> events = new HashSet<>(); + // signals.add(CDEventId); + // ... + registeredEvents = events; + } + + + public EventBusListenerTemplate() { + super(registeredEvents); + throw new IllegalStateException("Called Constructor of EventListenerTemplate"); + } + + @Override + protected void handleEvent(CDEvent e) { + // Do Event handling logic here + // Oerload to specify different behaviour for each respective Event + } + +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEvent.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEvent.java new file mode 100644 index 0000000..60b1a40 --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEvent.java @@ -0,0 +1,15 @@ +package de.hft.stuttgart.citydoctor2.eventbus; + +/** + * Abstract base for implementation of new Events handled by the eventbus + */ +public interface CDEvent { + + public Object getData(); + + public String getMessage(); + + public String toString(); + + public CDEventId getEventId(); +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEventId.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEventId.java new file mode 100644 index 0000000..ba5cc0a --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/CDEventId.java @@ -0,0 +1,60 @@ +package de.hft.stuttgart.citydoctor2.eventbus; + +import java.io.Serializable; + +public class CDEventId implements Serializable{ + + /** + * + */ + private static final long serialVersionUID = -328991495763035712L; + + public static final CDEventId CITYMODEL_LOADED = new CDEventId("CITYMODEL_LOADED"); + public static final CDEventId CITYMODEL_VALIDATION_STARTED = new CDEventId("CITYMODEL_VALIDATION_STARTED"); + public static final CDEventId CITYMODEL_VALIDATION_FINISHED = new CDEventId("CITYMODEL_VALIDATION_FINISHED"); + public static final CDEventId GEOMETRY_VALIDATION_STARTED = new CDEventId("GEOMETRY_VALIDATION_STARTED"); + public static final CDEventId GEOMETRY_VALIDATION_FINISHED = new CDEventId("GEOMETRY_VALIDATION_END"); + public static final CDEventId CHECK_STARTED = new CDEventId("CHECK_STARTED"); + public static final CDEventId CHECK_FINISHED = new CDEventId("CHECK_FINISHED"); + + + private String name; + + public CDEventId(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + CDEventId other = (CDEventId) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + return name; + } +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBus.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBus.java new file mode 100644 index 0000000..4de0d35 --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBus.java @@ -0,0 +1,38 @@ +package de.hft.stuttgart.citydoctor2.eventbus; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public final class EventBus{ + + private static EventBus INSTANCE; + + private Set<EventBusListener> registeredListeners = new HashSet<>(); + + private EventBus() { + + } + + public static EventBus getInstance() { + if (INSTANCE == null) { + INSTANCE = new EventBus(); + } + + return INSTANCE; + } + + public void emit(CDEvent e) { + registeredListeners.forEach(x -> x.receive(e)); + } + + public boolean tryRegisterEventListener(EventBusListener listener) { + return registeredListeners.add(listener); + } + + public boolean tryUnregisterEventListener(EventBusListener listener) { + return registeredListeners.remove(listener); + } + +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBusListener.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBusListener.java new file mode 100644 index 0000000..e87b93b --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/eventbus/EventBusListener.java @@ -0,0 +1,30 @@ +package de.hft.stuttgart.citydoctor2.eventbus; + +import java.util.Collections; +import java.util.Set; + +public abstract class EventBusListener { + + + protected final Set<CDEventId> listensTo; + + + + protected EventBusListener(Set<CDEventId> events) { + listensTo = Collections.unmodifiableSet(events); + } + + + public void receive(CDEvent e) { + if (listensTo.contains(e.getEventId())) { + handleEvent(e); + } + } + + protected abstract void handleEvent(CDEvent e); + + public Set<CDEventId> getListensTo(){ + return listensTo; + } + +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/CItyModelLoadedEvent.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/CItyModelLoadedEvent.java new file mode 100644 index 0000000..f7aa2f0 --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/CItyModelLoadedEvent.java @@ -0,0 +1,43 @@ +package de.hft.stuttgart.citydoctor2.events; + +import org.citygml4j.core.model.core.CityModel; + +import de.hft.stuttgart.citydoctor2.datastructure.GmlId; +import de.hft.stuttgart.citydoctor2.eventbus.CDEvent; +import de.hft.stuttgart.citydoctor2.eventbus.CDEventId; + +public final class CItyModelLoadedEvent implements CDEvent{ + + private CityModel model; + + private CDEventId id = CDEventId.CITYMODEL_LOADED; + + public CItyModelLoadedEvent(CityModel model) { + this.model = model; + }; + + @Override + public CityModel getData() { + return model; + } + + @Override + public String getMessage() { + String msg = "Loaded %s"; + msg = String.format(msg, model); + return msg; + } + + @Override + public String toString() { + String representation = "[Event: %s, Data: %s]"; + representation = String.format(representation, this.toString(), model.toString()); + return representation; + } + + @Override + public CDEventId getEventId() { + return id; + } + +} diff --git a/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/EventTemplate.java b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/EventTemplate.java new file mode 100644 index 0000000..739cf18 --- /dev/null +++ b/CityDoctorParent/CityDoctorModel/src/main/java/de/hft/stuttgart/citydoctor2/events/EventTemplate.java @@ -0,0 +1,35 @@ +package de.hft.stuttgart.citydoctor2.events; + +import de.hft.stuttgart.citydoctor2.datastructure.GmlId; +import de.hft.stuttgart.citydoctor2.eventbus.CDEvent; +import de.hft.stuttgart.citydoctor2.eventbus.CDEventId; + +public final class EventTemplate implements CDEvent{ + + private Object example; + + public EventTemplate() { + throw new IllegalStateException("Called constructor of Event-template"); + }; + + @Override + public Object getData() { + return example; + } + + @Override + public String getMessage() { + return "Message for a GUI element"; + } + + @Override + public String toString() { + return "String representation of this Event"; + } + + @Override + public CDEventId getEventId() { + return null; + } + +} -- GitLab