private static Optional<Topic> topicFromSignal(final Signal<?> signal) { // only things as group supported final TopicPath.Group group = signal instanceof WithThingId ? TopicPath.Group.THINGS : null; final TopicPath.Channel channel = signal.getDittoHeaders() .getChannel() .flatMap(TopicPath.Channel::forName) .orElse(TopicPath.Channel.TWIN); final TopicPath.Criterion criterion = getCriterionOfSignal(signal); if (TopicPath.Group.THINGS.equals(group)) { if (TopicPath.Channel.TWIN.equals(channel)) { if (EVENTS.equals(criterion)) { return Optional.of(Topic.TWIN_EVENTS); } } else if (TopicPath.Channel.LIVE.equals(channel) && criterion != null) { switch (criterion) { case COMMANDS: return Optional.of(Topic.LIVE_COMMANDS); case EVENTS: return Optional.of(Topic.LIVE_EVENTS); case MESSAGES: return Optional.of(Topic.LIVE_MESSAGES); default: return Optional.empty(); } } } return Optional.empty(); }
return Optional.of(topicPath.getChannel().getName()); case CRITERION_PLACEHOLDER: return Optional.of(topicPath.getCriterion().getName()); case ACTION_PLACEHOLDER: return topicPath.getAction().map(TopicPath.Action::getName);
/** * Creates a Criterion from the passed Criterion {@code name} if such an enum value exists, otherwise an empty * Optional. * * @param name the Criterion name to create the Criterion enum value of. * @return the optional Criterion. */ public static Optional<Criterion> forName(final String name) { return Stream.of(values()) // .filter(a -> Objects.equals(a.getName(), name)) // .findFirst(); }
.orElseThrow(() -> UnknownTopicPathException.newBuilder(path).build()); final TopicPath.Criterion criterion = TopicPath.Criterion.forName(parts[4]) .orElseThrow(() -> UnknownTopicPathException.newBuilder(path).build());
.orElseThrow(() -> UnknownTopicPathException.newBuilder(path).build()); final TopicPath.Criterion criterion = TopicPath.Criterion.forName(parts[4]) .orElseThrow(() -> UnknownTopicPathException.newBuilder(path).build());
private static Optional<Topic> topicFromSignal(final Signal<?> signal) { // only things as group supported final TopicPath.Group group = signal instanceof WithThingId ? TopicPath.Group.THINGS : null; final TopicPath.Channel channel = signal.getDittoHeaders() .getChannel() .flatMap(TopicPath.Channel::forName) .orElse(TopicPath.Channel.TWIN); final TopicPath.Criterion criterion = getCriterionOfSignal(signal); if (TopicPath.Group.THINGS.equals(group)) { if (TopicPath.Channel.TWIN.equals(channel)) { if (EVENTS.equals(criterion)) { return Optional.of(Topic.TWIN_EVENTS); } } else if (TopicPath.Channel.LIVE.equals(channel) && criterion != null) { switch (criterion) { case COMMANDS: return Optional.of(Topic.LIVE_COMMANDS); case EVENTS: return Optional.of(Topic.LIVE_EVENTS); case MESSAGES: return Optional.of(Topic.LIVE_MESSAGES); default: return Optional.empty(); } } } return Optional.empty(); }
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(); } }
@Nullable private Signal<?> signalFromAdaptable(final Adaptable adaptable, final TopicPath topicPath) { if (TopicPath.Criterion.COMMANDS.equals(topicPath.getCriterion())) { if (adaptable.getPayload().getStatus().isPresent()) { // this was a command response: return processCommandResponseSignalFromAdaptable(adaptable, topicPath); } else if (TopicPath.Action.RETRIEVE.equals(topicPath.getAction().orElse(null))) { return thingQueryCommandAdapter.fromAdaptable(adaptable); } else { return thingModifyCommandAdapter.fromAdaptable(adaptable); } } else if (TopicPath.Criterion.EVENTS.equals(topicPath.getCriterion())) { return thingEventAdapter.fromAdaptable(adaptable); } else if (TopicPath.Criterion.ERRORS.equals(topicPath.getCriterion())) { return thingErrorResponseFromAdaptable(adaptable); } return null; }
@Nullable private Signal<?> signalFromAdaptable(final Adaptable adaptable, final TopicPath topicPath) { if (TopicPath.Criterion.COMMANDS.equals(topicPath.getCriterion())) { if (adaptable.getPayload().getStatus().isPresent()) { // this was a command response: return processCommandResponseSignalFromAdaptable(adaptable, topicPath); } else if (TopicPath.Action.RETRIEVE.equals(topicPath.getAction().orElse(null))) { return thingQueryCommandAdapter.fromAdaptable(adaptable); } else { return thingModifyCommandAdapter.fromAdaptable(adaptable); } } else if (TopicPath.Criterion.EVENTS.equals(topicPath.getCriterion())) { return thingEventAdapter.fromAdaptable(adaptable); } else if (TopicPath.Criterion.ERRORS.equals(topicPath.getCriterion())) { return thingErrorResponseFromAdaptable(adaptable); } return null; }
@Override public Optional<ExternalMessage> map(final Adaptable adaptable) { final Map<String, String> headers = new LinkedHashMap<>(adaptable.getHeaders().orElse(DittoHeaders.empty())); final String jsonString = ProtocolFactory.wrapAsJsonifiableAdaptable(adaptable).toJsonString(); final boolean isError = TopicPath.Criterion.ERRORS.equals(adaptable.getTopicPath().getCriterion()); final boolean isResponse = adaptable.getPayload().getStatus().isPresent(); return Optional.of( ExternalMessageFactory.newExternalMessageBuilder(headers) .withTopicPath(adaptable.getTopicPath()) .withText(jsonString) .asResponse(isResponse) .asError(isError) .build()); }
@Test public void testReplaceCriterion() { assertThat(UNDER_TEST.apply(KNOWN_TOPIC_PATH, "criterion")).contains(KNOWN_CRITERION.getName()); }
/** * Creates a Criterion from the passed Criterion {@code name} if such an enum value exists, otherwise an empty * Optional. * * @param name the Criterion name to create the Criterion enum value of. * @return the optional Criterion. */ public static Optional<Criterion> forName(final String name) { return Stream.of(values()) // .filter(a -> Objects.equals(a.getName(), name)) // .findFirst(); }
@Override public Optional<ExternalMessage> map(final Adaptable adaptable) { final Map<String, String> headers = new LinkedHashMap<>(adaptable.getHeaders().orElse(DittoHeaders.empty())); final String jsonString = ProtocolFactory.wrapAsJsonifiableAdaptable(adaptable).toJsonString(); final boolean isError = TopicPath.Criterion.ERRORS.equals(adaptable.getTopicPath().getCriterion()); final boolean isResponse = adaptable.getPayload().getStatus().isPresent(); return Optional.of( ExternalMessageFactory.newExternalMessageBuilder(headers) .withTopicPath(adaptable.getTopicPath()) .withText(jsonString) .asResponse(isResponse) .asError(isError) .build()); }