@Override public void appendEvents(List<? extends EventMessage<?>> events) { activeStorage.appendEvents(events); }
/** * Append one or more events to the event storage. Events will be appended in the order that they are offered in. * <p> * Note that all events should have a unique event identifier. When storing {@link DomainEventMessage domain events} * events should also have a unique combination of aggregate id and sequence number. * <p> * By default this method creates a list of the offered events and then invokes {@link #appendEvents(List)}. * * @param events Events to append to the event storage */ default void appendEvents(EventMessage<?>... events) { appendEvents(asList(events)); }
@Override public void appendEvents(List<? extends EventMessage<?>> events) { delegate.appendEvents(events.stream().filter(filter).collect(Collectors.toList())); }
@Override public void appendEvents(EventMessage<?>... events) { delegate.appendEvents(Arrays.stream(events).filter(filter).collect(Collectors.toList())); }
@Override protected void prepareCommit(List<? extends EventMessage<?>> events) { storageEngine.appendEvents(events); super.prepareCommit(events); }
@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); }
@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); }
@Test public void testCreateTokenWithUnorderedEvents() { 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:50.00Z")); DomainEventMessage<String> event4 = createEvent(3, Instant.parse("2007-12-03T10:15:45.00Z")); DomainEventMessage<String> event5 = createEvent(4, Instant.parse("2007-12-03T10:15:42.00Z")); testSubject.appendEvents(event1, event2, event3, event4, event5); TrackingToken tokenAt = testSubject.createTokenAt(Instant.parse("2007-12-03T10:15:45.00Z")); List<EventMessage<?>> readEvents = testSubject.readEvents(tokenAt, false) .collect(toList()); assertEventStreamsById(Arrays.asList(event3, event4, event5), readEvents); }
@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); }
@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 @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 testStoreAndLoadEvents() { testSubject.appendEvents(createEvents(4)); assertEquals(4, testSubject.readEvents(AGGREGATE).asStream().count()); testSubject.appendEvents(createEvent("otherAggregate", 0)); assertEquals(4, testSubject.readEvents(AGGREGATE).asStream().count()); assertEquals(1, testSubject.readEvents("otherAggregate").asStream().count()); }
@Test public void testStoreAndLoadEventsArray() { testSubject.appendEvents(createEvent(0), createEvent(1)); assertEquals(2, testSubject.readEvents(AGGREGATE).asStream().count()); }
@Test @SuppressWarnings("OptionalGetWithoutIsPresent") public void testReadPartialStream() { testSubject.appendEvents(createEvents(5)); assertEquals(2L, testSubject.readEvents(AGGREGATE, 2).asStream().findFirst().get().getSequenceNumber()); assertEquals(4L, testSubject.readEvents(AGGREGATE, 2).asStream().reduce((a, b) -> b).get().getSequenceNumber()); assertEquals(3L, testSubject.readEvents(AGGREGATE, 2).asStream().count()); }
@Test public void testStoreAndLoadApplicationEvent() { testSubject.appendEvents(new GenericEventMessage<>("application event", MetaData.with("key", "value"))); assertEquals(1, testSubject.readEvents(null, false).count()); EventMessage<?> message = testSubject.readEvents(null, false).findFirst().get(); assertEquals("application event", message.getPayload()); assertEquals(MetaData.with("key", "value"), message.getMetaData()); }
@Test public void testReturnedEventMessageBehavior() { testSubject.appendEvents(createEvent().withMetaData(singletonMap("key", "value"))); DomainEventMessage<?> messageWithMetaData = testSubject.readEvents(AGGREGATE).next(); /// we make sure persisted events have the same MetaData alteration logic DomainEventMessage<?> altered = messageWithMetaData.withMetaData(singletonMap("key2", "value")); DomainEventMessage<?> combined = messageWithMetaData.andMetaData(singletonMap("key2", "value")); assertTrue(altered.getMetaData().containsKey("key2")); altered.getPayload(); assertFalse(altered.getMetaData().containsKey("key")); assertTrue(altered.getMetaData().containsKey("key2")); assertTrue(combined.getMetaData().containsKey("key")); assertTrue(combined.getMetaData().containsKey("key2")); assertNotNull(messageWithMetaData.getPayload()); assertNotNull(messageWithMetaData.getMetaData()); assertFalse(messageWithMetaData.getMetaData().isEmpty()); }
@Override public void appendEvents(List<? extends EventMessage<?>> events) { delegate.appendEvents(events.stream().filter(filter).collect(Collectors.toList())); }
@Override protected void prepareCommit(List<? extends EventMessage<?>> events) { storageEngine.appendEvents(events); super.prepareCommit(events); }
@Override protected void prepareCommit(List<? extends EventMessage<?>> events) { storageEngine.appendEvents(events); super.prepareCommit(events); }