/* 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.gtfs;
import java.io.File;
import java.io.IOException;
import org.onebusaway.gtfs.impl.GtfsRelationalDaoImpl;
import org.onebusaway.gtfs.impl.calendar.CalendarServiceDataFactoryImpl;
import org.onebusaway.gtfs.impl.calendar.CalendarServiceImpl;
import org.onebusaway.gtfs.model.AgencyAndId;
import org.onebusaway.gtfs.model.Route;
import org.onebusaway.gtfs.model.calendar.CalendarServiceData;
import org.onebusaway.gtfs.serialization.GtfsReader;
import org.onebusaway.gtfs.services.GtfsRelationalDao;
import org.onebusaway.gtfs.services.calendar.CalendarService;
import org.opentripplanner.routing.core.TraverseMode;
public class GtfsLibrary {
public static final char ID_SEPARATOR = '_';
public static GtfsContext createContext(GtfsRelationalDao dao) {
CalendarService calendarService = createCalendarService(dao);
return createContext(dao,calendarService);
}
public static GtfsContext createContext(GtfsRelationalDao dao, CalendarService calendarService) {
return new GtfsContextImpl(dao, calendarService);
}
public static GtfsContext readGtfs(File path) throws IOException {
return readGtfs(path, null);
}
public static GtfsContext readGtfs(File path, String defaultAgencyId) throws IOException {
GtfsRelationalDaoImpl dao = new GtfsRelationalDaoImpl();
GtfsReader reader = new GtfsReader();
reader.setInputLocation(path);
reader.setEntityStore(dao);
if (defaultAgencyId != null)
reader.setDefaultAgencyId(defaultAgencyId);
reader.run();
CalendarService calendarService = createCalendarService(dao);
return new GtfsContextImpl(dao, calendarService);
}
public static CalendarService createCalendarService(GtfsRelationalDao dao) {
CalendarServiceData data = createCalendarServiceData(dao);
CalendarServiceImpl service = new CalendarServiceImpl();
service.setData(data);
return service;
}
public static CalendarServiceData createCalendarServiceData(GtfsRelationalDao dao) {
CalendarServiceDataFactoryImpl factory = new CalendarServiceDataFactoryImpl();
factory.setGtfsDao(dao);
CalendarServiceData data = factory.createData();
return data;
}
public static AgencyAndId convertIdFromString(String value) {
int index = value.indexOf(ID_SEPARATOR);
if (index == -1) {
throw new IllegalStateException("invalid agency-and-id: " + value);
} else {
return new AgencyAndId(value.substring(0, index), value.substring(index + 1));
}
}
public static String convertIdToString(AgencyAndId aid) {
return aid.getAgencyId() + ID_SEPARATOR + aid.getId();
}
public static String getRouteName(Route route) {
if (route.getShortName() != null)
return route.getShortName();
return route.getLongName();
}
public static TraverseMode getTraverseMode(Route route) {
int routeType = route.getType();
if (routeType >= 100 && routeType < 200){ // Railway Service
return TraverseMode.RAIL;
}else if (routeType >= 200 && routeType < 300){ //Coach Service
return TraverseMode.BUS;
}else if (routeType >= 300 && routeType < 500){ //Suburban Railway Service and Urban Railway service
return TraverseMode.RAIL;
}else if (routeType >= 500 && routeType < 700){ //Metro Service and Underground Service
return TraverseMode.SUBWAY;
}else if (routeType >= 700 && routeType < 900){ //Bus Service and Trolleybus service
return TraverseMode.BUS;
}else if (routeType >= 900 && routeType < 1000){ //Tram service
return TraverseMode.TRAM;
}else if (routeType >= 1000 && routeType < 1100){ //Water Transport Service
return TraverseMode.FERRY;
}else if (routeType >= 1100 && routeType < 1200){ //Air Service
throw new IllegalArgumentException("Air transport not supported" + routeType);
}else if (routeType >= 1200 && routeType < 1300){ //Ferry Service
return TraverseMode.FERRY;
}else if (routeType >= 1300 && routeType < 1400){ //Telecabin Service
return TraverseMode.GONDOLA;
}else if (routeType >= 1400 && routeType < 1500){ //Funicalar Service
return TraverseMode.FUNICULAR;
}else if (routeType >= 1500 && routeType < 1600){ //Taxi Service
throw new IllegalArgumentException("Taxi service not supported" + routeType);
}else if (routeType >= 1600 && routeType < 1700){ //Self drive
return TraverseMode.CAR;
}
switch (routeType) {
case 0:
return TraverseMode.TRAM;
case 1:
return TraverseMode.SUBWAY;
case 2:
return TraverseMode.RAIL;
case 3:
return TraverseMode.BUS;
case 4:
return TraverseMode.FERRY;
case 5:
return TraverseMode.CABLE_CAR;
case 6:
return TraverseMode.GONDOLA;
case 7:
return TraverseMode.FUNICULAR;
default:
throw new IllegalArgumentException("unknown gtfs route type " + routeType);
}
}
private static class GtfsContextImpl implements GtfsContext {
private GtfsRelationalDao _dao;
private CalendarService _calendar;
public GtfsContextImpl(GtfsRelationalDao dao, CalendarService calendar) {
_dao = dao;
_calendar = calendar;
}
@Override
public GtfsRelationalDao getDao() {
return _dao;
}
@Override
public CalendarService getCalendarService() {
return _calendar;
}
}
}