// License: WTFPL. For details, see LICENSE file. package iodb; import java.util.Arrays; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType; /** * Generate unique imagery identifier based on its type and URL. * * @author Zverik * @license WTFPL */ public final class ImageryIdGenerator { private ImageryIdGenerator() { // Hide default constructor for utilities classes } public static String getImageryID(String url, ImageryType type) { if (url == null) return null; // predefined layers if (ImageryType.BING.equals(type) || url.contains("tiles.virtualearth.net")) return "bing"; if (ImageryType.SCANEX.equals(type) && url.toLowerCase().equals("irs")) return "scanex_irs"; if (ImageryType.TMS.equals(type) && url.toLowerCase().matches(".+tiles\\.mapbox\\.com/v[3-9]/openstreetmap\\.map.*")) return "mapbox"; boolean isWMS = ImageryType.WMS.equals(type); // System.out.println(url); // Remove protocol int i = url.indexOf("://"); url = url.substring(i + 3); // Split URL into address and query string i = url.indexOf('?'); String query = ""; if (i > 0) { query = url.substring(i); url = url.substring(0, i); } // Parse query parameters into a sorted map final Set<String> removeWMSParams = new TreeSet<>(Arrays.asList(new String[] { "srs", "width", "height", "bbox", "service", "request", "version", "format", "styles", "transparent" })); Map<String, String> qparams = new TreeMap<>(); String[] qparamsStr = query.length() > 1 ? query.substring(1).split("&") : new String[0]; for (String param : qparamsStr) { String[] kv = param.split("="); kv[0] = kv[0].toLowerCase(); // WMS: if this is WMS, remove all parameters except map and layers if (isWMS && removeWMSParams.contains(kv[0])) continue; // TMS: skip parameters with variable values and Mapbox's access token if ((kv.length > 1 && kv[1].indexOf('{') >= 0 && kv[1].indexOf('}') > 0) || kv[0].equals("access_token")) continue; qparams.put(kv[0].toLowerCase(), kv.length > 1 ? kv[1] : null); } // Reconstruct query parameters StringBuilder sb = new StringBuilder(); for (String qk : qparams.keySet()) { if (sb.length() > 0) sb.append('&'); else if (query.length() > 0) sb.append('?'); sb.append(qk).append('=').append(qparams.get(qk)); } query = sb.toString(); // TMS: remove /{zoom} and /{y}.png parts url = url.replaceAll("\\/\\{[^}]+\\}(?:\\.\\w+)?", ""); // TMS: remove variable parts url = url.replaceAll("\\{[^}]+\\}", ""); while (url.contains("..")) { url = url.replace("..", "."); } if (url.startsWith(".")) url = url.substring(1); return url + query; } }