package de.fub.agg2graph.gpseval.data.file;
import de.fub.agg2graph.gpseval.data.Waypoint;
import de.fub.agg2graph.gpseval.data.filter.WaypointFilter;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Iterator;
/**
* This is the base-class for all TrackFiles.
*
* <p>
* It handles the filtering of data using WaypointFilters.
* </p>
* <p>
* Subclasses only need to override the rawIterator-method which returns an
* Iterator for the unfiltered Waypoints.
* </p>
* <p>
* The iterator-method then returns an Iterator for the filtered Waypoints.
* </p>
*/
public abstract class TrackFile implements Iterable<Waypoint> {
private Path mDataFile;
private ArrayList<WaypointFilter> mFilters = new ArrayList<>();
/**
* Get the Iterator for the unfiltered Waypoints.
*
* To get only filtered Waypoints you should use iterator() instead.
*
* @return
*/
protected abstract Iterator<Waypoint> rawIterator();
/**
* Add a waypoint filter that is used by the Iterator returned by
* iterator().
*
* @param filter
*/
public void addWaypointFilter(WaypointFilter filter) {
mFilters.add(filter);
}
/**
* Set the path for the GPS-data-file.
*
* @param dataFile
*/
public void setDataFile(Path dataFile) {
mDataFile = dataFile;
}
/**
* Get the path of the GPS-data-file.
*
* @return
*/
public Path getDataFile() {
return mDataFile;
}
/**
* Returns an Iterator that uses WaypointFilters to filter the Waypoints
* which are returned.
*/
@Override
public Iterator<Waypoint> iterator() {
return new FilteredGPSDataIterator();
}
/**
* This Itreator returns only those Waypoints which passes all waypoint
* filters.
*/
private class FilteredGPSDataIterator implements Iterator<Waypoint> {
private Iterator<Waypoint> mRawIterator;
private Waypoint nextGpsData = null;
public FilteredGPSDataIterator() {
mRawIterator = rawIterator();
}
@Override
public boolean hasNext() {
nextGpsData = null;
while (mRawIterator.hasNext()) {
Waypoint gpsData = mRawIterator.next();
// check if the waypoint passes each waypoint filter
boolean passedAllFilter = true;
for (WaypointFilter filter : mFilters) {
if (!filter.filter(gpsData)) {
passedAllFilter = false;
break;
}
}
if (passedAllFilter) {
nextGpsData = gpsData;
return true;
}
}
return false;
}
@Override
public void remove() {
throw new UnsupportedOperationException("Not supported.");
}
@Override
public Waypoint next() {
return nextGpsData;
}
}
}