[Mapproxy-java] SF.net SVN: mapproxy:[24] tms/cache
Brought to you by:
pborissow
From: <pbo...@us...> - 2011-04-05 11:36:30
|
Revision: 24 http://mapproxy.svn.sourceforge.net/mapproxy/?rev=24&view=rev Author: pborissow Date: 2011-04-05 11:36:23 +0000 (Tue, 05 Apr 2011) Log Message: ----------- Implemented tile creation for TMS Modified Paths: -------------- Main.java config.xml server/RequestProcessor.java tms/TileRequest.java tms/TileServiceGrid.java tms/cache/TMSTileSource.java Modified: Main.java =================================================================== --- Main.java 2011-04-04 21:48:28 UTC (rev 23) +++ Main.java 2011-04-05 11:36:23 UTC (rev 24) @@ -27,7 +27,12 @@ * @param args the command line arguments */ public static void main(String[] args) throws Exception { + try{ new Main(args); + } + catch(Exception e){ + e.printStackTrace(); + } } //************************************************************************** Modified: config.xml =================================================================== --- config.xml 2011-04-04 21:48:28 UTC (rev 23) +++ config.xml 2011-04-05 11:36:23 UTC (rev 24) @@ -2,7 +2,7 @@ <mapproxy> <service> - <name>MapProxy Server 0.8.1 RC3</name> + <name>MapProxy Server 0.8.1 RC4</name> <description>Map proxy and tile cache for web map services</description> <port>9080</port> <numThreads>200</numThreads> Modified: server/RequestProcessor.java =================================================================== --- server/RequestProcessor.java 2011-04-04 21:48:28 UTC (rev 23) +++ server/RequestProcessor.java 2011-04-05 11:36:23 UTC (rev 24) @@ -86,9 +86,9 @@ } if (connection!=null) { - System.out.println(); - System.out.println("New Request From: " + connection.socket().getInetAddress()); - System.out.println("TimeStamp: " + new java.util.Date()); + //System.out.println(); + //System.out.println("New Request From: " + connection.socket().getInetAddress()); + //System.out.println("TimeStamp: " + new java.util.Date()); parseInputStream(connection); } @@ -144,8 +144,8 @@ //Print the requested URL - System.out.println(request.getMethod() + ": " + url); - System.out.println(); + //System.out.println(request.getMethod() + ": " + url); + //System.out.println(); System.out.println(request.toString()); @@ -264,119 +264,196 @@ } + //************************************************************************** + //** getLandingPage + //************************************************************************** + /** Used to construct an HTML landing page for the service. + */ + private void getLandingPage(RequestHeader request, SocketChannel connection) throws IOException { + javaxt.utils.Date date = new javaxt.utils.Date(); + date.setTimeZone("GMT"); + //Check whether this request is in the http cache + String key = "HOME"; + if (useCache(request, connection, key, date)) return; + + mapproxy.core.Service service = this.getMapProxy(); + + String url = request.getURL().toString(); + if (url.contains("?")) url = url.substring(0, url.indexOf("?")); + + String html = mapproxy.config.Config.base_config().get("html").toString(); + html = html.replace("@SERVICENAME", service.getName()); + html = html.replace("@SERVICEDESCRIPTION", service.getDescription()); + + StringBuffer layers = new StringBuffer(); + for (Layer layer : service.getLayers()){ + layers.append("<li>" + layer.getName() + "</li>"); + } + html = html.replace("@LAYERS", layers.toString()); + + + StringBuffer services = new StringBuffer(); + services.append("<li><a href=\"/WMS/?service=WMS&request=GetCapabilities&version=1.1.1\">WMS</a></li>"); + services.append("<li><a href=\"/TMS/?\">TMS</a></li>"); + services.append("<li><a href=\"/ArcGIS/?wsdl\">ArcGIS MapServer (SOAP)</a></li>"); + services.append("<li><a href=\"/ArcGIS/?f=json\">ArcGIS MapServer (REST)</a></li>"); + html = html.replace("@SERVICES", services.toString()); + + byte[] rsp = html.toString().getBytes("UTF-8"); + + + //Create a custom ETag + String eTag = "W/\"" + rsp.length + "-" + date.getTime() + "\""; + + + //Create http response header + String header = getHeader(date, "text/html", rsp.length, eTag, false); + byte[] hdr = header.getBytes(); + + + //Create a buffer to write bytes to the socket + int bufferSize = hdr.length + rsp.length; + java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(bufferSize); + + output.put(hdr); + output.put(rsp); + output.flip(); + synchronized(connection) { + connection.write(output); + } + + + //Update the http cache + this.updateCache(key, eTag); + + } + + + + //************************************************************************** - //** getTile + //** getCapabilities //************************************************************************** - /** Used to construct a response to a TMS Map request + /** Used to construct a response to a WMS GetCapabilities request */ - private void getTile(RequestHeader request, SocketChannel connection) throws IOException { + private void getCapabilities(RequestHeader request, SocketChannel connection) throws IOException { javaxt.utils.Date date = new javaxt.utils.Date(); date.setTimeZone("GMT"); + String url = request.getURL().toString(); + if (url.contains("?")) url = url.substring(0, url.indexOf("?")); + if (!url.endsWith("/")) url += "/"; + if (!url.toLowerCase().endsWith("/wms/")) url += "wms/"; - javaxt.utils.URL url = new javaxt.utils.URL(request.getURL()); - System.out.println(url); + //Get Capabilities + mapproxy.core.Service service = getMapProxy(); + String orgURL = service.getURL(); + service.setURL(url); + byte[] rsp = service.getCapabilities().toString("WMS").getBytes(); + service.setURL(orgURL); - //Check whether this request is in the http cache - mapproxy.tms.TileRequest req = new mapproxy.tms.TileRequest(url.toString()); - String key = req.id(); - String eTag = request.getProperty("if-none-match"); - String cacheControl = request.getProperty("cache-control"); + //Create a custom ETag + String eTag = "W/\"" + rsp.length + "-" + date.getTime() + "\""; - if (cacheControl==null) cacheControl = ""; - if (cacheControl.equalsIgnoreCase("no-cache")==false && eTag!=null){ + //Create http response header + String header = getHeader(date, "text/xml", rsp.length, eTag, false); + byte[] hdr = header.getBytes(); - String val = null; - synchronized (httpCache){ - val = httpCache.get(key); - } - if (val!=null){ - if (val.equals(eTag)){ - //Return 304 Response Code - StringBuffer header = new StringBuffer(); - header.append("HTTP/1.1 304 Not Modified\r\n"); - header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); - header.append("Server: " + serverName + "\r\n"); - header.append("ETag: " + eTag + "\r\n"); - header.append("\r\n"); + //Create a buffer to write bytes to the socket + int bufferSize = hdr.length + rsp.length; + java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(bufferSize); - System.out.println("304 Response!"); - //System.out.println(header); - byte[] response = header.toString().getBytes(); - java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(response.length); - output.put(response); - output.flip(); - synchronized(connection) { - connection.write(output); - } - return; - } - } - + output.put(hdr); + output.put(rsp); + output.flip(); + synchronized(connection) { + connection.write(output); } + } + + //************************************************************************** + //** getTile + //************************************************************************** + /** Used to construct a response to a TMS Map request + */ + private void getTile(RequestHeader request, SocketChannel connection) throws IOException { + + //Set local variables + String url = request.getURL().toString(); + javaxt.utils.Date date = new javaxt.utils.Date(); + date.setTimeZone("GMT"); + + + //Check whether this request is in the http cache + mapproxy.tms.TileRequest req = new mapproxy.tms.TileRequest(url); + String key = req.id(); + if (useCache(request, connection, key, date)) return; + + + //Find requested layer in the mapproxy service definition mapproxy.core.Service mapproxy = this.getMapProxy(); + mapproxy.core.Layer layer = mapproxy.getLayer(req.layer); - mapproxy.core.Layer layer = mapproxy.getLayers()[0]; + + //Instantiate the TMS cache and find the requested tile FileCache fileCache = (FileCache) layer.getParam("cache"); TileGrid grid = (TileGrid) layer.getParam("grid"); - - mapproxy.tms.cache.TMSTileSource tms = new mapproxy.tms.cache.TMSTileSource(grid, url.toString()); + mapproxy.tms.cache.TMSTileSource tms = new mapproxy.tms.cache.TMSTileSource(grid, url); CacheManager cacheManager = new CacheManager(fileCache, tms); Cache cache = new Cache(cacheManager, grid, true); + req.tile = new mapproxy.tms.TileServiceGrid(grid).internal_tile_coord(req.tile, true); - String format = req.format; - byte[] img; + String path = ""; try{ - req.tile = new mapproxy.tms.TileServiceGrid(grid).internal_tile_coord(req.tile, true); - img = new javaxt.io.File(cache.tile(req.tile).location).getBytes().toByteArray(); + path = cache.tile(req.tile).location; } catch(Exception e){ - img = new javaxt.io.Image(grid.tile_size[0], grid.tile_size[1]).getByteArray(format); + int[] coord = req.tile; + double[] bbox = grid.tile_bbox(coord[0], coord[1], coord[2]); + getImage(layer, grid.tile_size[0], grid.tile_size[1], fileCache.file_ext, bbox, grid.srs.toString()); + try{ + path = cache.tile(req.tile).location; + } + catch(Exception ex){ + } } + javaxt.io.File file = new javaxt.io.File(path); + //Convert the tile into a byte array + byte[] img; + String format = req.format; + if (file.exists() && file.getSize()>0){ + if (file.getExtension().equalsIgnoreCase(format)){ + img = file.getBytes().toByteArray(); + } + else{ + img = file.getImage().getByteArray(format); + } + } + else{ + img = new javaxt.io.Image(grid.tile_size[0], grid.tile_size[1]).getByteArray(format); + } + //Create http response header + String eTag = "W/\"" + img.length + "-" + date.getTime() + "\""; + String header = getHeader(date, "image/"+format, img.length, eTag, false); + byte[] hdr = header.getBytes(); + - - //Create a custom ETag - eTag = "W/\"" + img.length + "-" + date.getTime() + "\""; - - - //Write Response Header - StringBuffer header = new StringBuffer(); - header.append("HTTP/1.1 200 OK\r\n"); - header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); - header.append("Server: " + serverName + "\r\n"); - header.append("Content-Type: " + format + "\r\n"); - header.append("Content-Length: " + img.length + "\r\n"); - header.append("ETag: " + eTag + "\r\n"); - header.append("Last-Modified: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); //Sat, 23 Oct 2010 13:04:28 GMT - //header.append("Cache-Control: " + "max-age=" + (365*24*60*60) + "\r\n"); //vs "no-cache" - header.append("Accept-Ranges: bytes\r\n"); - header.append("Connection: Keep-Alive\r\n"); - - header.append("\r\n"); - - System.out.print("\r\n" + header.toString()); - - - //Convert the header into a byte array - byte[] hdr = header.toString().getBytes(); - - - //Create a buffer to write bytes to the socket + //Create a buffer to write response to the socket int bufferSize = img.length + hdr.length; java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(bufferSize); @@ -387,18 +464,12 @@ connection.write(output); } - System.out.println("Completed writing bytes..."); //Update the http cache - synchronized (httpCache){ - httpCache.put(key, eTag); - } - + this.updateCache(key, eTag); } - - //************************************************************************** //** getMap //************************************************************************** @@ -412,7 +483,7 @@ javaxt.utils.URL url = new javaxt.utils.URL(request.getURL()); - System.out.println(url); + //System.out.println(url); String layers = url.removeParameter("layers"); String bbox = url.removeParameter("bbox"); @@ -429,46 +500,13 @@ //Check whether this request is in the http cache String key = bbox + "|" + layers + "|" + format + "|" + width + "|" + height + "|" + srs; - - String eTag = request.getProperty("if-none-match"); - String cacheControl = request.getProperty("cache-control"); + if (useCache(request, connection, key, date)) return; - if (cacheControl==null) cacheControl = ""; - if (cacheControl.equalsIgnoreCase("no-cache")==false && eTag!=null){ - String val = null; - synchronized (httpCache){ - val = httpCache.get(key); - } - if (val!=null){ - if (val.equals(eTag)){ + mapproxy.core.Service mapproxy = this.getMapProxy(); - //Return 304 Response Code - StringBuffer header = new StringBuffer(); - header.append("HTTP/1.1 304 Not Modified\r\n"); - header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); - header.append("Server: " + serverName + "\r\n"); - header.append("ETag: " + eTag + "\r\n"); - header.append("\r\n"); - System.out.println("304 Response!"); - //System.out.println(header); - byte[] response = header.toString().getBytes(); - java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(response.length); - output.put(response); - output.flip(); - synchronized(connection) { - connection.write(output); - } - return; - } - } - - } - - - mapproxy.core.Service mapproxy = this.getMapProxy(); - + //Create image for each layer javaxt.io.Image image = new javaxt.io.Image(width, height); for (String layerName : layers.split(",")){ @@ -485,61 +523,12 @@ catch(Exception e){ } } - if (layer!=null){ - FileCache fileCache = (FileCache) layer.getParam("cache"); - TileGrid grid = (TileGrid) layer.getParam("grid"); - - String host = (String) layer.getParam("host"); - if (!host.contains("?")) host += "?"; - //host += url.getQueryString(); - - WMSMapRequestParams param = new WMSMapRequestParams(); - param.set("layers", (String) layer.getParam("layers")); - param.set("bbox", bbox); - - WMS111MapRequest req = new WMS111MapRequest(param, host); - req.params.size(new int[]{width, height}); - req.params.set("srs", srs); - - - - //if (format.equalsIgnoreCase("image/PNG24")) format = "jpeg"; //<-- This is crazy! If I return a 24 bit PNG, ArcMap doesn't display anything. If I return a JPEG, works like a champ - if (!format.toLowerCase().startsWith("image/")) format = "image/" + format; - if (format.equalsIgnoreCase("image/PNG24") && fileCache!=null) format = "image/png"; - format = "image/png"; - req.params.set("format", format); - - String protocol = (String) layer.getParam("protocol"); - if (protocol.equalsIgnoreCase("WMS")){ - - if (fileCache==null){ - image.addImage(new WMSClient(req).get_map(req), 0, 0, false); - } - else{ - WMSTileSource wms = new WMSTileSource(grid, new WMSClient(req)); - CacheManager cacheManager = new CacheManager(fileCache, wms); - Cache cache = new Cache(cacheManager, grid, true); - image.addImage(cache.image(req.params.bbox(), new SRS(req.params.srs()), req.params.size()), 0, 0, false); - } - } - else if (protocol.equalsIgnoreCase("MapServer")){ - - if (fileCache==null){ - image.addImage(new MapClient(req).get_map(req), 0, 0, false); - } - else{ - MapTileSource arcMapServer = new MapTileSource(grid, new MapClient(req)); - CacheManager cacheManager = new CacheManager(fileCache, arcMapServer); - Cache cache = new Cache(cacheManager, grid, true); - image.addImage(cache.image(req.params.bbox(), new SRS(req.params.srs()), req.params.size()), 0, 0, false); - } - - - } + image.addImage(getImage(layer, width, height, format, bbox, srs), 0, 0, false); } } + //Convert the image into a byte array //byte[] img = new javaxt.io.File("/temp/ArcGIS/ExportImage.png").getBytes().toByteArray(); @@ -548,37 +537,15 @@ - - //Create a custom ETag - eTag = "W/\"" + img.length + "-" + date.getTime() + "\""; + String eTag = "W/\"" + img.length + "-" + date.getTime() + "\""; - //Write Response Header - StringBuffer header = new StringBuffer(); - header.append("HTTP/1.1 200 OK\r\n"); - header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); - header.append("Server: " + serverName + "\r\n"); - header.append("Content-Type: " + format + "\r\n"); - header.append("Content-Length: " + img.length + "\r\n"); - header.append("ETag: " + eTag + "\r\n"); - header.append("Last-Modified: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); //Sat, 23 Oct 2010 13:04:28 GMT - //header.append("Cache-Control: " + "max-age=" + (365*24*60*60) + "\r\n"); //vs "no-cache" - header.append("Accept-Ranges: bytes\r\n"); - header.append("Connection: Keep-Alive\r\n"); + //Create http response header + String header = getHeader(date, format, img.length, eTag, false); + byte[] hdr = header.getBytes(); - //header.append("Proxy-Connection: Keep-Alive\r\n"); - //header.append("Via: 1.1 SPATCFW003\r\n"); - header.append("\r\n"); - - System.out.print("\r\n" + header.toString()); - - - //Convert the header into a byte array - byte[] hdr = header.toString().getBytes(); - - //Create a buffer to write bytes to the socket int bufferSize = img.length + hdr.length; java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(bufferSize); @@ -590,149 +557,86 @@ connection.write(output); } - System.out.println("Completed writing bytes..."); + //System.out.println("Completed writing bytes..."); + //Update the http cache - synchronized (httpCache){ - httpCache.put(key, eTag); - } + this.updateCache(key, eTag); } - private mapproxy.core.Service getMapProxy(){ - return ((mapproxy.core.Service) mapproxy.config.Config.base_config().get("mapproxy").toObject()); - } //************************************************************************** - //** getLandingPage + //** getImage //************************************************************************** - /** Used to construct an HTML landing page for the service. + /** Used to retrieve an image from a server for a given layer */ - private void getLandingPage(RequestHeader request, SocketChannel connection) throws IOException { + private javaxt.io.Image getImage(mapproxy.core.Layer layer, int width, int height, String format, String bbox, String srs){ - mapproxy.core.Service service = this.getMapProxy(); + FileCache fileCache = (FileCache) layer.getParam("cache"); + TileGrid grid = (TileGrid) layer.getParam("grid"); - javaxt.utils.Date date = new javaxt.utils.Date(); - date.setTimeZone("GMT"); + String host = (String) layer.getParam("host"); + if (!host.contains("?")) host += "?"; + //host += url.getQueryString(); - String url = request.getURL().toString(); - if (url.contains("?")) url = url.substring(0, url.indexOf("?")); - - String html = mapproxy.config.Config.base_config().get("html").toString(); - html = html.replace("@SERVICENAME", service.getName()); - html = html.replace("@SERVICEDESCRIPTION", service.getDescription()); + WMSMapRequestParams param = new WMSMapRequestParams(); + param.set("layers", (String) layer.getParam("layers")); + param.set("bbox", bbox); - StringBuffer layers = new StringBuffer(); - for (Layer layer : service.getLayers()){ - layers.append("<li>" + layer.getName() + "</li>"); - } - html = html.replace("@LAYERS", layers.toString()); + WMS111MapRequest req = new WMS111MapRequest(param, host); + req.params.size(new int[]{width, height}); + req.params.set("srs", srs); - - StringBuffer services = new StringBuffer(); - services.append("<li><a href=\"/WMS/?service=WMS&request=GetCapabilities&version=1.1.1\">WMS</a></li>"); - services.append("<li><a href=\"/ArcGIS/?wsdl\">ArcGIS MapServer (SOAP)</a></li>"); - services.append("<li><a href=\"/ArcGIS/?f=json\">ArcGIS MapServer (REST)</a></li>"); - html = html.replace("@SERVICES", services.toString()); - byte[] rsp = html.toString().getBytes("UTF-8"); + //if (format.equalsIgnoreCase("image/PNG24")) format = "jpeg"; //<-- This is crazy! If I return a 24 bit PNG, ArcMap doesn't display anything. If I return a JPEG, works like a champ + if (!format.toLowerCase().startsWith("image/")) format = "image/" + format; + if (format.equalsIgnoreCase("image/PNG24") && fileCache!=null) format = "image/png"; + //format = "image/png"; + req.params.set("format", format); - //Create a custom ETag - String eTag = "W/\"" + rsp.length + "-" + date.getTime() + "\""; + String protocol = (String) layer.getParam("protocol"); + if (protocol.equalsIgnoreCase("WMS")){ + if (fileCache==null){ + return new WMSClient(req).get_map(req); + } + else{ + WMSTileSource wms = new WMSTileSource(grid, new WMSClient(req)); + CacheManager cacheManager = new CacheManager(fileCache, wms); + Cache cache = new Cache(cacheManager, grid, true); + return cache.image(req.params.bbox(), new SRS(req.params.srs()), req.params.size()); + } + } + else if (protocol.equalsIgnoreCase("MapServer")){ - //Construct Response Header - StringBuffer header = new StringBuffer(); - header.append("HTTP/1.1 200 OK\r\n"); - header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); - header.append("Server: " + serverName + "\r\n"); - header.append("Content-Type: text/html\r\n"); - header.append("Content-Length: " + rsp.length + "\r\n"); - header.append("ETag: " + eTag + "\r\n"); - header.append("Last-Modified: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); //Sat, 23 Oct 2010 13:04:28 GMT - //header.append("Cache-Control: " + "max-age=" + (365*24*60*60) + "\r\n"); //vs "no-cache" - header.append("\r\n"); + if (fileCache==null){ + return new MapClient(req).get_map(req); + } + else{ + MapTileSource arcMapServer = new MapTileSource(grid, new MapClient(req)); + CacheManager cacheManager = new CacheManager(fileCache, arcMapServer); + Cache cache = new Cache(cacheManager, grid, true); + return cache.image(req.params.bbox(), new SRS(req.params.srs()), req.params.size()); + } - //System.out.println(header); - //Convert the header into a byte array - byte[] hdr = header.toString().getBytes(); + } - //Create a buffer to write bytes to the socket - int bufferSize = hdr.length + rsp.length; - java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(bufferSize); + return null; - output.put(hdr); - output.put(rsp); - output.flip(); - synchronized(connection) { - connection.write(output); - } } + private javaxt.io.Image getImage(mapproxy.core.Layer layer, int width, int height, String format, double[] bbox, String srs){ + return this.getImage(layer, width, height, format, bbox[0] + "," + bbox[1] + "," + bbox[2] + "," + bbox[3], srs); + } - //************************************************************************** - //** getCapabilities - //************************************************************************** - /** Used to construct a response to a WMS GetCapabilities request - */ - private void getCapabilities(RequestHeader request, SocketChannel connection) throws IOException { - javaxt.utils.Date date = new javaxt.utils.Date(); - date.setTimeZone("GMT"); - - String url = request.getURL().toString(); - if (url.contains("?")) url = url.substring(0, url.indexOf("?")); - if (!url.endsWith("/")) url += "/"; - if (!url.toLowerCase().endsWith("/wms/")) url += "wms/"; - - //Get Capabilities - - mapproxy.core.Service service = getMapProxy(); - String orgURL = service.getURL(); - service.setURL(url); - byte[] rsp = service.getCapabilities().toString("WMS").getBytes(); - service.setURL(orgURL); - - - //Create a custom ETag - String eTag = "W/\"" + rsp.length + "-" + date.getTime() + "\""; - - - //Construct Response Header - StringBuffer header = new StringBuffer(); - header.append("HTTP/1.1 200 OK\r\n"); - header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); - header.append("Server: " + serverName + "\r\n"); - header.append("Content-Type: text/xml\r\n"); - header.append("Content-Length: " + rsp.length + "\r\n"); - header.append("ETag: " + eTag + "\r\n"); - header.append("Last-Modified: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); //Sat, 23 Oct 2010 13:04:28 GMT - //header.append("Cache-Control: " + "max-age=" + (365*24*60*60) + "\r\n"); //vs "no-cache" - header.append("\r\n"); - - //System.out.println(header); - - //Convert the header into a byte array - byte[] hdr = header.toString().getBytes(); - - //Create a buffer to write bytes to the socket - int bufferSize = hdr.length + rsp.length; - java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(bufferSize); - - output.put(hdr); - output.put(rsp); - output.flip(); - synchronized(connection) { - connection.write(output); - } - } - //************************************************************************** //** getArcMapImage //************************************************************************** @@ -1152,8 +1056,104 @@ return ""; } + //************************************************************************** + //** getHeader + //************************************************************************** + /** Used to construct an http response header + */ + private String getHeader(javaxt.utils.Date date, String format, long length, String eTag, boolean gzip){ + StringBuffer header = new StringBuffer(); + header.append("HTTP/1.1 200 OK\r\n"); + header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); + header.append("Server: " + serverName + "\r\n"); + header.append("Content-Type: " + format + "\r\n"); + header.append("Content-Length: " + length + "\r\n"); + header.append("ETag: " + eTag + "\r\n"); + header.append("Last-Modified: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); //Sat, 23 Oct 2010 13:04:28 GMT + //header.append("Cache-Control: " + "max-age=" + (365*24*60*60) + "\r\n"); //vs "no-cache" + //header.append("Accept-Ranges: bytes\r\n"); + header.append("Connection: Keep-Alive\r\n"); + if (gzip){ + header.append("Content-Encoding: gzip\r\n"); + } + header.append("\r\n"); + //System.out.print("\r\n" + header.toString()); + return header.toString(); + } + + //************************************************************************** + //** useCache + //************************************************************************** + /** Used to check whether the request is in the http cache. If so, sends a + * 304 http response and returns true. Otherwise, nothing is sent back to + * the client and the method returns false. + */ + private boolean useCache(RequestHeader request, SocketChannel connection, String key, javaxt.utils.Date date) throws IOException { + + String eTag = request.getProperty("if-none-match"); + String cacheControl = request.getProperty("cache-control"); + + if (cacheControl==null) cacheControl = ""; + if (cacheControl.equalsIgnoreCase("no-cache")==false && eTag!=null){ + + String val = null; + synchronized (httpCache){ + val = httpCache.get(key); + } + if (val!=null){ + if (val.equals(eTag)){ + + //Return 304 Response Code + StringBuffer header = new StringBuffer(); + header.append("HTTP/1.1 304 Not Modified\r\n"); + header.append("Date: " + date.toString("EEE, dd MMM yyyy HH:mm:ss zzz") + "\r\n"); + header.append("Server: " + serverName + "\r\n"); + header.append("ETag: " + eTag + "\r\n"); + header.append("\r\n"); + + System.out.println("304 Response!"); + //System.out.println(header); + byte[] response = header.toString().getBytes(); + java.nio.ByteBuffer output = java.nio.ByteBuffer.allocateDirect(response.length); + output.put(response); + output.flip(); + synchronized(connection) { + connection.write(output); + } + return true; + } + } + + } + + return false; + } + + + //************************************************************************** + //** updateCache + //************************************************************************** + /** Used to update the http cache. + */ + private void updateCache(String key, String eTag){ + synchronized (httpCache){ + httpCache.put(key, eTag); //<-- Need to make this smarter so we don't run out of memory... + } + } + + + private boolean compressResponse(RequestHeader request){ + return request.getProperty("Accept-Encoding").toLowerCase().contains("gzip"); + } + + + //************************************************************************** + //** gzip + //************************************************************************** + /** Used gzip compress a byte array + */ private byte[] gzip(byte[] img) throws IOException { System.out.println(img.length + " bytes"); @@ -1167,4 +1167,9 @@ return img; } + + private mapproxy.core.Service getMapProxy(){ + return ((mapproxy.core.Service) mapproxy.config.Config.base_config().get("mapproxy").toObject()); + } + } \ No newline at end of file Modified: tms/TileRequest.java =================================================================== --- tms/TileRequest.java 2011-04-04 21:48:28 UTC (rev 23) +++ tms/TileRequest.java 2011-04-05 11:36:23 UTC (rev 24) @@ -4,12 +4,13 @@ //** TileRequest Class //****************************************************************************** /** - * + * Used to represent a TMS request. * ******************************************************************************/ public class TileRequest { + private String url; public String layer; public String format = "png"; public int[] tile; @@ -22,6 +23,7 @@ */ public TileRequest(String url){ + this.url = url; format = url.substring(url.lastIndexOf(".")+1); url = url.substring(0, url.lastIndexOf(".")); int y = cint(url.substring(url.lastIndexOf("/")+1)); @@ -33,9 +35,24 @@ tile = new int[]{x,y,z}; layer = url.substring(url.lastIndexOf("/")+1); - System.out.println("format: " + format); - System.out.println("layer: " + layer); - System.out.println("tile: " + mapproxy.core.Python.cstr(tile)); + if (layer.contains("%")){ + try{ + layer = new java.net.URLDecoder().decode(layer, "UTF-8"); + } + catch(Exception e){ + //Try to decode the string manually + String find[] = new String[]{"%20","%2C","%2F","%3A"}; + String replace[] = new String[]{" ",",","/",":"}; + for (int i=0; i<find.length; i++){ + layer = layer.replace(find[i],replace[i]); + } + } + } + + + //System.out.println("format: " + format); + //System.out.println("layer: " + layer); + //System.out.println("tile: " + mapproxy.core.Python.cstr(tile)); } public String id(){ @@ -49,4 +66,9 @@ return javaxt.utils.string.cint(s); } + + public String toString(){ + return this.url; + } + } Modified: tms/TileServiceGrid.java =================================================================== --- tms/TileServiceGrid.java 2011-04-04 21:48:28 UTC (rev 23) +++ tms/TileServiceGrid.java 2011-04-05 11:36:23 UTC (rev 24) @@ -137,10 +137,6 @@ if (z < 0) return null; - //Added hack for OpenLayers - if (this.grid.srs.isGeographic()){ - //z *= 2; - } if (use_profiles && this._skip_first_level) z += 1; @@ -151,7 +147,7 @@ //x = x+2; //y = y+1; //z = 4; - System.out.println("z: " + z); + //System.out.println("z: " + z); return this.grid.limit_tile(new int[]{x, y, z}); } Modified: tms/cache/TMSTileSource.java =================================================================== --- tms/cache/TMSTileSource.java 2011-04-04 21:48:28 UTC (rev 23) +++ tms/cache/TMSTileSource.java 2011-04-05 11:36:23 UTC (rev 24) @@ -2,7 +2,7 @@ import mapproxy.tms.*; import mapproxy.core.cache.*; import mapproxy.core.grid.*; -import mapproxy.core.image.*; +//import mapproxy.core.image.*; //import mapproxy.wms.request.*; import mapproxy.core.Python; @@ -93,7 +93,6 @@ * tiles. * @param tile_map tile_collection */ - public TileCollection create_tile(_Tile tile, TileCollection tile_map){ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |