package au.gov.amsa.craft.analyzer.wms; import java.io.File; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import java.util.regex.Pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import rx.Observable; import rx.Scheduler; import rx.functions.Func1; import rx.schedulers.Schedulers; import au.gov.amsa.navigation.DriftCandidate; import au.gov.amsa.navigation.DriftCandidates; import au.gov.amsa.navigation.DriftDetector; import au.gov.amsa.navigation.VesselPosition; import au.gov.amsa.navigation.VesselPositions; import au.gov.amsa.risky.format.BinaryFixes; import au.gov.amsa.risky.format.Fix; import au.gov.amsa.risky.format.NavigationalStatus; import au.gov.amsa.util.Files; import com.google.common.base.Optional; public class Sources { private static final Logger log = LoggerFactory.getLogger(Sources.class); public static Observable<VesselPosition> fixes() { List<File> files = Files.find(new File("/home/dave/Downloads/binary-fixes-2014-5-minutes"), Pattern.compile(".*\\.track")); log.info("files=" + files.size()); final AtomicLong num = new AtomicLong(); return Observable // list files .from(files) // share the load between processors .buffer(Math.max(1, files.size() / Runtime.getRuntime().availableProcessors() - 1)) // search each list of files for drift detections .flatMap(detectDrift(num, Schedulers.computation())) .map(VesselPositions.TO_VESSEL_POSITION); } public static Observable<VesselPosition> fixes2(File file) { return DriftCandidates.fromCsv(file, false).filter(new Func1<DriftCandidate, Boolean>() { @Override public Boolean call(DriftCandidate c) { return !c.fix().navigationalStatus().isPresent() || c.fix().navigationalStatus().get() != NavigationalStatus.ENGAGED_IN_FISHING; } }).map(VesselPositions.toVesselPosition(new Func1<DriftCandidate, Optional<?>>() { @Override public Optional<Long> call(DriftCandidate c) { return Optional.of(c.driftingSince()); } })); } private static Func1<List<File>, Observable<Fix>> detectDrift(AtomicLong num, final Scheduler scheduler) { return new Func1<List<File>, Observable<Fix>>() { @Override public Observable<Fix> call(List<File> files) { return BinaryFixes.from(files).compose(DriftDetector.detectDrift()) .map(new Func1<DriftCandidate, Fix>() { @Override public Fix call(DriftCandidate c) { return c.fix(); } }).subscribeOn(scheduler); } }; } }