package com.github.pfichtner.jrunalyser.base.datasource; import java.io.IOException; import java.util.Iterator; import java.util.Map; import java.util.Set; import javax.annotation.concurrent.ThreadSafe; import com.github.pfichtner.jrunalyser.base.data.WayPoint; import com.github.pfichtner.jrunalyser.base.data.track.DefaultTrack; import com.github.pfichtner.jrunalyser.base.data.track.Id; import com.github.pfichtner.jrunalyser.base.data.track.Track; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.collect.UnmodifiableIterator; @ThreadSafe public class InMemoryDataSource implements Datasource { private final Map<Id, Track> data = Maps.newConcurrentMap(); private final Set<WayPoint> commonWaypoints = Sets.newCopyOnWriteArraySet(); @Override public Set<Id> getTrackIds() { return this.data.keySet(); } @Override public Track loadTrack(Id id) { return this.data.get(id); } @Override public Iterable<Track> loadTracks(final Iterable<Id> ids) throws IOException { return new Iterable<Track>() { @Override public Iterator<Track> iterator() { return new UnmodifiableIterator<Track>() { Iterator<Id> delegate = ids.iterator(); @Override public boolean hasNext() { return this.delegate.hasNext(); } @Override public Track next() { return loadTrack(this.delegate.next()); } }; } }; } @Override public Track addTrack(Track track) { Id id = track.getId(); DefaultTrack result = new DefaultTrack(id, track.getMetadata(), track.getWaypoints(), track.getSegments(), track.getStatistics()); this.data.put(id, result); return result; } @Override public Track removeTrack(Id id) { return this.data.remove(id); } @Override public Set<WayPoint> getCommonWaypoints() { return this.commonWaypoints; } public void addCommonWaypoint(WayPoint wp) { this.commonWaypoints.add(wp); } }