package org.androad.sys.ors.rs.openrouteservice;
import java.util.ArrayList;
import java.util.Formatter;
import java.util.List;
import java.util.Locale;
import junit.framework.Assert;
import org.osmdroid.util.GeoPoint;
import org.androad.sys.ors.adt.AvoidFeature;
import org.androad.sys.ors.adt.aoi.AreaOfInterest;
import org.androad.sys.ors.adt.rs.DirectionsLanguage;
import org.androad.sys.ors.adt.rs.RoutePreferenceType;
import org.androad.sys.ors.util.Util;
import org.androad.sys.ors.util.constants.ORSXMLConstants;
import android.content.Context;
public class OpenRouteServiceRSRequestComposer implements ORSXMLConstants {
/**
*
* @param ctx
* @param nat
* @param start
* @param vias
* @param end
* @param pRoutePreference
* @param pProvideGeometry
* @param pAvoidTolls
* @param pAvoidHighways
* @param pRequestHandle <code>true</code> will make the Route available on the server, accessible through the handle-ID.
* @param pAvoidAreas
* @return
*/
public static String create(final Context ctx, final DirectionsLanguage nat, final GeoPoint start, final List<GeoPoint> vias, final GeoPoint end, final RoutePreferenceType pRoutePreference, final boolean pProvideGeometry, final boolean pAvoidTolls, final boolean pAvoidHighways, final boolean pRequestHandle, final ArrayList<AreaOfInterest> pAvoidAreas){
Assert.assertNotNull(start);
Assert.assertNotNull(end);
Assert.assertNotNull(pRoutePreference);
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb, Locale.ENGLISH);
sb.append(XML_BASE_TAG_UTF8);
f.format(XLS_OPENGIS_ROUTESERVICE_TAG_OPEN, nat.ID);
f.format(XLS_REQUESTHEADER_TAG, Util.getORSClientName(ctx));
sb.append(XLS_REQUESTMETHOD_ROUTE_TAG_OPEN);
f.format(XLS_DETERMINEROUTEREQUEST_TAG_OPEN, pRequestHandle);
sb.append(XLS_ROUTEPLAN_TAG_OPEN);
f.format(XLS_ROUTEPREFERENCE_TAG, pRoutePreference.mDefinedName);
sb.append(XLS_WAYPOINTLIST_TAG_OPEN)
.append(XLS_STARTPOINT_TAG_OPEN)
.append(XLS_POSITION_TAG_OPEN)
.append(GML_POINT_TAG_OPEN);
f.format(GML_POS_TAG, start.getLongitudeE6() / 1E6, start.getLatitudeE6() / 1E6);
sb.append(GML_POINT_TAG_CLOSE)
.append(XLS_POSITION_TAG_CLOSE)
.append(XLS_STARTPOINT_TAG_CLOSE);
if(vias != null){
for (final GeoPoint via : vias) {
sb.append(XLS_VIAPOINT_TAG_OPEN)
.append(XLS_POSITION_TAG_OPEN)
.append(GML_POINT_TAG_OPEN);
f.format(GML_POS_TAG, via.getLongitudeE6() / 1E6, via.getLatitudeE6() / 1E6);
sb.append(GML_POINT_TAG_CLOSE)
.append(XLS_POSITION_TAG_CLOSE)
.append(XLS_VIAPOINT_TAG_CLOSE);
}
}
sb.append(XLS_ENDPOINT_TAG_OPEN)
.append(XLS_POSITION_TAG_OPEN)
.append(GML_POINT_TAG_OPEN);
f.format(GML_POS_TAG, end.getLongitudeE6() / 1E6, end.getLatitudeE6() / 1E6);
sb.append(GML_POINT_TAG_CLOSE)
.append(XLS_POSITION_TAG_CLOSE)
.append(XLS_ENDPOINT_TAG_CLOSE)
.append(XLS_WAYPOINTLIST_TAG_CLOSE);
if(pAvoidHighways || pAvoidTolls || (pAvoidAreas != null && pAvoidAreas.size() > 0)){
sb.append(XLS_AVOIDLIST_TAG_OPEN);
if((pAvoidAreas != null && pAvoidAreas.size() > 0)){
for(final AreaOfInterest a : pAvoidAreas) {
a.appendToStringBuilder(sb, f);
}
}
if(pAvoidHighways){
sb.append(XLS_AVOIDFEATURE_TAG_OPEN)
.append(AvoidFeature.HIGHWAY.mDefiniton)
.append(XLS_AVOIDFEATURE_TAG_CLOSE);
}
if(pAvoidTolls){
sb.append(XLS_AVOIDFEATURE_TAG_OPEN)
.append(AvoidFeature.TOLLWAY.mDefiniton)
.append(XLS_AVOIDFEATURE_TAG_CLOSE);
}
sb.append(XLS_AVOIDLIST_TAG_CLOSE);
}
sb.append(XLS_ROUTEPLAN_TAG_CLOSE);
f.format(XLS_ROUTEINSTRUCTIONSREQUEST_TAG, pProvideGeometry);
sb.append(XLS_ROUTEGEOMETRYREQUEST_TAG)
.append(XLS_DETERMINEROUTEREQUEST_TAG_CLOSE)
.append(XLS_REQUESTMETHOD_ROUTE_TAG_CLOSE)
.append(XLS_OPENGIS_ROUTESERVICE_TAG_CLOSE);
return sb.toString();
}
/**
* Output similar to:
* <pre><xls:XLS xmlns:xls="http://www.opengis.net/xls" xmlns:gml="http://www.opengis.net/gml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/xls http://schemas.opengis.net/ols/1.1.0/RouteService.xsd
* version="1.1" xls:lang="en">
* <xls:RequestHeader sessionID="987654321"/>
* <xls:Request methodName="RouteRequest" requestID="123456789" version="1.1">
* <xls:DetermineRouteRequest distanceUnit="YD">
* <xls:RouteHandle routeID="1154174405531"></xls:RouteHandle>
* <xls:RouteInstructionsRequest format="text/plain"/>
* </xls:DetermineRouteRequest>
* </xls:Request>
* </xls:XLS></pre>
* @param ctx
* @param routeHandle
* @return
*/
public static String create(final Context ctx, final DirectionsLanguage nat, final long pRouteHandle) {
final StringBuilder sb = new StringBuilder();
final Formatter f = new Formatter(sb, Locale.ENGLISH);
f.format(XLS_OPENGIS_ROUTESERVICE_TAG_OPEN, nat.ID);
f.format(XLS_REQUESTHEADER_TAG, Util.getORSClientName(ctx));
sb.append(XLS_REQUESTMETHOD_ROUTE_TAG_OPEN);
f.format(XLS_DETERMINEROUTEREQUEST_TAG_OPEN, true);
f.format(XLS_ROUTEHANDLE_TAG, pRouteHandle);
f.format(XLS_ROUTEINSTRUCTIONSREQUEST_TAG, true);
sb.append(XLS_DETERMINEROUTEREQUEST_TAG_CLOSE)
.append(XLS_REQUESTMETHOD_ROUTE_TAG_CLOSE)
.append(XLS_OPENGIS_ROUTESERVICE_TAG_CLOSE);
return sb.toString();
}
}