[Major] Allow WebSocket* to be extensible

This commit is contained in:
Robert von Burg 2020-01-21 15:37:14 +01:00
parent 647a704c41
commit 4b2e8b9f81
3 changed files with 38 additions and 21 deletions

View File

@ -116,10 +116,14 @@ public class WebSocketClient implements MessageHandler.Whole<String> {
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<String> {
}
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();
});

View File

@ -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

View File

@ -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<String, String> observedTypes;
private Map<String, Boolean> asFlat;
protected ObserverHandler observerHandler;
protected WebSocketClient client;
protected MapOfSets<String, String> observedTypes;
protected Map<String, Boolean> 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<StrolchRootElement> elements) {
protected void handleUpdate(String updateType, String key, List<StrolchRootElement> elements) {
Set<String> observedTypesSet = this.observedTypes.getSet(key);
if (observedTypesSet == null)
return;
MapOfLists<String, JsonObject> 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<String, JsonObject> 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<String> 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();
}
}