package org.atlasapi.persistence.event; import org.atlasapi.media.entity.Event; import org.atlasapi.media.entity.Topic; import com.metabroadcast.common.ids.IdGenerator; import com.google.common.base.Optional; import org.joda.time.DateTime; import static com.google.common.base.Preconditions.checkNotNull; public class IdSettingEventStore implements EventStore { private final EventStore delegate; private final IdGenerator idGenerator; public IdSettingEventStore(EventStore delegate, IdGenerator idGenerator) { this.delegate = checkNotNull(delegate); this.idGenerator = checkNotNull(idGenerator); } @Override public Event createOrUpdate(Event event) { return delegate.createOrUpdate(generateOrRestoreId(event)); } @Override public Optional<Event> fetch(Long id) { return delegate.fetch(id); } @Override public Optional<Event> fetch(String uri) { return delegate.fetch(uri); } @Override public Iterable<Event> fetch(Optional<Topic> eventGroup, Optional<DateTime> from) { return delegate.fetch(eventGroup, from); } private Event generateOrRestoreId(Event event) { Optional<Event> existing = fetch(event.getCanonicalUri()); if (existing.isPresent() && existing.get().getId() != null) { event.setId(existing.get().getId()); } else { event.setId(idGenerator.generateRaw()); } return event; } }