static <T> void serialize(final Message<T> message, final JsonObjectBuilder messageBuilder, final Predicate<JsonField> predicate) { final Optional<ByteBuffer> rawPayloadOptional = message.getRawPayload(); final Optional<T> payloadOptional = message.getPayload(); if (rawPayloadOptional.isPresent() && !payloadOptional.filter(p -> p instanceof JsonValue).isPresent()) { final ByteBuffer rawPayload = rawPayloadOptional.get(); final String encodedString; if (shouldBeInterpretedAsText(message.getContentType().orElse(""))) { encodedString = new String(rawPayload.array()); } else { final ByteBuffer base64Encoded = BASE64_ENCODER.encode(rawPayload); encodedString = new String(base64Encoded.array(), StandardCharsets.UTF_8); } injectMessagePayload(messageBuilder, predicate, encodedString, message.getHeaders()); } else if (payloadOptional.isPresent()) { final T payload = payloadOptional.get(); if (payload instanceof JsonValue) { MessageCommandSizeValidator.getInstance().ensureValidSize(() -> ((JsonValue) payload).toString().length(), message::getHeaders); messageBuilder.set(MessageCommand.JsonFields.JSON_MESSAGE_PAYLOAD, (JsonValue) payload, predicate); } else { injectMessagePayload(messageBuilder, predicate, payload.toString(), message.getHeaders()); } } }
@Override default JsonPointer getResourcePath() { final Message<?> message = getMessage(); final String box = message.getDirection() == MessageDirection.TO ? MessageCommand.INBOX_PREFIX : MessageCommand.OUTBOX_PREFIX; final JsonPointer pathSuffix = JsonFactory.newPointer(JsonKey.of(box), JsonKey.of(MessageCommand.MESSAGES_PREFIX), JsonKey.of(message.getSubject())); final JsonPointer path = message.getFeatureId() .map(fId -> JsonFactory.newPointer(JsonKey.of(MessageCommand.FEATURES_PREFIX), JsonKey.of(fId))) .orElse(JsonPointer.empty()); return path.append(pathSuffix); }
/** * Tests whether a message command is fire-and-forget. * * @param command The message command. * @return {@code true} if the message's timeout header is 0 or if the message is flagged not to require a response, * {@code false} otherwise. */ private static boolean isFireAndForgetMessage(final MessageCommand<?, ?> command) { return command.getMessage() .getTimeout() .map(Duration::isZero) .orElseGet(() -> !command.getDittoHeaders().isResponseRequired()); }
/** * Creates an @{SendMessageAcceptedResponse} for a message command if it is fire-and-forget. * * @param command The message command. * @return The HTTP response if the message command is fire-and-forget, {@code Optional.empty()} otherwise. */ public static Optional<SendMessageAcceptedResponse> getResponseForFireAndForgetMessage( final MessageCommand<?, ?> command) { if (isFireAndForgetMessage(command)) { return Optional.of( SendMessageAcceptedResponse.newInstance(command.getThingId(), command.getMessage().getHeaders(), command.getDittoHeaders())); } else { return Optional.empty(); } }
messagesTopicPathBuilder.subject(message.getSubject()); .ifPresent(payloadBuilder::withValue); message.getStatusCode().ifPresent(payloadBuilder::withStatus); final DittoHeadersBuilder allHeadersBuilder = DittoHeaders.newBuilder(message.getHeaders()); allHeadersBuilder.putHeaders(dittoHeaders); final Map<String, String> externalHeaders = headerTranslator.toExternalHeaders(allHeadersBuilder.build());
final Optional<?> optionalPayload = message.getPayload(); final Optional<ByteBuffer> optionalRawPayload = message.getRawPayload(); final Optional<HttpStatusCode> responseStatusCode = Optional.of(messageCommandResponse.getStatusCode()) final Optional<ContentType> optionalContentType = message.getContentType().map(ContentType$.MODULE$::parse) .filter(Either::isRight) .map(Either::right)
LogUtil.enhanceLogWithCorrelationId(logger, command); logger.info("Got <MessageCommand> with subject <{}>, telling the targetActor about it", command.getMessage().getSubject()); getContext().become(commandResponseAwaiting); messageTimeout = message.getTimeout().orElse(null); isFireAndForgetMessage = isFireAndForgetMessage(command); if (messageTimeout != null && !isFireAndForgetMessage) {
/** * Creates an @{SendMessageAcceptedResponse} for a message command if it is fire-and-forget. * * @param command The message command. * @return The HTTP response if the message command is fire-and-forget, {@code Optional.empty()} otherwise. */ public static Optional<SendMessageAcceptedResponse> getResponseForFireAndForgetMessage( final MessageCommand<?, ?> command) { if (isFireAndForgetMessage(command)) { return Optional.of( SendMessageAcceptedResponse.newInstance(command.getThingId(), command.getMessage().getHeaders(), command.getDittoHeaders())); } else { return Optional.empty(); } }
messagesTopicPathBuilder.subject(message.getSubject()); .ifPresent(payloadBuilder::withValue); message.getStatusCode().ifPresent(payloadBuilder::withStatus); final DittoHeadersBuilder allHeadersBuilder = DittoHeaders.newBuilder(message.getHeaders()); allHeadersBuilder.putHeaders(dittoHeaders); final Map<String, String> externalHeaders = headerTranslator.toExternalHeaders(allHeadersBuilder.build());
static <T> void serialize(final Message<T> message, final JsonObjectBuilder messageBuilder, final Predicate<JsonField> predicate) { final Optional<ByteBuffer> rawPayloadOptional = message.getRawPayload(); final Optional<T> payloadOptional = message.getPayload(); if (rawPayloadOptional.isPresent() && !payloadOptional.filter(p -> p instanceof JsonValue).isPresent()) { final ByteBuffer rawPayload = rawPayloadOptional.get(); final String encodedString; if (shouldBeInterpretedAsText(message.getContentType().orElse(""))) { encodedString = new String(rawPayload.array()); } else { final ByteBuffer base64Encoded = BASE64_ENCODER.encode(rawPayload); encodedString = new String(base64Encoded.array(), StandardCharsets.UTF_8); } injectMessagePayload(messageBuilder, predicate, encodedString, message.getHeaders()); } else if (payloadOptional.isPresent()) { final T payload = payloadOptional.get(); if (payload instanceof JsonValue) { MessageCommandSizeValidator.getInstance().ensureValidSize(() -> ((JsonValue) payload).toString().length(), message::getHeaders); messageBuilder.set(MessageCommand.JsonFields.JSON_MESSAGE_PAYLOAD, (JsonValue) payload, predicate); } else { injectMessagePayload(messageBuilder, predicate, payload.toString(), message.getHeaders()); } } }
/** * Creates an @{SendMessageAcceptedResponse} for a message command if it is fire-and-forget. * * @param command The message command. * @return The HTTP response if the message command is fire-and-forget, {@code Optional.empty()} otherwise. */ private static Optional<SendMessageAcceptedResponse> getResponseForFireAndForgetMessage( final MessageCommand<?, ?> command) { if (isFireAndForgetMessage(command)) { return Optional.of( SendMessageAcceptedResponse.newInstance(command.getThingId(), command.getMessage().getHeaders(), command.getDittoHeaders())); } else { return Optional.empty(); } }
@Override default JsonPointer getResourcePath() { final Message<?> message = getMessage(); final String box = message.getDirection() == MessageDirection.TO ? MessageCommand.INBOX_PREFIX : MessageCommand.OUTBOX_PREFIX; final JsonPointer pathSuffix = JsonFactory.newPointer(JsonKey.of(box), JsonKey.of(MessageCommand.MESSAGES_PREFIX), JsonKey.of(message.getSubject())); final JsonPointer path = message.getFeatureId() .map(fId -> JsonFactory.newPointer(JsonKey.of(MessageCommand.FEATURES_PREFIX), JsonKey.of(fId))) .orElse(JsonPointer.empty()); return path.append(pathSuffix); }
/** * Tests whether a message command is fire-and-forget. * * @param command The message command. * @return {@code true} if the message's timeout header is 0 or if the message is flagged not to require a response, * {@code false} otherwise. */ public static boolean isFireAndForgetMessage(final MessageCommand<?, ?> command) { return command.getMessage() .getTimeout() .map(Duration::isZero) .orElseGet(() -> !command.getDittoHeaders().isResponseRequired()); } }
@Override public SendMessageAcceptedResponse setDittoHeaders(final DittoHeaders dittoHeaders) { return newInstance(getThingId(), getMessage().getHeaders(), getStatusCode(), dittoHeaders); }
@Override default JsonPointer getResourcePath() { final Message<?> message = getMessage(); final String box = message.getDirection() == MessageDirection.TO ? INBOX_PREFIX : OUTBOX_PREFIX; final JsonPointer pathSuffix = JsonPointer.empty() .addLeaf(JsonKey.of(box)) .addLeaf(JsonKey.of(MESSAGES_PREFIX)) .addLeaf(JsonKey.of(message.getSubject())); final JsonPointer path = message.getFeatureId().map(fId -> JsonPointer.empty() .addLeaf(JsonKey.of(FEATURES_PREFIX)) .addLeaf(JsonKey.of(fId))) .orElse(JsonPointer.empty()); return path.append(pathSuffix); }
/** * Tests whether a message command is fire-and-forget. * * @param command The message command. * @return {@code true} if the message's timeout header is 0 or if the message is flagged not to require a response, * {@code false} otherwise. */ public static boolean isFireAndForgetMessage(final MessageCommand<?, ?> command) { return command.getMessage() .getTimeout() .map(Duration::isZero) .orElseGet(() -> !command.getDittoHeaders().isResponseRequired()); } }
@Override public SendMessageAcceptedResponse setDittoHeaders(final DittoHeaders dittoHeaders) { return newInstance(getThingId(), getMessage().getHeaders(), getStatusCode(), dittoHeaders); }
@Override default JsonPointer getResourcePath() { final Message<?> message = getMessage(); final String box = message.getDirection() == MessageDirection.TO ? INBOX_PREFIX : OUTBOX_PREFIX; final JsonPointer pathSuffix = JsonPointer.empty() .addLeaf(JsonKey.of(box)) .addLeaf(JsonKey.of(MESSAGES_PREFIX)) .addLeaf(JsonKey.of(message.getSubject())); final JsonPointer path = message.getFeatureId().map(fId -> JsonPointer.empty() .addLeaf(JsonKey.of(FEATURES_PREFIX)) .addLeaf(JsonKey.of(fId))) .orElse(JsonPointer.empty()); return path.append(pathSuffix); }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> predicate) { jsonObjectBuilder.set(MessageCommandResponse.JsonFields.JSON_THING_ID, getThingId(), predicate); final JsonObjectBuilder messageBuilder = JsonFactory.newObjectBuilder(); final JsonObject messageHeadersObject = message.getHeaders().toJson(); messageBuilder.set(MessageCommandResponse.JsonFields.JSON_MESSAGE_HEADERS, messageHeadersObject, predicate); MessagePayloadSerializer.serialize(message, messageBuilder, predicate); final JsonObject messageObject = messageBuilder.build(); jsonObjectBuilder.set(MessageCommandResponse.JsonFields.JSON_MESSAGE, messageObject, predicate); }
@Override protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder, final JsonSchemaVersion schemaVersion, final Predicate<JsonField> predicate) { jsonObjectBuilder.set(MessageCommand.JsonFields.JSON_THING_ID, getThingId(), predicate); final JsonObjectBuilder messageBuilder = JsonFactory.newObjectBuilder(); final JsonObject headersObject = message.getHeaders().toJson(); messageBuilder.set(MessageCommand.JsonFields.JSON_MESSAGE_HEADERS, headersObject, predicate); MessagePayloadSerializer.serialize(message, messageBuilder, predicate); final JsonObject messageObject = messageBuilder.build(); jsonObjectBuilder.set(MessageCommand.JsonFields.JSON_MESSAGE, messageObject, predicate); }