private DittoHeaders appendETagIfNotNull(final DittoHeaders dittoHeaders, @Nullable final EntityTag entityTag) { if (entityTag == null) { return dittoHeaders; } return dittoHeaders.toBuilder().eTag(entityTag).build(); } }
private WithDittoHeaders appendETagHeader(final C command, final WithDittoHeaders response) { final DittoHeaders dittoHeaders = response.getDittoHeaders(); final Optional<EntityTag> entityTagOpt = determineETagEntity(command) .flatMap(EntityTag::fromEntity); if (entityTagOpt.isPresent()) { final DittoHeaders newDittoHeaders = dittoHeaders.toBuilder().eTag(entityTagOpt.get()).build(); return response.setDittoHeaders(newDittoHeaders); } return response; }
private WithDittoHeaders appendETagHeader(final C command, final WithDittoHeaders response) { final DittoHeaders dittoHeaders = response.getDittoHeaders(); final Optional<EntityTag> entityTagOpt = determineETagEntity(command) .flatMap(EntityTag::fromEntity); if (entityTagOpt.isPresent()) { final DittoHeaders newDittoHeaders = dittoHeaders.toBuilder().eTag(entityTagOpt.get()).build(); return response.setDittoHeaders(newDittoHeaders); } return response; }
/** * Returns new {@code Headers} for the specified {@code headers} map. * * @param headers the headers map. * @return the headers. */ public static DittoHeaders newHeadersWithDittoContentType(final Map<String, String> headers) { return DittoHeaders.of(headers).toBuilder().contentType(DittoConstants.DITTO_PROTOCOL_CONTENT_TYPE).build(); }
/** * Returns new {@code Headers} for the specified {@code headers} map. * * @param headers the headers map. * @return the headers. */ public static DittoHeaders newHeadersWithDittoContentType(final Map<String, String> headers) { return DittoHeaders.of(headers).toBuilder().contentType(DittoConstants.DITTO_PROTOCOL_CONTENT_TYPE).build(); }
private static <C extends Command, E> WithDittoHeaders appendETagHeaderIfProvided(final C command, final WithDittoHeaders withDittoHeaders, @Nullable final Thing thing, @Nullable final ETagEntityProvider<C, E> eTagProvider) { if (eTagProvider == null) { return withDittoHeaders; } final Optional<E> eTagEntityOpt = eTagProvider.determineETagEntity(command, thing); if (eTagEntityOpt.isPresent()) { final Optional<EntityTag> entityTagOpt = EntityTag.fromEntity(eTagEntityOpt.get()); if (entityTagOpt.isPresent()) { final EntityTag entityTag = entityTagOpt.get(); final DittoHeaders newDittoHeaders = withDittoHeaders.getDittoHeaders().toBuilder() .eTag(entityTag) .build(); return withDittoHeaders.setDittoHeaders(newDittoHeaders); } } return withDittoHeaders; }
private static <C extends Command, E> WithDittoHeaders appendETagHeaderIfProvided(final C command, final WithDittoHeaders withDittoHeaders, @Nullable final Thing thing, @Nullable final ETagEntityProvider<C, E> eTagProvider) { if (eTagProvider == null) { return withDittoHeaders; } final Optional<E> eTagEntityOpt = eTagProvider.determineETagEntity(command, thing); if (eTagEntityOpt.isPresent()) { final Optional<EntityTag> entityTagOpt = EntityTag.fromEntity(eTagEntityOpt.get()); if (entityTagOpt.isPresent()) { final EntityTag entityTag = entityTagOpt.get(); final DittoHeaders newDittoHeaders = withDittoHeaders.getDittoHeaders().toBuilder() .eTag(entityTag) .build(); return withDittoHeaders.setDittoHeaders(newDittoHeaders); } } return withDittoHeaders; }
private DittoHeaders enhanceHeaders(final DittoHeaders dittoHeaders) { return dittoHeaders.toBuilder().channel(TopicPath.Channel.LIVE.getName()).build(); }
private CommandResponse unfixCorrelationId(final CommandResponse response) { final String correlationId = response.getDittoHeaders() .getCorrelationId() .flatMap(s -> decodeCommandCorrelationId(s).getValue(ORIGINAL_CORRELATION_ID)) .map(JsonValue::asString) .orElse(null); final DittoHeaders dittoHeaders = response.getDittoHeaders().toBuilder() .correlationId(correlationId) .build(); return response.setDittoHeaders(dittoHeaders); }
/** * Add to headers any information that will be missing from topic path. * * @param filteredHeaders headers read from external headers. * @param topicPath topic path of an adaptable. * @return filteredHeaders with extra information from topicPath. */ private static DittoHeaders addTopicPathInfo(final DittoHeaders filteredHeaders, final TopicPath topicPath) { final DittoHeaders extraInfo = mapTopicPathToHeaders(topicPath); return extraInfo.isEmpty() ? filteredHeaders : filteredHeaders.toBuilder().putHeaders(extraInfo).build(); }
/** * Add to headers any information that will be missing from topic path. * * @param filteredHeaders headers read from external headers. * @param topicPath topic path of an adaptable. * @return filteredHeaders with extra information from topicPath. */ private static DittoHeaders addTopicPathInfo(final DittoHeaders filteredHeaders, final TopicPath topicPath) { final DittoHeaders extraInfo = mapTopicPathToHeaders(topicPath); return extraInfo.isEmpty() ? filteredHeaders : filteredHeaders.toBuilder().putHeaders(extraInfo).build(); }
@Override public DittoHeaders apply(final ExternalMessage externalMessage, final DittoHeaders dittoHeaders) { final DittoHeadersBuilder dittoHeadersBuilder = dittoHeaders.toBuilder(); final String beforeMapping = externalMessage .findHeader(DittoHeaderDefinition.AUTHORIZATION_SUBJECTS.getKey()) .orElseThrow(() -> new IllegalArgumentException( "Missing header " + DittoHeaderDefinition.AUTHORIZATION_SUBJECTS.getKey())); // do not use dittoHeadersBuilder.authorizationSubjects(beforeMapping); // because beforeMapping is a JsonArray String, we need to set AUTHORIZATION_SUBJECTS header directly dittoHeadersBuilder.putHeader(DittoHeaderDefinition.AUTHORIZATION_SUBJECTS.getKey(), beforeMapping); if (!dittoHeaders.getOrigin().isPresent()) { dittoHeadersBuilder.origin(connectionId); } // overwrite the auth-subjects to the configured ones after mapping in order to be sure that the mapping // does not choose/change the auth-subjects itself: return dittoHeadersBuilder.build(); }
@Override public DittoHeaders apply(final ExternalMessage externalMessage, final DittoHeaders dittoHeaders) { final DittoHeadersBuilder dittoHeadersBuilder = dittoHeaders.toBuilder(); final String beforeMapping = externalMessage .findHeader(DittoHeaderDefinition.AUTHORIZATION_SUBJECTS.getKey()) .orElseThrow(() -> new IllegalArgumentException( "Missing header " + DittoHeaderDefinition.AUTHORIZATION_SUBJECTS.getKey())); // do not use dittoHeadersBuilder.authorizationSubjects(beforeMapping); // because beforeMapping is a JsonArray String, we need to set AUTHORIZATION_SUBJECTS header directly dittoHeadersBuilder.putHeader(DittoHeaderDefinition.AUTHORIZATION_SUBJECTS.getKey(), beforeMapping); if (!dittoHeaders.getOrigin().isPresent()) { dittoHeadersBuilder.origin(connectionId); } // overwrite the auth-subjects to the configured ones after mapping in order to be sure that the mapping // does not choose/change the auth-subjects itself: return dittoHeadersBuilder.build(); }
/** * Extend a signal by read-subjects header given explicitly. * * @param <T> type of the signal. * @param signal the signal to extend. * @param readSubjects explicitly-given read subjects. * @return the extended signal. */ protected static <T extends Signal> T addReadSubjectsToSignal(final Signal<T> signal, final Set<String> readSubjects) { final DittoHeaders newHeaders = signal.getDittoHeaders() .toBuilder() .readSubjects(readSubjects) .build(); return signal.setDittoHeaders(newHeaders); }
private void tellCommandAsDryRun(final Command command) { final String correlationId = encodeCorrelationId(command.getDittoHeaders()); final DittoHeadersBuilder dittoHeadersBuilder = command.getDittoHeaders() .toBuilder() .correlationId(correlationId); commands.put(correlationId, command.setDittoHeaders(dittoHeadersBuilder.build())); pendingCommands.add(correlationId); final Command commandAsDryRun = command.setDittoHeaders(dittoHeadersBuilder.dryRun(true).build()); conciergeForwarder.tell(commandAsDryRun, getSelf()); }
private <A extends ThingModifiedEvent<? extends A>> void persistAndApplyEvent( final A event, final BiConsumer<A, Thing> handler) { final A modifiedEvent; if (thing != null) { // set version of event to the version of the thing final DittoHeaders newHeaders = event.getDittoHeaders().toBuilder() .schemaVersion(thing.getImplementedSchemaVersion()) .build(); modifiedEvent = event.setDittoHeaders(newHeaders); } else { modifiedEvent = event; } if (modifiedEvent.getDittoHeaders().isDryRun()) { handler.accept(modifiedEvent, thing); } else { persistEvent(modifiedEvent, persistedEvent -> { // after the event was persisted, apply the event on the current actor state applyEvent(persistedEvent); handler.accept(persistedEvent, thing); }); } }
private <A extends ThingModifiedEvent<? extends A>> void persistAndApplyEvent( final A event, final BiConsumer<A, Thing> handler) { final A modifiedEvent; if (thing != null) { // set version of event to the version of the thing final DittoHeaders newHeaders = event.getDittoHeaders().toBuilder() .schemaVersion(thing.getImplementedSchemaVersion()) .build(); modifiedEvent = event.setDittoHeaders(newHeaders); } else { modifiedEvent = event; } if (modifiedEvent.getDittoHeaders().isDryRun()) { handler.accept(modifiedEvent, thing); } else { persistEvent(modifiedEvent, persistedEvent -> { // after the event was persisted, apply the event on the current actor state applyEvent(persistedEvent); handler.accept(persistedEvent, thing); }); } }
private void publishMessageCommand(final MessageCommand command, final Enforcer enforcer, final ActorRef sender) { final ResourceKey resourceKey = ResourceKey.newInstance(MessageCommand.RESOURCE_TYPE, command.getResourcePath()); final Set<String> messageReaders = enforcer.getSubjectIdsWithPermission(resourceKey, Permission.READ) .getGranted(); final DittoHeaders headersWithReadSubjects = command.getDittoHeaders() .toBuilder() .readSubjects(messageReaders) .build(); final MessageCommand commandWithReadSubjects = command.setDittoHeaders(headersWithReadSubjects); publishToMediator(commandWithReadSubjects, commandWithReadSubjects.getTypePrefix(), sender); // answer the sender immediately for fire-and-forget message commands. getResponseForFireAndForgetMessage(commandWithReadSubjects) .ifPresent(response -> replyToSender(response, sender)); }
private Signal<?> fromLiveAdaptable(final Adaptable adaptable) { final TopicPath topicPath = adaptable.getTopicPath(); final Signal<?> liveSignal; if (TopicPath.Criterion.MESSAGES.equals(topicPath.getCriterion())) { // /things/live/messages final boolean isResponse = adaptable.getPayload().getStatus().isPresent(); if (isResponse) { liveSignal = messageCommandResponseAdapter.fromAdaptable(adaptable); } else { liveSignal = messageCommandAdapter.fromAdaptable(adaptable); } } else { liveSignal = signalFromAdaptable(adaptable, topicPath); // /things/live/(commands|events) } if (liveSignal != null) { final DittoHeadersBuilder enhancedHeadersBuilder = liveSignal.getDittoHeaders() .toBuilder() .channel(TopicPath.Channel.LIVE.getName()); return liveSignal.setDittoHeaders(enhancedHeadersBuilder.build()); } else { throw UnknownTopicPathException.newBuilder(topicPath).build(); } }
private Signal<?> fromLiveAdaptable(final Adaptable adaptable) { final TopicPath topicPath = adaptable.getTopicPath(); final Signal<?> liveSignal; if (TopicPath.Criterion.MESSAGES.equals(topicPath.getCriterion())) { // /things/live/messages final boolean isResponse = adaptable.getPayload().getStatus().isPresent(); if (isResponse) { liveSignal = messageCommandResponseAdapter.fromAdaptable(adaptable); } else { liveSignal = messageCommandAdapter.fromAdaptable(adaptable); } } else { liveSignal = signalFromAdaptable(adaptable, topicPath); // /things/live/(commands|events) } if (liveSignal != null) { final DittoHeadersBuilder enhancedHeadersBuilder = liveSignal.getDittoHeaders() .toBuilder() .channel(TopicPath.Channel.LIVE.getName()); return liveSignal.setDittoHeaders(enhancedHeadersBuilder.build()); } else { throw UnknownTopicPathException.newBuilder(topicPath).build(); } }