Completly remove bsh

This commit is contained in:
max-klaus 2019-11-21 21:47:17 +03:00
parent df68cc70b3
commit a596ff9551
6 changed files with 176 additions and 155 deletions

View file

@ -76,7 +76,6 @@
* 3rd party libraries present in the libs folder (https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/libs): * 3rd party libraries present in the libs folder (https://github.com/osmandapp/Osmand/tree/master/OsmAnd-java/libs):
- bzip2-20090327.jar Bzip2 - Apache License - bzip2-20090327.jar Bzip2 - Apache License
- bsh-core-2.0b4.jar Bean Shell - SPL and LGPL (http://www.beanshell.org/license.html)
- commons-logging-1.1.1.jar - Apache License - commons-logging-1.1.1.jar - Apache License
- gnu-trove-osmand.jar GNU trove - LGPL - gnu-trove-osmand.jar GNU trove - LGPL
- icu4j-49_1.jar - ICU license (http://source.icu-project.org/repos/icu/icu/trunk/license.html) - icu4j-49_1.jar - ICU license (http://source.icu-project.org/repos/icu/icu/trunk/license.html)

View file

@ -99,7 +99,6 @@ dependencies {
implementation group: 'commons-logging', name: 'commons-logging', version: '1.2' implementation group: 'commons-logging', name: 'commons-logging', version: '1.2'
implementation group: 'org.json', name: 'json', version: '20171018' implementation group: 'org.json', name: 'json', version: '20171018'
implementation 'it.unibo.alice.tuprolog:tuprolog:3.2.1' implementation 'it.unibo.alice.tuprolog:tuprolog:3.2.1'
implementation 'org.beanshell:bsh-core:2.0b4'
implementation 'org.apache.commons:commons-compress:1.17' implementation 'org.apache.commons:commons-compress:1.17'
implementation 'com.moparisthebest:junidecode:0.1.1' implementation 'com.moparisthebest:junidecode:0.1.1'
implementation 'com.vividsolutions:jts-core:1.14.0' implementation 'com.vividsolutions:jts-core:1.14.0'

View file

@ -15,10 +15,8 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.OutputStreamWriter; import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection; import java.net.URLConnection;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
@ -26,14 +24,13 @@ import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import bsh.Interpreter;
public class TileSourceManager { public class TileSourceManager {
private static final Log log = PlatformUtil.getLog(TileSourceManager.class); private static final Log log = PlatformUtil.getLog(TileSourceManager.class);
public static final String RULE_BEANSHELL = "beanshell";
public static final String RULE_YANDEX_TRAFFIC = "yandex_traffic"; public static final String RULE_YANDEX_TRAFFIC = "yandex_traffic";
private static final String RULE_WMS = "wms_tile"; private static final String RULE_WMS = "wms_tile";
private static final String RULE_TEMPLATE_1 = "template:1";
private static final String RND_ALG_WIKIMAPIA = "wikimapia";
private static final TileSourceTemplate MAPNIK_SOURCE = private static final TileSourceTemplate MAPNIK_SOURCE =
new TileSourceTemplate("OsmAnd (online tiles)", "https://tile.osmand.net/hd/{0}/{1}/{2}.png", ".png", 19, 1, 512, 8, 18000); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ new TileSourceTemplate("OsmAnd (online tiles)", "https://tile.osmand.net/hd/{0}/{1}/{2}.png", ".png", 19, 1, 512, 8, 18000); //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
@ -51,6 +48,9 @@ public class TileSourceManager {
MAPILLARY_VECTOR_SOURCE.setHidden(true); MAPILLARY_VECTOR_SOURCE.setHidden(true);
} }
private static final String PARAM_BING_QUAD_KEY = "{q}";
private static final String PARAM_RND = "{rnd}";
public static class TileSourceTemplate implements ITileSource, Cloneable { public static class TileSourceTemplate implements ITileSource, Cloneable {
private int maxZoom; private int maxZoom;
private int minZoom; private int minZoom;
@ -63,6 +63,9 @@ public class TileSourceManager {
// -1 never expires, // -1 never expires,
private long expirationTimeMillis = -1; private long expirationTimeMillis = -1;
private boolean ellipticYTile; private boolean ellipticYTile;
private boolean invertedYTile;
private String randoms;
private String[] randomsArray;
private String rule; private String rule;
private boolean hidden; // if hidden in configure map settings, for example mapillary sources private boolean hidden; // if hidden in configure map settings, for example mapillary sources
@ -82,12 +85,62 @@ public class TileSourceManager {
public static String normalizeUrl(String url) { public static String normalizeUrl(String url) {
if (url != null) { if (url != null) {
url = url.replaceAll("\\{\\$z\\}", "{0}"); //$NON-NLS-1$ //$NON-NLS-2$ url = url.replaceAll("\\{\\$z\\}", "{0}");
url = url.replaceAll("\\{\\$x\\}", "{1}"); //$NON-NLS-1$//$NON-NLS-2$ url = url.replaceAll("\\{\\$x\\}", "{1}");
url = url.replaceAll("\\{\\$y\\}", "{2}"); //$NON-NLS-1$ //$NON-NLS-2$ url = url.replaceAll("\\{\\$y\\}", "{2}");
url = url.replaceAll("\\{z\\}", "{0}");
url = url.replaceAll("\\{x\\}", "{1}");
url = url.replaceAll("\\{y\\}", "{2}");
} }
return url; return url;
} }
public static String[] buildRandomsArray(String randomsStr) {
List<String> randoms = new ArrayList<>();
if (!Algorithms.isEmpty(randomsStr)) {
if (randomsStr.equals(RND_ALG_WIKIMAPIA)) {
return new String[]{RND_ALG_WIKIMAPIA};
}
String[] valuesArray = randomsStr.split(",");
for (String s : valuesArray) {
String[] rangeArray = s.split("-");
if (rangeArray.length == 2) {
String s1 = rangeArray[0];
String s2 = rangeArray[1];
boolean rangeValid = false;
try {
int a = Integer.parseInt(s1);
int b = Integer.parseInt(s2);
if (b > a) {
for (int i = a; i <= b; i++) {
randoms.add(String.valueOf(i));
}
rangeValid = true;
}
} catch (NumberFormatException e) {
if (s1.length() == 1 && s2.length() == 1) {
char a = s1.charAt(0);
char b = s2.charAt(0);
if (b > a) {
for (char i = a; i <= b; i++) {
randoms.add(String.valueOf(i));
}
rangeValid = true;
}
}
}
if (!rangeValid) {
randoms.add(s1);
randoms.add(s2);
}
} else {
randoms.add(s);
}
}
}
return randoms.toArray(new String[randoms.size()]);
}
public void setMinZoom(int minZoom) { public void setMinZoom(int minZoom) {
this.minZoom = minZoom; this.minZoom = minZoom;
} }
@ -117,6 +170,31 @@ public class TileSourceManager {
return ellipticYTile; return ellipticYTile;
} }
public boolean isInvertedYTile() {
return invertedYTile;
}
public void setInvertedYTile(boolean invertedYTile) {
this.invertedYTile = invertedYTile;
}
public String getRandoms() {
return randoms;
}
public void setRandoms(String randoms) {
this.randoms = randoms;
this.randomsArray = buildRandomsArray(randoms);
}
public String[] getRandomsArray() {
return randomsArray;
}
public void setRandomsArray(String[] randomsArray) {
this.randomsArray = randomsArray;
}
@Override @Override
public int getBitDensity() { public int getBitDensity() {
return bitDensity; return bitDensity;
@ -208,8 +286,52 @@ public class TileSourceManager {
if (urlToLoad == null) { if (urlToLoad == null) {
return null; return null;
} }
return MessageFormat.format(urlToLoad, zoom + "", x + "", y + ""); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ if (isInvertedYTile()) {
y = (1 << zoom) - 1 - y;
} }
return buildUrlToLoad(urlToLoad, randomsArray, x, y, zoom);
}
private static String eqtBingQuadKey(int z, int x, int y) {
char[] NUM_CHAR = {'0', '1', '2', '3'};
char[] tn = new char[z];
for (int i = z - 1; i >= 0; i--) {
int num = (x % 2) | ((y % 2) << 1);
tn[i] = NUM_CHAR[num];
x >>= 1;
y >>= 1;
}
return new String(tn);
}
public static String buildUrlToLoad(String urlTemplate, String[] randomsArray, int x, int y, int zoom) {
try {
if (randomsArray != null && randomsArray.length > 0) {
String rand;
if (RND_ALG_WIKIMAPIA.equals(randomsArray[0])) {
rand = String.valueOf(x % 4 + (y % 4) * 4);
} else {
rand = randomsArray[(x + y) % randomsArray.length];
}
urlTemplate = urlTemplate.replace(PARAM_RND, rand);
} else if (urlTemplate.contains(PARAM_RND)) {
log.error("Cannot resolve randoms for template: " + urlTemplate);
return null;
}
int bingQuadKeyParamIndex = urlTemplate.indexOf(PARAM_BING_QUAD_KEY);
if (bingQuadKeyParamIndex != -1) {
return urlTemplate.replace(PARAM_BING_QUAD_KEY, eqtBingQuadKey(zoom, x, y));
}
return MessageFormat.format(urlTemplate, zoom + "", x + "", y + "");
} catch (IllegalArgumentException e) {
log.error("Cannot build url for template: " + urlTemplate, e);
return null;
}
}
public String getUrlTemplate() { public String getUrlTemplate() {
return urlToLoad; return urlToLoad;
@ -349,6 +471,12 @@ public class TileSourceManager {
if (tm.isEllipticYTile()) { if (tm.isEllipticYTile()) {
properties.put("ellipsoid", tm.isEllipticYTile() + ""); properties.put("ellipsoid", tm.isEllipticYTile() + "");
} }
if (tm.isInvertedYTile()) {
properties.put("inverted_y", tm.isInvertedYTile() + "");
}
if (tm.getRandoms() != null) {
properties.put("randoms", tm.getRandoms());
}
if (tm.getExpirationTimeMinutes() != -1) { if (tm.getExpirationTimeMinutes() != -1) {
properties.put("expiration_time_minutes", tm.getExpirationTimeMinutes() + ""); properties.put("expiration_time_minutes", tm.getExpirationTimeMinutes() + "");
} }
@ -390,12 +518,8 @@ public class TileSourceManager {
try { try {
if (readUrl.exists()) { if (readUrl.exists()) {
BufferedReader reader = new BufferedReader(new InputStreamReader( BufferedReader reader = new BufferedReader(new InputStreamReader(
new FileInputStream(readUrl), "UTF-8")); //$NON-NLS-1$ new FileInputStream(readUrl), "UTF-8"));
url = reader.readLine(); url = reader.readLine();
//
//url = url.replaceAll("\\{\\$z\\}", "{0}"); //$NON-NLS-1$ //$NON-NLS-2$
//url = url.replaceAll("\\{\\$x\\}", "{1}"); //$NON-NLS-1$//$NON-NLS-2$
//url = url.replaceAll("\\{\\$y\\}", "{2}"); //$NON-NLS-1$ //$NON-NLS-2$
url = TileSourceTemplate.normalizeUrl(url); url = TileSourceTemplate.normalizeUrl(url);
reader.close(); reader.close();
} }
@ -457,7 +581,7 @@ public class TileSourceManager {
final List<TileSourceTemplate> templates = new ArrayList<TileSourceTemplate>(); final List<TileSourceTemplate> templates = new ArrayList<TileSourceTemplate>();
try { try {
URLConnection connection = NetworkUtils.getHttpURLConnection((https ? "https" : "http") URLConnection connection = NetworkUtils.getHttpURLConnection((https ? "https" : "http")
+ "://osmand.net/tile_sources?" + versionAsUrl); + "://test.osmand.net/tile_sources?" + versionAsUrl);
XmlPullParser parser = PlatformUtil.newXMLPullParser(); XmlPullParser parser = PlatformUtil.newXMLPullParser();
parser.setInput(connection.getInputStream(), "UTF-8"); parser.setInput(connection.getInputStream(), "UTF-8");
int tok; int tok;
@ -487,12 +611,12 @@ public class TileSourceManager {
} }
public static TileSourceTemplate createTileSourceTemplate(Map<String, String> attrs) { public static TileSourceTemplate createTileSourceTemplate(Map<String, String> attrs) {
TileSourceTemplate template = null; TileSourceTemplate template;
String rule = attrs.get("rule"); String rule = attrs.get("rule");
if (rule == null){ if (rule == null){
template = createSimpleTileSourceTemplate(attrs, false); template = createSimpleTileSourceTemplate(attrs, false);
} else if(RULE_BEANSHELL.equalsIgnoreCase(rule)){ } else if (RULE_TEMPLATE_1.equalsIgnoreCase(rule)) {
template = createBeanshellTileSourceTemplate(attrs); template = createSimpleTileSourceTemplate(attrs, false);
} else if (RULE_WMS.equalsIgnoreCase(rule)) { } else if (RULE_WMS.equalsIgnoreCase(rule)) {
template = createWmsTileSourceTemplate(attrs); template = createWmsTileSourceTemplate(attrs);
} else if (RULE_YANDEX_TRAFFIC.equalsIgnoreCase(rule)) { } else if (RULE_YANDEX_TRAFFIC.equalsIgnoreCase(rule)) {
@ -521,8 +645,10 @@ public class TileSourceManager {
String ext = attributes.get("ext") == null ? ".jpg" : attributes.get("ext"); String ext = attributes.get("ext") == null ? ".jpg" : attributes.get("ext");
int bitDensity = parseInt(attributes, "img_density", 16); int bitDensity = parseInt(attributes, "img_density", 16);
int avgTileSize = parseInt(attributes, "avg_img_size", 18000); int avgTileSize = parseInt(attributes, "avg_img_size", 18000);
String randoms = attributes.get("randoms");
urlTemplate = "http://whoots.mapwarper.net/tms/{0}/{1}/{2}/"+layer+"/"+urlTemplate; urlTemplate = "http://whoots.mapwarper.net/tms/{0}/{1}/{2}/"+layer+"/"+urlTemplate;
TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize); TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize);
templ.setRandoms(randoms);
return templ; return templ;
} }
@ -534,10 +660,7 @@ public class TileSourceManager {
if (name == null || (urlTemplate == null && !ignoreTemplate)) { if (name == null || (urlTemplate == null && !ignoreTemplate)) {
return null; return null;
} }
//As I see, here is no changes to urlTemplate
//if(urlTemplate != null){
//urlTemplate.replace("${x}", "{1}").replace("${y}", "{2}").replace("${z}", "{0}");
//}
urlTemplate = TileSourceTemplate.normalizeUrl(urlTemplate); urlTemplate = TileSourceTemplate.normalizeUrl(urlTemplate);
int maxZoom = parseInt(attributes, "max_zoom", 18); int maxZoom = parseInt(attributes, "max_zoom", 18);
@ -551,82 +674,18 @@ public class TileSourceManager {
if (Boolean.parseBoolean(attributes.get("ellipsoid"))) { if (Boolean.parseBoolean(attributes.get("ellipsoid"))) {
ellipsoid = true; ellipsoid = true;
} }
boolean invertedY = false;
if (Boolean.parseBoolean(attributes.get("inverted_y"))) {
invertedY = true;
}
String randoms = attributes.get("randoms");
TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize); TileSourceTemplate templ = new TileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize);
if(expirationTime >= 0) { if(expirationTime >= 0) {
templ.setExpirationTimeMinutes(expirationTime); templ.setExpirationTimeMinutes(expirationTime);
} }
templ.setEllipticYTile(ellipsoid); templ.setEllipticYTile(ellipsoid);
templ.setInvertedYTile(invertedY);
templ.setRandoms(randoms);
return templ; return templ;
} }
private static TileSourceTemplate createBeanshellTileSourceTemplate(Map<String, String> attributes) {
String name = attributes.get("name");
String urlTemplate = attributes.get("url_template");
if (name == null || urlTemplate == null) {
return null;
}
int maxZoom = parseInt(attributes, "max_zoom", 18);
int minZoom = parseInt(attributes, "min_zoom", 5);
int tileSize = parseInt(attributes, "tile_size", 256);
String ext = attributes.get("ext") == null ? ".jpg" : attributes.get("ext");
int bitDensity = parseInt(attributes, "img_density", 16);
int avgTileSize = parseInt(attributes, "avg_img_size", 18000);
int expirationTime = parseInt(attributes, "expiration_time_minutes", -1);
boolean ellipsoid = false;
if (Boolean.parseBoolean(attributes.get("ellipsoid"))) {
ellipsoid = true;
}
TileSourceTemplate templ;
templ = new BeanShellTileSourceTemplate(name, urlTemplate, ext, maxZoom, minZoom, tileSize, bitDensity, avgTileSize);
templ.setEllipticYTile(ellipsoid);
if(expirationTime > 0) {
templ.setExpirationTimeMinutes(expirationTime);
}
return templ;
}
public static class BeanShellTileSourceTemplate extends TileSourceTemplate {
Interpreter bshInterpreter;
public BeanShellTileSourceTemplate(String name, String urlToLoad, String ext,
int maxZoom, int minZoom, int tileSize, int bitDensity, int avgSize) {
super(name, urlToLoad, ext, maxZoom, minZoom, tileSize, bitDensity, avgSize);
bshInterpreter = new Interpreter();
try {
bshInterpreter.eval(urlToLoad);
bshInterpreter.getClassManager().setClassLoader(new ClassLoader() {
@Override
public URL getResource(String resName) {
return null;
}
@Override
public InputStream getResourceAsStream(String resName) {
return null;
}
@Override
public Class<?> loadClass(String className) throws ClassNotFoundException {
throw new ClassNotFoundException("Error requesting " + className);
}
});
} catch (bsh.EvalError e) {
log.error("Error executing the map init script " + urlToLoad, e);
}
}
@Override
public String getUrlToLoad(int x, int y, int zoom) {
try {
return (String) bshInterpreter.eval("getTileUrl("+zoom+","+x+","+y+");");
} catch (bsh.EvalError e) {
log.error(e.getMessage(), e);
return null;
}
}
}
} }

View file

@ -51,7 +51,7 @@
<application android:allowBackup="true" android:backupAgent="net.osmand.plus.OsmandBackupAgent" <application android:allowBackup="true" android:backupAgent="net.osmand.plus.OsmandBackupAgent"
android:icon="@mipmap/icon" android:label="@string/app_name" android:icon="@mipmap/icon" android:label="@string/app_name"
android:name="net.osmand.plus.OsmandApplication" android:configChanges="locale" android:name="net.osmand.plus.OsmandApplication" android:configChanges="locale"
android:theme="@style/OsmandDarkTheme" android:restoreAnyVersion="true" android:largeHeap="true"> android:theme="@style/OsmandDarkTheme" android:restoreAnyVersion="true" android:largeHeap="true" android:usesCleartextTraffic="true">
<meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIqF3tNGT66etVBn_vgzpfAY1wmIzKV1Ss6Ku-2A" /> <meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIqF3tNGT66etVBn_vgzpfAY1wmIzKV1Ss6Ku-2A" />
<meta-data android:name="com.sec.android.support.multiwindow" android:value="true" /> <meta-data android:name="com.sec.android.support.multiwindow" android:value="true" />

View file

@ -459,7 +459,6 @@ dependencies {
implementation group: 'commons-logging', name: 'commons-logging', version: '1.2' implementation group: 'commons-logging', name: 'commons-logging', version: '1.2'
implementation 'commons-codec:commons-codec:1.11' implementation 'commons-codec:commons-codec:1.11'
implementation 'it.unibo.alice.tuprolog:tuprolog:3.2.1' implementation 'it.unibo.alice.tuprolog:tuprolog:3.2.1'
implementation 'org.beanshell:bsh-core:2.0b4'
implementation 'org.apache.commons:commons-compress:1.17' implementation 'org.apache.commons:commons-compress:1.17'
implementation 'com.moparisthebest:junidecode:0.1.1' implementation 'com.moparisthebest:junidecode:0.1.1'
implementation 'org.immutables:gson:2.5.0' implementation 'org.immutables:gson:2.5.0'

View file

@ -3,14 +3,11 @@ package net.osmand.plus;
import android.database.sqlite.SQLiteDiskIOException; import android.database.sqlite.SQLiteDiskIOException;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.os.Build;
import android.widget.Toast;
import net.osmand.IndexConstants; import net.osmand.IndexConstants;
import net.osmand.PlatformUtil; import net.osmand.PlatformUtil;
import net.osmand.data.QuadRect; import net.osmand.data.QuadRect;
import net.osmand.map.ITileSource; import net.osmand.map.ITileSource;
import net.osmand.map.TileSourceManager;
import net.osmand.map.TileSourceManager.TileSourceTemplate; import net.osmand.map.TileSourceManager.TileSourceTemplate;
import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteConnection;
import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor;
@ -22,13 +19,8 @@ import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.text.MessageFormat;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import bsh.Interpreter;
public class SQLiteTileSource implements ITileSource { public class SQLiteTileSource implements ITileSource {
@ -48,6 +40,9 @@ public class SQLiteTileSource implements ITileSource {
private boolean timeSupported = false; private boolean timeSupported = false;
private long expirationTimeMillis = -1; // never private long expirationTimeMillis = -1; // never
private boolean isEllipsoid = false; private boolean isEllipsoid = false;
private boolean invertedY = false;
private String randoms;
private String[] randomsArray;
private String rule = null; private String rule = null;
private String referer = null; private String referer = null;
@ -56,9 +51,6 @@ public class SQLiteTileSource implements ITileSource {
private OsmandApplication ctx; private OsmandApplication ctx;
private boolean onlyReadonlyAvailable = false; private boolean onlyReadonlyAvailable = false;
private static final Pattern RND_PATTERN =
Pattern.compile(".*(\\{rnd:([0-9a-zA-Z-_~:\\/?#\\[\\]@!$&'\\(\\)*+,;=]+)\\}).*");
public SQLiteTileSource(OsmandApplication ctx, File f, List<TileSourceTemplate> toFindUrl){ public SQLiteTileSource(OsmandApplication ctx, File f, List<TileSourceTemplate> toFindUrl){
this.ctx = ctx; this.ctx = ctx;
@ -111,7 +103,6 @@ public class SQLiteTileSource implements ITileSource {
return base != null ? base.getTileSize() : tileSize; return base != null ? base.getTileSize() : tileSize;
} }
Interpreter bshInterpreter = null;
@Override @Override
public String getUrlToLoad(int x, int y, int zoom) { public String getUrlToLoad(int x, int y, int zoom) {
if (zoom > maxZoom) if (zoom > maxZoom)
@ -120,47 +111,10 @@ public class SQLiteTileSource implements ITileSource {
if (db == null || db.isReadOnly() || urlTemplate == null) { if (db == null || db.isReadOnly() || urlTemplate == null) {
return null; return null;
} }
if (invertedY) {
String urlTemplate = this.urlTemplate; y = (1 << zoom) - 1 - y;
try {
Matcher matcher = RND_PATTERN.matcher(urlTemplate);
if (matcher.matches()) {
int i = 0;
String rndString = matcher.group(1);
String valuesString = matcher.group(2);
if (!Algorithms.isEmpty(valuesString)) {
String[] valuesArray = valuesString.split(",");
if (valuesArray.length > 0) {
i = ((x + y) % valuesArray.length);
}
}
urlTemplate = urlTemplate.replace(rndString, i + "");
return MessageFormat.format(urlTemplate, zoom + "", x + "", y + "");
} else if (TileSourceManager.RULE_BEANSHELL.equalsIgnoreCase(rule)) {
if (Build.VERSION.SDK_INT >= 28) {
Toast.makeText(ctx, "Beanshell is not supported on Android 9+ anymore. Use {rnd:1,2,3,a,b,c} pattern instead.", Toast.LENGTH_LONG).show();
return null;
}
try {
if (bshInterpreter == null) {
bshInterpreter = new Interpreter();
bshInterpreter.eval(urlTemplate);
}
return (String) bshInterpreter.eval("getTileUrl(" + zoom + "," + x + "," + y + ");");
} catch (bsh.EvalError e) {
LOG.debug("getUrlToLoad Error" + e.getMessage());
Toast.makeText(ctx, e.getMessage(), Toast.LENGTH_LONG).show();
LOG.error(e.getMessage(), e);
return null;
}
} else {
return MessageFormat.format(urlTemplate, zoom + "", x + "", y + "");
}
} catch (IllegalArgumentException e) {
LOG.error("Cannot build url for template: " + urlTemplate, e);
return null;
} }
return TileSourceTemplate.buildUrlToLoad(urlTemplate, randomsArray, x, y, zoom);
} }
@Override @Override
@ -213,7 +167,6 @@ public class SQLiteTileSource implements ITileSource {
if(url != -1) { if(url != -1) {
String template = cursor.getString(url); String template = cursor.getString(url);
if(!Algorithms.isEmpty(template)){ if(!Algorithms.isEmpty(template)){
//urlTemplate = template;
urlTemplate = TileSourceTemplate.normalizeUrl(template); urlTemplate = TileSourceTemplate.normalizeUrl(template);
} }
} }
@ -261,6 +214,19 @@ public class SQLiteTileSource implements ITileSource {
this.isEllipsoid = true; this.isEllipsoid = true;
} }
} }
int invertedY = list.indexOf("inverted_y");
if(invertedY != -1) {
int set = (int) cursor.getInt(invertedY);
if(set == 1){
this.invertedY = true;
}
}
int randomsId = list.indexOf("randoms");
if(randomsId != -1) {
this.randoms = cursor.getString(randomsId);
this.randomsArray = TileSourceTemplate.buildRandomsArray(this.randoms);
}
//boolean inversiveInfoZoom = tnumbering != -1 && "BigPlanet".equals(cursor.getString(tnumbering)); //boolean inversiveInfoZoom = tnumbering != -1 && "BigPlanet".equals(cursor.getString(tnumbering));
boolean inversiveInfoZoom = inversiveZoom; boolean inversiveInfoZoom = inversiveZoom;
int mnz = list.indexOf("minzoom"); int mnz = list.indexOf("minzoom");
@ -500,7 +466,6 @@ public class SQLiteTileSource implements ITileSource {
public void closeDB(){ public void closeDB(){
LOG.debug("closeDB"); LOG.debug("closeDB");
bshInterpreter = null;
if(timeSupported) { if(timeSupported) {
clearOld(); clearOld();
} }