4
4
import graphql .schema .DataFetcher ;
5
5
import graphql .schema .DataFetchingEnvironment ;
6
6
import java .text .ParseException ;
7
+ import java .time .Instant ;
7
8
import java .time .LocalDate ;
8
9
import java .time .ZoneId ;
9
10
import java .util .ArrayList ;
23
24
import org .opentripplanner .apis .gtfs .mapping .BikesAllowedMapper ;
24
25
import org .opentripplanner .apis .gtfs .model .TripOccupancy ;
25
26
import org .opentripplanner .apis .support .SemanticHash ;
27
+ import org .opentripplanner .model .Timetable ;
26
28
import org .opentripplanner .model .TripTimeOnDate ;
27
29
import org .opentripplanner .routing .alertpatch .EntitySelector ;
28
30
import org .opentripplanner .routing .alertpatch .TransitAlert ;
35
37
import org .opentripplanner .transit .model .site .StopLocation ;
36
38
import org .opentripplanner .transit .model .timetable .Direction ;
37
39
import org .opentripplanner .transit .model .timetable .Trip ;
40
+ import org .opentripplanner .transit .model .timetable .TripTimes ;
38
41
import org .opentripplanner .transit .service .TransitService ;
39
42
import org .opentripplanner .utils .time .ServiceDateUtils ;
40
43
@@ -126,13 +129,41 @@ public DataFetcher<Iterable<TransitAlert>> alerts() {
126
129
@ Override
127
130
public DataFetcher <TripTimeOnDate > arrivalStoptime () {
128
131
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
+ }
136
167
};
137
168
}
138
169
@@ -149,13 +180,35 @@ public DataFetcher<String> blockId() {
149
180
@ Override
150
181
public DataFetcher <TripTimeOnDate > departureStoptime () {
151
182
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
+ }
159
212
};
160
213
}
161
214
@@ -255,16 +308,37 @@ public DataFetcher<Iterable<TripTimeOnDate>> stoptimes() {
255
308
@ Override
256
309
public DataFetcher <Iterable <TripTimeOnDate >> stoptimesForDate () {
257
310
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
+ }
268
342
};
269
343
}
270
344
0 commit comments