package pl.edu.agh.service; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import pl.edu.agh.bo.RoutingBO; import pl.edu.agh.bo.RoutingBO.Error; import pl.edu.agh.exception.BusinessException; import pl.edu.agh.jsonrpc.JSONRPCException; import pl.edu.agh.jsonrpc.RawDataSocket; import pl.edu.agh.model.RoutingResult; import pl.edu.agh.model.SimpleLocationInfo; import pl.edu.agh.model.TrafficData; import pl.edu.agh.model.TrafficInfo; import pl.edu.agh.model.WayWithSpeedInfo; import pl.edu.agh.spatial.GeometryHelper; import pl.edu.agh.spatial.WGS84GeometryFactory; import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.vividsolutions.jts.geom.Point; @Component public class TrafficServiceImpl implements TrafficService { static final ImmutableMap<RoutingBO.Error, String> ROUTING_ERROR_MAPPING = new ImmutableMap.Builder<RoutingBO.Error, String>() .put(Error.NO_START_ROUTE, NO_START_ROUTE_ERROR).put(Error.NO_END_ROUTE, NO_END_ROUTE_ERROR) .put(Error.CALCULATING_ERROR, CALCULATING_ROUTE_ERROR).build(); @Autowired RoutingBO routingBO; @Autowired WGS84GeometryFactory geometryFactory; @Override public RoutingResult calculateRoute(SimpleLocationInfo start, SimpleLocationInfo end, boolean useTrafficDataToRoute) throws JSONRPCException { try { List<Point> points = routingBO.calculateRoute( geometryFactory.createPoint(start.getLongitude(), start.getLatitude()), geometryFactory.createPoint(end.getLongitude(), end.getLatitude()), useTrafficDataToRoute); return new RoutingResult(transformPointsToInfos(points)); } catch (BusinessException ex) { throw new JSONRPCException(ROUTING_ERROR_MAPPING.get(ex.getError()), ex); } } private List<SimpleLocationInfo> transformPointsToInfos(List<Point> points) { List<SimpleLocationInfo> infos = Lists.transform(points, new Function<Point, SimpleLocationInfo>() { @Override public SimpleLocationInfo apply(Point point) { return new SimpleLocationInfo(point.getX(), point.getY()); } }); return infos; } @Override public TrafficData getTrafficData(SimpleLocationInfo location, double radius) throws JSONRPCException { List<WayWithSpeedInfo> ways = routingBO.getTrafficData(geometryFactory.createPoint(location.getLongitude(), location.getLatitude()), radius); List<TrafficInfo> trafficInfos = transformWaysToTrafficInfos(ways); return new TrafficData(trafficInfos); } private List<TrafficInfo> transformWaysToTrafficInfos(List<WayWithSpeedInfo> ways) { List<TrafficInfo> trafficInfos = Lists.transform(ways, new Function<WayWithSpeedInfo, TrafficInfo>() { @Override public TrafficInfo apply(WayWithSpeedInfo way) { List<SimpleLocationInfo> points = transformPointsToInfos(GeometryHelper.getPointsFromGeometry( way.getLineString(), geometryFactory)); return new TrafficInfo(points, way.getDirectWaySpeed(), way.getReverseWaySpeed(), way.isOneWay()); } }); return trafficInfos; } @Override public void configAdHoc(RawDataSocket socket, AsyncDataListener listener) { // TODO Auto-generated method stub } @Override public TrafficData getTrafficDataViaAdHoc(SimpleLocationInfo location, double radius) throws JSONRPCException { // TODO Auto-generated method stub return null; } }