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