package org.arbeitspferde.groningen.datastore;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.inject.Singleton;
import org.arbeitspferde.groningen.Datastore;
import org.arbeitspferde.groningen.PipelineId;
import org.arbeitspferde.groningen.PipelineState;
import org.arbeitspferde.groningen.config.GroningenConfig;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
/**
* {@link Datastore} implementation that keeps everything in memory only.
*/
@Singleton
public class InMemoryDatastore implements Datastore {
private static final Logger log = Logger.getLogger(InMemoryDatastore.class.getCanonicalName());
private final Map<PipelineId, PipelineState> data = Maps.newHashMap();
@Override
public synchronized List<PipelineId> listPipelinesIds() {
log.fine("list pipeline ids");
return Lists.newArrayList(data.keySet());
}
@Override
public synchronized List<PipelineState> getPipelines(List<PipelineId> ids) {
log.fine(String.format("get pipelines %s", Joiner.on(",").join(ids)));
List<PipelineState> states = new ArrayList<>();
for (PipelineId id : ids) {
states.add(data.get(id));
}
return states;
}
@Override
public synchronized void createPipeline(PipelineState pipelineState, boolean checkForConflicts)
throws PipelineAlreadyExists, PipelineConflictsWithRunningPipelines {
log.fine(String.format("createPipeline %s", pipelineState.pipelineId()));
PipelineState existingPipeline = data.get(pipelineState.pipelineId());
if (existingPipeline != null) {
throw new PipelineAlreadyExists(existingPipeline);
}
if (checkForConflicts) {
List<PipelineState> conflictingPipelines =
findConflictingPipelines(pipelineState.config());
if (!conflictingPipelines.isEmpty()) {
throw new PipelineConflictsWithRunningPipelines(conflictingPipelines);
}
}
writePipelines(Lists.newArrayList(pipelineState));
}
@Override
public synchronized void writePipelines(List<PipelineState> pipelinesStates) {
List<PipelineId> ids = new ArrayList<>();
for (PipelineState state : pipelinesStates) {
ids.add(state.pipelineId());
}
log.fine(String.format("write pipelines %s", Joiner.on(",").join(ids)));
for (PipelineState state : pipelinesStates) {
data.put(state.pipelineId(), state);
}
}
@Override
public synchronized void deletePipelines(List<PipelineId> ids) {
log.fine(String.format("delete pipelines %s", Joiner.on(",").join(ids)));
for (PipelineId id : ids) {
data.remove(id);
}
}
@Override
public List<PipelineState> findConflictingPipelines(GroningenConfig pipelineConfiguration) {
// TODO(mbushkov): implement this method. Returning empty result here is preferable:
// throwing UnsupportedOperationException would prevent JTune from using this class, as
// JTune uses findConflictingPipelines() as an additional check when launching pipelines.
return Lists.newArrayList();
}
}