private void recordVehicle(VehiclePosition vehicle, DataCopier copier) throws SQLException, Exception { if (!vehicle.hasPosition()) { throw new Exception("No position found"); } PreparedStatement stmt = null; DataCopierRow row = null; if (copier == null) { stmt = mStatements.get(STVEHICLE); } else { row = new DataCopierRow(); } int congestionLevel = vehicle.hasCongestionLevel() ? vehicle.getCongestionLevel().getNumber() : CongestionLevel.UNKNOWN_CONGESTION_LEVEL_VALUE; int vehicleStatus = vehicle.hasCurrentStatus() ? vehicle.getCurrentStatus().getNumber() : VehicleStopStatus.IN_TRANSIT_TO_VALUE; int stopSequence = vehicle.hasCurrentStopSequence() ? vehicle.getCurrentStopSequence() : -1; if (row == null) { stmt.setInt(1, congestionLevel); stmt.setInt(2, vehicleStatus); stmt.setInt(3, stopSequence); } else { row.add(congestionLevel); row.add(vehicleStatus); row.add(stopSequence); } Position pos = vehicle.getPosition(); if (pos.hasBearing()) { if (row == null) { stmt.setFloat(4, pos.getBearing()); } else { row.add(pos.getBearing()); } } else { if (row == null) { stmt.setNull(4, Types.FLOAT); } else { row.addNull(); } } if (pos.hasOdometer()) { if (row == null) { stmt.setDouble(5, pos.getOdometer()); } else { row.add(pos.getOdometer()); } } else { if (row == null) { stmt.setNull(5, Types.DOUBLE); } else { row.addNull(); } } if (pos.hasSpeed()) { if (row == null) { stmt.setFloat(6, pos.getSpeed()); } else { row.add(pos.getSpeed()); } } else { if (row == null) { stmt.setNull(6, Types.FLOAT); } else { row.addNull(); } } if (pos.hasLatitude()) { if (row == null) { stmt.setFloat(7, pos.getLatitude()); } else { row.add(pos.getLatitude()); } } else { if (row == null) { stmt.setNull(7, Types.FLOAT); } else { row.addNull(); } } if (pos.hasLongitude()) { if (row == null) { stmt.setFloat(8, pos.getLongitude()); } else { row.add(pos.getLongitude()); } } else { if (row == null) { stmt.setNull(8, Types.FLOAT); } else { row.addNull(); } } if (vehicle.hasStopId()) { if (row == null) { stmt.setString(9, vehicle.getStopId()); } else { row.add(vehicle.getStopId()); } } else { if (row == null) { stmt.setNull(9, Types.VARCHAR); } else { row.addNull(); } } if (vehicle.hasTimestamp()) { if (row == null) { stmt.setLong(10, vehicle.getTimestamp()); } else { row.add(vehicle.getTimestamp()); } } else { if (row == null) { stmt.setNull(10, Types.INTEGER); } else { row.addNull(); } } if (vehicle.hasTrip()) { TripDescriptor trip = vehicle.getTrip(); if (trip.hasScheduleRelationship()) { if (row == null) { stmt.setInt(11, trip.getScheduleRelationship().getNumber()); } else { row.add(trip.getScheduleRelationship().getNumber()); } } else { if (row == null) { stmt.setNull(11, Types.INTEGER); } else { row.addNull(); } } if (trip.hasStartDate()) { if (row == null) { stmt.setString(12, trip.getStartDate()); } else { row.add(trip.getStartDate()); } } else { if (row == null) { stmt.setNull(12, Types.VARCHAR); } else { row.addNull(); } } if (trip.hasStartTime()) { if (row == null) { stmt.setString(13, trip.getStartTime()); } else { row.add(trip.getStartTime()); } } else { if (row == null) { stmt.setNull(13, Types.VARCHAR); } else { row.addNull(); } } if (trip.hasTripId()) { if (row == null) { stmt.setString(14, trip.getTripId()); } else { row.add(trip.getTripId()); } } else { if (row == null) { stmt.setNull(14, Types.VARCHAR); } else { row.addNull(); } } if (trip.hasRouteId()) { if (row == null) { stmt.setString(15, trip.getRouteId()); } else { row.add(trip.getRouteId()); } } else { if (row == null) { stmt.setNull(15, Types.VARCHAR); } else { row.addNull(); } } } else { if (row == null) { stmt.setNull(11, Types.INTEGER); stmt.setNull(12, Types.VARCHAR); stmt.setNull(13, Types.VARCHAR); stmt.setNull(14, Types.VARCHAR); stmt.setNull(15, Types.VARCHAR); } else { row.addNull(5); } } if (vehicle.hasVehicle()) { VehicleDescriptor vd = vehicle.getVehicle(); if (vd.hasId()) { if (row == null) { stmt.setString(16, vd.getId()); } else { row.add(vd.getId()); } } else { if (row == null) { stmt.setNull(16, Types.VARCHAR); } else { row.addNull(); } } if (vd.hasLabel()) { if (row == null) { stmt.setString(17, vd.getLabel()); } else { row.add(vd.getLabel()); } } else { if (row == null) { stmt.setNull(17, Types.VARCHAR); } else { row.addNull(); } } if (vd.hasLicensePlate()) { if (row == null) { stmt.setString(18, vd.getLicensePlate()); } else { row.add(vd.getLicensePlate()); } } else { if (row == null) { stmt.setNull(18, Types.VARCHAR); } else { row.addNull(); } } } else { if (row == null) { stmt.setNull(16, Types.VARCHAR); stmt.setNull(17, Types.VARCHAR); stmt.setNull(18, Types.VARCHAR); } else { row.addNull(3); } } Date recorded = new Date(); if (row == null) { stmt.setInt(19, (int) (recorded.getTime() / 1000)); } else { row.add((int) (recorded.getTime() / 1000)); } if (stmt == null) { copier.add(row); } else { stmt.execute(); } }
/** * This method downloads the latest vehicle data, processes each vehicle in turn, and create a * GTFS-realtime feed of trip updates and vehicle positions as a result. */ private void refreshVehicles() throws IOException, JSONException { /** We download the vehicle details as an array of JSON objects. */ JSONArray vehicleArray = downloadVehicleDetails(); /** * The FeedMessage.Builder is what we will use to build up our GTFS-realtime feeds. We create a * feed for both trip updates and vehicle positions. */ FeedMessage.Builder tripUpdates = GtfsRealtimeLibrary.createFeedMessageBuilder(); FeedMessage.Builder vehiclePositions = GtfsRealtimeLibrary.createFeedMessageBuilder(); /** We iterate over every JSON vehicle object. */ for (int i = 0; i < vehicleArray.length(); ++i) { JSONObject obj = vehicleArray.getJSONObject(i); String trainNumber = obj.getString("trainno"); String route = obj.getString("dest"); String stopId = obj.getString("nextstop"); double lat = obj.getDouble("lat"); double lon = obj.getDouble("lon"); int delay = obj.getInt("late"); /** * We construct a TripDescriptor and VehicleDescriptor, which will be used in both trip * updates and vehicle positions to identify the trip and vehicle. Ideally, we would have a * trip id to use for the trip descriptor, but the SEPTA api doesn't include it, so we settle * for a route id instead. */ TripDescriptor.Builder tripDescriptor = TripDescriptor.newBuilder(); tripDescriptor.setRouteId(route); VehicleDescriptor.Builder vehicleDescriptor = VehicleDescriptor.newBuilder(); vehicleDescriptor.setId(trainNumber); /** * To construct our TripUpdate, we create a stop-time arrival event for the next stop for the * vehicle, with the specified arrival delay. We add the stop-time update to a TripUpdate * builder, along with the trip and vehicle descriptors. */ StopTimeEvent.Builder arrival = StopTimeEvent.newBuilder(); arrival.setDelay(delay * 60); StopTimeUpdate.Builder stopTimeUpdate = StopTimeUpdate.newBuilder(); stopTimeUpdate.setArrival(arrival); stopTimeUpdate.setStopId(stopId); TripUpdate.Builder tripUpdate = TripUpdate.newBuilder(); tripUpdate.addStopTimeUpdate(stopTimeUpdate); tripUpdate.setTrip(tripDescriptor); tripUpdate.setVehicle(vehicleDescriptor); /** * Create a new feed entity to wrap the trip update and add it to the GTFS-realtime trip * updates feed. */ FeedEntity.Builder tripUpdateEntity = FeedEntity.newBuilder(); tripUpdateEntity.setId(trainNumber); tripUpdateEntity.setTripUpdate(tripUpdate); tripUpdates.addEntity(tripUpdateEntity); /** * To construct our VehiclePosition, we create a position for the vehicle. We add the position * to a VehiclePosition builder, along with the trip and vehicle descriptors. */ Position.Builder position = Position.newBuilder(); position.setLatitude((float) lat); position.setLongitude((float) lon); VehiclePosition.Builder vehiclePosition = VehiclePosition.newBuilder(); vehiclePosition.setPosition(position); vehiclePosition.setTrip(tripDescriptor); vehiclePosition.setVehicle(vehicleDescriptor); /** * Create a new feed entity to wrap the vehicle position and add it to the GTFS-realtime * vehicle positions feed. */ FeedEntity.Builder vehiclePositionEntity = FeedEntity.newBuilder(); vehiclePositionEntity.setId(trainNumber); vehiclePositionEntity.setVehicle(vehiclePosition); vehiclePositions.addEntity(vehiclePositionEntity); } /** Build out the final GTFS-realtime feed messagse and save them. */ _gtfsRealtimeProvider.setTripUpdates(tripUpdates.build()); _gtfsRealtimeProvider.setVehiclePositions(vehiclePositions.build()); _log.info("vehicles extracted: " + tripUpdates.getEntityCount()); }