/** * Convert this {@link EventJson} to an {@link Event}, using the supplied {@link EventTypeMatcher} and * {@link ObjectMapper}. * @param typeMatcher The {@link EventTypeMatcher} to use to resolve {@link EventType}s to * {@link com.opencredo.concursus.data.tuples.TupleSchema}s * @param objectMapper The {@link ObjectMapper} to use to deserialise event parameters. * @return The converted {@link Event}, iff the {@link EventTypeMatcher} matches its type. */ public Optional<Event> toEvent(EventTypeMatcher typeMatcher, ObjectMapper objectMapper) { EventType eventType = EventType.of(aggregateType, VersionedName.of(name, version)); BiFunction<JsonNode, Type, Object> deserialiser = makeDeserialiser(objectMapper); return typeMatcher.match(eventType).map(tupleSchema -> eventType.makeEvent( aggregateId, StreamTimestamp.of(streamId, Instant.ofEpochMilli(eventTimestamp)), tupleSchema.deserialise(deserialiser, parameters), characteristics )) .map(event -> processingId.isEmpty() ? event : event.processed(UUID.fromString(processingId)) ); }
/** * Convert this {@link CommandJson} to an {@link Command}, using the supplied {@link CommandTypeMatcher} and * {@link ObjectMapper}. * @param typeMatcher The {@link CommandTypeMatcher} to use to resolve {@link CommandType}s to * {@link com.opencredo.concursus.domain.commands.CommandTypeInfo}. * @param objectMapper The {@link ObjectMapper} to use to deserialise event parameters. * @return The converted {@link Command}, iff the {@link CommandTypeMatcher} matches its type. */ public Optional<Command> toCommand(CommandTypeMatcher typeMatcher, ObjectMapper objectMapper) { CommandType commandType = getCommandType(); BiFunction<JsonNode, Type, Object> deserialiser = makeDeserialiser(objectMapper); return typeMatcher.match(commandType).map(typeInfo -> commandType.makeCommand( aggregateId, StreamTimestamp.of(streamId, Instant.ofEpochMilli(commandTimestamp)), typeInfo.getTupleSchema().deserialise(deserialiser, parameters), typeInfo.getReturnType() )) .map(command -> processingId.isEmpty() ? command : command.processed(UUID.fromString(processingId)) ); }
private void createEvent(Row row, String aggregateType, VersionedName versionedName, TupleSchema tupleSchema) { Map<String, String> parameterData = row.getMap(PARAMETERS, String.class, String.class); Tuple parameters = tupleSchema.deserialise(deserialiser, parameterData); Event event = Event.of( AggregateId.of(aggregateType, row.getString(AGGREGATE_ID)), StreamTimestamp.of(row.getString(STREAM_ID), row.getDate(EVENT_TIMESTAMP).toInstant()), row.getUUID(PROCESSING_ID), versionedName, parameters, row.getInt(CHARACTERISTICS)); eventCollector.accept(event); }