/* This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.opentripplanner.updater.stoptime; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import org.opentripplanner.updater.JsonConfigurable; import org.opentripplanner.routing.graph.Graph; import org.opentripplanner.util.HttpUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.transit.realtime.GtfsRealtime; import com.google.transit.realtime.GtfsRealtime.FeedEntity; import com.google.transit.realtime.GtfsRealtime.FeedMessage; import com.google.transit.realtime.GtfsRealtime.TripUpdate; public class GtfsRealtimeHttpTripUpdateSource implements TripUpdateSource, JsonConfigurable { private static final Logger LOG = LoggerFactory.getLogger(GtfsRealtimeHttpTripUpdateSource.class); /** * True iff the last list with updates represent all updates that are active right now, i.e. all * previous updates should be disregarded */ private boolean fullDataset = true; /** * Feed id that is used to match trip ids in the TripUpdates */ private String feedId; private String url; @Override public void configure(Graph graph, JsonNode config) throws Exception { String url = config.path("url").asText(); if (url == null) { throw new IllegalArgumentException("Missing mandatory 'url' parameter"); } this.url = url; this.feedId = config.path("feedId").asText(); } @Override public List<TripUpdate> getUpdates() { FeedMessage feedMessage = null; List<FeedEntity> feedEntityList = null; List<TripUpdate> updates = null; fullDataset = true; try { InputStream is = HttpUtils.getData(url); if (is != null) { // Decode message feedMessage = FeedMessage.PARSER.parseFrom(is); feedEntityList = feedMessage.getEntityList(); // Change fullDataset value if this is an incremental update if (feedMessage.hasHeader() && feedMessage.getHeader().hasIncrementality() && feedMessage.getHeader().getIncrementality() .equals(GtfsRealtime.FeedHeader.Incrementality.DIFFERENTIAL)) { fullDataset = false; } // Create List of TripUpdates updates = new ArrayList<TripUpdate>(feedEntityList.size()); for (FeedEntity feedEntity : feedEntityList) { if (feedEntity.hasTripUpdate()) updates.add(feedEntity.getTripUpdate()); } } } catch (Exception e) { LOG.warn("Failed to parse gtfs-rt feed from " + url + ":", e); } return updates; } @Override public boolean getFullDatasetValueOfLastUpdates() { return fullDataset; } public String toString() { return "GtfsRealtimeHttpUpdateStreamer(" + url + ")"; } @Override public String getFeedId() { return this.feedId; } }