diff --git a/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketClient.java b/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketClient.java index aedb78811..c86564457 100644 --- a/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketClient.java +++ b/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketClient.java @@ -116,10 +116,14 @@ public class WebSocketClient implements MessageHandler.Whole { this.observerHandlersByRealm.computeIfAbsent(objectType, s -> { ObserverHandler observerHandler = this.container.getRealm(realm).getObserverHandler(); - return new WebSocketObserverHandler(observerHandler, this); + return getWebSocketObserverHandler(observerHandler); }).register(objectType, type, flat); } + protected WebSocketObserverHandler getWebSocketObserverHandler(ObserverHandler observerHandler) { + return new WebSocketObserverHandler(observerHandler, this); + } + private void handleUnregister(JsonObject jsonObject) { String realm = jsonObject.get(Tags.Json.REALM).getAsString(); String objectType = jsonObject.get(Tags.Json.OBJECT_TYPE).getAsString(); @@ -165,17 +169,17 @@ public class WebSocketClient implements MessageHandler.Whole { } private void close(CloseReason.CloseCode code, String reason) { + close(new CloseReason(code, reason)); + } + + public void close(CloseReason closeReason) { + if (this.observerHandlersByRealm == null || this.observerHandlersByRealm.isEmpty()) + return; try { - this.session.close(new CloseReason(code, reason)); + this.session.close(new CloseReason(closeReason.getCloseCode(), closeReason.getReasonPhrase())); } catch (IOException e) { logger.error("Failed to close client after invalid authentication!", e); } - } - - public void close() { - if (this.observerHandlersByRealm == null || this.observerHandlersByRealm.isEmpty()) - return; - this.observerHandlersByRealm.keySet().forEach(realm -> { this.observerHandlersByRealm.get(realm).unregisterAll(); }); diff --git a/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketEndpoint.java b/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketEndpoint.java index cd6e92ae1..83582f273 100644 --- a/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketEndpoint.java +++ b/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketEndpoint.java @@ -24,7 +24,7 @@ public class WebSocketEndpoint { public void onClose(Session session, CloseReason closeReason) { WebSocketClient webSocketClient = this.clientMap.remove(session); if (webSocketClient != null) - webSocketClient.close(); + webSocketClient.close(closeReason); } @OnError diff --git a/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketObserverHandler.java b/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketObserverHandler.java index ab18001f4..6d01184d6 100644 --- a/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketObserverHandler.java +++ b/li.strolch.websocket/src/main/java/li/strolch/websocket/WebSocketObserverHandler.java @@ -17,14 +17,18 @@ import li.strolch.model.StrolchRootElement; import li.strolch.model.Tags; import li.strolch.utils.collections.MapOfLists; import li.strolch.utils.collections.MapOfSets; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class WebSocketObserverHandler implements Observer { - private ObserverHandler observerHandler; - private WebSocketClient client; + protected static final Logger logger = LoggerFactory.getLogger(WebSocketObserverHandler.class); - private MapOfSets observedTypes; - private Map asFlat; + protected ObserverHandler observerHandler; + protected WebSocketClient client; + + protected MapOfSets observedTypes; + protected Map asFlat; public WebSocketObserverHandler(ObserverHandler observerHandler, WebSocketClient client) { this.observerHandler = observerHandler; @@ -67,18 +71,17 @@ public class WebSocketObserverHandler implements Observer { handleUpdate("ObserverRemove", key, elements); } - private void handleUpdate(String updateType, String key, List elements) { + protected void handleUpdate(String updateType, String key, List elements) { Set observedTypesSet = this.observedTypes.getSet(key); if (observedTypesSet == null) return; - MapOfLists data = elements.stream().filter(e -> observedTypesSet.contains(e.getType())) - .map(e -> { - if (this.asFlat.get(e.getType())) - return e.toFlatJsonObject(); - else - return e.toJsonObject(); - }).collect(MapOfLists::new, (mol, e) -> mol.addElement(e.get(Tags.Json.TYPE).getAsString(), e), + MapOfLists data = elements // + .stream() // + .filter(e -> filter(observedTypesSet, e)) // + .map(this::toJson) // + .collect(MapOfLists::new, // + (mol, e) -> mol.addElement(e.get(Tags.Json.TYPE).getAsString(), e), // MapOfLists::addAll); if (data.isEmpty()) return; @@ -95,4 +98,14 @@ public class WebSocketObserverHandler implements Observer { this.client.sendMessage(jsonObject.toString()); }); } + + protected boolean filter(Set observedTypesSet, StrolchRootElement e) { + return observedTypesSet.contains(e.getType()); + } + + protected JsonObject toJson(StrolchRootElement e) { + if (this.asFlat.get(e.getType())) + return e.toFlatJsonObject(); + return e.toJsonObject(); + } }