package org.atlasapi.media.segment;
import java.util.Map;
import java.util.concurrent.ConcurrentMap;
import org.atlasapi.media.entity.Publisher;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMap.Builder;
import com.google.common.collect.Maps;
import com.google.common.collect.Table;
import com.google.common.collect.Tables;
import com.metabroadcast.common.base.Maybe;
public class InMemorySegmentStore implements SegmentResolver, SegmentWriter {
private ConcurrentMap<SegmentRef, Segment> idStore;
private Table<Publisher, String, Segment> sourceStore;
public InMemorySegmentStore() {
this.idStore = Maps.newConcurrentMap();
this.sourceStore = Tables.newCustomTable(Maps.<Publisher,Map<String,Segment>>newConcurrentMap(), new Supplier<Map<String, Segment>>(){
@Override
public Map<String, Segment> get() {
return Maps.newConcurrentMap();
}});
}
@Override
public Maybe<Segment> resolveForSource(Publisher source, String sourceId) {
return Maybe.fromPossibleNullValue(sourceStore.get(source, sourceId));
}
@Override
public Segment write(Segment segment) {
idStore.put(segment.toRef(), segment);
sourceStore.put(segment.getPublisher(), segment.getCanonicalUri(), segment);
return segment;
}
@Override
public Map<SegmentRef, Maybe<Segment>> resolveById(Iterable<SegmentRef> identifiers) {
final Builder<SegmentRef, Maybe<Segment>> resolved = ImmutableMap.builder();
for (SegmentRef segmentRef : identifiers) {
resolved.put(segmentRef, Maybe.fromPossibleNullValue(idStore.get(segmentRef)));
}
return resolved.build();
}
}