package org.opentripplanner.routing.core; import static com.google.common.base.Preconditions.checkNotNull; import java.io.Serializable; import java.util.LinkedList; import java.util.List; import org.onebusaway.gtfs.model.Trip; /** * StopTransfer class used by TransferTable. Represents a transfer between two stops. * Contains more specific transfer information depending on the routes and trips * that are involved. * See the links described at TransferTable for more details about the specifications. * @see TransferTable */ public class StopTransfer implements Serializable { private static final long serialVersionUID = -2669653246852789518L; /** * Special value for transferTime indicating that this transfer is unknown */ public static final int UNKNOWN_TRANSFER = -999; /** * Special value for transferTime indicating that this transfer is preferred */ public static final int PREFERRED_TRANSFER = -2; /** * Special value for transferTime indicating that this transfer is forbidden */ public static final int FORBIDDEN_TRANSFER = -1; /** * Special value for transferTime indicating that this transfer is timed. * In a timed transfer, the departing vehicle will wait for passengers from the * arriving vehicle, so the minimum transfer time is effectively zero. */ public static final int TIMED_TRANSFER = 0; /** * List with specific transfers for this transfer between two stops. */ private final List<SpecificTransfer> specificTransfers = new LinkedList<SpecificTransfer>(); /** * Default constructor */ public StopTransfer() { } /** * Add a specific transfer to this transfer. * @param specificTransfer is the specific transfer; is not allowed to be null * @return true if successful */ public boolean addSpecificTransfer(SpecificTransfer specificTransfer) { checkNotNull(specificTransfer); return specificTransfers.add(specificTransfer); } /** * Get the transfer time that should be used when transferring from a trip to another trip. * Note that this function does not check whether another specific transfer exists with the * same specificity, what is forbidden by the specifications. * @param fromTrip is the arriving trip * @param toTrip is the departing trip * @return the transfer time in seconds. May contain special (negative) values which meaning * can be found in the *_TRANSFER constants. */ public int getTransferTime(Trip fromTrip, Trip toTrip) { // By default the transfer is unknown int transferTime = UNKNOWN_TRANSFER; // Pick the matching specific transfer with the highest specificity int maxFoundSpecificity = SpecificTransfer.MIN_SPECIFICITY - 1; for (SpecificTransfer specificTransfer : specificTransfers) { int specificity = specificTransfer.getSpecificity(); if (specificity > maxFoundSpecificity) { if (specificTransfer.matches(fromTrip, toTrip)) { // Set the found transfer time transferTime = specificTransfer.getTransferTime(); maxFoundSpecificity = specificity; // Break when highest specificity is found if (maxFoundSpecificity == SpecificTransfer.MAX_SPECIFICITY) { break; } } } } // Return transfer time return transferTime; } /** * Public function for testing purposes only. * @return the first specific transfer time * @see TransferTable */ @Deprecated public int getFirstSpecificTransferTime() { // By default the transfer is unknown int transferTime = UNKNOWN_TRANSFER; // Pick the first specific transfer for (SpecificTransfer specificTransfer : specificTransfers) { // Set the found transfer time transferTime = specificTransfer.getTransferTime(); break; } // Return transfer time return transferTime; } }