--- /dev/null
+package tim.prune.gui.map;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+/**
+ * Class to represent any map source, whether an OsmMapSource
+ * or one of the more complicated ones.
+ * Map sources may contain just one or several layers, and may
+ * build their URLs in different ways depending on the source
+ */
+public abstract class MapSource
+{
+ /**
+ * @return the number of layers used in this source
+ */
+ public abstract int getNumLayers();
+
+ /**
+ * @return the name of the source
+ */
+ public abstract String getName();
+
+ /**
+ * @return the base url for the specified layer
+ */
+ public abstract String getBaseUrl(int inLayerNum);
+
+ /**
+ * @return the site name for the specified layer
+ */
+ public abstract String getSiteName(int inLayerNum);
+
+ /**
+ * @return the file extension for the specified layer
+ */
+ public abstract String getFileExtension(int inLayerNum);
+
+ /**
+ * Make the URL to get the specified tile
+ * @param inLayerNum number of layer, from 0 (base) to getNumLayers-1 (top)
+ * @param inZoom zoom level
+ * @param inX x coordinate of tile
+ * @param inY y coordinate of tile
+ * @return URL as string
+ */
+ public abstract String makeURL(int inLayerNum, int inZoom, int inX, int inY);
+
+ /**
+ * @return the maximum zoom level for this source
+ */
+ public abstract int getMaxZoomLevel();
+
+ /**
+ * Make a relative file path from the base directory including site name
+ * @param inLayerNum layer number
+ * @param inZoom zoom level
+ * @param inX x coordinate
+ * @param inY y coordinate
+ * @return relative file path as String
+ */
+ public String makeFilePath(int inLayerNum, int inZoom, int inX, int inY)
+ {
+ return getSiteName(inLayerNum) + inZoom + "/" + inX + "/" + inY + getFileExtension(inLayerNum);
+ }
+
+ /**
+ * Checks the given url for having the right prefix and trailing slash
+ * @param inUrl url to check
+ * @return validated url with correct prefix and trailing slash, or null
+ */
+ protected static String fixBaseUrl(String inUrl)
+ {
+ if (inUrl == null || inUrl.equals("")) {return null;}
+ String url = inUrl;
+ // check prefix
+ try {
+ new URL(url);
+ }
+ catch (MalformedURLException e) {
+ // add the http protocol
+ url = "http://" + url;
+ }
+ // check trailing /
+ if (!url.endsWith("/")) {
+ url = url + "/";
+ }
+ return url;
+ }
+
+ /**
+ * Fix the site name by stripping off protocol and www.
+ * This is used to create the file path for disk caching
+ * @param inUrl url to strip
+ * @return stripped url
+ */
+ protected static String fixSiteName(String inUrl)
+ {
+ if (inUrl == null || inUrl.equals("")) {return null;}
+ String url = inUrl.toLowerCase();
+ int idx = url.indexOf("://");
+ if (idx >= 0) {url = url.substring(idx + 3);}
+ if (url.startsWith("www.")) {url = url.substring(4);}
+ return url;
+ }
+
+ /**
+ * @return string which can be written to the Config
+ */
+ public abstract String getConfigString();
+
+ /**
+ * @return semicolon-separated list of base urls in order
+ */
+ public String getSiteStrings()
+ {
+ String s = "";
+ for (int i=0; i<getNumLayers(); i++) {
+ String url = getBaseUrl(i);
+ if (url != null) {s = s + url + ";";}
+ }
+ return s;
+ }
+}