/** * Returns the given {@code result} as a {@link ResultMessage} instance. If {@code result} already implements {@link * ResultMessage}, it is returned as-is. If {@code result} implements {@link Message}, payload and meta data will be * used to construct new {@link GenericResultMessage}. Otherwise, the given {@code result} is wrapped into a {@link * GenericResultMessage} as its payload. * * @param result the command result to be wrapped as {@link ResultMessage} * @param <T> The type of the payload contained in returned Message * @return a Message containing given {@code result} as payload, or {@code result} if already * implements {@link ResultMessage} */ @SuppressWarnings("unchecked") public static <T> ResultMessage<T> asResultMessage(Object result) { if (ResultMessage.class.isInstance(result)) { return (ResultMessage<T>) result; } else if (Message.class.isInstance(result)) { Message<?> resultMessage = (Message<?>) result; return new GenericResultMessage<>((T) resultMessage.getPayload(), resultMessage.getMetaData()); } return new GenericResultMessage<>((T) result); }
@Override @SuppressWarnings("unchecked") public <E> Stream<E> filterCandidates(T message, Stream<E> candidates) { Property routingProperty = getProperty(message.getPayloadType(), routingKey); if (routingProperty == null) { return Stream.empty(); } Object routingValue = routingProperty.getValue(message.getPayload()); return candidates.filter(candidate -> matchesInstance(candidate, routingValue)); }
@Override public GenericDeadlineMessage<T> andMetaData(Map<String, ?> additionalMetaData) { return new GenericDeadlineMessage<>( deadlineName, getDelegate().andMetaData(additionalMetaData), this::getTimestamp ); }
@Override public Map<String, ?> correlationDataFor(Message<?> message) { Map<String, Object> result = new HashMap<>(); result.put(correlationKey, message.getIdentifier()); result.put(traceKey, message.getMetaData().getOrDefault(traceKey, message.getIdentifier())); return result; }
@Override public Class<T> getPayloadType() { return delegate.getPayloadType(); }
@Override public MetaData getMetaData() { return delegate.getMetaData(); }
@Override public Object resolveParameterValue(Message message) { return message.getPayload(); }
@Override public SubscriptionQueryUpdateMessage<U> withMetaData(Map<String, ?> metaData) { return new GenericSubscriptionQueryUpdateMessage<>(getDelegate().withMetaData(metaData)); }
@Override public String getIdentifier() { return delegate.getIdentifier(); }
@Override public <S> SerializedObject<S> serializeMetaData(Serializer serializer, Class<S> expectedRepresentation) { return delegate.serializeMetaData(serializer, expectedRepresentation); }
@Override public boolean matches(Message message) { return message.getPayloadType() != null && payloadType.isAssignableFrom(message.getPayloadType()); }
@Override public Object resolveParameterValue(Message message) { return message.getMetaData(); }
@Override public T getPayload() { return delegate.getPayload(); }
@Override public Map<String, ?> correlationDataFor(Message<?> message) { Map<String, Object> result = new HashMap<>(); result.put(correlationKey, message.getIdentifier()); result.put(traceKey, message.getMetaData().getOrDefault(traceKey, message.getIdentifier())); return result; }
@Override public QueryMessage<T, R> withMetaData(Map<String, ?> metaData) { return new GenericQueryMessage<>(getDelegate().withMetaData(metaData), queryName, responseType); }
@Override public String resolveParameterValue(Message message) { return message.getIdentifier(); }
@Override public <S> SerializedObject<S> serializeMetaData(Serializer serializer, Class<S> expectedRepresentation) { return delegate.serializeMetaData(serializer, expectedRepresentation); }
/** * Apply a new event message to the aggregate and then publish this message to external systems. If the given {@code * payloadOrMessage} is an instance of a {@link Message} an event message is applied with the payload and metadata * of the given message, otherwise an event message is applied with given payload and empty metadata. * * @param payloadOrMessage defines the payload and optionally metadata to apply to the aggregate */ protected void applyMessageOrPayload(Object payloadOrMessage) { if (payloadOrMessage instanceof Message) { Message message = (Message) payloadOrMessage; apply(message.getPayload(), message.getMetaData()); } else if (payloadOrMessage != null) { apply(payloadOrMessage, MetaData.emptyInstance()); } }
private static Object invokeAnnotated(Message<?> command, Class<? extends Annotation> annotation) throws InvocationTargetException, IllegalAccessException { for (Method m : methodsOf(command.getPayloadType())) { if (AnnotationUtils.isAnnotationPresent(m, annotation)) { ensureAccessible(m); return m.invoke(command.getPayload()); } } for (Field f : fieldsOf(command.getPayloadType())) { if (AnnotationUtils.isAnnotationPresent(f, annotation)) { return getFieldValue(f, command.getPayload()); } } return null; }
@Override public MonitorCallback onMessageIngested(Message<?> message) { String monitorName = monitorNameBuilder.apply(message.getPayloadType()); MessageMonitor<Message<?>> messageMonitorForPayloadType = payloadTypeMonitors.computeIfAbsent(monitorName, payloadType -> monitorSupplier.get()); return messageMonitorForPayloadType.onMessageIngested(message); }