altos-mapd: Check nearest portion of tile to launch site
[fw/altos] / map-server / altos-mapd / AltosMapdClient.java
index 70ceae82275800e817bc1ec4e820c293458f2f55..6c95da8f7b705b6d02df2ab7f683e434b6dd1f5d 100644 (file)
@@ -26,7 +26,10 @@ public class AltosMapdClient extends Thread implements AltosMapStoreListener {
        private AltosJson       request;
        private AltosJson       reply;
 
+       private int             http_status;
+
        private void set_status(int status) {
+               http_status = status;
                reply.put("status", status);
        }
 
@@ -66,62 +69,65 @@ public class AltosMapdClient extends Thread implements AltosMapStoreListener {
                try {
                        request = AltosJson.fromInputStream(socket.getInputStream());
 
-                       double  lat = request.get_double("lat", AltosLib.MISSING);
-                       double  lon = request.get_double("lon", AltosLib.MISSING);
-                       int     zoom = request.get_int("zoom", AltosLib.MISSING);
-                       String  addr = request.get_string("remote_addr", null);
-
-                       if (lat == AltosLib.MISSING ||
-                           lon == AltosLib.MISSING ||
-                           zoom == AltosLib.MISSING ||
-                           addr == null)
-                       {
+                       if (request == null) {
                                set_status(400);
-                       } else if (!AltosMapd.check_lat_lon(lat, lon)) {
-                               set_status(403);        /* Forbidden */
+                               System.out.printf("client failed %d\n", http_status);
                        } else {
 
-                               store_ready = new Semaphore(0);
+                               double  lat = request.get_double("lat", AltosLib.MISSING);
+                               double  lon = request.get_double("lon", AltosLib.MISSING);
+                               int     zoom = request.get_int("zoom", AltosLib.MISSING);
+                               String  addr = request.get_string("remote_addr", null);
 
-                               System.out.printf("Fetching tile for %g %g %d\n", lat, lon, zoom);
+                               if (lat == AltosLib.MISSING ||
+                                   lon == AltosLib.MISSING ||
+                                   zoom == AltosLib.MISSING ||
+                                   addr == null)
+                               {
+                                       set_status(400);
+                               } else if (!AltosMapd.check_lat_lon(lat, lon, zoom)) {
+                                       set_status(403);        /* Forbidden */
+                               } else {
 
-                               AltosMapStore   map_store = AltosMapStore.get(new AltosLatLon(lat, lon),
-                                                                             zoom,
-                                                                             AltosMapd.maptype,
-                                                                             AltosMapd.px_size,
-                                                                             AltosMapd.scale);
-                               int status;
+                                       store_ready = new Semaphore(0);
 
-                               if (map_store == null) {
-                                       System.out.printf("no store?\n");
-                                       status = AltosMapTile.failed;
-                               } else {
-                                       map_store.add_listener(this);
+                                       AltosMapStore   map_store = AltosMapStore.get(new AltosLatLon(lat, lon),
+                                                                                     zoom,
+                                                                                     AltosMapd.maptype,
+                                                                                     AltosMapd.px_size,
+                                                                                     AltosMapd.scale);
+                                       int status;
 
-                                       System.out.printf("Waiting for tile\n");
+                                       if (map_store == null) {
+                                               status = AltosMapTile.failed;
+                                       } else {
+                                               map_store.add_listener(this);
 
-                                       try {
-                                               store_ready.acquire();
-                                       } catch (Exception ie) {
-                                       }
+                                               try {
+                                                       store_ready.acquire();
+                                               } catch (Exception ie) {
+                                               }
 
-                                       status = map_store.status();
-                               }
+                                               status = map_store.status();
+                                       }
 
-                               if (status == AltosMapTile.fetched || status == AltosMapTile.loaded) {
-                                       set_status(200);
-                                       set_file(map_store.file);
-                               } else if (status == AltosMapTile.failed) {
-                                       set_status(404);
-                               } else if (status == AltosMapTile.fetching) {
-                                       set_status(408);
-                               } else if (status == AltosMapTile.bad_request) {
-                                       set_status(400);
-                               } else if (status == AltosMapTile.forbidden) {
-                                       set_status(403);
-                               } else {
-                                       set_status(400);
+                                       if (status == AltosMapTile.fetched || status == AltosMapTile.loaded) {
+                                               set_status(200);
+                                               set_file(map_store.file);
+                                       } else if (status == AltosMapTile.failed) {
+                                               set_status(404);
+                                       } else if (status == AltosMapTile.fetching) {
+                                               set_status(408);
+                                       } else if (status == AltosMapTile.bad_request) {
+                                               set_status(400);
+                                       } else if (status == AltosMapTile.forbidden) {
+                                               set_status(403);
+                                       } else {
+                                               set_status(400);
+                                       }
                                }
+                               System.out.printf("%s: %.6f %.6f %d status %d\n",
+                                                 addr, lat, lon, zoom, http_status);
                        }
                } catch (Exception e) {
                        System.out.printf("client exception %s\n", e.toString());
@@ -140,7 +146,6 @@ public class AltosMapdClient extends Thread implements AltosMapStoreListener {
                                socket.close();
                        } catch (IOException ie) {
                        }
-                       System.out.printf("client done\n");
                }
        }