/** * 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.transit_data_federation.impl.tripplanner; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.annotation.PostConstruct; import org.onebusaway.collections.CollectionsLibrary; import org.onebusaway.container.refresh.Refreshable; import org.onebusaway.gtfs.model.AgencyAndId; import org.onebusaway.transit_data_federation.impl.RefreshableResources; import org.onebusaway.transit_data_federation.impl.transit_graph.StopEntryImpl; import org.onebusaway.transit_data_federation.services.FederatedTransitDataBundle; import org.onebusaway.transit_data_federation.services.transit_graph.StopEntry; import org.onebusaway.transit_data_federation.services.transit_graph.TransitGraphDao; import org.onebusaway.transit_data_federation.services.tripplanner.StopTransfer; import org.onebusaway.transit_data_federation.services.tripplanner.StopTransferService; import org.onebusaway.utility.ObjectSerializationLibrary; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class StopTransferServiceImpl implements StopTransferService { private static Logger _log = LoggerFactory.getLogger(StopTransferServiceImpl.class); private static final StopTransferList EMPTY_TRANSFERS = new StopTransferList( new ArrayList<StopTransfer>()); private FederatedTransitDataBundle _bundle; private TransitGraphDao _transitGraphDao; @Autowired public void setBundle(FederatedTransitDataBundle bundle) { _bundle = bundle; } @Autowired public void setTransitGraphDao(TransitGraphDao transitGraphDao) { _transitGraphDao = transitGraphDao; } @PostConstruct @Refreshable(dependsOn = RefreshableResources.STOP_TRANSFER_DATA) public void setup() throws IOException, ClassNotFoundException { File path = _bundle.getStopTransfersPath(); if (path.exists()) { StopTransferAndHopData allData = ObjectSerializationLibrary.readObject(path); Map<AgencyAndId, List<StopTransferData>> stopTransferDataByStopId = allData.getTransferData(); Map<AgencyAndId, List<StopTransferData>> reversedStopTransfersByStopId = reverseTransfers(stopTransferDataByStopId); Set<AgencyAndId> stopIds = new HashSet<AgencyAndId>(); stopIds.addAll(stopTransferDataByStopId.keySet()); stopIds.addAll(reversedStopTransfersByStopId.keySet()); _log.info("stop transfers=" + stopTransferDataByStopId.size()); _log.info("reverse stop transfers=" + reversedStopTransfersByStopId.size()); for (AgencyAndId stopId : stopIds) { StopEntry stop = _transitGraphDao.getStopEntryForId(stopId); if (stop == null) { _log.warn("unknown stop: " + stopId); continue; } List<StopTransferData> transfersFromStopData = stopTransferDataByStopId.get(stopId); List<StopTransferData> transfersToStopData = reversedStopTransfersByStopId.get(stopId); List<StopTransfer> transfersFromStop = getTransferDataAsList(transfersFromStopData); List<StopTransfer> transfersToStop = getTransferDataAsList(transfersToStopData); StopEntryImpl stopEntry = (StopEntryImpl) stop; stopEntry.setTransfers(new StopTransfers(transfersFromStop, transfersToStop)); } } } @Override public List<StopTransfer> getTransfersFromStop(StopEntry stop) { StopEntryImpl impl = (StopEntryImpl) stop; StopTransfers transfers = impl.getTransfers(); if (transfers == null || transfers.getTransfersFromStop() == null) return EMPTY_TRANSFERS; return transfers.getTransfersFromStop(); } @Override public List<StopTransfer> getTransfersToStop(StopEntry stop) { StopEntryImpl impl = (StopEntryImpl) stop; StopTransfers transfers = impl.getTransfers(); if (transfers == null || transfers.getTransfersToStop() == null) return EMPTY_TRANSFERS; return transfers.getTransfersToStop(); } /**** * ****/ private Map<AgencyAndId, List<StopTransferData>> reverseTransfers( Map<AgencyAndId, List<StopTransferData>> stopTransferDataByStopId) { Map<AgencyAndId, List<StopTransferData>> reversed = new HashMap<AgencyAndId, List<StopTransferData>>(); for (Map.Entry<AgencyAndId, List<StopTransferData>> entry : stopTransferDataByStopId.entrySet()) { AgencyAndId fromStop = entry.getKey(); for (StopTransferData transfer : entry.getValue()) { AgencyAndId toStop = transfer.getStopId(); List<StopTransferData> transfers = reversed.get(toStop); if (transfers == null) { transfers = new ArrayList<StopTransferData>(); reversed.put(toStop, transfers); } StopTransferData reversedTransfer = new StopTransferData(fromStop, transfer.getMinTransferTime(), transfer.getDistance()); transfers.add(reversedTransfer); } } return reversed; } private List<StopTransfer> getTransferDataAsList( List<StopTransferData> transferData) { if (CollectionsLibrary.isEmpty(transferData)) return null; List<StopTransfer> transfers = new ArrayList<StopTransfer>(); for (StopTransferData data : transferData) { AgencyAndId targetStopId = data.getStopId(); StopEntry targetStop = _transitGraphDao.getStopEntryForId(targetStopId); if (targetStop == null) { _log.warn("unkown stop: " + targetStopId); continue; } StopTransfer transfer = new StopTransfer(targetStop, data.getMinTransferTime(), data.getDistance()); transfers.add(transfer); } return new StopTransferList(transfers); } }