private Response handleClientRequest(Request request) { Response response; try { response = Optional.ofNullable(requestHandler.handle(request)) .orElseThrow(() -> new NullPointerException("Response must not be null")); } catch (Exception e) { logger.error("Unexpected exception occurred during request handling (action='{}', handler='{}')", request.getBody().getAction().name(), requestHandler.getClass().getCanonicalName(), e); response = Response.newBuilder() .withLast(request.isSingleReplyExpected()) .buildFailed(500); } return response; }
protected Body(Action action) { this.action = action.ordinal(); }
public Action getAction() { return Action.values()[action]; }
@Transactional public boolean deleteDevice(@NotNull String deviceId) { DeviceVO deviceVO = deviceDao.findById(deviceId); if (deviceVO == null) { logger.error("Device with ID {} not found", deviceId); return false; } DeviceDeleteRequest deviceDeleteRequest = new DeviceDeleteRequest(deviceVO); Request request = Request.newBuilder() .withBody(deviceDeleteRequest) .build(); CompletableFuture<String> future = new CompletableFuture<>(); Consumer<Response> responseConsumer = response -> { Action resAction = response.getBody().getAction(); if (resAction.equals(Action.DEVICE_DELETE_RESPONSE)) { future.complete(response.getBody().getAction().name()); } else { logger.warn("Unknown action received from backend {}", resAction); } }; rpcClient.call(request, responseConsumer); return deviceDao.deleteById(deviceId) != 0; }
Consumer<Response> responseConsumer = response -> { Action resAction = response.getBody().getAction(); if (resAction.equals(Action.NOTIFICATION_SUBSCRIBE_RESPONSE)) { NotificationSubscribeResponse r = response.getBody().cast(NotificationSubscribeResponse.class); requestResponseMatcher.addSubscription(subscriptionId, response.getCorrelationId()); future.complete(r.getNotifications()); } else if (resAction.equals(Action.NOTIFICATION_EVENT)) { NotificationEvent event = response.getBody().cast(NotificationEvent.class); callback.accept(event.getNotification(), subscriptionId);
public CompletableFuture<Pair<Long, DeviceCommand>> sendSubscribeToUpdateRequest(final long commandId, final DeviceVO device, BiConsumer<DeviceCommand, Long> callback) { CompletableFuture<Pair<Long, DeviceCommand>> future = new CompletableFuture<>(); final Long subscriptionId = idGenerator.generate(); Consumer<Response> responseConsumer = response -> { Action resAction = response.getBody().getAction(); if (resAction.equals(Action.COMMAND_UPDATE_SUBSCRIBE_RESPONSE)) { future.complete(Pair.of(response.getBody().cast(CommandUpdateSubscribeResponse.class).getSubscriptionId(), response.getBody().cast(CommandUpdateSubscribeResponse.class).getDeviceCommand())); } else if (resAction.equals(COMMAND_UPDATE_EVENT)) { callback.accept(response.getBody().cast(CommandUpdateEvent.class).getDeviceCommand(), subscriptionId); } else { logger.warn("Unknown action received from backend {}", resAction); } }; Filter filter = new Filter(device.getNetworkId(), device.getDeviceTypeId(), Long.toString(commandId), COMMAND_UPDATE_EVENT.name(), null); rpcClient.call(Request.newBuilder() .withBody(new CommandUpdateSubscribeRequest(commandId, device.getDeviceId(), subscriptionId, filter)) .build(), responseConsumer); return future; }
Consumer<Response> responseConsumer = response -> { Action resAction = response.getBody().getAction(); if (resAction.equals(Action.COMMAND_SUBSCRIBE_RESPONSE)) { future.complete(response.getBody().cast(CommandSubscribeResponse.class).getCommands()); requestResponseMatcher.addSubscription(subscriptionId, response.getCorrelationId()); } else if (!returnUpdated && resAction.equals(Action.COMMAND_EVENT)) { callback.accept(response.getBody().cast(CommandEvent.class).getCommand(), subscriptionId); } else if (returnUpdated && resAction.equals(Action.COMMANDS_UPDATE_EVENT)) { callback.accept(response.getBody().cast(CommandsUpdateEvent.class).getDeviceCommand(), subscriptionId); } else {
@Override public Collection<Filter> getApplicableFilters() { Filter deviceFilter = new Filter(command.getNetworkId(), command.getDeviceTypeId(), command.getId().toString(), Action.COMMAND_UPDATE_EVENT.name(), null); Filter deviceWithNameFilter = new Filter(command.getNetworkId(), command.getDeviceTypeId(), command.getId().toString(), Action.COMMAND_UPDATE_EVENT.name(), command.getCommand()); return Arrays.asList(deviceFilter, deviceWithNameFilter); }
private static GsonBuilder createGsonBuilder() { RuntimeTypeAdapterFactory<Body> req = RuntimeTypeAdapterFactory.of(Body.class, "a") .registerSubtype(ErrorResponse.class, Action.ERROR_RESPONSE.ordinal()) .registerSubtype(CommandInsertRequest.class, Action.COMMAND_INSERT_REQUEST.ordinal()) .registerSubtype(CommandInsertResponse.class, Action.COMMAND_INSERT_RESPONSE.ordinal()) .registerSubtype(CommandSearchRequest.class, Action.COMMAND_SEARCH_REQUEST.ordinal()) .registerSubtype(CommandSearchResponse.class, Action.COMMAND_SEARCH_RESPONSE.ordinal()) .registerSubtype(CommandSubscribeRequest.class, Action.COMMAND_SUBSCRIBE_REQUEST.ordinal()) .registerSubtype(CommandSubscribeResponse.class, Action.COMMAND_SUBSCRIBE_RESPONSE.ordinal()) .registerSubtype(CommandUnsubscribeRequest.class, Action.COMMAND_UNSUBSCRIBE_REQUEST.ordinal()) .registerSubtype(CommandUnsubscribeResponse.class, Action.COMMAND_UNSUBSCRIBE_RESPONSE.ordinal()) .registerSubtype(CommandUpdateSubscribeRequest.class, Action.COMMAND_UPDATE_SUBSCRIBE_REQUEST.ordinal()) .registerSubtype(CommandUpdateSubscribeResponse.class, Action.COMMAND_UPDATE_SUBSCRIBE_RESPONSE.ordinal()) .registerSubtype(CommandUpdateRequest.class, Action.COMMAND_UPDATE_REQUEST.ordinal()) .registerSubtype(CommandsUpdateRequest.class, Action.COMMANDS_UPDATE_REQUEST.ordinal()) .registerSubtype(NotificationSearchRequest.class, Action.NOTIFICATION_SEARCH_REQUEST.ordinal()) .registerSubtype(NotificationSearchResponse.class, Action.NOTIFICATION_SEARCH_RESPONSE.ordinal()) .registerSubtype(NotificationInsertRequest.class, Action.NOTIFICATION_INSERT_REQUEST.ordinal()) .registerSubtype(NotificationInsertResponse.class, Action.NOTIFICATION_INSERT_RESPONSE.ordinal()) .registerSubtype(NotificationSubscribeRequest.class, Action.NOTIFICATION_SUBSCRIBE_REQUEST.ordinal()) .registerSubtype(NotificationSubscribeResponse.class, Action.NOTIFICATION_SUBSCRIBE_RESPONSE.ordinal()) .registerSubtype(NotificationUnsubscribeRequest.class, Action.NOTIFICATION_UNSUBSCRIBE_REQUEST.ordinal()) .registerSubtype(NotificationUnsubscribeResponse.class, Action.NOTIFICATION_UNSUBSCRIBE_RESPONSE.ordinal()) .registerSubtype(NotificationEvent.class, Action.NOTIFICATION_EVENT.ordinal()) .registerSubtype(CommandEvent.class, Action.COMMAND_EVENT.ordinal()) .registerSubtype(CommandUpdateEvent.class, Action.COMMAND_UPDATE_EVENT.ordinal()) .registerSubtype(CommandsUpdateEvent.class, Action.COMMANDS_UPDATE_EVENT.ordinal())
public CompletableFuture<Set<Long>> sendUnsubscribeRequest(Set<Long> subIds) { CommandUnsubscribeRequest unsubscribeRequest = new CommandUnsubscribeRequest(subIds); Request request = Request.newBuilder() .withBody(unsubscribeRequest) .build(); CompletableFuture<Set<Long>> future = new CompletableFuture<>(); Consumer<Response> responseConsumer = response -> { Action resAction = response.getBody().getAction(); if (resAction.equals(Action.COMMAND_UNSUBSCRIBE_RESPONSE)) { future.complete(response.getBody().cast(CommandUnsubscribeResponse.class).getSubscriptionIds()); subIds.forEach(requestResponseMatcher::removeSubscription); } else { logger.warn("Unknown action received from backend {}", resAction); } }; rpcClient.call(request, responseConsumer); return future; }
deviceId, networks, deviceTypes, timestamp, names, session); Set<Filter> filters = filterService.getFilterList(deviceId, networks, deviceTypes, COMMAND_EVENT.name(), names, authentication);
public CompletableFuture<Set<Long>> unsubscribe(Set<Long> subIds) { NotificationUnsubscribeRequest unsubscribeRequest = new NotificationUnsubscribeRequest(subIds); Request request = Request.newBuilder() .withBody(unsubscribeRequest) .build(); CompletableFuture<Set<Long>> future = new CompletableFuture<>(); Consumer<Response> responseConsumer = response -> { Action resAction = response.getBody().getAction(); if (resAction.equals(Action.NOTIFICATION_UNSUBSCRIBE_RESPONSE)) { future.complete(response.getBody().cast(NotificationUnsubscribeResponse.class).getSubscriptionIds()); subIds.forEach(requestResponseMatcher::removeSubscription); } else { logger.warn("Unknown action received from backend {}", resAction); } }; rpcClient.call(request, responseConsumer); return future; }
private Response handleClientRequest(Request request) { Response response; final Action action = request.getBody().getAction(); RequestHandler requestHandler = requestHandlersMapper.requestHandlerMap().get(action); if (requestHandler == null) { throw new RuntimeException("Action '" + action + "' is not supported."); } try { response = Optional.ofNullable(requestHandler.handle(request)) .orElseThrow(() -> new NullPointerException("Response must not be null")); } catch (Exception e) { logger.error("Unexpected exception occurred during request handling (action='{}', handler='{}')", request.getBody().getAction().name(), requestHandler.getClass().getCanonicalName(), e); response = Response.newBuilder() .withLast(request.isSingleReplyExpected()) .buildFailed(500); } return response; } }
deviceId, networks, deviceTypes, timestamp, names, session); Set<Filter> filters = filterService.getFilterList(deviceId, networks, deviceTypes, NOTIFICATION_EVENT.name(), names, authentication);
@Override public Collection<Filter> getApplicableFilters() { Filter deviceFilter = new Filter(command.getNetworkId(), command.getDeviceTypeId(), command.getDeviceId(), Action.COMMANDS_UPDATE_EVENT.name(), null); Filter deviceWithNameFilter = new Filter(command.getNetworkId(), command.getDeviceTypeId(), command.getDeviceId(), Action.COMMANDS_UPDATE_EVENT.name(), command.getCommand()); return Arrays.asList(deviceFilter, deviceWithNameFilter); }
Set<Filter> filters = filterService.getFilterList(deviceId, networks, deviceTypes, NOTIFICATION_EVENT.name(), names, authentication);
@Override public Collection<Filter> getApplicableFilters() { Filter deviceFilter = new Filter(command.getNetworkId(), command.getDeviceTypeId(), command.getDeviceId(), Action.COMMAND_EVENT.name(), null); Filter deviceWithNameFilter = new Filter(command.getNetworkId(), command.getDeviceTypeId(), command.getDeviceId(), Action.COMMAND_EVENT.name(), command.getCommand()); return Arrays.asList(deviceFilter, deviceWithNameFilter); }
@Override public Collection<Filter> getApplicableFilters() { Filter deviceFilter = new Filter(notification.getNetworkId(), notification.getDeviceTypeId(), notification.getDeviceId(), Action.NOTIFICATION_EVENT.name(), null); Filter deviceWithNameFilter = new Filter(notification.getNetworkId(), notification.getDeviceTypeId(), notification.getDeviceId(), Action.NOTIFICATION_EVENT.name(), notification.getNotification()); return Arrays.asList(deviceFilter, deviceWithNameFilter); }
private List<Response> createCommandSubscription(PluginSubscribeRequest body, boolean returnUpdated) { return body.getFilters().stream() .map(filter -> { filter.setEventName(COMMAND_EVENT.name()); CommandSubscribeRequest commandSubscribeRequest = new CommandSubscribeRequest(body.getSubscriptionId(), filter, body.getNames(), null, returnUpdated, 0); Request commandRequest = Request.newBuilder() .withBody(commandSubscribeRequest) .withSingleReply(false) .build(); commandRequest.setReplyTo(body.getTopicName()); return commandSubscribeRequestHandler.handle(commandRequest); }).collect(toList()); }
private List<Response> createNotificationSubscription(PluginSubscribeRequest body) { return body.getFilters().stream() .map(filter -> { filter.setEventName(NOTIFICATION_EVENT.name()); NotificationSubscribeRequest notificationSubscribeRequest = new NotificationSubscribeRequest( body.getSubscriptionId(), filter, body.getNames(), null); Request notificationRequest = Request.newBuilder() .withBody(notificationSubscribeRequest) .withSingleReply(false) .build(); notificationRequest.setReplyTo(body.getTopicName()); return notificationSubscribeRequestHandler.handle(notificationRequest); }).collect(toList()); }