X-Git-Url: https://gitweb.fperrin.net/?a=blobdiff_plain;f=tim%2Fprune%2Fgui%2Fmap%2FMapSource.java;h=d838ef34d99d47a7f7fe524b8a63e87cf98609b6;hb=4d5796d02a15808311c09448d79e6e7d1de9d636;hp=c2311ae186ac89a077d265be2fba3b35973787b6;hpb=c0387c124840c9407e040600fda88f3c3e8f6aa6;p=GpsPrune.git diff --git a/tim/prune/gui/map/MapSource.java b/tim/prune/gui/map/MapSource.java index c2311ae..d838ef3 100644 --- a/tim/prune/gui/map/MapSource.java +++ b/tim/prune/gui/map/MapSource.java @@ -2,6 +2,8 @@ package tim.prune.gui.map; import java.net.MalformedURLException; import java.net.URL; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Class to represent any map source, whether an OsmMapSource @@ -11,6 +13,13 @@ import java.net.URL; */ public abstract class MapSource { + /** File extensions */ + protected String[] _extensions = null; + + /** Regular expression for catching server wildcards */ + protected static final Pattern WILD_PATTERN = Pattern.compile("^(.*)\\[(.*)\\](.*)$"); + + /** * @return the number of layers used in this source */ @@ -34,7 +43,9 @@ public abstract class MapSource /** * @return the file extension for the specified layer */ - public abstract String getFileExtension(int inLayerNum); + public final String getFileExtension(int inLayerNum) { + return _extensions[inLayerNum]; + } /** * Make the URL to get the specified tile @@ -61,7 +72,7 @@ public abstract class MapSource */ public String makeFilePath(int inLayerNum, int inZoom, int inX, int inY) { - return getSiteName(inLayerNum) + inZoom + "/" + inX + "/" + inY + getFileExtension(inLayerNum); + return getSiteName(inLayerNum) + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum); } /** @@ -69,23 +80,35 @@ public abstract class MapSource * @param inUrl url to check * @return validated url with correct prefix and trailing slash, or null */ - protected static String fixBaseUrl(String inUrl) + public static String fixBaseUrl(String inUrl) { if (inUrl == null || inUrl.equals("")) {return null;} - String url = inUrl; + String urlstr = inUrl; // check prefix try { - new URL(url); + new URL(urlstr.replace('[', 'w').replace(']', 'w')); } - catch (MalformedURLException e) { + catch (MalformedURLException e) + { + // fail if protocol specified + if (urlstr.indexOf("://") >= 0) {return null;} // add the http protocol - url = "http://" + url; + urlstr = "http://" + urlstr; } // check trailing / - if (!url.endsWith("/")) { - url = url + "/"; + if (!urlstr.endsWith("/")) { + urlstr = urlstr + "/"; } - return url; + // Validate current url, return null if not ok + try { + URL url = new URL(urlstr.replace('[', 'w').replace(']', 'w')); + // url host must contain a dot + if (url.getHost().indexOf('.') < 0) {return null;} + } + catch (MalformedURLException e) { + urlstr = null; + } + return urlstr; } /** @@ -101,6 +124,17 @@ public abstract class MapSource int idx = url.indexOf("://"); if (idx >= 0) {url = url.substring(idx + 3);} if (url.startsWith("www.")) {url = url.substring(4);} + // Strip out any "[.*]" as well + if (url.indexOf('[') >= 0) + { + Matcher matcher = WILD_PATTERN.matcher(url); + if (matcher.matches()) { + url = matcher.group(1) + matcher.group(3); + if (url.length() > 1 && url.charAt(0) == '.') { + url = url.substring(1); + } + } + } return url; } @@ -110,15 +144,22 @@ public abstract class MapSource public abstract String getConfigString(); /** - * @return semicolon-separated list of base urls in order + * @return semicolon-separated list of base urls and extensions in order */ public String getSiteStrings() { - String s = ""; - for (int i=0; i