package com.nutiteq.services; import java.io.IOException; import com.mgmaps.utils.Tools; import com.nutiteq.cache.Cache; import com.nutiteq.components.Route; import com.nutiteq.components.WgsPoint; import com.nutiteq.core.MappingCore; import com.nutiteq.io.ResourceDataWaiter; import com.nutiteq.io.ResourceRequestor; import com.nutiteq.utils.Utils; /** * OpenLS directions service using Nutiteq's backend. */ public class OpenLSDirections implements DirectionsService, ResourceRequestor, ResourceDataWaiter { private final String routeUrl; private final DirectionsWaiter directionsWaiter; /** * Default baseurl for the service. */ public static final String NUTITEQ_DEFAULT_SERVICE_URL = "http://lbs.nutiteq.ee/osm/geocode_kml.php"; /** * * @param directionsWaiter * object waiting for directions result * @param baseurl * baseurl for the service * @param language * used language * @param routeStart * star point for route (in WGS84) * @param routeEnd * end point for route (in WGS84) */ public OpenLSDirections(final DirectionsWaiter directionsWaiter, final String baseurl, final String language, final WgsPoint routeStart, final WgsPoint routeEnd) { this.directionsWaiter = directionsWaiter; final StringBuffer url = new StringBuffer(Utils.prepareForParameters(baseurl)); url.append("out=openls&t=d&saddr=").append(Tools.urlEncode(routeStart.getLat() + "N, ")); url.append(Tools.urlEncode(routeStart.getLon() + "E")); url.append("&daddr=").append(Tools.urlEncode(routeEnd.getLat() + "N, ")); url.append(Tools.urlEncode(routeEnd.getLon() + "E")).append("&lang="); url.append(language).append("&gzip=yes"); routeUrl = url.toString(); } public String resourcePath() { return routeUrl; } //TODO jaanus : read as gzip stream public void dataRetrieved(final byte[] data) { final OpenLSReader reader = new OpenLSReader(data, directionsWaiter); try { final Route route = reader.read(); directionsWaiter.routeFound(route); } catch (final IOException e) { directionsWaiter.routingParsingError(e.getMessage()); } } public void notifyError() { directionsWaiter.networkError(); } public void execute() { MappingCore.getInstance().getTasksRunner().enqueueDownload(this, com.nutiteq.cache.Cache.CACHE_LEVEL_NONE); } public void cancel() { //TODO jaanus } public int getCachingLevel() { return Cache.CACHE_LEVEL_NONE; } }