@Override public void appendEvents(List<? extends EventMessage<?>> events) { activeStorage.appendEvents(events); }
@Override public TrackingToken createHeadToken() { return activeStorage.createHeadToken(); }
@Override public TrackingToken createTailToken() { return delegate.createTailToken(); }
@Test @SuppressWarnings("OptionalGetWithoutIsPresent") public void testLoadPartialStreamOfTrackedEvents() { List<DomainEventMessage<?>> events = createEvents(4); testSubject.appendEvents(events); TrackingToken token = testSubject.readEvents(null, false).findFirst().get().trackingToken(); assertEquals(3, testSubject.readEvents(token, false).count()); assertEquals(events.subList(1, events.size()).stream().map(EventMessage::getIdentifier).collect(toList()), testSubject.readEvents(token, false).map(EventMessage::getIdentifier).collect(toList())); }
@Test public void testCreateTokenAt() { DomainEventMessage<String> event1 = createEvent(0, Instant.parse("2007-12-03T10:15:00.00Z")); DomainEventMessage<String> event2 = createEvent(1, Instant.parse("2007-12-03T10:15:40.00Z")); DomainEventMessage<String> event3 = createEvent(2, Instant.parse("2007-12-03T10:15:35.00Z")); testSubject.appendEvents(event1, event2, event3); TrackingToken tokenAt = testSubject.createTokenAt(Instant.parse("2007-12-03T10:15:30.00Z")); List<EventMessage<?>> readEvents = testSubject.readEvents(tokenAt, false) .collect(toList()); assertEventStreamsById(Arrays.asList(event2, event3), readEvents); }
@Override public DomainEventStream readEvents(String aggregateIdentifier, long firstSequenceNumber) { return delegate.readEvents(aggregateIdentifier, firstSequenceNumber); }
@Test public void testCreateHeadToken() { DomainEventMessage<String> event1 = createEvent(0, Instant.parse("2007-12-03T10:15:00.00Z")); DomainEventMessage<String> event2 = createEvent(1, Instant.parse("2007-12-03T10:15:40.00Z")); DomainEventMessage<String> event3 = createEvent(2, Instant.parse("2007-12-03T10:15:35.00Z")); testSubject.appendEvents(event1, event2, event3); TrackingToken headToken = testSubject.createHeadToken(); List<EventMessage<?>> readEvents = testSubject.readEvents(headToken, false) .collect(toList()); assertTrue(readEvents.isEmpty()); }
@Test public void testCreateTailToken() { DomainEventMessage<String> event1 = createEvent(0, Instant.parse("2007-12-03T10:15:00.00Z")); DomainEventMessage<String> event2 = createEvent(1, Instant.parse("2007-12-03T10:15:40.00Z")); DomainEventMessage<String> event3 = createEvent(2, Instant.parse("2007-12-03T10:15:35.00Z")); testSubject.appendEvents(event1, event2, event3); TrackingToken headToken = testSubject.createTailToken(); List<EventMessage<?>> readEvents = testSubject.readEvents(headToken, false) .collect(toList()); assertEventStreamsById(Arrays.asList(event1, event2, event3), readEvents); }
/** * {@inheritDoc} * <p> * This implementation returns a {@link DomainEventStream} starting with the last stored snapshot of the aggregate * followed by subsequent domain events. */ @Override public DomainEventStream readEvents(String aggregateIdentifier) { Optional<DomainEventMessage<?>> optionalSnapshot; try { optionalSnapshot = storageEngine.readSnapshot(aggregateIdentifier); } catch (Exception | LinkageError e) { optionalSnapshot = handleSnapshotReadingError(aggregateIdentifier, e); } DomainEventStream eventStream; if (optionalSnapshot.isPresent()) { DomainEventMessage<?> snapshot = optionalSnapshot.get(); eventStream = DomainEventStream.concat(DomainEventStream.of(snapshot), storageEngine.readEvents(aggregateIdentifier, snapshot.getSequenceNumber() + 1)); } else { eventStream = storageEngine.readEvents(aggregateIdentifier); } Stream<? extends DomainEventMessage<?>> domainEventMessages = stagedDomainEventMessages(aggregateIdentifier); return DomainEventStream.concat(eventStream, DomainEventStream.of(domainEventMessages)); }
@Override public TrackingToken createTokenAt(Instant dateTime) { return delegate.createTokenAt(dateTime); } }
@Override public void storeSnapshot(DomainEventMessage<?> snapshot) { delegate.storeSnapshot(snapshot); }
@Test public void testStoreAndLoadSnapshot() { testSubject.storeSnapshot(createEvent(0)); testSubject.storeSnapshot(createEvent(1)); testSubject.storeSnapshot(createEvent(3)); testSubject.storeSnapshot(createEvent(2)); assertTrue(testSubject.readSnapshot(AGGREGATE).isPresent()); assertEquals(3, testSubject.readSnapshot(AGGREGATE).get().getSequenceNumber()); }
@Override public Optional<DomainEventMessage<?>> readSnapshot(String aggregateIdentifier) { return delegate.readSnapshot(aggregateIdentifier); }
@Override public Optional<Long> lastSequenceNumberFor(String aggregateIdentifier) { return delegate.lastSequenceNumberFor(aggregateIdentifier); }
@Test @SuppressWarnings("OptionalGetWithoutIsPresent") public void testLoadTrackedEvents() throws InterruptedException { testSubject.appendEvents(createEvents(4)); assertEquals(4, testSubject.readEvents(null, false).count()); // give the clock some time to make sure the last message is really last Thread.sleep(10); DomainEventMessage<?> eventMessage = createEvent("otherAggregate", 0); testSubject.appendEvents(eventMessage); assertEquals(5, testSubject.readEvents(null, false).count()); assertEquals(eventMessage.getIdentifier(), testSubject.readEvents(null, false).reduce((a, b) -> b).get().getIdentifier()); }
@Test public void testCreateTokenAtExactTime() { DomainEventMessage<String> event1 = createEvent(0, Instant.parse("2007-12-03T10:15:30.00Z")); DomainEventMessage<String> event2 = createEvent(1, Instant.parse("2007-12-03T10:15:40.00Z")); DomainEventMessage<String> event3 = createEvent(2, Instant.parse("2007-12-03T10:15:35.00Z")); testSubject.appendEvents(event1, event2, event3); TrackingToken tokenAt = testSubject.createTokenAt(Instant.parse("2007-12-03T10:15:30.00Z")); List<EventMessage<?>> readEvents = testSubject.readEvents(tokenAt, false) .collect(toList()); assertEventStreamsById(Arrays.asList(event1, event2, event3), readEvents); }
@Override public Stream<? extends TrackedEventMessage<?>> readEvents(TrackingToken trackingToken, boolean mayBlock) { return delegate.readEvents(trackingToken, mayBlock); }
/** * {@inheritDoc} * <p> * This implementation returns a {@link DomainEventStream} starting with the last stored snapshot of the aggregate * followed by subsequent domain events. */ @Override public DomainEventStream readEvents(String aggregateIdentifier) { Optional<DomainEventMessage<?>> optionalSnapshot; try { optionalSnapshot = storageEngine.readSnapshot(aggregateIdentifier); } catch (Exception | LinkageError e) { optionalSnapshot = handleSnapshotReadingError(aggregateIdentifier, e); } DomainEventStream eventStream; if (optionalSnapshot.isPresent()) { DomainEventMessage<?> snapshot = optionalSnapshot.get(); eventStream = DomainEventStream.concat(DomainEventStream.of(snapshot), storageEngine.readEvents(aggregateIdentifier, snapshot.getSequenceNumber() + 1)); } else { eventStream = storageEngine.readEvents(aggregateIdentifier); } Stream<? extends DomainEventMessage<?>> domainEventMessages = stagedDomainEventMessages(aggregateIdentifier); return DomainEventStream.concat(eventStream, DomainEventStream.of(domainEventMessages)); }
@Override public TrackingToken createTokenAt(Instant dateTime) { TrackingToken tokenFromActiveStorage = activeStorage.createTokenAt(dateTime); if (tokenFromActiveStorage == null) { return historicStorage.createTokenAt(dateTime); } return tokenFromActiveStorage; }
@Override public void storeSnapshot(DomainEventMessage<?> snapshot) { activeStorage.storeSnapshot(snapshot); }