@Override public Instant getTimestamp() { return source.getTimestamp(); }
@Override public <S> IntermediateEventRepresentation upcast(SerializedType outputType, Class<S> expectedRepresentationType, Function<S, S> upcastFunction, Function<MetaData, MetaData> metaDataUpcastFunction) { return new UpcastedEventRepresentation<>(outputType, this, upcastFunction, metaDataUpcastFunction, expectedRepresentationType, converter); }
@Override public Optional<String> getAggregateType() { return source.getAggregateType(); }
Stream<IntermediateEventRepresentation> upcastResult = upcastAndDeserialize(eventEntryStream, upcasterChain, entry -> new InitialEventRepresentation(entry, serializer)); return upcastResult.map(ir -> { SerializedMessage<?> serializedMessage = new SerializedMessage<>(ir.getMessageIdentifier(), new LazyDeserializingObject<>( ir::getData, ir.getType(), serializer), ir.getMetaData()); if (ir.getAggregateIdentifier().isPresent()) { return new GenericTrackedDomainEventMessage<>(ir.getTrackingToken().get(), ir.getAggregateType().orElse(null), ir.getAggregateIdentifier().get(), ir.getSequenceNumber().get(), serializedMessage, ir::getTimestamp); } else { return new GenericTrackedEventMessage<>(ir.getTrackingToken().get(), serializedMessage, ir::getTimestamp);
private static Stream<IntermediateEventRepresentation> upcastAndDeserialize( Stream<? extends EventData<?>> eventEntryStream, EventUpcaster upcasterChain, Function<EventData<?>, IntermediateEventRepresentation> entryConverter) { return upcasterChain.upcast(eventEntryStream.map(entryConverter)); } }
@Override public Optional<TrackingToken> getTrackingToken() { return source.getTrackingToken(); }
@Override public String getMessageIdentifier() { return source.getMessageIdentifier(); }
@Override public Optional<String> getAggregateIdentifier() { return source.getAggregateIdentifier(); }
@Override public Optional<Long> getSequenceNumber() { return source.getSequenceNumber(); }
@Override public LazyDeserializingObject<MetaData> getMetaData() { if (metaData == null) { metaData = new LazyDeserializingObject<>(metaDataUpcastFunction.apply(source.getMetaData().getObject())); } return metaData; } }
/** * Upcast the serialized payload of the event (leaving other aspects of the event the same). * * @param outputType The output type of the event after upcasting * @param expectedRepresentationType The type of the serialized payload required by the upcast function * @param upcastFunction The upcast function for the event's payload * @param <T> The expected payload type before and after upcasting * @return The intermediate representation of the event after upcasting */ default <T> IntermediateEventRepresentation upcastPayload(SerializedType outputType, Class<T> expectedRepresentationType, Function<T, T> upcastFunction) { return upcast(outputType, expectedRepresentationType, upcastFunction, Function.identity()); }
@Override public <D> SerializedObject<D> getData(Class<D> requiredType) { return converter.convert(getData(), requiredType); }
Stream<IntermediateEventRepresentation> upcastResult = upcastAndDeserialize(eventEntryStream, upcasterChain, entry -> { InitialEventRepresentation result = new InitialEventRepresentation(entry, serializer); currentSequenceNumber.set(result.getSequenceNumber().get()); return result; }); Stream<? extends DomainEventMessage<?>> stream = upcastResult.map(ir -> { SerializedMessage<?> serializedMessage = new SerializedMessage<>(ir.getMessageIdentifier(), new LazyDeserializingObject<>( ir::getData, ir.getType(), serializer), ir.getMetaData()); if (ir.getTrackingToken().isPresent()) { return new GenericTrackedDomainEventMessage<>(ir.getTrackingToken().get(), ir.getAggregateType().get(), ir.getAggregateIdentifier().get(), ir.getSequenceNumber().get(), serializedMessage, ir::getTimestamp); } else { return new GenericDomainEventMessage<>(ir.getAggregateType().get(), ir.getAggregateIdentifier().get(), ir.getSequenceNumber().get(), serializedMessage, ir::getTimestamp);
private static Stream<IntermediateEventRepresentation> upcastAndDeserialize( Stream<? extends EventData<?>> eventEntryStream, EventUpcaster upcasterChain, Function<EventData<?>, IntermediateEventRepresentation> entryConverter) { return upcasterChain.upcast(eventEntryStream.map(entryConverter)); } }
@Override public Optional<TrackingToken> getTrackingToken() { return source.getTrackingToken(); }
@Override public <T> IntermediateEventRepresentation upcast(SerializedType outputType, Class<T> expectedRepresentationType, Function<T, T> upcastFunction, Function<MetaData, MetaData> metaDataUpcastFunction) { return new UpcastedEventRepresentation<>(outputType, this, upcastFunction, metaDataUpcastFunction, expectedRepresentationType, serializer.getConverter()); }
@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 <S> IntermediateEventRepresentation upcast(SerializedType outputType, Class<S> expectedRepresentationType, Function<S, S> upcastFunction, Function<MetaData, MetaData> metaDataUpcastFunction) { return new UpcastedEventRepresentation<>(outputType, this, upcastFunction, metaDataUpcastFunction, expectedRepresentationType, converter); }
@Override public <S> IntermediateEventRepresentation upcast(SerializedType outputType, Class<S> expectedRepresentationType, Function<S, S> upcastFunction, Function<MetaData, MetaData> metaDataUpcastFunction) { return new UpcastedEventRepresentation<>(outputType, this, upcastFunction, metaDataUpcastFunction, expectedRepresentationType, converter); }