@Override public Optional<String> getContentType() { return headers.getContentType(); }
@Override public String getThingId() { return headers.getThingId(); }
/** * Returns a new builder with a fluent API for an immutable MessageHeaders object for a Claim Message. * * @param thingId the thing ID of the message. * @return the builder. * @throws NullPointerException if {@code thingId} is {@code null}. * @throws IllegalArgumentException if {@code thingId} is empty. */ static MessageHeadersBuilder newBuilderForClaiming(final CharSequence thingId) { return newBuilder(MessageDirection.TO, thingId, KnownMessageSubjects.CLAIM_SUBJECT); }
/** * Deserializes the {@link Message} from the JSON representation - the {@code rawPayload} is decoded with Base64. * * @param <T> the type of the message's payload. * @param jsonObject the JsonObjectReader to use for reading the message * @return the Message */ protected static <T> Message<T> deserializeMessageFromJson(final JsonObject jsonObject) { final JsonObject messageObject = jsonObject.getValueOrThrow(MessageCommandResponse.JsonFields.JSON_MESSAGE); final JsonObject messageHeadersObject = messageObject.getValue(MessageCommandResponse.JsonFields.JSON_MESSAGE_HEADERS) .filter(JsonValue::isObject) .map(JsonValue::asObject) .orElseThrow(() -> JsonMissingFieldException.newBuilder() .fieldName( MessageCommandResponse.JsonFields.JSON_MESSAGE_HEADERS.getPointer().toString()) .build()); final Optional<JsonValue> messagePayloadOptional = messageObject.getValue(MessageCommand.JsonFields.JSON_MESSAGE_PAYLOAD); final MessageHeaders messageHeaders = MessageHeaders.of(messageHeadersObject); final MessageBuilder<T> messageBuilder = Message.<T>newBuilder(messageHeaders); MessagePayloadSerializer.deserialize(messagePayloadOptional, messageBuilder, messageHeaders); return messageBuilder.build(); }
private static Adaptable jsonifiableToAdaptable(final Jsonifiable.WithPredicate<JsonObject, JsonField> jsonifiable, final TopicPath.Channel channel, final ProtocolAdapter adapter) { final Adaptable adaptable; if (jsonifiable instanceof Command) { adaptable = adapter.toAdaptable((Command) jsonifiable, channel); } else if (jsonifiable instanceof Event) { adaptable = adapter.toAdaptable((Event) jsonifiable, channel); } else if (jsonifiable instanceof CommandResponse) { adaptable = adapter.toAdaptable((CommandResponse) jsonifiable, channel); } else if (jsonifiable instanceof DittoRuntimeException) { final DittoHeaders enhancedHeaders = ((DittoRuntimeException) jsonifiable).getDittoHeaders().toBuilder() .channel(channel.getName()) .build(); ThingErrorResponse errorResponse; try { errorResponse = ThingErrorResponse.of(MessageHeaders.of(enhancedHeaders).getThingId(), (DittoRuntimeException) jsonifiable, enhancedHeaders); } catch (final IllegalStateException | IllegalArgumentException | DittoRuntimeException e) { // thrown if headers did not contain the thing ID: errorResponse = ThingErrorResponse.of((DittoRuntimeException) jsonifiable, enhancedHeaders); } adaptable = adapter.toAdaptable(errorResponse, channel); } else { throw new IllegalArgumentException("Jsonifiable was neither Command nor CommandResponse nor" + " Event nor DittoRuntimeException: " + jsonifiable.getClass().getSimpleName()); } return adaptable; }
final MessageHeaders messageHeaders = messageHeadersFrom(adaptable); final String contentType = String.valueOf(messageHeaders.get(DittoHeaderDefinition.CONTENT_TYPE.getKey())); final boolean shouldBeInterpretedAsText = shouldBeInterpretedAsText(contentType); final Charset charset = shouldBeInterpretedAsText ? determineCharset(contentType) : StandardCharsets.UTF_8;
@Override public AuthorizationContext getAuthorizationContext() { return headers.getAuthorizationContext(); }
@Override public Optional<String> getFeatureId() { return headers.getFeatureId(); }
@Override public MessageDirection getDirection() { return headers.getDirection(); }
@Override public Optional<String> getCorrelationId() { return headers.getCorrelationId(); }
@Override public Optional<HttpStatusCode> getStatusCode() { return headers.getStatusCode(); }
/** * Deserializes the {@link Message} from the JSON representation - the {@code rawPayload} is decoded with Base64. * * @param <T> the type of the message's payload. * @param jsonObject the JsonObjectReader to use for reading the message * @return the Message */ protected static <T> Message<T> deserializeMessageFromJson(final JsonObject jsonObject) { final JsonObject messageObject = jsonObject.getValueOrThrow(MessageCommandResponse.JsonFields.JSON_MESSAGE); final JsonObject messageHeadersObject = messageObject.getValue(MessageCommandResponse.JsonFields.JSON_MESSAGE_HEADERS) .filter(JsonValue::isObject) .map(JsonValue::asObject) .orElseThrow(() -> JsonMissingFieldException.newBuilder() .fieldName( MessageCommandResponse.JsonFields.JSON_MESSAGE_HEADERS.getPointer().toString()) .build()); final Optional<JsonValue> messagePayloadOptional = messageObject.getValue(MessageCommand.JsonFields.JSON_MESSAGE_PAYLOAD); final MessageHeaders messageHeaders = MessageHeaders.of(messageHeadersObject); final MessageBuilder<T> messageBuilder = Message.<T>newBuilder(messageHeaders); MessagePayloadSerializer.deserialize(messagePayloadOptional, messageBuilder, messageHeaders); return messageBuilder.build(); }
final MessageHeaders messageHeaders = messageHeadersFrom(adaptable); final String contentType = String.valueOf(messageHeaders.get(DittoHeaderDefinition.CONTENT_TYPE.getKey())); final boolean shouldBeInterpretedAsText = shouldBeInterpretedAsText(contentType); final Charset charset = shouldBeInterpretedAsText ? determineCharset(contentType) : StandardCharsets.UTF_8;
/** * Deserializes the {@link Message} from the JSON representation - the {@code rawPayload} is decoded with Base64. * * @param <T> the type of the message's payload. * @param jsonObject the JsonObjectReader to use for reading the message. * @return the Message. */ protected static <T> Message<T> deserializeMessageFromJson(final JsonObject jsonObject) { final JsonObject messageObject = jsonObject.getValueOrThrow(MessageCommand.JsonFields.JSON_MESSAGE); final JsonObject messageHeadersObject = messageObject.getValueOrThrow(MessageCommand.JsonFields.JSON_MESSAGE_HEADERS); final Optional<JsonValue> messagePayloadOptional = messageObject.getValue(MessageCommand.JsonFields.JSON_MESSAGE_PAYLOAD); final MessageHeaders messageHeaders = MessageHeaders.of(messageHeadersObject); final MessageBuilder<T> messageBuilder = Message.newBuilder(messageHeaders); MessagePayloadSerializer.deserialize(messagePayloadOptional, messageBuilder, messageHeaders); return messageBuilder.build(); }
private Function<ByteBuffer, MessageCommand<?, ?>> buildSendFeatureMessage(final MessageDirection direction, final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId, final String featureId, final String msgSubject, final Duration timeout) { final HttpRequest httpRequest = ctx.getRequest(); return payload -> { final ContentType contentType = httpRequest.entity() .getContentType(); final MessageHeaders headers = MessageHeaders.newBuilder(direction, thingId, normalizeSubject(msgSubject)) .featureId(featureId) .correlationId(dittoHeaders.getCorrelationId().orElse(null)) .contentType(contentType .toString()) .timeout(timeout) .timestamp(OffsetDateTime.now()) .validationUrl(httpRequest.getHeader(X_DITTO_VALIDATION_URL) .map(HttpHeader::value) .orElse(null)) .putHeaders(dittoHeaders) .build(); final MessageBuilder<Object> messageBuilder = initMessageBuilder(payload, contentType, headers); return SendFeatureMessage.of(thingId, featureId, messageBuilder.build(), enhanceHeaders(dittoHeaders)); }; }
static void deserialize(final Optional<JsonValue> messagePayloadOptional, final MessageBuilder messageBuilder, final MessageHeaders messageHeaders) { final String contentType = messageHeaders.getContentType().orElse(""); if (messagePayloadOptional.isPresent()) { final JsonValue payload = messagePayloadOptional.get(); if (shouldBeInterpretedAsText(contentType)) { messageBuilder.payload(payload.isString() ? payload.asString() : payload); } else { final String payloadStr = payload.isString() ? payload.asString() : payload.toString(); final byte[] payloadBytes = payloadStr.getBytes(StandardCharsets.UTF_8); MessageCommandSizeValidator.getInstance().ensureValidSize(() -> payloadBytes.length, () -> messageHeaders); messageBuilder.rawPayload(ByteBuffer.wrap(BASE64_DECODER.decode(payloadBytes))); } } }
/** * Deserializes the {@link Message} from the JSON representation - the {@code rawPayload} is decoded with Base64. * * @param <T> the type of the message's payload. * @param jsonObject the JsonObjectReader to use for reading the message. * @return the Message. */ protected static <T> Message<T> deserializeMessageFromJson(final JsonObject jsonObject) { final JsonObject messageObject = jsonObject.getValueOrThrow(MessageCommand.JsonFields.JSON_MESSAGE); final JsonObject messageHeadersObject = messageObject.getValueOrThrow(MessageCommand.JsonFields.JSON_MESSAGE_HEADERS); final Optional<JsonValue> messagePayloadOptional = messageObject.getValue(MessageCommand.JsonFields.JSON_MESSAGE_PAYLOAD); final MessageHeaders messageHeaders = MessageHeaders.of(messageHeadersObject); final MessageBuilder<T> messageBuilder = Message.newBuilder(messageHeaders); MessagePayloadSerializer.deserialize(messagePayloadOptional, messageBuilder, messageHeaders); return messageBuilder.build(); }
private Function<ByteBuffer, MessageCommand<?, ?>> buildSendThingMessage(final MessageDirection direction, final RequestContext ctx, final DittoHeaders dittoHeaders, final String thingId, final String msgSubject, final Duration timeout) { return payload -> { final HttpRequest httpRequest = ctx.getRequest(); final ContentType contentType = httpRequest.entity().getContentType(); final MessageHeaders headers = MessageHeaders.newBuilder(direction, thingId, normalizeSubject(msgSubject)) .correlationId(dittoHeaders.getCorrelationId().orElse(null)) .contentType(contentType.toString()) .timeout(timeout) .timestamp(OffsetDateTime.now()) .putHeaders(dittoHeaders) .build(); final MessageBuilder<Object> messageBuilder = initMessageBuilder(payload, contentType, headers); return SendThingMessage.of(thingId, messageBuilder.build(), enhanceHeaders(dittoHeaders)); }; }
static void deserialize(final Optional<JsonValue> messagePayloadOptional, final MessageBuilder messageBuilder, final MessageHeaders messageHeaders) { final String contentType = messageHeaders.getContentType().orElse(""); if (messagePayloadOptional.isPresent()) { final JsonValue payload = messagePayloadOptional.get(); if (shouldBeInterpretedAsText(contentType)) { messageBuilder.payload(payload.isString() ? payload.asString() : payload); } else { final String payloadStr = payload.isString() ? payload.asString() : payload.toString(); final byte[] payloadBytes = payloadStr.getBytes(StandardCharsets.UTF_8); MessageCommandSizeValidator.getInstance().ensureValidSize(() -> payloadBytes.length, () -> messageHeaders); messageBuilder.rawPayload(ByteBuffer.wrap(BASE64_DECODER.decode(payloadBytes))); } } }
/** * Creates a new {@code SendMessageAcceptedResponse} from a JSON object. * * @param jsonObject the JSON object of which the SendMessageAcceptedResponse is to be created. * @param dittoHeaders the headers. * @return the command. * @throws NullPointerException if {@code jsonObject} is {@code null}. * @throws org.eclipse.ditto.json.JsonParseException if the passed in {@code jsonObject} was not in the expected * format. */ public static SendMessageAcceptedResponse fromJson(final JsonObject jsonObject, final DittoHeaders dittoHeaders) { return new CommandResponseJsonDeserializer<SendMessageAcceptedResponse>(TYPE, jsonObject).deserialize( statusCode -> { final String thingId = jsonObject.getValueOrThrow(MessageCommandResponse.JsonFields.JSON_THING_ID); final JsonObject jsonHeaders = jsonObject.getValueOrThrow(MessageCommandResponse.JsonFields.JSON_MESSAGE) .getValueOrThrow(MessageCommandResponse.JsonFields.JSON_MESSAGE_HEADERS); final MessageHeaders messageHeaders = MessageHeaders.of(jsonHeaders); return newInstance(thingId, messageHeaders, statusCode, dittoHeaders); }); }