use of org.openremote.model.event.shared.EventSubscription in project openremote by openremote.
the class ClientEventService method init.
@Override
public void init(Container container) throws Exception {
timerService = container.getService(TimerService.class);
messageBrokerService = container.getService(MessageBrokerService.class);
identityService = container.getService(ManagerIdentityService.class);
eventSubscriptions = new EventSubscriptions(container.getService(TimerService.class), container.getService(ManagerExecutorService.class));
MessageBrokerSetupService messageBrokerSetupService = container.getService(MessageBrokerSetupService.class);
messageBrokerSetupService.getContext().getTypeConverterRegistry().addTypeConverters(new EventTypeConverters());
messageBrokerSetupService.getContext().addRoutes(new RouteBuilder() {
@Override
public void configure() throws Exception {
from("websocket://" + WEBSOCKET_EVENTS).routeId("FromClientWebsocketEvents").choice().when(header(WebsocketConstants.SESSION_OPEN)).process(exchange -> {
// Do nothing except stop the exchanges
}).stop().when(or(header(WebsocketConstants.SESSION_CLOSE), header(WebsocketConstants.SESSION_CLOSE_ERROR))).process(exchange -> {
String sessionKey = getSessionKey(exchange);
eventSubscriptions.cancelAll(sessionKey);
}).stop().end().choice().when(bodyAs(String.class).startsWith(EventSubscription.MESSAGE_PREFIX)).convertBodyTo(EventSubscription.class).process(exchange -> {
String sessionKey = getSessionKey(exchange);
EventSubscription subscription = exchange.getIn().getBody(EventSubscription.class);
AuthContext authContext = exchange.getIn().getHeader(Constants.AUTH_CONTEXT, AuthContext.class);
if (eventSubscriptionAuthorizers.stream().anyMatch(authorizer -> authorizer.apply(authContext, subscription))) {
boolean restrictedUser = identityService.getIdentityProvider().isRestrictedUser(authContext.getUserId());
eventSubscriptions.update(sessionKey, restrictedUser, subscription);
} else {
LOG.warning("Unauthorized subscription from '" + authContext.getUsername() + "' in realm '" + authContext.getAuthenticatedRealm() + "': " + subscription);
sendToSession(sessionKey, new UnauthorizedEventSubscription(subscription.getEventType()));
}
}).when(bodyAs(String.class).startsWith(CancelEventSubscription.MESSAGE_PREFIX)).convertBodyTo(CancelEventSubscription.class).process(exchange -> {
String sessionKey = getSessionKey(exchange);
eventSubscriptions.cancel(sessionKey, exchange.getIn().getBody(CancelEventSubscription.class));
}).when(bodyAs(String.class).startsWith(SharedEvent.MESSAGE_PREFIX)).convertBodyTo(SharedEvent.class).process(exchange -> {
SharedEvent event = exchange.getIn().getBody(SharedEvent.class);
// If there is no timestamp in event, set to system time
if (event.getTimestamp() <= 0) {
event.setTimestamp(timerService.getCurrentTimeMillis());
}
}).to(ClientEventService.CLIENT_EVENT_TOPIC).otherwise().process(exchange -> LOG.fine("Unsupported message body: " + exchange.getIn().getBody())).end();
from(ClientEventService.CLIENT_EVENT_QUEUE).routeId("ToClientWebsocketEvents").choice().when(body().isInstanceOf(SharedEvent.class)).split(method(eventSubscriptions, "splitForSubscribers")).to("websocket://" + WEBSOCKET_EVENTS).end();
}
});
}
Aggregations