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
*/
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
*/
/**
* @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
*/
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);
}
/**
* @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;
}
/**
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;
}
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<getNumLayers(); i++) {
+ StringBuilder sb = new StringBuilder();
+ for (int i=0; i<getNumLayers(); i++)
+ {
String url = getBaseUrl(i);
- if (url != null) {s = s + url + ";";}
+ if (url != null)
+ {
+ sb.append(url);
+ sb.append(';');
+ sb.append(getFileExtension(i));
+ sb.append(';');
+ }
}
- return s;
+ return sb.toString();
}
}