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; }
private Optional<InboundExternalMessage> convertMessage(final ExternalMessage message, final StartedTimer overAllProcessingTimer) { checkNotNull(message); try { final Optional<Adaptable> adaptableOpt = withTimer( overAllProcessingTimer.startNewSegment(PAYLOAD_SEGMENT_NAME), () -> getMapper(message).map(message)); return adaptableOpt.map(adaptable -> { enhanceLogFromAdaptable(adaptable); final Signal<?> signal = this.<Signal<?>>withTimer( overAllProcessingTimer.startNewSegment(PROTOCOL_SEGMENT_NAME), () -> protocolAdapter.fromAdaptable(adaptable)); return MappedInboundExternalMessage.of(message, adaptable.getTopicPath(), signal); }); } catch (final DittoRuntimeException e) { throw e; } catch (final Exception e) { throw MessageMappingFailedException.newBuilder(message.findContentType().orElse("")) .description("Could not map ExternalMessage due to unknown problem: " + e.getClass().getSimpleName() + " " + e.getMessage()) .dittoHeaders(DittoHeaders.of(message.getHeaders())) .cause(e) .build(); } }
private Optional<InboundExternalMessage> convertMessage(final ExternalMessage message, final StartedTimer overAllProcessingTimer) { checkNotNull(message); try { final Optional<Adaptable> adaptableOpt = withTimer( overAllProcessingTimer.startNewSegment(PAYLOAD_SEGMENT_NAME), () -> getMapper(message).map(message)); return adaptableOpt.map(adaptable -> { enhanceLogFromAdaptable(adaptable); final Signal<?> signal = this.<Signal<?>>withTimer( overAllProcessingTimer.startNewSegment(PROTOCOL_SEGMENT_NAME), () -> protocolAdapter.fromAdaptable(adaptable)); return MappedInboundExternalMessage.of(message, adaptable.getTopicPath(), signal); }); } catch (final DittoRuntimeException e) { throw e; } catch (final Exception e) { throw MessageMappingFailedException.newBuilder(message.findContentType().orElse("")) .description("Could not map ExternalMessage due to unknown problem: " + e.getClass().getSimpleName() + " " + e.getMessage()) .dittoHeaders(DittoHeaders.of(message.getHeaders())) .cause(e) .build(); } }
/** * Processes a Signal to an ExternalMessage. * * @param signal the signal * @return the message */ Optional<ExternalMessage> process(final Signal<?> signal) { final StartedTimer overAllProcessingTimer = startNewTimer().tag(DIRECTION_TAG_NAME, OUTBOUND); return withTimer(overAllProcessingTimer, () -> convertToExternalMessage(() -> protocolAdapter.toAdaptable(signal), overAllProcessingTimer)); }
signal = adapter.fromAdaptable(jsonifiableAdaptable); } catch (final DittoRuntimeException e) { throw e.setDittoHeaders(e.getDittoHeaders().toBuilder().origin(connectionCorrelationId).build());
/** * Processes a Signal to an ExternalMessage. * * @param signal the signal * @return the message */ Optional<ExternalMessage> process(final Signal<?> signal) { final StartedTimer overAllProcessingTimer = startNewTimer().tag(DIRECTION_TAG_NAME, OUTBOUND); return withTimer(overAllProcessingTimer, () -> convertToExternalMessage(() -> protocolAdapter.toAdaptable(signal), overAllProcessingTimer)); }