44import graphql .schema .DataFetcher ;
55import graphql .schema .DataFetchingEnvironment ;
66import java .text .ParseException ;
7+ import java .time .Instant ;
78import java .time .LocalDate ;
89import java .time .ZoneId ;
910import java .util .ArrayList ;
2324import org .opentripplanner .apis .gtfs .mapping .BikesAllowedMapper ;
2425import org .opentripplanner .apis .gtfs .model .TripOccupancy ;
2526import org .opentripplanner .apis .support .SemanticHash ;
27+ import org .opentripplanner .model .Timetable ;
2628import org .opentripplanner .model .TripTimeOnDate ;
2729import org .opentripplanner .routing .alertpatch .EntitySelector ;
2830import org .opentripplanner .routing .alertpatch .TransitAlert ;
3537import org .opentripplanner .transit .model .site .StopLocation ;
3638import org .opentripplanner .transit .model .timetable .Direction ;
3739import org .opentripplanner .transit .model .timetable .Trip ;
40+ import org .opentripplanner .transit .model .timetable .TripTimes ;
3841import org .opentripplanner .transit .service .TransitService ;
3942import org .opentripplanner .utils .time .ServiceDateUtils ;
4043
@@ -126,13 +129,41 @@ public DataFetcher<Iterable<TransitAlert>> alerts() {
126129 @ Override
127130 public DataFetcher <TripTimeOnDate > arrivalStoptime () {
128131 return environment -> {
129- var serviceDate = getOptionalServiceDateArgument (environment );
130- var trip = getSource (environment );
131- var transitService = getTransitService (environment );
132- var stopTimes = serviceDate
133- .map (date -> transitService .getTripTimeOnDates (trip , date ))
134- .orElseGet (() -> transitService .getScheduledTripTimes (trip ));
135- return stopTimes .map (List ::getLast ).orElse (null );
132+ try {
133+ TransitService transitService = getTransitService (environment );
134+ TripPattern tripPattern = getTripPattern (environment );
135+ if (tripPattern == null ) {
136+ return null ;
137+ }
138+ Timetable timetable = tripPattern .getScheduledTimetable ();
139+
140+ TripTimes tripTimes = timetable .getTripTimes (getSource (environment ));
141+ if (tripTimes == null ) {
142+ return null ;
143+ }
144+ LocalDate serviceDate = null ;
145+ Instant midnight = null ;
146+
147+ var args = new GraphQLTypes .GraphQLTripArrivalStoptimeArgs (environment .getArguments ());
148+ if (args .getGraphQLServiceDate () != null ) {
149+ serviceDate = ServiceDateUtils .parseString (args .getGraphQLServiceDate ());
150+ midnight = ServiceDateUtils .asStartOfService (
151+ serviceDate ,
152+ transitService .getTimeZone ()
153+ ).toInstant ();
154+ }
155+
156+ return new TripTimeOnDate (
157+ tripTimes ,
158+ tripTimes .getNumStops () - 1 ,
159+ tripPattern ,
160+ serviceDate ,
161+ midnight
162+ );
163+ } catch (ParseException e ) {
164+ // invalid date format
165+ return null ;
166+ }
136167 };
137168 }
138169
@@ -149,13 +180,35 @@ public DataFetcher<String> blockId() {
149180 @ Override
150181 public DataFetcher <TripTimeOnDate > departureStoptime () {
151182 return environment -> {
152- var serviceDate = getOptionalServiceDateArgument (environment );
153- var trip = getSource (environment );
154- var transitService = getTransitService (environment );
155- var stopTimes = serviceDate
156- .map (date -> transitService .getTripTimeOnDates (trip , date ))
157- .orElseGet (() -> transitService .getScheduledTripTimes (trip ));
158- return stopTimes .map (List ::getFirst ).orElse (null );
183+ try {
184+ TransitService transitService = getTransitService (environment );
185+ TripPattern tripPattern = getTripPattern (environment );
186+ if (tripPattern == null ) {
187+ return null ;
188+ }
189+ Timetable timetable = tripPattern .getScheduledTimetable ();
190+
191+ TripTimes tripTimes = timetable .getTripTimes (getSource (environment ));
192+ if (tripTimes == null ) {
193+ return null ;
194+ }
195+ LocalDate serviceDate = null ;
196+ Instant midnight = null ;
197+
198+ var args = new GraphQLTypes .GraphQLTripDepartureStoptimeArgs (environment .getArguments ());
199+ if (args .getGraphQLServiceDate () != null ) {
200+ serviceDate = ServiceDateUtils .parseString (args .getGraphQLServiceDate ());
201+ midnight = ServiceDateUtils .asStartOfService (
202+ serviceDate ,
203+ transitService .getTimeZone ()
204+ ).toInstant ();
205+ }
206+
207+ return new TripTimeOnDate (tripTimes , 0 , tripPattern , serviceDate , midnight );
208+ } catch (ParseException e ) {
209+ // invalid date format
210+ return null ;
211+ }
159212 };
160213 }
161214
@@ -255,16 +308,37 @@ public DataFetcher<Iterable<TripTimeOnDate>> stoptimes() {
255308 @ Override
256309 public DataFetcher <Iterable <TripTimeOnDate >> stoptimesForDate () {
257310 return environment -> {
258- TransitService transitService = getTransitService (environment );
259- Trip trip = getSource (environment );
260- var args = new GraphQLTypes .GraphQLTripStoptimesForDateArgs (environment .getArguments ());
261-
262- ZoneId timeZone = transitService .getTimeZone ();
263- LocalDate serviceDate = args .getGraphQLServiceDate () != null
264- ? ServiceDateUtils .parseString (args .getGraphQLServiceDate ())
265- : LocalDate .now (timeZone );
266-
267- return transitService .getTripTimeOnDates (trip , serviceDate ).orElse (null );
311+ try {
312+ TransitService transitService = getTransitService (environment );
313+ Trip trip = getSource (environment );
314+ var args = new GraphQLTypes .GraphQLTripStoptimesForDateArgs (environment .getArguments ());
315+
316+ ZoneId timeZone = transitService .getTimeZone ();
317+ LocalDate serviceDate = args .getGraphQLServiceDate () != null
318+ ? ServiceDateUtils .parseString (args .getGraphQLServiceDate ())
319+ : LocalDate .now (timeZone );
320+
321+ TripPattern tripPattern = transitService .findPattern (trip , serviceDate );
322+ if (tripPattern == null ) {
323+ return List .of ();
324+ }
325+
326+ Instant midnight = ServiceDateUtils .asStartOfService (
327+ serviceDate ,
328+ transitService .getTimeZone ()
329+ ).toInstant ();
330+ Timetable timetable = transitService .findTimetable (tripPattern , serviceDate );
331+ return TripTimeOnDate .fromTripTimesWithScheduleFallback (
332+ timetable ,
333+ trip ,
334+ serviceDate ,
335+ midnight ,
336+ transitService
337+ );
338+ } catch (ParseException e ) {
339+ // invalid date format
340+ return null ;
341+ }
268342 };
269343 }
270344
0 commit comments