[Git][debian-gis-team/jmapviewer][upstream] New upstream version 2.10+dfsg
Bas Couwenberg
gitlab at salsa.debian.org
Fri May 31 05:17:48 BST 2019
Bas Couwenberg pushed to branch upstream at Debian GIS Project / jmapviewer
Commits:
9b3489cc by Bas Couwenberg at 2019-05-31T03:54:05Z
New upstream version 2.10+dfsg
- - - - -
4 changed files:
- Readme.txt
- src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java
- src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java
- src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java
Changes:
=====================================
Readme.txt
=====================================
@@ -10,7 +10,7 @@ JMapViewer
(c) 2010-2011, Michael Vigovsky
(c) 2011-2017, Paul Hartmann
(c) 2011-2016, Gleb Smirnoff
-(c) 2011-2018, Vincent Privat
+(c) 2011-2019, Vincent Privat
(c) 2011, Jason Huntley
(c) 2012-2016, Simon Legner
(c) 2012, Teemu Koskinen
=====================================
src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java
=====================================
@@ -8,17 +8,24 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.MessageFormat;
+import java.util.Map;
import java.util.Objects;
+import java.util.TreeMap;
+import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
+/**
+ * Feature adapter allows to override JMapViewer behaviours from a client application such as JOSM.
+ */
public final class FeatureAdapter {
private static BrowserAdapter browserAdapter = new DefaultBrowserAdapter();
private static ImageAdapter imageAdapter = new DefaultImageAdapter();
private static TranslationAdapter translationAdapter = new DefaultTranslationAdapter();
private static LoggingAdapter loggingAdapter = new DefaultLoggingAdapter();
+ private static SettingsAdapter settingsAdapter = new DefaultSettingsAdapter();
private FeatureAdapter() {
// private constructor for utility classes
@@ -41,6 +48,28 @@ public final class FeatureAdapter {
BufferedImage read(URL input, boolean readMetadata, boolean enforceTransparency) throws IOException;
}
+ /**
+ * Basic settings system allowing to store/retrieve String key/value pairs.
+ */
+ public interface SettingsAdapter {
+ /**
+ * Get settings value for a certain key and provide a default value.
+ * @param key the identifier for the setting
+ * @param def the default value. For each call of get() with a given key, the
+ * default value must be the same. {@code def} may be null.
+ * @return the corresponding value if the property has been set before, {@code def} otherwise
+ */
+ String get(String key, String def);
+
+ /**
+ * Set a value for a certain setting.
+ * @param key the unique identifier for the setting
+ * @param value the value of the setting. Can be null or "" which both removes the key-value entry.
+ * @return {@code true}, if something has changed (i.e. value is different than before)
+ */
+ boolean put(String key, String value);
+ }
+
public static void registerBrowserAdapter(BrowserAdapter browserAdapter) {
FeatureAdapter.browserAdapter = Objects.requireNonNull(browserAdapter);
}
@@ -57,6 +86,15 @@ public final class FeatureAdapter {
FeatureAdapter.loggingAdapter = Objects.requireNonNull(loggingAdapter);
}
+ /**
+ * Registers settings adapter.
+ * @param settingsAdapter settings adapter, must not be null
+ * @throws NullPointerException if settingsAdapter is null
+ */
+ public static void registerSettingsAdapter(SettingsAdapter settingsAdapter) {
+ FeatureAdapter.settingsAdapter = Objects.requireNonNull(settingsAdapter);
+ }
+
public static void openLink(String url) {
browserAdapter.openLink(url);
}
@@ -73,6 +111,42 @@ public final class FeatureAdapter {
return loggingAdapter.getLogger(name);
}
+ public static Logger getLogger(Class<?> klass) {
+ return loggingAdapter.getLogger(klass.getSimpleName());
+ }
+
+ /**
+ * Get settings value for a certain key and provide a default value.
+ * @param key the identifier for the setting
+ * @param def the default value. For each call of get() with a given key, the
+ * default value must be the same. {@code def} may be null.
+ * @return the corresponding value if the property has been set before, {@code def} otherwise
+ */
+ public static String getSetting(String key, String def) {
+ return settingsAdapter.get(key, def);
+ }
+
+ /**
+ * Get settings value for a certain key and provide a default value.
+ * @param key the identifier for the setting
+ * @param def the default value. For each call of get() with a given key, the
+ * default value must be the same. {@code def} may be null.
+ * @return the corresponding value if the property has been set before, {@code def} otherwise
+ */
+ public static int getIntSetting(String key, int def) {
+ return Integer.parseInt(settingsAdapter.get(key, Integer.toString(def)));
+ }
+
+ /**
+ * Set a value for a certain setting.
+ * @param key the unique identifier for the setting
+ * @param value the value of the setting. Can be null or "" which both removes the key-value entry.
+ * @return {@code true}, if something has changed (i.e. value is different than before)
+ */
+ public static boolean putSetting(String key, String value) {
+ return settingsAdapter.put(key, value);
+ }
+
public static class DefaultBrowserAdapter implements BrowserAdapter {
@Override
public void openLink(String url) {
@@ -85,7 +159,7 @@ public final class FeatureAdapter {
e.printStackTrace();
}
} else {
- System.err.println(tr("Opening link not supported on current platform (''{0}'')", url));
+ getLogger(FeatureAdapter.class).log(Level.SEVERE, tr("Opening link not supported on current platform (''{0}'')", url));
}
}
}
@@ -110,4 +184,21 @@ public final class FeatureAdapter {
return Logger.getLogger(name);
}
}
+
+ /**
+ * Default settings adapter keeping settings in memory only.
+ */
+ public static class DefaultSettingsAdapter implements SettingsAdapter {
+ private final Map<String, String> settings = new TreeMap<>();
+
+ @Override
+ public String get(String key, String def) {
+ return settings.getOrDefault(key, def);
+ }
+
+ @Override
+ public boolean put(String key, String value) {
+ return !Objects.equals(value == null || value.isEmpty() ? settings.remove(key) : settings.put(key, value), value);
+ }
+ }
}
=====================================
src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java
=====================================
@@ -13,6 +13,8 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import org.openstreetmap.gui.jmapviewer.interfaces.TileJob;
import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
@@ -24,7 +26,22 @@ import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener;
* @author Jan Peter Stotz
*/
public class OsmTileLoader implements TileLoader {
- private static final ThreadPoolExecutor jobDispatcher = (ThreadPoolExecutor) Executors.newFixedThreadPool(8);
+
+ private static final Logger LOG = FeatureAdapter.getLogger(OsmTileLoader.class);
+
+ /** Setting key for number of threads */
+ public static final String THREADS_SETTING = "jmapviewer.osm-tile-loader.threads";
+ private static final int DEFAULT_THREADS_NUMBER = 8;
+ private static int nThreads = DEFAULT_THREADS_NUMBER;
+ static {
+ try {
+ nThreads = FeatureAdapter.getIntSetting(THREADS_SETTING, DEFAULT_THREADS_NUMBER);
+ } catch (Exception e) {
+ LOG.log(Level.SEVERE, e.getMessage(), e);
+ }
+ }
+
+ private static final ThreadPoolExecutor jobDispatcher = (ThreadPoolExecutor) Executors.newFixedThreadPool(nThreads);
private final class OsmTileJob implements TileJob {
private final Tile tile;
@@ -68,10 +85,10 @@ public class OsmTileLoader implements TileLoader {
listener.tileLoadingFinished(tile, false);
if (input == null) {
try {
- System.err.println("Failed loading " + tile.getUrl() +": "
+ LOG.log(Level.SEVERE, "Failed loading " + tile.getUrl() +": "
+e.getClass() + ": " + e.getMessage());
} catch (IOException ioe) {
- ioe.printStackTrace();
+ LOG.log(Level.SEVERE, ioe.getMessage(), ioe);
}
}
} finally {
@@ -102,12 +119,17 @@ public class OsmTileLoader implements TileLoader {
protected TileLoaderListener listener;
+ /**
+ * Constructs a new {@code OsmTileLoader}.
+ * @param listener tile loader listener
+ */
public OsmTileLoader(TileLoaderListener listener) {
this(listener, null);
}
public OsmTileLoader(TileLoaderListener listener, Map<String, String> headers) {
this.headers.put("Accept", "text/html, image/png, image/jpeg, image/gif, */*");
+ this.headers.put("User-Agent", "JMapViewer Java/"+System.getProperty("java.version"));
if (headers != null) {
this.headers.putAll(headers);
}
=====================================
src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java
=====================================
@@ -14,6 +14,8 @@ import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
import java.util.regex.Pattern;
import javax.xml.parsers.DocumentBuilder;
@@ -42,7 +44,21 @@ import org.xml.sax.SAXException;
*/
public class BingAerialTileSource extends TMSTileSource {
+ private static final Logger LOG = FeatureAdapter.getLogger(BingAerialTileSource.class);
+
+ /** Setting key for Bing metadata API URL. Must contain {@link #API_KEY_PLACEHOLDER} */
+ public static final String METADATA_API_SETTING = "jmapviewer.bing.metadata-api-url";
+ /** Setting key for Bing API key */
+ public static final String API_KEY_SETTING = "jmapviewer.bing.api-key";
+ /** Placeholder to specify Bing API key in metadata API URL*/
+ public static final String API_KEY_PLACEHOLDER = "{apiKey}";
+
+ /** Bing Metadata API URL */
+ private static final String METADATA_API_URL =
+ "https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&output=xml&key=" + API_KEY_PLACEHOLDER;
+ /** Original Bing API key created by Potlatch2 developers in 2010 */
private static final String API_KEY = "Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU";
+
private static volatile Future<List<Attribution>> attributions; // volatile is required for getAttribution(), see below.
private static String imageUrlTemplate;
private static Integer imageryZoomMax;
@@ -94,8 +110,8 @@ public class BingAerialTileSource extends TMSTileSource {
}
protected URL getAttributionUrl() throws MalformedURLException {
- return new URL("https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&output=xml&key="
- + API_KEY);
+ return new URL(FeatureAdapter.getSetting(METADATA_API_SETTING, METADATA_API_URL)
+ .replace(API_KEY_PLACEHOLDER, FeatureAdapter.getSetting(API_KEY_SETTING, API_KEY)));
}
protected List<Attribution> parseAttributionText(InputSource xml) throws IOException {
@@ -159,11 +175,8 @@ public class BingAerialTileSource extends TMSTileSource {
}
return attributionsList;
- } catch (SAXException e) {
- System.err.println("Could not parse Bing aerials attribution metadata.");
- e.printStackTrace();
- } catch (ParserConfigurationException | XPathExpressionException | NumberFormatException e) {
- e.printStackTrace();
+ } catch (SAXException | ParserConfigurationException | XPathExpressionException | NumberFormatException e) {
+ LOG.log(Level.SEVERE, "Could not parse Bing aerials attribution metadata.", e);
}
return null;
}
@@ -208,7 +221,7 @@ public class BingAerialTileSource extends TMSTileSource {
}
}
} catch (IOException e) {
- System.err.println("Error while retrieving Bing logo: "+e.getMessage());
+ LOG.log(Level.SEVERE, "Error while retrieving Bing logo: "+e.getMessage());
}
return null;
}
@@ -241,7 +254,7 @@ public class BingAerialTileSource extends TMSTileSource {
System.out.println("Successfully loaded Bing attribution data.");
return r;
} catch (IOException ex) {
- System.err.println("Could not connect to Bing API. Will retry in " + waitTimeSec + " seconds.");
+ LOG.log(Level.SEVERE, "Could not connect to Bing API. Will retry in " + waitTimeSec + " seconds.");
Thread.sleep(TimeUnit.SECONDS.toMillis(waitTimeSec));
waitTimeSec *= 2;
}
@@ -264,11 +277,11 @@ public class BingAerialTileSource extends TMSTileSource {
try {
return attributions.get(0, TimeUnit.MILLISECONDS);
} catch (TimeoutException ex) {
- System.err.println("Bing: attribution data is not yet loaded.");
+ LOG.log(Level.WARNING, "Bing: attribution data is not yet loaded.");
} catch (ExecutionException ex) {
throw new RuntimeException(ex.getCause());
} catch (InterruptedException ign) {
- System.err.println("InterruptedException: " + ign.getMessage());
+ LOG.log(Level.SEVERE, "InterruptedException: " + ign.getMessage());
}
return null;
}
View it on GitLab: https://salsa.debian.org/debian-gis-team/jmapviewer/commit/9b3489cc786925d45691bad2aa1a92f687b73de1
--
View it on GitLab: https://salsa.debian.org/debian-gis-team/jmapviewer/commit/9b3489cc786925d45691bad2aa1a92f687b73de1
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20190531/027f84fa/attachment-0001.html>
More information about the Pkg-grass-devel
mailing list