package org.opentripplanner.api.thrift.util; import java.util.Collection; import java.util.Set; import org.opentripplanner.api.thrift.definition.LatLng; import org.opentripplanner.api.thrift.definition.Location; import org.opentripplanner.api.thrift.definition.TravelMode; import org.opentripplanner.api.thrift.definition.TripParameters; import org.opentripplanner.common.model.GenericLocation; import org.opentripplanner.routing.core.RoutingRequest; import org.opentripplanner.routing.graph.Graph; import lombok.NoArgsConstructor; /** * Builder for RoutingRequests. * * @author avi */ public class RoutingRequestBuilder { private final RoutingRequest routingRequest; private Graph graph; public RoutingRequestBuilder() { routingRequest = new RoutingRequest(); } /** * Initialize with given TripParameters. * * @param tripParams */ public RoutingRequestBuilder(TripParameters tripParams) { this(); addTripParameters(tripParams); } /** * Initialize with a prototype RoutingRequest (which will be copied). */ public RoutingRequestBuilder(RoutingRequest prototypeRequest) { routingRequest = prototypeRequest.clone(); } /** * Convert a LatLng structure into an internal String representation. * * @param latlng * @return String that is accepted internally as a LatLng. */ private static GenericLocation makeGenericLocation(final LatLng latlng) { GenericLocation loc = new GenericLocation(); loc.setLat(latlng.getLat()); loc.setLng(latlng.getLng()); return loc; } /** * Convert a Location structure into an internal String representation. * * @param latlng * @return String that is accepted internally as a LatLng. */ private static GenericLocation makeGenericLocation(final Location loc) { GenericLocation genericLoc = makeGenericLocation(loc.getLat_lng()); if (loc.isSetHeading()) { genericLoc.setHeading(loc.getHeading()); } return genericLoc; } /** * Sets the trip start time. * * @param startTime seconds since the epoch. * @return */ public RoutingRequestBuilder setStartTime(long startTime) { routingRequest.dateTime = startTime; routingRequest.setArriveBy(false); return this; } /** * Set the requested arrival time of the trip. * * @param arriveBy seconds since the epoch. * @return */ public RoutingRequestBuilder setArriveBy(long arriveBy) { routingRequest.dateTime = arriveBy; routingRequest.setArriveBy(true); return this; } /** * Adds TripParameters to the RoutingRequest. * * @param tripParams * @return self reference */ public RoutingRequestBuilder addTripParameters(TripParameters tripParams) { if (tripParams.isSetAllowed_modes()) { Set<TravelMode> allowedModes = tripParams.getAllowed_modes(); setTravelModes(new TravelModeSet(allowedModes)); } // Set trip timing information if (tripParams.isSetStart_time()) { setStartTime(tripParams.getStart_time()); } else if (tripParams.isSetArrive_by()) { setArriveBy(tripParams.getArrive_by()); } setOrigin(tripParams.getOrigin()); setDestination(tripParams.getDestination()); return this; } /** * Overwrite the set of allowed TravelModes. * * @param modes * @return */ public RoutingRequestBuilder setTravelModes(TravelModeSet modes) { routingRequest.setModes(modes.toTraverseModeSet()); return this; } /** * Overwrite the set of allowed TravelModes. * * @param modes * @return */ public RoutingRequestBuilder setTravelModes(Collection<TravelMode> modes) { TravelModeSet modeSet = new TravelModeSet(modes); routingRequest.setModes(modeSet.toTraverseModeSet()); return this; } /** * Set the trip origin. * * @param from * @return self reference */ public RoutingRequestBuilder setOrigin(Location origin) { routingRequest.setFrom(makeGenericLocation(origin)); return this; } /** * Set the trip origin. * * @param from * @return self reference */ public RoutingRequestBuilder setOrigin(LatLng origin) { routingRequest.setFrom(makeGenericLocation(origin)); return this; } /** * Set the trip destination. * * @param from * @return self reference */ public RoutingRequestBuilder setDestination(Location dest) { routingRequest.setTo(makeGenericLocation(dest)); return this; } /** * Set the trip destination. * * @param from * @return self reference */ public RoutingRequestBuilder setDestination(LatLng dest) { routingRequest.setTo(makeGenericLocation(dest)); return this; } /** * Set whether to search in batch mode. * * @param batch * @return */ public RoutingRequestBuilder setBatch(boolean batch) { routingRequest.setBatch(batch); return this; } /** * Set the graph to route on. * * @param g * @return self reference. */ public RoutingRequestBuilder setGraph(Graph g) { graph = g; return this; } /** * Set the number of itineraries to return. * * @param n * @return self reference. */ public RoutingRequestBuilder setNumItineraries(int n) { routingRequest.setNumItineraries(n); return this; } /** * Build a RoutingRequest from the accumulated parameters. * * @return */ public RoutingRequest build() { // Set the graph at the end to avoid certain complications. if (graph != null) { routingRequest.setRoutingContext(graph); } return routingRequest; } }