@Override protected String getType(final Adaptable adaptable) { if (adaptable.getTopicPath().getSubject().filter(KnownMessageSubjects.CLAIM_SUBJECT::equals).isPresent()) { return SendClaimMessageResponse.TYPE; } else if (!adaptable.getHeaders().map(DittoHeaders::isResponseRequired).orElse(true)) { return SendMessageAcceptedResponse.TYPE; } else if (adaptable.getPayload().getPath().getFeatureId().isPresent()) { return SendFeatureMessageResponse.TYPE; } else { return SendThingMessageResponse.TYPE; } }
@Override public boolean containsHeaderForKey(final CharSequence key) { return delegateAdaptable.containsHeaderForKey(key); }
@Override public final Adaptable toAdaptable(final T signal, final TopicPath.Channel channel) { final Adaptable adaptable = constructAdaptable(signal, channel); final Map<String, String> externalHeaders = headerTranslator.toExternalHeaders(adaptable.getDittoHeaders()); return adaptable.setDittoHeaders(DittoHeaders.of(externalHeaders)); }
@Override protected String getType(final Adaptable adaptable) { if (adaptable.getTopicPath().getSubject().filter(KnownMessageSubjects.CLAIM_SUBJECT::equals).isPresent()) { return SendClaimMessage.TYPE; } else if (adaptable.getPayload().getPath().getFeatureId().isPresent()) { return SendFeatureMessage.TYPE; } else { return SendThingMessage.TYPE; } }
@Override public Optional<DittoHeaders> getHeaders() { return delegateAdaptable.getHeaders(); }
@Override public TopicPath getTopicPath() { return delegateAdaptable.getTopicPath(); }
/** * Returns a new {@code AdaptableBuilder} for the existing {@code existingAdaptable} and a specific * {@code overwriteTopicPath} to overwrite the one in {@code existingAdaptable}. * * @param existingAdaptable the existingAdaptable to initialize the AdaptableBuilder with. * @param overwriteTopicPath the specific {@code TopicPath} to set as overwrite. * @return the builder. */ public static AdaptableBuilder newAdaptableBuilder(final Adaptable existingAdaptable, final TopicPath overwriteTopicPath) { return ImmutableAdaptableBuilder.of(overwriteTopicPath).withPayload(existingAdaptable.getPayload()) .withHeaders(existingAdaptable.getHeaders().orElse(null)); }
@Override public final T fromAdaptable(final Adaptable externalAdaptable) { checkNotNull(externalAdaptable, "Adaptable"); // get type from external adaptable before header filtering in case some headers exist for external messages // but not internally in Ditto. final String type = getType(externalAdaptable); // filter headers by header translator, then inject any missing information from topic path final DittoHeaders externalHeaders = externalAdaptable.getHeaders().orElse(DittoHeaders.empty()); final DittoHeaders filteredHeaders = addTopicPathInfo( headerTranslator.fromExternalHeaders(externalHeaders), externalAdaptable.getTopicPath()); final Adaptable adaptable = externalAdaptable.setDittoHeaders(filteredHeaders); final JsonifiableMapper<T> jsonifiableMapper = mappingStrategies.get(type); if (null == jsonifiableMapper) { throw UnknownTopicPathException.newBuilder(adaptable.getTopicPath()).build(); } return DittoJsonException.wrapJsonRuntimeException(() -> jsonifiableMapper.map(adaptable)); }
private static JsonObject initialPolicyForCreateThingFrom(final Adaptable adaptable) { return adaptable.getPayload().getValue() .map(JsonValue::asObject) .map(o -> o.getValue(CreateThing.JSON_INLINE_POLICY).map(JsonValue::asObject).orElse(null)) .orElse(null); }
@Override public Optional<ExternalMessage> apply(final Adaptable adaptable) { final JsonifiableAdaptable jsonifiableAdaptable = ProtocolFactory.wrapAsJsonifiableAdaptable(adaptable); final ExternalMessageBuilder messageBuilder = ExternalMessageFactory.newExternalMessageBuilder( adaptable.getHeaders().orElseGet(adaptable::getDittoHeaders)) .withTopicPath(adaptable.getTopicPath()); messageBuilder.withAdditionalHeaders(ExternalMessage.CONTENT_TYPE_HEADER, DittoConstants.DITTO_PROTOCOL_CONTENT_TYPE); messageBuilder.withText(jsonifiableAdaptable.toJsonString()); return Optional.of(messageBuilder.build()); }
private static Adaptable handleSingleRetrieve(final ThingQueryCommand<?> command, final TopicPath.Channel channel) { final TopicPathBuilder topicPathBuilder = ProtocolFactory.newTopicPathBuilder(command.getThingId()); final CommandsTopicPathBuilder commandsTopicPathBuilder; commandsTopicPathBuilder = fromTopicPathBuilderWithChannel(topicPathBuilder, channel); final String commandName = command.getClass().getSimpleName().toLowerCase(); if (!commandName.startsWith(TopicPath.Action.RETRIEVE.toString())) { throw UnknownCommandException.newBuilder(commandName).build(); } final PayloadBuilder payloadBuilder = Payload.newBuilder(command.getResourcePath()); command.getSelectedFields().ifPresent(payloadBuilder::withFields); return Adaptable.newBuilder(commandsTopicPathBuilder.retrieve().build()) .withPayload(payloadBuilder.build()) .withHeaders(ProtocolFactory.newHeadersWithDittoContentType(command.getDittoHeaders())) .build(); }
@Override public JsonifiableAdaptable setDittoHeaders(@Nonnull final DittoHeaders dittoHeaders) { return new ImmutableJsonifiableAdaptable(delegateAdaptable.setDittoHeaders(dittoHeaders)); } }
@Override public DittoHeaders getDittoHeaders() { return delegateAdaptable.getDittoHeaders(); }
@Override protected String getType(final Adaptable adaptable) { if (adaptable.getTopicPath().getSubject().filter(KnownMessageSubjects.CLAIM_SUBJECT::equals).isPresent()) { return SendClaimMessage.TYPE; } else if (adaptable.getPayload().getPath().getFeatureId().isPresent()) { return SendFeatureMessage.TYPE; } else { return SendThingMessage.TYPE; } }
@Override public Optional<DittoHeaders> getHeaders() { return delegateAdaptable.getHeaders(); }
@Override public TopicPath getTopicPath() { return delegateAdaptable.getTopicPath(); }
/** * Returns a new {@code AdaptableBuilder} for the existing {@code existingAdaptable} and a specific * {@code overwriteTopicPath} to overwrite the one in {@code existingAdaptable}. * * @param existingAdaptable the existingAdaptable to initialize the AdaptableBuilder with. * @param overwriteTopicPath the specific {@code TopicPath} to set as overwrite. * @return the builder. */ public static AdaptableBuilder newAdaptableBuilder(final Adaptable existingAdaptable, final TopicPath overwriteTopicPath) { return ImmutableAdaptableBuilder.of(overwriteTopicPath).withPayload(existingAdaptable.getPayload()) .withHeaders(existingAdaptable.getHeaders().orElse(null)); }
@Override public final T fromAdaptable(final Adaptable externalAdaptable) { checkNotNull(externalAdaptable, "Adaptable"); // get type from external adaptable before header filtering in case some headers exist for external messages // but not internally in Ditto. final String type = getType(externalAdaptable); // filter headers by header translator, then inject any missing information from topic path final DittoHeaders externalHeaders = externalAdaptable.getHeaders().orElse(DittoHeaders.empty()); final DittoHeaders filteredHeaders = addTopicPathInfo( headerTranslator.fromExternalHeaders(externalHeaders), externalAdaptable.getTopicPath()); final Adaptable adaptable = externalAdaptable.setDittoHeaders(filteredHeaders); final JsonifiableMapper<T> jsonifiableMapper = mappingStrategies.get(type); if (null == jsonifiableMapper) { throw UnknownTopicPathException.newBuilder(adaptable.getTopicPath()).build(); } return DittoJsonException.wrapJsonRuntimeException(() -> jsonifiableMapper.map(adaptable)); }
private static JsonObject initialPolicyForModifyThingFrom(final Adaptable adaptable) { return adaptable.getPayload().getValue() .map(JsonValue::asObject) .map(o -> o.getValue(ModifyThing.JSON_INLINE_POLICY).map(JsonValue::asObject).orElse(null)) .orElse(null); }
@Override public Optional<ExternalMessage> apply(final Adaptable adaptable) { final JsonifiableAdaptable jsonifiableAdaptable = ProtocolFactory.wrapAsJsonifiableAdaptable(adaptable); final ExternalMessageBuilder messageBuilder = ExternalMessageFactory.newExternalMessageBuilder( adaptable.getHeaders().orElseGet(adaptable::getDittoHeaders)) .withTopicPath(adaptable.getTopicPath()); messageBuilder.withAdditionalHeaders(ExternalMessage.CONTENT_TYPE_HEADER, DittoConstants.DITTO_PROTOCOL_CONTENT_TYPE); messageBuilder.withText(jsonifiableAdaptable.toJsonString()); return Optional.of(messageBuilder.build()); }