/* * Copyright (c) 2010-2016. Axon Framework * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * http://www.apache.org/licenses/LICENSE-2.0 * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.axonframework.eventsourcing; import org.axonframework.eventhandling.TrackedEventMessage; import org.axonframework.eventsourcing.eventstore.TrackingToken; import org.axonframework.messaging.Message; import java.time.Instant; import java.util.Map; import java.util.function.Supplier; /** * Generic implementation of a {@link DomainEventMessage} that is also a {@link TrackedEventMessage}. * * @param <T> The type of payload contained in this Message */ public class GenericTrackedDomainEventMessage<T> extends GenericDomainEventMessage<T> implements TrackedEventMessage<T> { private final TrackingToken trackingToken; /** * Initialize a DomainEventMessage originating from an aggregate. * * @param trackingToken Tracking token of the event * @param delegate Delegate domain event containing other event data */ public GenericTrackedDomainEventMessage(TrackingToken trackingToken, DomainEventMessage<T> delegate) { this(trackingToken, delegate.getType(), delegate.getAggregateIdentifier(), delegate.getSequenceNumber(), delegate, delegate.getTimestamp()); } /** * Initialize a DomainEventMessage originating from an Aggregate using existing data. The timestamp of the event is * supplied lazily to prevent unnecessary deserialization of the timestamp. * * @param trackingToken Tracking token of the event * @param type The domain type * @param aggregateIdentifier The identifier of the aggregate generating this message * @param sequenceNumber The message's sequence number * @param delegate The delegate message providing the payload, metadata and identifier of the event * @param timestamp The event's timestamp supplier */ public GenericTrackedDomainEventMessage(TrackingToken trackingToken, String type, String aggregateIdentifier, long sequenceNumber, Message<T> delegate, Supplier<Instant> timestamp) { super(type, aggregateIdentifier, sequenceNumber, delegate, timestamp); this.trackingToken = trackingToken; } /** * Initialize a DomainEventMessage originating from an aggregate. * * @param trackingToken Tracking token of the event * @param type The domain type * @param aggregateIdentifier The identifier of the aggregate generating this message * @param sequenceNumber The message's sequence number * @param delegate The delegate message providing the payload, metadata and identifier of the event * @param timestamp The event's timestamp */ protected GenericTrackedDomainEventMessage(TrackingToken trackingToken, String type, String aggregateIdentifier, long sequenceNumber, Message<T> delegate, Instant timestamp) { super(type, aggregateIdentifier, sequenceNumber, delegate, timestamp); this.trackingToken = trackingToken; } @Override public TrackingToken trackingToken() { return trackingToken; } @Override public GenericTrackedDomainEventMessage<T> withMetaData(Map<String, ?> metaData) { return new GenericTrackedDomainEventMessage<>(trackingToken, getType(), getAggregateIdentifier(), getSequenceNumber(), getDelegate().withMetaData(metaData), getTimestamp()); } @Override public GenericTrackedDomainEventMessage<T> andMetaData(Map<String, ?> metaData) { return new GenericTrackedDomainEventMessage<>(trackingToken, getType(), getAggregateIdentifier(), getSequenceNumber(), getDelegate().andMetaData(metaData), getTimestamp()); } }