[Major] Allow WebSocket* to be extensible
This commit is contained in:
parent
647a704c41
commit
4b2e8b9f81
|
@ -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();
|
||||
});
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue