@Override public void appendEvents(List<? extends EventMessage<?>> events) { appendEvents(events, eventSerializer); }
@Override public Stream<? extends TrackedEventMessage<?>> readEvents(TrackingToken trackingToken, boolean mayBlock) { Stream<? extends TrackedEventData<?>> input = readEventData(trackingToken, mayBlock); return upcastAndDeserializeTrackedEvents(input, eventSerializer, upcasterChain); }
@Override public Optional<DomainEventMessage<?>> readSnapshot(String aggregateIdentifier) { return readSnapshotData(aggregateIdentifier) .filter(snapshotFilter) .map(snapshot -> upcastAndDeserializeDomainEvents(Stream.of(snapshot), snapshotSerializer, upcasterChain )) .flatMap(DomainEventStream::asStream) .findFirst() .map(event -> (DomainEventMessage<?>) event); }
@Test @DirtiesContext @SuppressWarnings({"unchecked", "OptionalGetWithoutIsPresent"}) public void testStoreAndLoadEventsWithUpcaster() { EventUpcaster mockUpcasterChain = mock(EventUpcaster.class); when(mockUpcasterChain.upcast(isA(Stream.class))).thenAnswer(invocation -> { Stream<?> inputStream = (Stream) invocation.getArguments()[0]; return inputStream.flatMap(e -> Stream.of(e, e)); }); testSubject = createEngine(mockUpcasterChain); testSubject.appendEvents(createEvents(4)); List<DomainEventMessage> upcastedEvents = testSubject.readEvents(AGGREGATE).asStream().collect(toList()); assertEquals(8, upcastedEvents.size()); Iterator<DomainEventMessage> iterator = upcastedEvents.iterator(); while (iterator.hasNext()) { DomainEventMessage event1 = iterator.next(), event2 = iterator.next(); assertEquals(event1.getAggregateIdentifier(), event2.getAggregateIdentifier()); assertEquals(event1.getSequenceNumber(), event2.getSequenceNumber()); assertEquals(event1.getPayload(), event2.getPayload()); assertEquals(event1.getMetaData(), event2.getMetaData()); } }
@Override public void storeSnapshot(DomainEventMessage<?> snapshot) { storeSnapshot(snapshot, snapshotSerializer); }
protected Optional<Serializer> serializer() { return storageEngine instanceof AbstractEventStorageEngine ? Optional.of(((AbstractEventStorageEngine) storageEngine).getSnapshotSerializer()) : Optional.empty(); }
@Override public void storeSnapshot(DomainEventMessage<?> snapshot) { storeSnapshot(snapshot, serializer); }
@DirtiesContext @Test(expected = ConcurrencyException.class) public void testUniqueKeyConstraintOnEventIdentifier() { testSubject.appendEvents(createEvent("id", AGGREGATE, 0), createEvent("id", "otherAggregate", 0)); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { Stream<? extends DomainEventData<?>> input = readEventData(aggregateIdentifier, firstSequenceNumber); return upcastAndDeserializeDomainEvents(input, eventSerializer, upcasterChain); }
@Override public Optional<DomainEventMessage<?>> readSnapshot(String aggregateIdentifier) { return readSnapshotData(aggregateIdentifier) .filter(snapshotFilter) .map(snapshot -> upcastAndDeserializeDomainEvents(Stream.of(snapshot), snapshotSerializer, upcasterChain )) .flatMap(DomainEventStream::asStream) .findFirst() .map(event -> (DomainEventMessage<?>) event); }
@Override public void storeSnapshot(DomainEventMessage<?> snapshot) { storeSnapshot(snapshot, snapshotSerializer); }
@DirtiesContext @Test(expected = ConcurrencyException.class) public void testStoreDuplicateEventWithExceptionTranslator() { testSubject.appendEvents(createEvent(0), createEvent(0)); }
@Override public Stream<? extends TrackedEventMessage<?>> readEvents(TrackingToken trackingToken, boolean mayBlock) { Stream<? extends TrackedEventData<?>> input = readEventData(trackingToken, mayBlock); return EventUtils.upcastAndDeserializeTrackedEvents(input, eventSerializer, upcasterChain, true); }
@Override public Optional<DomainEventMessage<?>> readSnapshot(String aggregateIdentifier) { return readSnapshotData(aggregateIdentifier).filter(snapshotFilter).map(entry -> { DomainEventStream stream = EventUtils.upcastAndDeserializeDomainEvents(Stream.of(entry), serializer, upcasterChain, false); return stream.hasNext() ? stream.next() : null; }); }
@DirtiesContext @Test(expected = EventStoreException.class) public void testStoreDuplicateEventWithoutExceptionResolver() { testSubject = createEngine((PersistenceExceptionResolver) e -> false); testSubject.appendEvents(createEvent(0), createEvent(0)); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { Stream<? extends DomainEventData<?>> input = readEventData(aggregateIdentifier, firstSequenceNumber); return EventUtils.upcastAndDeserializeDomainEvents(input, eventSerializer, upcasterChain, false); }
@Override public void appendEvents(List<? extends EventMessage<?>> events) { appendEvents(events, eventSerializer); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { Stream<? extends DomainEventData<?>> input = readEventData(aggregateIdentifier, firstSequenceNumber); return upcastAndDeserializeDomainEvents(input, eventSerializer, upcasterChain); }
@Override public void appendEvents(List<? extends EventMessage<?>> events) { appendEvents(events, eventSerializer); }
@Override public Stream<? extends TrackedEventMessage<?>> readEvents(TrackingToken trackingToken, boolean mayBlock) { Stream<? extends TrackedEventData<?>> input = readEventData(trackingToken, mayBlock); return upcastAndDeserializeTrackedEvents(input, eventSerializer, upcasterChain); }