/** * Apply the provided event. Applying events means they are added to the uncommitted event queue * and forwarded to the {@link #handle(org.axonframework.domain.DomainEventMessage)} event handler * method} for processing. * * <p>The event is applied on all entities part of this aggregate. * * @param eventPayload The payload of the event to apply * @param metaData any meta-data that must be registered with the Event */ protected void apply(Object eventPayload, MetaData metaData) { if (getIdentifier() == null) { // workaround for aggregates that set the aggregate identifier in an Event Handler if (getUncommittedEventCount() > 0 || getVersion() != null) { throw new IncompatibleAggregateException( "The Aggregate Identifier has not been initialized. " + "It must be initialized at the latest when the " + "first event is applied."); } handleRecursively(new GenericDomainEventMessage<Object>(null, 0, eventPayload, metaData)); registerEvent(metaData, eventPayload); } else { DomainEventMessage event = registerEvent(metaData, eventPayload); handleRecursively(event); } }
/** * {@inheritDoc} * * <p>This implementation is aware of a special type of <code>DomainEvents</code>: the <code> * AggregateSnapshot</code>, which is a snapshot event, containing the actual aggregate inside. * * <p><code>AggregateSnapshot</code> events are used to initialize the aggregate with the correct * version ({@link #getVersion()}). * * @throws IllegalStateException if this aggregate was already initialized. */ @Override public void initializeState(DomainEventStream domainEventStream) { Assert.state(getUncommittedEventCount() == 0, "Aggregate is already initialized"); long lastSequenceNumber = -1; while (domainEventStream.hasNext()) { DomainEventMessage event = domainEventStream.next(); lastSequenceNumber = event.getSequenceNumber(); handleRecursively(event); } initializeEventStream(lastSequenceNumber); }