first working version with event reception in kanban

This commit is contained in:
2025-12-20 00:43:01 +01:00
parent 3b3803dafa
commit bd2fb255d2
11 changed files with 107 additions and 45 deletions

View File

@@ -1,21 +1,26 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.messagebus;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import static de.srsoftware.umbrella.core.Constants.USER;
public abstract class Event<Payload> {
import de.srsoftware.tools.Mappable;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.util.Map;
import org.json.JSONObject;
public abstract class Event<Payload extends Mappable> {
public enum EventType {
CREATE,
UPDATE,
DELETE;
}
}
private UmbrellaUser initiator;
private String realm;
private Payload payload;
private EventType eventType;
public Event(UmbrellaUser initiator, String realm, Payload payload, EventType type){
this.initiator = initiator;
this.realm = realm;
@@ -27,7 +32,21 @@ public abstract class Event<Payload> {
return eventType.toString();
}
public abstract String json();
public abstract boolean isIntendedFor(UmbrellaUser user);
public String json(){
Class<?> clazz = payload.getClass();
{ // get the highest superclass that is not object
Class<?> parent = clazz.getSuperclass();
while (parent != null && parent != Object.class) {
clazz = parent;
parent = clazz.getSuperclass();
}
}
var map = Map.of(USER,initiator.toMap(),clazz.getSimpleName().toLowerCase(),payload.toMap());
return new JSONObject(map).toString();
}
public Payload payload(){
return payload;

View File

@@ -5,7 +5,6 @@ import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
import java.net.InetSocketAddress;
import java.util.LinkedList;
import java.util.Objects;
public class EventQueue extends LinkedList<Event> implements AutoCloseable, EventListener {

View File

@@ -4,6 +4,7 @@ package de.srsoftware.umbrella.messagebus;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
import static java.lang.System.Logger.Level.*;
import static java.lang.Thread.sleep;
import static java.net.HttpURLConnection.HTTP_OK;
import com.sun.net.httpserver.HttpExchange;
@@ -13,7 +14,6 @@ import de.srsoftware.tools.SessionToken;
import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.Token;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
@@ -42,14 +42,16 @@ public class MessageApi extends BaseHandler{
LOG.log(INFO,"{0} opened event stream.",addr);
var counter = 0;
while (!stream.checkError()){
Thread.sleep(100);
sleep(100);
if (eventQueue.isEmpty()){
if (++counter > 300) counter = sendBeacon(addr,stream);
} else {
var elem = eventQueue.remove(0);
LOG.log(DEBUG,"sending event to {0}",addr);
sendEvent(stream,elem);
counter = 0;
var event = eventQueue.removeFirst();
//if (event.isIntendedFor(user.get())) {
LOG.log(DEBUG, "sending event to {0}", addr);
sendEvent(stream, event);
counter = 0;
//}
}
}
LOG.log(INFO,"{0} disconnected from event stream.",addr);

View File

@@ -5,15 +5,18 @@ import static de.srsoftware.umbrella.core.Constants.TASK;
import de.srsoftware.umbrella.core.model.Task;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import org.json.JSONObject;
public class TaskEvent extends Event<Task>{
public TaskEvent(UmbrellaUser initiator, Task task, EventType type){
super(initiator,TASK, task, type);
super(initiator, TASK, task, type);
}
@Override
public String json() {
return new JSONObject(payload().toMap()).toString();
public boolean isIntendedFor(UmbrellaUser user) {
for (var member : payload().members().values()){
if (member.user().equals(user)) return true;
}
return false;
}
}