public static byte[] getImage(int x, int y, int zoom, HttpMapSource mapSource) throws IOException, InterruptedException, UnrecoverableDownloadException { MapSpace mapSpace = mapSource.getMapSpace(); int maxTileIndex = mapSpace.getMaxPixels(zoom) / mapSpace.getTileSize(); if (x > maxTileIndex) throw new RuntimeException("Invalid tile index x=" + x + " for zoom " + zoom); if (y > maxTileIndex) throw new RuntimeException("Invalid tile index y=" + y + " for zoom " + zoom); TileStore ts = TileStore.getInstance(); // Thread.sleep(2000); // Test code for creating random download failures // if (Math.random()>0.7) throw new // IOException("intentionally download error"); Settings s = Settings.getInstance(); TileStoreEntry tile = null; if (s.tileStoreEnabled) { // Copy the file from the persistent tilestore instead of // downloading it from internet. tile = ts.getTile(x, y, zoom, mapSource); boolean expired = isTileExpired(tile); if (tile != null) { if (expired) { log.trace("Expired: " + mapSource.getName() + " " + tile); } else { log.trace("Tile of map source " + mapSource.getName() + " used from tilestore"); byte[] data = tile.getData(); notifyCachedTileUsed(data.length); return data; } } } byte[] data = null; if (tile == null) { data = downloadTileAndUpdateStore(x, y, zoom, mapSource); notifyTileDownloaded(data.length); } else { byte[] updatedData = updateStoredTile(tile, mapSource); if (updatedData != null) { data = updatedData; notifyTileDownloaded(data.length); } else { data = tile.getData(); notifyCachedTileUsed(data.length); } } return data; }