package com.dougkeen.bart.model; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; public class RealTimeDepartures { public RealTimeDepartures(Station origin, Station destination, List routes) { this.origin = origin; this.destination = destination; this.routes = routes; this.unfilteredDepartures = new ArrayList(); } private Station origin; private Station destination; private long time; private List departures; final private List unfilteredDepartures; private List routes; public Station getOrigin() { return origin; } public void setOrigin(Station origin) { this.origin = origin; } public Station getDestination() { return destination; } public void setDestination(Station destination) { this.destination = destination; } public long getTime() { return time; } public void setTime(long time) { this.time = time; } public List getDepartures() { if (departures == null) { departures = new ArrayList(); } return departures; } public void setDepartures(List departures) { this.departures = departures; } public void includeTransferRoutes() { routes.addAll(origin.getTransferRoutes(destination)); rebuildFilteredDepaturesCollection(); } public void includeDoubleTransferRoutes() { routes.addAll(origin.getDoubleTransferRoutes(destination)); rebuildFilteredDepaturesCollection(); } private void rebuildFilteredDepaturesCollection() { getDepartures().clear(); for (Departure departure : unfilteredDepartures) { addDepartureIfApplicable(departure); } } public void addDeparture(Departure departure) { unfilteredDepartures.add(departure); addDepartureIfApplicable(departure); } private void addDepartureIfApplicable(Departure departure) { Station destination = Station.getByAbbreviation(departure .getTrainDestinationAbbreviation()); if (departure.getLine() == null) return; for (Route route : routes) { if (route.trainDestinationIsApplicable(destination, departure.getLine())) { departure.setRequiresTransfer(route.hasTransfer()); departure .setTransferScheduled(Line.YELLOW_ORANGE_SCHEDULED_TRANSFER .equals(route.getDirectLine())); getDepartures().add(departure); departure.calculateEstimates(time); return; } } } public void sortDepartures() { Collections.sort(getDepartures()); } public void finalizeDeparturesList() { boolean hasDirectRoute = false; for (Departure departure : getDepartures()) { if (!departure.getRequiresTransfer()) { hasDirectRoute = true; break; } } if (hasDirectRoute) { Iterator iterator = getDepartures().iterator(); while (iterator.hasNext()) { Departure departure = iterator.next(); if (departure.getRequiresTransfer() && (!departure.isTransferScheduled() || departure .getTrainDestination().isBetween(getOrigin(), getDestination(), departure.getLine()))) { iterator.remove(); } } } sortDepartures(); } public List getRoutes() { return routes; } public void setRoutes(List routes) { this.routes = routes; } @Override public String toString() { StringBuilder builder = new StringBuilder(); builder.append("RealTimeDepartures [origin="); builder.append(origin); builder.append(", destination="); builder.append(destination); builder.append(", time="); builder.append(time); builder.append(", departures="); builder.append(departures); builder.append("]"); return builder.toString(); } }