Package org.onebusaway.api.actions.siri

Source Code of org.onebusaway.api.actions.siri.SiriUtils

/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*         http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.api.actions.siri;

import org.onebusaway.siri.model.DistanceExtensions;
import org.onebusaway.siri.model.Distances;
import org.onebusaway.siri.model.FramedVehicleJourneyRef;
import org.onebusaway.siri.model.MonitoredCall;
import org.onebusaway.siri.model.MonitoredVehicleJourney;
import org.onebusaway.siri.model.OnwardCall;
import org.onebusaway.transit_data.model.RouteBean;
import org.onebusaway.transit_data.model.StopBean;
import org.onebusaway.transit_data.model.TripStopTimeBean;
import org.onebusaway.transit_data.model.trips.TripBean;
import org.onebusaway.transit_data.model.trips.TripDetailsBean;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

public class SiriUtils {

  public static String getIdWithoutAgency(String id) {
    int startIndex = id.indexOf('_') + 1;
    id = id.substring(startIndex);
    return id;
  }

  /**
   * @param stopTimes The list of all stops this trip makes
   * @param serviceDate
   * @param distance How far in meters the bus is along the trip
   * @param currentStop The stop the bus is presently at
   * @return A list of Siri OnwardCall objects
   */

  public static List<OnwardCall> getOnwardCalls(
      List<TripStopTimeBean> stopTimes, long serviceDate, double distance,
      StopBean currentStop) {

    ArrayList<OnwardCall> onwardCalls = new ArrayList<OnwardCall>();

    HashMap<String, Integer> visitNumberForStop = new HashMap<String, Integer>();
    boolean afterStart = false;
    boolean afterStop = currentStop == null;
    int i = 0;
    for (TripStopTimeBean stopTime : stopTimes) {
      StopBean stop = stopTime.getStop();
      int visitNumber = getVisitNumber(visitNumberForStop, stop);
      if (stopTime.getDistanceAlongTrip() >= distance) {
        afterStart = true;
      }
      if (afterStart) {
        i += 1;
        if (afterStop) {
          OnwardCall onwardCall = new OnwardCall();
          onwardCall.StopPointRef = SiriUtils.getIdWithoutAgency(stop.getId());
          onwardCall.StopPointName = stop.getName();
          onwardCall.VisitNumber = visitNumber;
          onwardCall.Extensions = new DistanceExtensions();

          onwardCall.Extensions.Distances = new Distances();
          onwardCall.Extensions.Distances.DistanceFromCall = stopTime.getDistanceAlongTrip()
              - distance;
          onwardCall.Extensions.Distances.CallDistanceAlongRoute = stopTime.getDistanceAlongTrip();
          onwardCall.Extensions.Distances.StopsFromCall = i - 1;

          /*
           * This is not really that useful without being more certain about
           * what trip we're on, so it's commented out Calendar arrivalTime =
           * new GregorianCalendar(); long millis = serviceDate +
           * stopTime.getArrivalTime() * 1000;
           * arrivalTime.setTimeInMillis(millis); onwardCall.AimedArrivalTime =
           * arrivalTime;
           *
           * Calendar departureTime = new GregorianCalendar(); millis =
           * serviceDate + stopTime.getDepartureTime() * 1000;
           * departureTime.setTimeInMillis(millis);
           * onwardCall.AimedDepartureTime = departureTime;
           */

          onwardCalls.add(onwardCall);
        }
        if (stop == currentStop) {
          afterStop = true;
        }
      }
    }
    if (onwardCalls.size() == 0) {
      return null;
    }
    return onwardCalls;
  }

  public static int getVisitNumber(HashMap<String, Integer> visitNumberForStop,
      StopBean stop) {
    int visitNumber;
    if (visitNumberForStop.containsKey(stop.getId())) {
      visitNumber = visitNumberForStop.get(stop.getId()) + 1;
    } else {
      visitNumber = 1;
    }
    visitNumberForStop.put(stop.getId(), visitNumber);
    return visitNumber;
  }

  public static MonitoredVehicleJourney getMonitoredVehicleJourney(
      TripDetailsBean trip, Date serviceDate, String vehicleId) {
    TripBean tripBean = trip.getTrip();

    MonitoredVehicleJourney monitoredVehicleJourney = new MonitoredVehicleJourney();

    monitoredVehicleJourney.CourseOfJourneyRef = getIdWithoutAgency(trip.getTripId());
    RouteBean route = tripBean.getRoute();
    monitoredVehicleJourney.LineRef = getIdWithoutAgency(route.getId());
    monitoredVehicleJourney.DirectionRef = tripBean.getDirectionId();
    monitoredVehicleJourney.PublishedLineName = tripBean.getTripHeadsign();

    monitoredVehicleJourney.FramedVehicleJourneyRef = new FramedVehicleJourneyRef();
    monitoredVehicleJourney.VehicleRef = vehicleId;

    monitoredVehicleJourney.FramedVehicleJourneyRef.DataFrameRef = String.format(
        "%1$tY-%1$tm-%1$td", serviceDate);
    monitoredVehicleJourney.FramedVehicleJourneyRef.DatedVehicleJourneyRef = trip.getTripId();

    List<TripStopTimeBean> stops = trip.getSchedule().getStopTimes();
    monitoredVehicleJourney.OriginRef = getIdWithoutAgency(stops.get(0).getStop().getId());
    StopBean lastStop = stops.get(stops.size() - 1).getStop();
    monitoredVehicleJourney.DestinationRef = getIdWithoutAgency(lastStop.getId());

    StopBean nextStop = trip.getStatus().getNextStop();
    if (nextStop != null) {
      monitoredVehicleJourney.MonitoredCall = new MonitoredCall();
      monitoredVehicleJourney.MonitoredCall.StopPointRef = nextStop.getId();
      monitoredVehicleJourney.MonitoredCall.StopPointName = nextStop.getName();
      monitoredVehicleJourney.MonitoredCall.VisitNumber = 1; // FIXME: this is
                                                             // theoretically
                                                             // wrong but
                                                             // practically
                                                             // rarely so
    }
    return monitoredVehicleJourney;
  }

  public static String getProgressRateForStatus(String status) {
    if (status == null) {
      return "unknown";
    }
    if (status.equals("default")) {
      return "unknown";
    }
    if (status.equals("IN_PROGRESS")) {
      return "normalProgress";
    }
    if (status.startsWith("LAYOVER")) {
      return "noProgress";
    }
    if (status.equals("STALLED")) {
      return "noProgress";
    }
    return null; /* something unknown */
  }
}
TOP

Related Classes of org.onebusaway.api.actions.siri.SiriUtils

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.