/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
* Copyright (C) 2011 Google, Inc.
*
* 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.beans;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import org.onebusaway.container.cache.Cacheable;
import org.onebusaway.exceptions.NoSuchStopServiceException;
import org.onebusaway.gtfs.model.AgencyAndId;
import org.onebusaway.transit_data.model.RouteBean;
import org.onebusaway.transit_data.model.StopBean;
import org.onebusaway.transit_data_federation.model.narrative.StopNarrative;
import org.onebusaway.transit_data_federation.services.AgencyAndIdLibrary;
import org.onebusaway.transit_data_federation.services.RouteService;
import org.onebusaway.transit_data_federation.services.beans.RouteBeanService;
import org.onebusaway.transit_data_federation.services.beans.StopBeanService;
import org.onebusaway.transit_data_federation.services.narrative.NarrativeService;
import org.onebusaway.transit_data_federation.services.transit_graph.StopEntry;
import org.onebusaway.transit_data_federation.services.transit_graph.TransitGraphDao;
import org.onebusaway.utility.text.NaturalStringOrder;
import org.onebusaway.utility.text.StringLibrary;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
class StopBeanServiceImpl implements StopBeanService {
private static RouteBeanComparator _routeBeanComparator = new RouteBeanComparator();
private TransitGraphDao _transitGraphDao;
private RouteService _routeService;
private RouteBeanService _routeBeanService;
private NarrativeService _narrativeService;
@Autowired
public void setTranstiGraphDao(TransitGraphDao transitGraphDao) {
_transitGraphDao = transitGraphDao;
}
@Autowired
public void setRouteService(RouteService routeService) {
_routeService = routeService;
}
@Autowired
public void setRouteBeanService(RouteBeanService routeBeanService) {
_routeBeanService = routeBeanService;
}
@Autowired
public void setNarrativeService(NarrativeService narrativeService) {
_narrativeService = narrativeService;
}
@Cacheable
public StopBean getStopForId(AgencyAndId id) {
StopEntry stop = _transitGraphDao.getStopEntryForId(id);
StopNarrative narrative = _narrativeService.getStopForId(id);
if (stop == null)
throw new NoSuchStopServiceException(
AgencyAndIdLibrary.convertToString(id));
StopBean sb = new StopBean();
fillStopBean(stop, narrative, sb);
fillRoutesForStopBean(stop, sb);
return sb;
}
private void fillRoutesForStopBean(StopEntry stop, StopBean sb) {
Set<AgencyAndId> routeCollectionIds = _routeService.getRouteCollectionIdsForStop(stop.getId());
List<RouteBean> routeBeans = new ArrayList<RouteBean>(
routeCollectionIds.size());
for (AgencyAndId routeCollectionId : routeCollectionIds) {
RouteBean bean = _routeBeanService.getRouteForId(routeCollectionId);
routeBeans.add(bean);
}
Collections.sort(routeBeans, _routeBeanComparator);
sb.setRoutes(routeBeans);
}
private void fillStopBean(StopEntry stop, StopNarrative narrative,
StopBean bean) {
bean.setId(ApplicationBeanLibrary.getId(stop.getId()));
bean.setLat(stop.getStopLat());
bean.setLon(stop.getStopLon());
bean.setName(narrative.getName());
bean.setCode(StringLibrary.getBestName(narrative.getCode(),
stop.getId().getId()));
bean.setLocationType(narrative.getLocationType());
bean.setDirection(narrative.getDirection());
bean.setWheelchairBoarding(stop.getWheelchairBoarding());
}
private static String getRouteBeanName(RouteBean bean) {
return bean.getShortName() == null ? bean.getLongName()
: bean.getShortName();
}
private static class RouteBeanComparator implements Comparator<RouteBean> {
public int compare(RouteBean o1, RouteBean o2) {
String name1 = getRouteBeanName(o1);
String name2 = getRouteBeanName(o2);
return NaturalStringOrder.compareNatural(name1, name2);
}
}
}