package org.myeslib.util.hazelcast;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.myeslib.core.data.AggregateRootHistory;
import org.myeslib.core.data.UnitOfWork;
import org.myeslib.util.jdbi.AggregateRootHistoryReaderDao;
import org.myeslib.util.jdbi.UnitOfWorkJournalDao;
import com.google.inject.Inject;
import com.hazelcast.core.MapStore;
import com.hazelcast.core.PostProcessingMapStore;
@Slf4j
public class HzMapStore implements MapStore<UUID, AggregateRootHistory>, PostProcessingMapStore{
private final UnitOfWorkJournalDao<UUID> writer;
private final AggregateRootHistoryReaderDao<UUID> reader;
@Inject
public HzMapStore(UnitOfWorkJournalDao<UUID> writer, AggregateRootHistoryReaderDao<UUID> reader){
this.writer = writer;
this.reader = reader;
}
@Override
public AggregateRootHistory load(UUID key) {
log.info("load {}", key);
return reader.get(key);
}
@Override
public Map<UUID, AggregateRootHistory> loadAll(Collection<UUID> keys) {
log.debug("load all");
Map<UUID, AggregateRootHistory> result = new HashMap<>();
for (UUID id : keys) {
result.put(id, reader.get(id));
}
return result;
}
@Override
public Set<UUID> loadAllKeys() {
// TODO check if is possible to avoid this initial load
log.debug("load all keys -- empty");
Set<UUID> keys = new HashSet<>();
return keys;
}
@Override
public void store(UUID key, AggregateRootHistory value) {
// To set timestamp from db onto it ?
List<UnitOfWork> pending = value.getPendingOfPersistence();
for (UnitOfWork uow : pending){
log.info("storing id {}, version {}", key, uow.getVersion());
writer.append(key, uow);
value.markAsPersisted(uow);
}
}
@Override
public void storeAll(Map<UUID, AggregateRootHistory> map) {
log.debug("store all");
for (Map.Entry<UUID, AggregateRootHistory> entry : map.entrySet()) {
store(entry.getKey(), entry.getValue());
}
}
@Override
public void delete(UUID key) {
// never will delete
}
@Override
public void deleteAll(Collection<UUID> keys) {
// never will delete
}
}