]> gitweb.fperrin.net Git - GpsPrune.git/blob - tim/prune/gui/map/MapSource.java
Version 14, October 2012
[GpsPrune.git] / tim / prune / gui / map / MapSource.java
1 package tim.prune.gui.map;
2
3 import java.net.MalformedURLException;
4 import java.net.URL;
5 import java.util.regex.Matcher;
6 import java.util.regex.Pattern;
7
8 /**
9  * Class to represent any map source, whether an OsmMapSource
10  * or one of the more complicated ones.
11  * Map sources may contain just one or several layers, and may
12  * build their URLs in different ways depending on the source
13  */
14 public abstract class MapSource
15 {
16         /** File extensions */
17         protected String[] _extensions = null;
18
19         /** Regular expression for catching server wildcards */
20         protected static final Pattern WILD_PATTERN = Pattern.compile("^(.*)\\[(.*)\\](.*)$");
21
22
23         /**
24          * @return the number of layers used in this source
25          */
26         public abstract int getNumLayers();
27
28         /**
29          * @return the name of the source
30          */
31         public abstract String getName();
32
33         /**
34          * @return the base url for the specified layer
35          */
36         public abstract String getBaseUrl(int inLayerNum);
37
38         /**
39          * @return the site name for the specified layer
40          */
41         public abstract String getSiteName(int inLayerNum);
42
43         /**
44          * @return the file extension for the specified layer
45          */
46         public final String getFileExtension(int inLayerNum) {
47                 return _extensions[inLayerNum];
48         }
49
50         /**
51          * Make the URL to get the specified tile
52          * @param inLayerNum number of layer, from 0 (base) to getNumLayers-1 (top)
53          * @param inZoom zoom level
54          * @param inX x coordinate of tile
55          * @param inY y coordinate of tile
56          * @return URL as string
57          */
58         public abstract String makeURL(int inLayerNum, int inZoom, int inX, int inY);
59
60         /**
61          * @return the maximum zoom level for this source
62          */
63         public abstract int getMaxZoomLevel();
64
65         /**
66          * Make a relative file path from the base directory including site name
67          * @param inLayerNum layer number
68          * @param inZoom zoom level
69          * @param inX x coordinate
70          * @param inY y coordinate
71          * @return relative file path as String
72          */
73         public String makeFilePath(int inLayerNum, int inZoom, int inX, int inY)
74         {
75                 return getSiteName(inLayerNum) + inZoom + "/" + inX + "/" + inY + "." + getFileExtension(inLayerNum);
76         }
77
78         /**
79          * Checks the given url for having the right prefix and trailing slash
80          * @param inUrl url to check
81          * @return validated url with correct prefix and trailing slash, or null
82          */
83         public static String fixBaseUrl(String inUrl)
84         {
85                 if (inUrl == null || inUrl.equals("")) {return null;}
86                 String urlstr = inUrl;
87                 // check prefix
88                 try {
89                         new URL(urlstr.replace('[', 'w').replace(']', 'w'));
90                 }
91                 catch (MalformedURLException e)
92                 {
93                         // fail if protocol specified
94                         if (urlstr.indexOf("://") >= 0) {return null;}
95                         // add the http protocol
96                         urlstr = "http://" + urlstr;
97                 }
98                 // check trailing /
99                 if (!urlstr.endsWith("/")) {
100                         urlstr = urlstr + "/";
101                 }
102                 // Validate current url, return null if not ok
103                 try {
104                         URL url = new URL(urlstr.replace('[', 'w').replace(']', 'w'));
105                         // url host must contain a dot
106                         if (url.getHost().indexOf('.') < 0) {return null;}
107                 }
108                 catch (MalformedURLException e) {
109                         urlstr = null;
110                 }
111                 return urlstr;
112         }
113
114         /**
115          * Fix the site name by stripping off protocol and www.
116          * This is used to create the file path for disk caching
117          * @param inUrl url to strip
118          * @return stripped url
119          */
120         protected static String fixSiteName(String inUrl)
121         {
122                 if (inUrl == null || inUrl.equals("")) {return null;}
123                 String url = inUrl.toLowerCase();
124                 int idx = url.indexOf("://");
125                 if (idx >= 0) {url = url.substring(idx + 3);}
126                 if (url.startsWith("www.")) {url = url.substring(4);}
127                 // Strip out any "[.*]" as well
128                 if (url.indexOf('[') >= 0)
129                 {
130                         Matcher matcher = WILD_PATTERN.matcher(url);
131                         if (matcher.matches()) {
132                                 url = matcher.group(1) + matcher.group(3);
133                                 if (url.length() > 1 && url.charAt(0) == '.') {
134                                         url = url.substring(1);
135                                 }
136                         }
137                 }
138                 return url;
139         }
140
141         /**
142          * @return string which can be written to the Config
143          */
144         public abstract String getConfigString();
145
146         /**
147          * @return semicolon-separated list of base urls and extensions in order
148          */
149         public String getSiteStrings()
150         {
151                 StringBuilder sb = new StringBuilder();
152                 for (int i=0; i<getNumLayers(); i++)
153                 {
154                         String url = getBaseUrl(i);
155                         if (url != null)
156                         {
157                                 sb.append(url);
158                                 sb.append(';');
159                                 sb.append(getFileExtension(i));
160                                 sb.append(';');
161                         }
162                 }
163                 return sb.toString();
164         }
165 }