diff --git a/brouter-core/src/main/java/btools/router/OsmTrack.java b/brouter-core/src/main/java/btools/router/OsmTrack.java index 98ff094..909d2a5 100644 --- a/brouter-core/src/main/java/btools/router/OsmTrack.java +++ b/brouter-core/src/main/java/btools/router/OsmTrack.java @@ -289,7 +289,11 @@ public final class OsmTrack public void dumpMessages( String filename, RoutingContext rc ) throws Exception { BufferedWriter bw = filename == null ? null : new BufferedWriter( new FileWriter( filename ) ); + writeMessages( bw, rc ); + } + public void writeMessages( BufferedWriter bw, RoutingContext rc ) throws Exception + { // csv-header-line String header = "Longitude\tLatitude\tElevation\tDistance\tCostPerKm\tElevCost\tTurnCost"; diff --git a/brouter-server/src/main/java/btools/server/RouteServer.java b/brouter-server/src/main/java/btools/server/RouteServer.java index dc91b70..7f5ec03 100644 --- a/brouter-server/src/main/java/btools/server/RouteServer.java +++ b/brouter-server/src/main/java/btools/server/RouteServer.java @@ -96,16 +96,16 @@ public class RouteServer extends Thread cr.quite = true; cr.doRun( maxRunningTime ); - writeHttpHeader(bw); - if ( cr.getErrorMessage() != null ) { + writeHttpHeader(bw); bw.write( cr.getErrorMessage() ); bw.write( "\n" ); } else { OsmTrack track = cr.getFoundTrack(); + writeHttpHeader(bw, handler.getMimeType()); if ( track != null ) { bw.write( handler.formatTrack(track) ); @@ -204,12 +204,18 @@ public class RouteServer extends Thread } return maxRunningTime; } - - private static void writeHttpHeader(BufferedWriter bw) throws IOException { + + private static void writeHttpHeader( BufferedWriter bw ) throws IOException + { + writeHttpHeader( bw, "text/plain" ); + } + + private static void writeHttpHeader( BufferedWriter bw, String mimeType ) throws IOException + { // http-header bw.write( "HTTP/1.1 200 OK\n" ); bw.write( "Connection: close\n" ); - bw.write( "Content-Type: text/xml; charset=utf-8\n" ); + bw.write( "Content-Type: " + mimeType + "; charset=utf-8\n" ); bw.write( "Access-Control-Allow-Origin: *\n" ); bw.write( "\n" ); } diff --git a/brouter-server/src/main/java/btools/server/request/RequestHandler.java b/brouter-server/src/main/java/btools/server/request/RequestHandler.java index 060603b..f8b55fa 100644 --- a/brouter-server/src/main/java/btools/server/request/RequestHandler.java +++ b/brouter-server/src/main/java/btools/server/request/RequestHandler.java @@ -25,4 +25,5 @@ public abstract class RequestHandler public abstract String formatTrack(OsmTrack track); + public abstract String getMimeType(); } \ No newline at end of file diff --git a/brouter-server/src/main/java/btools/server/request/ServerHandler.java b/brouter-server/src/main/java/btools/server/request/ServerHandler.java index afa717c..8f96893 100644 --- a/brouter-server/src/main/java/btools/server/request/ServerHandler.java +++ b/brouter-server/src/main/java/btools/server/request/ServerHandler.java @@ -1,14 +1,15 @@ package btools.server.request; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - import btools.router.OsmNodeNamed; import btools.router.OsmTrack; import btools.router.RoutingContext; import btools.server.ServiceContext; +import java.io.BufferedWriter; import java.io.File; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; /** * URL query parameter handler for web and standalone server. Supports all @@ -29,6 +30,8 @@ import java.io.File; */ public class ServerHandler extends RequestHandler { + private RoutingContext rc; + public ServerHandler( ServiceContext serviceContext, HashMap params ) { super( serviceContext, params ); @@ -37,7 +40,7 @@ public class ServerHandler extends RequestHandler { @Override public RoutingContext readRoutingContext() { - RoutingContext rc = new RoutingContext(); + rc = new RoutingContext(); String profile = params.get( "profile" ); // when custom profile replace prefix with directory path @@ -98,6 +101,20 @@ public class ServerHandler extends RequestHandler { { result = track.formatAsKml(); } + else if ("csv".equals(format)) + { + try + { + StringWriter sw = new StringWriter(); + BufferedWriter bw = new BufferedWriter(sw); + track.writeMessages( bw, rc ); + return sw.toString(); + } + catch (Exception ex) + { + return "Error: " + ex.getMessage(); + } + } else { System.out.println("unknown track format '" + format + "', using default"); result = track.formatAsGpx(); @@ -105,7 +122,30 @@ public class ServerHandler extends RequestHandler { return result; } - + + @Override + public String getMimeType() + { + // default + String result = "text/plain"; + + // optional, may be null + String format = params.get( "format" ); + if ( format != null ) + { + if ( "gpx".equals( format ) || "kml".equals( format ) ) + { + result = "text/xml"; + } + else if ( "csv".equals( format ) ) + { + result = "text/tab-separated-values"; + } + } + + return result; + } + private static OsmNodeNamed readPosition( String vlon, String vlat, String name ) { if ( vlon == null ) throw new IllegalArgumentException( "lon " + name + " not found in input" );