package org.arbeitspferde.groningen.historydatastore; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import org.arbeitspferde.groningen.HistoryDatastore; import org.arbeitspferde.groningen.PipelineHistoryState; import org.arbeitspferde.groningen.PipelineId; import org.joda.time.Instant; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Memory-only implementation of {@link HistoryDatastore}. */ public class MemoryHistoryDatastore implements HistoryDatastore { private final Map<PipelineId, List<PipelineHistoryState>> data = new HashMap<>(); @Override public void writeState(PipelineHistoryState state) { List<PipelineHistoryState> states = data.get(state.pipelineId()); if (states == null) { states = new ArrayList<>(); data.put(state.pipelineId(), states); } states.add(state); Collections.sort(states, new Comparator<PipelineHistoryState>() { @Override public int compare(PipelineHistoryState s1, PipelineHistoryState s2) { return s1.endTimestamp().compareTo(s2.endTimestamp()); } }); } @Override public List<PipelineId> listPipelinesIds() { return Lists.newArrayList(data.keySet()); } private List<PipelineHistoryState> readStates(PipelineId pipelineId) { List<PipelineHistoryState> states = data.get(pipelineId); if (states == null) { states = new ArrayList<>(); } return states; } @Override public List<PipelineHistoryState> getStatesForPipelineId(PipelineId pipelineId) { return ImmutableList.copyOf(readStates(pipelineId)); } @Override public List<PipelineHistoryState> getStatesForPipelineId( PipelineId pipelineId, Instant afterTimestamp) { List<PipelineHistoryState> results = new ArrayList<>(); for (PipelineHistoryState state : readStates(pipelineId)) { if (state.endTimestamp().isAfter(afterTimestamp)) { results.add(state); } } return ImmutableList.copyOf(results); } }