package tim.prune.function.srtm; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.net.MalformedURLException; import java.net.URL; import java.net.HttpURLConnection; import tim.prune.App; import tim.prune.GpsPrune; import tim.prune.config.Config; /** * Create an account at: https://urs.earthdata.nasa.gov/users/new * Data policy: https://lpdaac.usgs.gov/data/data-citation-and-policies/ * */ public class SrtmGl1Source extends SrtmSource { /** URL prefix for all tiles */ private static final String URL_PREFIX = "https://e4ftl01.cr.usgs.gov/MEASURES/SRTMGL1.003/2000.02.11/"; /** Auth URL */ private static final String AUTH_URL = "urs.earthdata.nasa.gov"; public SrtmGl1Source() { CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); } public String getName() { return "SRTMGL1_v003"; } protected String getSourceExtension() { return ".SRTMGL1.hgt.zip"; } private URL buildUrl(SrtmTile inTile) throws SrtmSourceException { try { return new URL(URL_PREFIX + inTile.getTileName() + getSourceExtension()); } catch (MalformedURLException e) { throw new SrtmSourceException(e.getMessage()); } } public boolean isReadyToUse() { return getAuth() != null; } private String getAuth() { String authString = Config.getConfigString(Config.KEY_EARTHDATA_AUTH); if (authString != null) { return "Basic " + authString; } else { return null; } } public boolean downloadTile(SrtmTile inTile) throws SrtmSourceException { return downloadTile(inTile, getAuth()); } private boolean downloadTile(SrtmTile inTile, String auth) throws SrtmSourceException { URL tileUrl = buildUrl(inTile); File outputFile = getCacheFileName(inTile); System.out.println("Download: Need to download: " + tileUrl); try { HttpURLConnection conn = (HttpURLConnection) tileUrl.openConnection(); long fileLength = 0L; // Define streams FileOutputStream outStream = null; InputStream inStream = null; // Documentation about HTTP interface at: // https://wiki.earthdata.nasa.gov/display/EL/How+To+Access+Data+With+Java int redirects = 0; while (redirects < 10) { redirects++; conn.setRequestProperty("User-Agent", "GpsPrune v" + GpsPrune.VERSION_NUMBER); conn.setInstanceFollowRedirects(false); conn.setUseCaches(false); if (conn.getURL().getHost().equals(AUTH_URL)) { conn.setRequestProperty("Authorization", auth); } int status = conn.getResponseCode(); if (status == 200) { // Found the tile, we're good inStream = conn.getInputStream(); fileLength = conn.getContentLengthLong(); break; } else if (status == 302) { // redirected to SSO server then back to original resource String newUrl = conn.getHeaderField("Location"); conn = (HttpURLConnection) (new URL(newUrl)).openConnection(); } else if (status == 404) { throw new SrtmSourceException("Tile " + inTile.getTileName() + " not found at " + conn.getURL()); } else { throw new SrtmSourceException("Invalid response from server: " + status + conn.getResponseMessage()); } } // _progress.setValue(t * 10 + 1); outStream = new FileOutputStream(outputFile); // Copy all the bytes to the file int c; long written = 0L; while ((c = inStream.read()) != -1) { outStream.write(c); written++; // _progress.setValue(t * 10 + 1 + (int) ((10 * written) / fileLength)); } // Make sure streams are closed try {inStream.close();} catch (Exception e) {} try {outStream.close();} catch (Exception e) {} return true; } catch (IOException e) { throw new SrtmSourceException("Error while downloading tile " + inTile.getTileName() + ": "+e.getMessage()); } } public boolean testAuth(String auth) throws SrtmSourceException { // The only thing special about this tile is that it's the smallest tile // It covers small islands in Malaysia SrtmTile testTile = new SrtmTile(7, 117); if (isCached(testTile)) { getCacheFileName(testTile).delete(); } return downloadTile(testTile, auth); } public int getRowSize(SrtmTile inTile) { return 3601; } }