@Override public void accept(String input) { EventJson.fromString(input, typeMatcher, objectMapper).ifPresent(outChannel::accept); } }
@Override public void accept(Event event) { inChannel.accept(EventJson.toString(event, objectMapper)); } }
@JsonCreator public static EventJson of(String aggregateType, String aggregateId, String name, String version, long eventTimestamp, String streamId, String processingId, int characteristics, Map<String, JsonNode> parameters) { return new EventJson(aggregateType, aggregateId, name, version, eventTimestamp, streamId, processingId, characteristics, parameters); }
public static String toString(Event event, ObjectMapper objectMapper) { try { return objectMapper.writeValueAsString(of(event, objectMapper)); } catch (JsonProcessingException e) { throw new RuntimeException(e); } }
public static Optional<Event> fromString(String eventString, EventTypeMatcher eventTypeMatcher, ObjectMapper objectMapper) { try { EventJson eventJson = objectMapper.readValue(eventString, EventJson.class); return eventJson.toEvent(eventTypeMatcher, objectMapper); } catch (IOException e) { throw new RuntimeException(e); } }
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( UUID.fromString(aggregateId), StreamTimestamp.of(streamId, Instant.ofEpochMilli(eventTimestamp)), tupleSchema.deserialise(deserialiser, parameters), characteristics )) .map(event -> processingId.isEmpty() ? event : event.processed(UUID.fromString(processingId)) ); }
public static String toString(Collection<Event> events, ObjectMapper objectMapper) { try { return objectMapper.writeValueAsString( events.stream() .map(event -> EventJson.of(event, objectMapper)) .collect(toList())); } catch (JsonProcessingException e) { throw new RuntimeException(e); } }
public static List<Event> fromString(String eventsString, EventTypeMatcher eventTypeMatcher, ObjectMapper objectMapper) { try { EventJson[] eventsJson = objectMapper.readValue(eventsString, objectMapper.getTypeFactory().constructArrayType(EventJson.class)); return Stream.of(eventsJson) .map(eventJson -> eventJson.toEvent(eventTypeMatcher, objectMapper)) .filter(Optional::isPresent) .map(Optional::get) .collect(toList()); } catch (IOException e) { throw new RuntimeException(e); } }
@Override public Map<AggregateId, List<Event>> getEvents(EventTypeMatcher matcher, String aggregateType, Collection<UUID> aggregateIds, TimeRange timeRange) { Function<String, Optional<Event>> deserialiser = eventJson -> EventJson.fromString(eventJson, matcher, objectMapper); Pipeline pipeline = jedis.pipelined(); final Map<AggregateId, Response<Set<String>>> responses = aggregateIds.stream() .map(id -> AggregateId.of(aggregateType, id)) .collect(toMap( Function.identity(), id -> pipeline.smembers(id.toString()))); pipeline.sync(); return responses.entrySet().stream() .collect(toMap( Entry::getKey, e -> deserialiseAll(timeRange, deserialiser, e.getValue().get()))); } }
public static RedisEventLog create(Jedis jedis, ObjectMapper objectMapper) { return new RedisEventLog(jedis, evt -> EventJson.toString(evt, objectMapper)); }
public static EventJson of(Event event, ObjectMapper objectMapper) { Function<Object, JsonNode> serialiser = objectMapper::valueToTree; return of( event.getAggregateId().getType(), event.getAggregateId().getId().toString(), event.getEventName().getName(), event.getEventName().getVersion(), event.getEventTimestamp().getTimestamp().toEpochMilli(), event.getEventTimestamp().getStreamId(), event.getProcessingId().map(UUID::toString).orElse(""), event.getCharacteristics(), event.getParameters().serialise(serialiser) ); }
@Override public List<Event> getEvents(EventTypeMatcher matcher, AggregateId aggregateId, TimeRange timeRange) { Function<String, Optional<Event>> deserialiser = eventJson -> EventJson.fromString(eventJson, matcher, objectMapper); final Set<String> eventsForId = jedis.smembers(aggregateId.toString()); return deserialiseAll(timeRange, deserialiser, eventsForId); }