001 package org.openstreetmap.gui.jmapviewer.tilesources;
002
003 import java.util.Map;
004 import java.util.HashMap;
005 import java.util.Random;
006 import java.util.regex.Pattern;
007 import java.util.regex.Matcher;
008
009 public class TemplatedTMSTileSource extends TMSTileSource {
010
011 private Random rand = null;
012 private String[] randomParts = null;
013 private Map<String, String> headers = new HashMap<String, String>();
014
015 public static final String PATTERN_ZOOM = "\\{(?:(\\d+)-)?zoom([+-]\\d+)?\\}";
016 public static final String PATTERN_X = "\\{x\\}";
017 public static final String PATTERN_Y = "\\{y\\}";
018 public static final String PATTERN_Y_YAHOO = "\\{!y\\}";
019 public static final String PATTERN_NEG_Y = "\\{-y\\}";
020 public static final String PATTERN_SWITCH = "\\{switch:([^}]+)\\}";
021 public static final String PATTERN_HEADER = "\\{header\\(([^,]+),([^}]+)\\)\\}";
022
023 public static final String[] ALL_PATTERNS = {
024 PATTERN_HEADER, PATTERN_ZOOM, PATTERN_X, PATTERN_Y, PATTERN_Y_YAHOO, PATTERN_NEG_Y,
025 PATTERN_SWITCH
026 };
027
028 public TemplatedTMSTileSource(String name, String url, int maxZoom) {
029 super(name, url, maxZoom);
030 handleTemplate();
031 }
032
033 public TemplatedTMSTileSource(String name, String url, int minZoom, int maxZoom) {
034 super(name, url, minZoom, maxZoom);
035 handleTemplate();
036 }
037
038 private void handleTemplate() {
039 // Capturing group pattern on switch values
040 Matcher m = Pattern.compile(".*"+PATTERN_SWITCH+".*").matcher(baseUrl);
041 if (m.matches()) {
042 rand = new Random();
043 randomParts = m.group(1).split(",");
044 }
045 Pattern pattern = Pattern.compile(PATTERN_HEADER);
046 StringBuffer output = new StringBuffer();
047 Matcher matcher = pattern.matcher(baseUrl);
048 while (matcher.find()) {
049 headers.put(matcher.group(1),matcher.group(2));
050 matcher.appendReplacement(output, "");
051 }
052 matcher.appendTail(output);
053 baseUrl = output.toString();
054 }
055
056 public Map<String, String> getHeaders() {
057 return headers;
058 }
059
060 @Override
061 public String getTileUrl(int zoom, int tilex, int tiley) {
062 int finalZoom = zoom;
063 Matcher m = Pattern.compile(".*"+PATTERN_ZOOM+".*").matcher(this.baseUrl);
064 if (m.matches()) {
065 if(m.group(1) != null) {
066 finalZoom = Integer.valueOf(m.group(1))-zoom;
067 }
068 if(m.group(2) != null) {
069 String ofs = m.group(2);
070 if(ofs.startsWith("+"))
071 ofs = ofs.substring(1);
072 finalZoom += Integer.valueOf(ofs);
073 }
074 }
075 String r = this.baseUrl
076 .replaceAll(PATTERN_ZOOM, Integer.toString(finalZoom))
077 .replaceAll(PATTERN_X, Integer.toString(tilex))
078 .replaceAll(PATTERN_Y, Integer.toString(tiley))
079 .replaceAll(PATTERN_Y_YAHOO, Integer.toString((int)Math.pow(2, zoom-1)-1-tiley))
080 .replaceAll(PATTERN_NEG_Y, Integer.toString((int)Math.pow(2, zoom)-1-tiley));
081 if (rand != null) {
082 r = r.replaceAll(PATTERN_SWITCH, randomParts[rand.nextInt(randomParts.length)]);
083 }
084 return r;
085 }
086 }