From: Keith Packard Date: Wed, 28 May 2014 07:42:24 +0000 (-0700) Subject: altosuilib: Add google maps API key, configured with -with-google-key X-Git-Tag: 1.3.2.2~64 X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=commitdiff_plain;h=3773e89c47d356c4df58edc5725c33bca89b9605;ds=sidebyside altosuilib: Add google maps API key, configured with -with-google-key This places the actual key outside of the repository, allowing the user to configure the name of the file containing the key. By default, this pulls the key from $HOME/altusmetrumllc/google-maps-api-key. With the key present, there are no longer any rate limits to loading map data. Signed-off-by: Keith Packard --- diff --git a/altosuilib/AltosSiteMap.java b/altosuilib/AltosSiteMap.java index ee9b8c05..d9ea564c 100644 --- a/altosuilib/AltosSiteMap.java +++ b/altosuilib/AltosSiteMap.java @@ -263,8 +263,6 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay, Mous AltosSiteMap asm = new AltosSiteMap(true); asm.centre = asm.getBaseLocation(lat, lng); - //Point2D.Double p = new Point2D.Double(); - //Point2D.Double p2; int dx = -w/2, dy = -h/2; for (int y = dy; y < h+dy; y++) { for (int x = dx; x < w+dx; x++) { @@ -334,8 +332,10 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay, Mous private void initMaps(double lat, double lng) { setBaseLocation(lat, lng); - for (AltosSiteMapTile tile : mapTiles.values()) + for (AltosSiteMapTile tile : mapTiles.values()) { tile.clearMap(); + tile.set_status(AltosSiteMapCache.loading); + } Thread thread = new Thread() { public void run() { for (Point k : mapTiles.keySet()) @@ -369,8 +369,13 @@ public class AltosSiteMap extends JComponent implements AltosFlightDisplay, Mous format_string = "jpg"; else format_string = "png32"; - return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&sensor=false&maptype=%s&format=%s", - lat, lng, zoom, px_size, px_size, maptype_names[maptype], format_string); + + if (AltosUIVersion.has_google_maps_api_key()) + return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&sensor=false&maptype=%s&format=%s&key=%s", + lat, lng, zoom, px_size, px_size, maptype_names[maptype], format_string, AltosUIVersion.google_maps_api_key); + else + return String.format("http://maps.google.com/maps/api/staticmap?center=%.6f,%.6f&zoom=%d&size=%dx%d&sensor=false&maptype=%s&format=%s", + lat, lng, zoom, px_size, px_size, maptype_names[maptype], format_string); } boolean initialised = false; diff --git a/altosuilib/AltosSiteMapCache.java b/altosuilib/AltosSiteMapCache.java index 6e6046bc..c4316dab 100644 --- a/altosuilib/AltosSiteMapCache.java +++ b/altosuilib/AltosSiteMapCache.java @@ -45,6 +45,67 @@ public class AltosSiteMapCache { static private Object fetch_lock = new Object(); + private static int fetch_one(File file, String url) { + URL u; + + System.out.printf("Loading URL %s\n", url); + try { + u = new URL(url); + } catch (java.net.MalformedURLException e) { + return bad_request; + } + + byte[] data; + URLConnection uc = null; + try { + uc = u.openConnection(); + String type = uc.getContentType(); + int contentLength = uc.getContentLength(); + if (uc instanceof HttpURLConnection) { + int response = ((HttpURLConnection) uc).getResponseCode(); + switch (response) { + case HttpURLConnection.HTTP_FORBIDDEN: + case HttpURLConnection.HTTP_PAYMENT_REQUIRED: + case HttpURLConnection.HTTP_UNAUTHORIZED: + forbidden_time = System.nanoTime(); + forbidden_set = true; + return forbidden; + } + } + InputStream in = new BufferedInputStream(uc.getInputStream()); + int bytesRead = 0; + int offset = 0; + data = new byte[contentLength]; + while (offset < contentLength) { + bytesRead = in.read(data, offset, data.length - offset); + if (bytesRead == -1) + break; + offset += bytesRead; + } + in.close(); + + if (offset != contentLength) + return failed; + + } catch (IOException e) { + return failed; + } + + try { + FileOutputStream out = new FileOutputStream(file); + out.write(data); + out.flush(); + out.close(); + } catch (FileNotFoundException e) { + return bad_request; + } catch (IOException e) { + if (file.exists()) + file.delete(); + return bad_request; + } + return success; + } + public static int fetch_map(File file, String url) { if (file.exists()) return success; @@ -52,75 +113,27 @@ public class AltosSiteMapCache { if (forbidden_set && (System.nanoTime() - forbidden_time) < forbidden_interval) return forbidden; - synchronized (fetch_lock) { - URL u; - long startTime = System.nanoTime(); - - try { - u = new URL(url); - } catch (java.net.MalformedURLException e) { - return bad_request; - } - - byte[] data; - URLConnection uc = null; - try { - uc = u.openConnection(); - String type = uc.getContentType(); - int contentLength = uc.getContentLength(); - if (uc instanceof HttpURLConnection) { - int response = ((HttpURLConnection) uc).getResponseCode(); - switch (response) { - case HttpURLConnection.HTTP_FORBIDDEN: - case HttpURLConnection.HTTP_PAYMENT_REQUIRED: - case HttpURLConnection.HTTP_UNAUTHORIZED: - forbidden_time = System.nanoTime(); - forbidden_set = true; - return forbidden; + int status = bad_request; + + if (!AltosUIVersion.has_google_maps_api_key()) { + synchronized (fetch_lock) { + long startTime = System.nanoTime(); + status = fetch_one(file, url); + if (status == success) { + long duration_ms = (System.nanoTime() - startTime) / 1000000; + if (duration_ms < google_maps_ratelimit_ms) { + try { + Thread.sleep(google_maps_ratelimit_ms - duration_ms); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } } } - InputStream in = new BufferedInputStream(uc.getInputStream()); - int bytesRead = 0; - int offset = 0; - data = new byte[contentLength]; - while (offset < contentLength) { - bytesRead = in.read(data, offset, data.length - offset); - if (bytesRead == -1) - break; - offset += bytesRead; - } - in.close(); - - if (offset != contentLength) - return failed; - - } catch (IOException e) { - return failed; - } - - try { - FileOutputStream out = new FileOutputStream(file); - out.write(data); - out.flush(); - out.close(); - } catch (FileNotFoundException e) { - return bad_request; - } catch (IOException e) { - if (file.exists()) - file.delete(); - return bad_request; - } - - long duration_ms = (System.nanoTime() - startTime) / 1000000; - if (duration_ms < google_maps_ratelimit_ms) { - try { - Thread.sleep(google_maps_ratelimit_ms - duration_ms); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } } - return success; + } else { + status = fetch_one(file, url); } + return status; } static final int min_cache_size = 9; diff --git a/altosuilib/AltosUIVersion.java.in b/altosuilib/AltosUIVersion.java.in index 3f629560..0edb5c04 100644 --- a/altosuilib/AltosUIVersion.java.in +++ b/altosuilib/AltosUIVersion.java.in @@ -19,4 +19,10 @@ package org.altusmetrum.altosuilib_2; public class AltosUIVersion { public final static String version = "@VERSION@"; + + public final static String google_maps_api_key = @GOOGLEKEY@; + + static boolean has_google_maps_api_key() { + return google_maps_api_key != null && google_maps_api_key.length() > 1; + } } diff --git a/configure.ac b/configure.ac index d2d87754..dfbe59bc 100644 --- a/configure.ac +++ b/configure.ac @@ -162,6 +162,20 @@ AM_CONDITIONAL(FATINSTALL, [test "x$FATDIR" != "xnone"]) AC_SUBST(FATDIR) +AC_ARG_WITH(google-key, AS_HELP_STRING([--with-google-key=PATH], + [Set the file to read the google maps API key from (defaults to ~/altusmetrumllc/google-maps-api-key)]), + [GOOGLEKEYFILE=$withval], [GOOGLEKEYFILE=$HOME/altusmetrumllc/google-maps-api-key]) + +if test -r "$GOOGLEKEYFILE" -a -s "$GOOGLEKEYFILE"; then + GOOGLEKEY='"'`cat "$GOOGLEKEYFILE"`'"' + HAVE_GOOGLE_KEY="yes" +else + GOOGLEKEY='null' + HAVE_GOOGLE_KEY="no" +fi + +AC_SUBST(GOOGLEKEY) + AC_PROG_CC AC_PROG_INSTALL AC_PROG_LN_S @@ -537,11 +551,12 @@ echo " STlink support..............: ${HAVE_STLINK}" echo " Local pdclib................: ${HAVE_PDCLIB}" echo " i386 and amd64 libaltos.....: ${MULTI_ARCH}" echo "" -echo " Java paths" +echo " Java" echo " freetts.....................: ${FREETTS}" echo " jfreechart..................: ${JFREECHART}" echo " jcommon.....................: ${JCOMMON}" echo " JVM include.................: ${JVM_INCLUDE}" +echo " Google maps API key.........: ${HAVE_GOOGLE_KEY}" if test x${ANDROID_SDK} != "xno"; then echo "" echo " Android path"