diff options
| -rw-r--r-- | altosuilib/AltosSiteMap.java | 15 | ||||
| -rw-r--r-- | altosuilib/AltosSiteMapCache.java | 143 | ||||
| -rw-r--r-- | altosuilib/AltosUIVersion.java.in | 6 | ||||
| -rw-r--r-- | configure.ac | 17 | 
4 files changed, 110 insertions, 71 deletions
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"  | 
