This is an automated email from the git hooks/post-receive script. sebastic-guest pushed a commit to branch master in repository jmapviewer.
commit e97508c9202e16540cde965fa75b4ca31697c74c Author: Bas Couwenberg <sebas...@xs4all.nl> Date: Mon Dec 29 21:37:04 2014 +0100 Imported Upstream version 1.05+dfsg --- src/org/openstreetmap/gui/jmapviewer/Demo.java | 16 +- .../gui/jmapviewer/FeatureAdapter.java | 21 +++ .../openstreetmap/gui/jmapviewer/JMapViewer.java | 174 +++++++++++--------- .../gui/jmapviewer/MemoryTileCache.java | 7 +- .../gui/jmapviewer/OsmFileCacheTileLoader.java | 178 +++++++++++---------- .../gui/jmapviewer/OsmTileLoader.java | 6 +- .../gui/jmapviewer/TMSFileCacheTileLoader.java | 76 +++++++++ src/org/openstreetmap/gui/jmapviewer/Tile.java | 55 ++++--- .../gui/jmapviewer/TileController.java | 9 +- .../gui/jmapviewer/interfaces/TileCache.java | 5 + .../jmapviewer/interfaces/TileLoaderListener.java | 11 +- .../gui/jmapviewer/interfaces/TileSource.java | 13 +- .../tilesources/AbstractMapQuestTileSource.java | 4 +- .../tilesources/AbstractOsmTileSource.java | 6 +- .../tilesources/AbstractTMSTileSource.java | 9 +- .../tilesources/BingAerialTileSource.java | 9 +- .../tilesources/MapQuestOpenAerialTileSource.java | 2 +- .../tilesources/MapQuestOsmTileSource.java | 2 +- .../gui/jmapviewer/tilesources/OsmTileSource.java | 4 +- .../jmapviewer/tilesources/ScanexTileSource.java | 4 +- .../gui/jmapviewer/tilesources/TMSTileSource.java | 9 +- .../tilesources/TemplatedTMSTileSource.java | 8 +- 22 files changed, 390 insertions(+), 238 deletions(-) diff --git a/src/org/openstreetmap/gui/jmapviewer/Demo.java b/src/org/openstreetmap/gui/jmapviewer/Demo.java index d6ae3e8..57ee480 100644 --- a/src/org/openstreetmap/gui/jmapviewer/Demo.java +++ b/src/org/openstreetmap/gui/jmapviewer/Demo.java @@ -57,13 +57,9 @@ public class Demo extends JFrame implements JMapViewerEventListener { treeMap = new JMapViewerTree("Zones"); // Listen to the map viewer for user operations so components will - // recieve events and update + // receive events and update map().addJMVListener(this); - // final JMapViewer map = new JMapViewer(new MemoryTileCache(),4); - // map.setTileLoader(new OsmFileCacheTileLoader(map)); - // new DefaultMapController(map); - setLayout(new BorderLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setExtendedState(JFrame.MAXIMIZED_BOTH); @@ -93,8 +89,12 @@ public class Demo extends JFrame implements JMapViewerEventListener { map().setDisplayToFitMapMarkers(); } }); - JComboBox<TileSource> tileSourceSelector = new JComboBox<>(new TileSource[] { new OsmTileSource.Mapnik(), - new OsmTileSource.CycleMap(), new BingAerialTileSource(), new MapQuestOsmTileSource(), new MapQuestOpenAerialTileSource() }); + JComboBox<TileSource> tileSourceSelector = new JComboBox<>(new TileSource[] { + new OsmTileSource.Mapnik(), + new OsmTileSource.CycleMap(), + new BingAerialTileSource(), + new MapQuestOsmTileSource(), + new MapQuestOpenAerialTileSource() }); tileSourceSelector.addItemListener(new ItemListener() { public void itemStateChanged(ItemEvent e) { map().setTileSource((TileSource) e.getItem()); @@ -148,7 +148,7 @@ public class Demo extends JFrame implements JMapViewerEventListener { }); panelBottom.add(showTileGrid); final JCheckBox showZoomControls = new JCheckBox("Show zoom controls"); - showZoomControls.setSelected(map().getZoomContolsVisible()); + showZoomControls.setSelected(map().getZoomControlsVisible()); showZoomControls.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { map().setZoomContolsVisible(showZoomControls.isSelected()); diff --git a/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java b/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java index 24245f9..c048e44 100644 --- a/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java +++ b/src/org/openstreetmap/gui/jmapviewer/FeatureAdapter.java @@ -6,6 +6,7 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.text.MessageFormat; +import java.util.logging.Logger; public class FeatureAdapter { @@ -18,8 +19,13 @@ public class FeatureAdapter { // TODO: more i18n functions } + public static interface LoggingAdapter { + Logger getLogger(String name); + } + private static BrowserAdapter browserAdapter = new DefaultBrowserAdapter(); private static TranslationAdapter translationAdapter = new DefaultTranslationAdapter(); + private static LoggingAdapter loggingAdapter = new DefaultLoggingAdapter(); public static void registerBrowserAdapter(BrowserAdapter browserAdapter) { FeatureAdapter.browserAdapter = browserAdapter; @@ -29,6 +35,10 @@ public class FeatureAdapter { FeatureAdapter.translationAdapter = translationAdapter; } + public static void registerLoggingAdapter(LoggingAdapter loggingAdapter) { + FeatureAdapter.loggingAdapter = loggingAdapter; + } + public static void openLink(String url) { browserAdapter.openLink(url); } @@ -36,6 +46,10 @@ public class FeatureAdapter { public static String tr(String text, Object... objects) { return translationAdapter.tr(text, objects); } + + public static Logger getLogger(String name) { + return loggingAdapter.getLogger(name); + } public static class DefaultBrowserAdapter implements BrowserAdapter { @Override @@ -60,4 +74,11 @@ public class FeatureAdapter { return MessageFormat.format(text, objects); } } + + public static class DefaultLoggingAdapter implements LoggingAdapter { + @Override + public Logger getLogger(String name) { + return Logger.getLogger(name); + } + } } diff --git a/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java b/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java index f1ddc06..6ccbe2e 100644 --- a/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java +++ b/src/org/openstreetmap/gui/jmapviewer/JMapViewer.java @@ -9,6 +9,7 @@ import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -84,6 +85,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { HORIZONTAL, VERTICAL } + protected ZOOM_BUTTON_STYLE zoomButtonStyle; protected TileSource tileSource; @@ -93,24 +95,27 @@ public class JMapViewer extends JPanel implements TileLoaderListener { /** * Creates a standard {@link JMapViewer} instance that can be controlled via * mouse: hold right mouse button for moving, double click left mouse button - * or use mouse wheel for zooming. Loaded tiles are stored the + * or use mouse wheel for zooming. Loaded tiles are stored in a * {@link MemoryTileCache} and the tile loader uses 4 parallel threads for * retrieving the tiles. */ - @SuppressWarnings("unused") public JMapViewer() { this(new MemoryTileCache(), 8); new DefaultMapController(this); } + /** + * Creates a new {@link JMapViewer} instance. + * @param tileCache The cache where to store tiles + * @param downloadThreadCount The number of parallel threads for retrieving the tiles + */ public JMapViewer(TileCache tileCache, int downloadThreadCount) { - super(); JobDispatcher.setMaxWorkers(downloadThreadCount); tileSource = new OsmTileSource.Mapnik(); tileController = new TileController(tileSource, tileCache, this); - mapMarkerList = new LinkedList<>(); - mapPolygonList = new LinkedList<>(); - mapRectangleList = new LinkedList<>(); + mapMarkerList = Collections.synchronizedList(new LinkedList<MapMarker>()); + mapPolygonList = Collections.synchronizedList(new LinkedList<MapPolygon>()); + mapRectangleList = Collections.synchronizedList(new LinkedList<MapRectangle>()); mapMarkersVisible = true; mapRectanglesVisible = true; mapPolygonsVisible = true; @@ -120,13 +125,10 @@ public class JMapViewer extends JPanel implements TileLoaderListener { setMinimumSize(new Dimension(tileSource.getTileSize(), tileSource.getTileSize())); setPreferredSize(new Dimension(400, 400)); setDisplayPosition(new Coordinate(50, 9), 3); - //setToolTipText(""); } @Override public String getToolTipText(MouseEvent event) { - // Point screenPoint = event.getLocationOnScreen(); - // Coordinate c = getPosition(screenPoint); return super.getToolTipText(event); } @@ -242,8 +244,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { } /** - * Sets the displayed map pane and zoom level so that all chosen map elements are - * visible. + * Sets the displayed map pane and zoom level so that all chosen map elements are visible. */ public void setDisplayToFitMapElements(boolean markers, boolean rectangles, boolean polygons) { int nbElemToCheck = 0; @@ -263,39 +264,45 @@ public class JMapViewer extends JPanel implements TileLoaderListener { int mapZoomMax = tileController.getTileSource().getMaxZoom(); if (markers) { - for (MapMarker marker : mapMarkerList) { - if(marker.isVisible()){ - int x = tileSource.LonToX(marker.getLon(), mapZoomMax); - int y = tileSource.LatToY(marker.getLat(), mapZoomMax); - x_max = Math.max(x_max, x); - y_max = Math.max(y_max, y); - x_min = Math.min(x_min, x); - y_min = Math.min(y_min, y); + synchronized (mapMarkerList) { + for (MapMarker marker : mapMarkerList) { + if (marker.isVisible()) { + int x = tileSource.LonToX(marker.getLon(), mapZoomMax); + int y = tileSource.LatToY(marker.getLat(), mapZoomMax); + x_max = Math.max(x_max, x); + y_max = Math.max(y_max, y); + x_min = Math.min(x_min, x); + y_min = Math.min(y_min, y); + } } } } if (rectangles) { - for (MapRectangle rectangle : mapRectangleList) { - if(rectangle.isVisible()){ - x_max = Math.max(x_max, tileSource.LonToX(rectangle.getBottomRight().getLon(), mapZoomMax)); - y_max = Math.max(y_max, tileSource.LatToY(rectangle.getTopLeft().getLat(), mapZoomMax)); - x_min = Math.min(x_min, tileSource.LonToX(rectangle.getTopLeft().getLon(), mapZoomMax)); - y_min = Math.min(y_min, tileSource.LatToY(rectangle.getBottomRight().getLat(), mapZoomMax)); + synchronized (mapRectangleList) { + for (MapRectangle rectangle : mapRectangleList) { + if (rectangle.isVisible()) { + x_max = Math.max(x_max, tileSource.LonToX(rectangle.getBottomRight().getLon(), mapZoomMax)); + y_max = Math.max(y_max, tileSource.LatToY(rectangle.getTopLeft().getLat(), mapZoomMax)); + x_min = Math.min(x_min, tileSource.LonToX(rectangle.getTopLeft().getLon(), mapZoomMax)); + y_min = Math.min(y_min, tileSource.LatToY(rectangle.getBottomRight().getLat(), mapZoomMax)); + } } } } if (polygons) { - for (MapPolygon polygon : mapPolygonList) { - if(polygon.isVisible()){ - for (ICoordinate c : polygon.getPoints()) { - int x = tileSource.LonToX(c.getLon(), mapZoomMax); - int y = tileSource.LatToY(c.getLat(), mapZoomMax); - x_max = Math.max(x_max, x); - y_max = Math.max(y_max, y); - x_min = Math.min(x_min, x); - y_min = Math.min(y_min, y); + synchronized (mapPolygonList) { + for (MapPolygon polygon : mapPolygonList) { + if (polygon.isVisible()) { + for (ICoordinate c : polygon.getPoints()) { + int x = tileSource.LonToX(c.getLon(), mapZoomMax); + int y = tileSource.LatToY(c.getLat(), mapZoomMax); + x_max = Math.max(x_max, x); + y_max = Math.max(y_max, y); + x_min = Math.min(x_min, x); + y_min = Math.min(y_min, y); + } } } } @@ -319,26 +326,22 @@ public class JMapViewer extends JPanel implements TileLoaderListener { setDisplayPosition(x, y, newZoom); } - /** - * Sets the displayed map pane and zoom level so that all map markers are - * visible. + * Sets the displayed map pane and zoom level so that all map markers are visible. */ public void setDisplayToFitMapMarkers() { setDisplayToFitMapElements(true, false, false); } /** - * Sets the displayed map pane and zoom level so that all map rectangles are - * visible. + * Sets the displayed map pane and zoom level so that all map rectangles are visible. */ public void setDisplayToFitMapRectangles() { setDisplayToFitMapElements(false, true, false); } /** - * Sets the displayed map pane and zoom level so that all map polygons are - * visible. + * Sets the displayed map pane and zoom level so that all map polygons are visible. */ public void setDisplayToFitMapPolygons() { setDisplayToFitMapElements(false, false, true); @@ -429,7 +432,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { * @return Integer the radius in pixels */ public Integer getLatOffset(double lat, double offset, boolean checkOutside) { - int y = tileSource.LatToY(lat+offset, zoom); + int y = tileSource.LatToY(lat + offset, zoom); y -= center.y - getHeight() / 2; if (checkOutside) { if (y < 0 || y > getHeight()) @@ -456,13 +459,14 @@ public class JMapViewer extends JPanel implements TileLoaderListener { * @return Integer the radius in pixels */ public Integer getRadius(MapMarker marker, Point p) { - if(marker.getMarkerStyle() == MapMarker.STYLE.FIXED) - return (int)marker.getRadius(); - else if(p!=null){ + if (marker.getMarkerStyle() == MapMarker.STYLE.FIXED) + return (int) marker.getRadius(); + else if (p != null) { Integer radius = getLatOffset(marker.getLat(), marker.getRadius(), false); - radius = radius==null?null:p.y-radius.intValue(); + radius = radius == null ? null : p.y - radius.intValue(); return radius; - }else return null; + } else + return null; } /** @@ -499,18 +503,18 @@ public class JMapViewer extends JPanel implements TileLoaderListener { * @author Jason Huntley */ public double getMeterPerPixel() { - Point origin=new Point(5,5); - Point center=new Point(getWidth()/2, getHeight()/2); + Point origin = new Point(5, 5); + Point center = new Point(getWidth() / 2, getHeight() / 2); - double pDistance=center.distance(origin); + double pDistance = center.distance(origin); - Coordinate originCoord=getPosition(origin); - Coordinate centerCoord=getPosition(center); + Coordinate originCoord = getPosition(origin); + Coordinate centerCoord = getPosition(center); double mDistance = tileSource.getDistance(originCoord.getLat(), originCoord.getLon(), centerCoord.getLat(), centerCoord.getLon()); - return mDistance/pDistance; + return mDistance / pDistance; } @Override @@ -613,20 +617,29 @@ public class JMapViewer extends JPanel implements TileLoaderListener { } if (mapPolygonsVisible && mapPolygonList != null) { - for (MapPolygon polygon : mapPolygonList) { - if(polygon.isVisible()) paintPolygon(g, polygon); + synchronized (mapPolygonList) { + for (MapPolygon polygon : mapPolygonList) { + if (polygon.isVisible()) + paintPolygon(g, polygon); + } } } if (mapRectanglesVisible && mapRectangleList != null) { - for (MapRectangle rectangle : mapRectangleList) { - if(rectangle.isVisible()) paintRectangle(g, rectangle); + synchronized (mapRectangleList) { + for (MapRectangle rectangle : mapRectangleList) { + if (rectangle.isVisible()) + paintRectangle(g, rectangle); + } } } if (mapMarkersVisible && mapMarkerList != null) { - for (MapMarker marker : mapMarkerList) { - if(marker.isVisible())paintMarker(g, marker); + synchronized (mapMarkerList) { + for (MapMarker marker : mapMarkerList) { + if (marker.isVisible()) + paintMarker(g, marker); + } } } @@ -637,7 +650,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { * Paint a single marker. */ protected void paintMarker(Graphics g, MapMarker marker) { - Point p = getMapPosition(marker.getLat(), marker.getLon(), marker.getMarkerStyle()==MapMarker.STYLE.FIXED); + Point p = getMapPosition(marker.getLat(), marker.getLon(), marker.getMarkerStyle() == MapMarker.STYLE.FIXED); Integer radius = getRadius(marker, p); if (scrollWrapEnabled) { int tilesize = tileSource.getTileSize(); @@ -780,6 +793,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { /** * Increases the current zoom level by one + * @param mapPoint point to choose as center for new zoom level */ public void zoomIn(Point mapPoint) { setZoom(zoom + 1, mapPoint); @@ -947,7 +961,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { zoomOutButton.setVisible(visible); } - public boolean getZoomContolsVisible() { + public boolean getZoomControlsVisible() { return zoomSlider.isVisible(); } @@ -955,7 +969,7 @@ public class JMapViewer extends JPanel implements TileLoaderListener { if (tileSource.getMaxZoom() > MAX_ZOOM) throw new RuntimeException("Maximum zoom level too high"); if (tileSource.getMinZoom() < MIN_ZOOM) - throw new RuntimeException("Minumim zoom level too low"); + throw new RuntimeException("Minimum zoom level too low"); Coordinate position = getPosition(); this.tileSource = tileSource; tileController.setTileSource(tileSource); @@ -1025,21 +1039,21 @@ public class JMapViewer extends JPanel implements TileLoaderListener { return; } switch (style) { - case HORIZONTAL: - zoomSlider.setBounds(10, 10, 30, 150); - zoomInButton.setBounds(4, 155, 18, 18); - zoomOutButton.setBounds(26, 155, 18, 18); - break; - case VERTICAL: - zoomSlider.setBounds(10, 27, 30, 150); - zoomInButton.setBounds(14, 8, 20, 20); - zoomOutButton.setBounds(14, 176, 20, 20); - break; - default: - zoomSlider.setBounds(10, 10, 30, 150); - zoomInButton.setBounds(4, 155, 18, 18); - zoomOutButton.setBounds(26, 155, 18, 18); - break; + case HORIZONTAL: + zoomSlider.setBounds(10, 10, 30, 150); + zoomInButton.setBounds(4, 155, 18, 18); + zoomOutButton.setBounds(26, 155, 18, 18); + break; + case VERTICAL: + zoomSlider.setBounds(10, 27, 30, 150); + zoomInButton.setBounds(14, 8, 20, 20); + zoomOutButton.setBounds(14, 176, 20, 20); + break; + default: + zoomSlider.setBounds(10, 10, 30, 150); + zoomInButton.setBounds(4, 155, 18, 18); + zoomOutButton.setBounds(26, 155, 18, 18); + break; } repaint(); } @@ -1087,9 +1101,9 @@ public class JMapViewer extends JPanel implements TileLoaderListener { */ void fireJMVEvent(JMVCommandEvent evt) { Object[] listeners = evtListenerList.getListenerList(); - for (int i=0; i<listeners.length; i+=2) { - if (listeners[i]==JMapViewerEventListener.class) { - ((JMapViewerEventListener)listeners[i+1]).processCommand(evt); + for (int i = 0; i < listeners.length; i += 2) { + if (listeners[i] == JMapViewerEventListener.class) { + ((JMapViewerEventListener) listeners[i + 1]).processCommand(evt); } } } diff --git a/src/org/openstreetmap/gui/jmapviewer/MemoryTileCache.java b/src/org/openstreetmap/gui/jmapviewer/MemoryTileCache.java index ccf61b2..220df59 100644 --- a/src/org/openstreetmap/gui/jmapviewer/MemoryTileCache.java +++ b/src/org/openstreetmap/gui/jmapviewer/MemoryTileCache.java @@ -31,6 +31,9 @@ public class MemoryTileCache implements TileCache { */ protected final CacheLinkedListElement lruTiles; + /** + * Constructs a new {@code MemoryTileCache}. + */ public MemoryTileCache() { hash = new HashMap<>(cacheSize); lruTiles = new CacheLinkedListElement(); @@ -80,9 +83,7 @@ public class MemoryTileCache implements TileCache { return new CacheEntry(tile); } - /** - * Clears the cache deleting all tiles from memory - */ + @Override public synchronized void clear() { hash.clear(); lruTiles.clear(); diff --git a/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java b/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java index c88c207..08212ef 100644 --- a/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java +++ b/src/org/openstreetmap/gui/jmapviewer/OsmFileCacheTileLoader.java @@ -42,10 +42,9 @@ import org.openstreetmap.gui.jmapviewer.interfaces.TileSource.TileUpdate; */ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileLoader { - private static final Logger log = Logger.getLogger(OsmFileCacheTileLoader.class.getName()); + private static final Logger log = FeatureAdapter.getLogger(OsmFileCacheTileLoader.class.getName()); - private static final String ETAG_FILE_EXT = ".etag"; - private static final String TAGS_FILE_EXT = ".tags"; + protected static final String TAGS_FILE_EXT = "tags"; private static final Charset TAGS_CHARSET = Charset.forName("UTF-8"); @@ -56,8 +55,8 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL protected final Map<TileSource, File> sourceCacheDirMap; - protected long maxCacheFileAge = FILE_AGE_ONE_WEEK; - protected long recheckAfter = FILE_AGE_ONE_DAY; + protected long maxCacheFileAge = Long.MAX_VALUE; // max. age not limited + protected long recheckAfter = FILE_AGE_ONE_WEEK; public static File getDefaultCacheDir() throws SecurityException { String tempDir = null; @@ -133,8 +132,8 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL Tile tile; File tileCacheDir; File tileFile = null; - long fileAge = 0; - boolean fileTilePainted = false; + Long fileMtime = null; + Long now = null; // current time in milliseconds (keep consistent value for the whole run) public FileLoadJob(Tile tile) { this.tile = tile; @@ -154,44 +153,61 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL tile.error = false; tile.loading = true; } + now = System.currentTimeMillis(); tileCacheDir = getSourceCacheDir(tile.getSource()); - if (loadTileFromFile()) { + + if (loadTileFromFile(recheckAfter)) { + log.log(Level.FINE, "TMS - found in tile cache: {0}", tile); + tile.setLoaded(true); + listener.tileLoadingFinished(tile, true); return; } - if (fileTilePainted) { - TileJob job = new TileJob() { + TileJob job = new TileJob() { - @Override - public void run() { - loadOrUpdateTile(); - } - @Override - public Tile getTile() { - return tile; + @Override + public void run() { + if (loadOrUpdateTile()) { + tile.setLoaded(true); + listener.tileLoadingFinished(tile, true); + } else { + // failed to download - use old cache file if available + if (loadTileFromFile(maxCacheFileAge)) { + tile.setLoaded(true); + tile.error = false; + listener.tileLoadingFinished(tile, true); + log.log(Level.FINE, "TMS - found stale tile in cache: {0}", tile); + } else { + // failed completely + tile.setLoaded(true); + listener.tileLoadingFinished(tile, false); + } } - }; - JobDispatcher.getInstance().addJob(job); - } else { - loadOrUpdateTile(); - } + } + @Override + public Tile getTile() { + return tile; + } + }; + JobDispatcher.getInstance().addJob(job); } - protected void loadOrUpdateTile() { + protected boolean loadOrUpdateTile() { try { URLConnection urlConn = loadTileFromOsm(tile); - if (tileFile != null) { + if (fileMtime != null && now - fileMtime <= maxCacheFileAge) { switch (tile.getSource().getTileUpdate()) { case IfModifiedSince: - urlConn.setIfModifiedSince(fileAge); + urlConn.setIfModifiedSince(fileMtime); break; case LastModified: - if (!isOsmTileNewer(fileAge)) { - log.finest("LastModified test: local version is up to date: " + tile); - tile.setLoaded(true); - tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge + recheckAfter); - return; + if (!isOsmTileNewer(fileMtime)) { + log.log(Level.FINE, "TMS - LastModified test: local version is up to date: {0}", tile); + tileFile.setLastModified(now); + return true; } break; + default: + break; } } if (tile.getSource().getTileUpdate() == TileUpdate.ETag || tile.getSource().getTileUpdate() == TileUpdate.IfNoneMatch) { @@ -203,11 +219,12 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL break; case ETag: if (hasOsmTileETag(fileETag)) { - tile.setLoaded(true); - tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge - + recheckAfter); - return; + log.log(Level.FINE, "TMS - ETag test: local version is up to date: {0}", tile); + tileFile.setLastModified(now); + return true; } + default: + break; } } tile.putValue("etag", urlConn.getHeaderField("ETag")); @@ -215,10 +232,20 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 304) { // If we are isModifiedSince or If-None-Match has been set // and the server answers with a HTTP 304 = "Not Modified" - log.finest("ETag test: local version is up to date: " + tile); - tile.setLoaded(true); - tileFile.setLastModified(System.currentTimeMillis() - maxCacheFileAge + recheckAfter); - return; + switch (tile.getSource().getTileUpdate()) { + case IfModifiedSince: + log.log(Level.FINE, "TMS - IfModifiedSince test: local version is up to date: {0}", tile); + break; + case IfNoneMatch: + log.log(Level.FINE, "TMS - IfNoneMatch test: local version is up to date: {0}", tile); + break; + default: + break; + } + if (loadTileFromFile(maxCacheFileAge)) { + tileFile.setLastModified(now); + return true; + } } loadTileMetadata(tile, urlConn); @@ -226,10 +253,11 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL if ("no-tile".equals(tile.getValue("tile-info"))) { + log.log(Level.FINE, "TMS - No tile: tile-info=no-tile: {0}", tile); tile.setError("No tile at this zoom level"); - listener.tileLoadingFinished(tile, true); + return true; } else { - for(int i = 0; i < 5; ++i) { + for (int i = 0; i < 5; ++i) { if (urlConn instanceof HttpURLConnection && ((HttpURLConnection)urlConn).getResponseCode() == 503) { Thread.sleep(5000+(new Random()).nextInt(5000)); continue; @@ -237,41 +265,43 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL byte[] buffer = loadTileInBuffer(urlConn); if (buffer != null) { tile.loadImage(new ByteArrayInputStream(buffer)); - tile.setLoaded(true); - listener.tileLoadingFinished(tile, true); saveTileToFile(buffer); - break; + log.log(Level.FINE, "TMS - downloaded tile from server: {0}", tile.getUrl()); + return true; } } } } catch (Exception e) { tile.setError(e.getMessage()); - listener.tileLoadingFinished(tile, false); if (input == null) { try { - System.err.println("Failed loading " + tile.getUrl() +": " + e.getMessage()); + log.log(Level.WARNING, "TMS - Failed downloading {0}: {1}", new Object[]{tile.getUrl(), e.getMessage()}); + return false; } catch(IOException i) { } } - } finally { - tile.loading = false; - tile.setLoaded(true); } + log.log(Level.WARNING, "TMS - Failed downloading tile: {0}", tile); + return false; } - protected boolean loadTileFromFile() { + protected boolean loadTileFromFile(long maxAge) { try { tileFile = getTileFile(); if (!tileFile.exists()) return false; - loadTagsFromFile(); + + fileMtime = tileFile.lastModified(); + if (now - fileMtime > maxAge) + return false; + if ("no-tile".equals(tile.getValue("tile-info"))) { tile.setError("No tile at this zoom level"); if (tileFile.exists()) { tileFile.delete(); } - tileFile = getTagsFile(); + tileFile = null; } else { try (FileInputStream fin = new FileInputStream(tileFile)) { if (fin.available() == 0) @@ -279,21 +309,13 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL tile.loadImage(fin); } } + return true; - fileAge = tileFile.lastModified(); - boolean oldTile = System.currentTimeMillis() - fileAge > maxCacheFileAge; - if (!oldTile) { - tile.setLoaded(true); - listener.tileLoadingFinished(tile, true); - fileTilePainted = true; - return true; - } - listener.tileLoadingFinished(tile, true); - fileTilePainted = true; } catch (Exception e) { + log.log(Level.WARNING, "TMS - Error while loading image from tile cache: {0}; {1}", new Object[]{e.getMessage(), tile}); tileFile.delete(); tileFile = null; - fileAge = 0; + fileMtime = null; } return false; } @@ -346,7 +368,7 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL urlConn.setReadTimeout(30000); // 30 seconds read timeout // System.out.println("Tile age: " + new // Date(urlConn.getLastModified()) + " / " - // + new Date(fileAge)); + // + new Date(fileMtime)); long lastModified = urlConn.getLastModified(); if (lastModified == 0) return true; // no LastModified time returned @@ -362,7 +384,7 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL urlConn.setReadTimeout(30000); // 30 seconds read timeout // System.out.println("Tile age: " + new // Date(urlConn.getLastModified()) + " / " - // + new Date(fileAge)); + // + new Date(fileMtime)); String osmETag = urlConn.getHeaderField("ETag"); if (osmETag == null) return true; @@ -375,18 +397,19 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL } protected File getTagsFile() { - return new File(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile() + "_" + tile.getYtile() + return new File(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile() + "_" + tile.getYtile() + "." + TAGS_FILE_EXT); } protected void saveTileToFile(byte[] rawData) { + File file = getTileFile(); + file.getParentFile().mkdirs(); try ( - FileOutputStream f = new FileOutputStream(tileCacheDir + "/" + tile.getZoom() + "_" + tile.getXtile() - + "_" + tile.getYtile() + "." + tile.getSource().getTileType()) + FileOutputStream f = new FileOutputStream(file) ) { f.write(rawData); } catch (Exception e) { - System.err.println("Failed to save tile content: " + e.getLocalizedMessage()); + log.log(Level.SEVERE, "Failed to save tile content: {0}", e.getLocalizedMessage()); } } @@ -405,26 +428,7 @@ public class OsmFileCacheTileLoader extends OsmTileLoader implements CachedTileL } } - /** Load backward-compatiblity .etag file and if it exists move it to new .tags file*/ - private void loadOldETagfromFile() { - File etagFile = new File(tileCacheDir, tile.getZoom() + "_" - + tile.getXtile() + "_" + tile.getYtile() + ETAG_FILE_EXT); - if (!etagFile.exists()) return; - try (FileInputStream f = new FileInputStream(etagFile)) { - byte[] buf = new byte[f.available()]; - f.read(buf); - String etag = new String(buf, TAGS_CHARSET.name()); - tile.putValue("etag", etag); - if (etagFile.delete()) { - saveTagsToFile(); - } - } catch (IOException e) { - System.err.println("Failed to load compatiblity etag: " + e.getLocalizedMessage()); - } - } - protected void loadTagsFromFile() { - loadOldETagfromFile(); File tagsFile = getTagsFile(); try (BufferedReader f = new BufferedReader(new InputStreamReader(new FileInputStream(tagsFile), TAGS_CHARSET))) { for (String line = f.readLine(); line != null; line = f.readLine()) { diff --git a/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java b/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java index 8bb0955..eee1fc8 100644 --- a/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java +++ b/src/org/openstreetmap/gui/jmapviewer/OsmTileLoader.java @@ -70,8 +70,10 @@ public class OsmTileLoader implements TileLoader { listener.tileLoadingFinished(tile, false); if (input == null) { try { - System.err.println("Failed loading " + tile.getUrl() +": " + e.getMessage()); - } catch(IOException i) { + System.err.println("Failed loading " + tile.getUrl() +": " + +e.getClass() + ": " + e.getMessage()); + } catch (IOException ioe) { + ioe.printStackTrace(); } } } finally { diff --git a/src/org/openstreetmap/gui/jmapviewer/TMSFileCacheTileLoader.java b/src/org/openstreetmap/gui/jmapviewer/TMSFileCacheTileLoader.java new file mode 100644 index 0000000..e60548e --- /dev/null +++ b/src/org/openstreetmap/gui/jmapviewer/TMSFileCacheTileLoader.java @@ -0,0 +1,76 @@ +// License: GPL. For details, see Readme.txt file. +package org.openstreetmap.gui.jmapviewer; + +import java.io.File; +import java.io.IOException; +import org.openstreetmap.gui.jmapviewer.interfaces.TileJob; +import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener; +import org.openstreetmap.gui.jmapviewer.interfaces.TileSource; + +/** + * Reworked version of the OsmFileCacheTileLoader. + * + * When class OsmFileCacheTileLoader is no longer needed, it can be integrated + * here and removed. + */ +public class TMSFileCacheTileLoader extends OsmFileCacheTileLoader { + + public TMSFileCacheTileLoader(TileLoaderListener map, File cacheDir) throws IOException { + super(map, cacheDir); + } + + @Override + public TileJob createTileLoaderJob(final Tile tile) { + return new TMSFileLoadJob(tile); + } + + protected class TMSFileLoadJob extends FileLoadJob { + + public TMSFileLoadJob(Tile tile) { + super(tile); + } + + @Override + protected File getTileFile() { + return getDataFile(tile.getSource().getTileType()); + } + + @Override + protected File getTagsFile() { + return getDataFile(TAGS_FILE_EXT); + } + + protected File getDataFile(String ext) { + int nDigits = (int) Math.ceil(Math.log10(1 << tile.getZoom())); + String x = String.format("%0" + nDigits + "d", tile.getXtile()); + String y = String.format("%0" + nDigits + "d", tile.getYtile()); + File path = new File(tileCacheDir, "z" + tile.getZoom()); + for (int i=0; i<nDigits; i++) { + String component = "x" + x.substring(i, i+1) + "y" + y.substring(i, i+1); + if (i == nDigits -1 ) { + component += "." + ext; + } + path = new File(path, component); + } + return path; + } + } + + @Override + protected File getSourceCacheDir(TileSource source) { + File dir = sourceCacheDirMap.get(source); + if (dir == null) { + String id = source.getId(); + if (id != null) { + dir = new File(cacheDirBase, id); + } else { + dir = new File(cacheDirBase, source.getName().replaceAll("[\\\\/:*?\"<>|]", "_")); + } + if (!dir.exists()) { + dir.mkdirs(); + } + } + return dir; + } + +} diff --git a/src/org/openstreetmap/gui/jmapviewer/Tile.java b/src/org/openstreetmap/gui/jmapviewer/Tile.java index 9e56e71..82ab19e 100644 --- a/src/org/openstreetmap/gui/jmapviewer/Tile.java +++ b/src/org/openstreetmap/gui/jmapviewer/Tile.java @@ -24,18 +24,21 @@ import org.openstreetmap.gui.jmapviewer.interfaces.TileSource; public class Tile { /** - * Hourglass image that is displayed until a map tile has been loaded + * Hourglass image that is displayed until a map tile has been loaded, except for overlay sources */ public static BufferedImage LOADING_IMAGE; + + /** + * Red cross image that is displayed after a loading error, except for overlay sources + */ public static BufferedImage ERROR_IMAGE; static { try { LOADING_IMAGE = ImageIO.read(JMapViewer.class.getResourceAsStream("images/hourglass.png")); ERROR_IMAGE = ImageIO.read(JMapViewer.class.getResourceAsStream("images/error.png")); - } catch (Exception e1) { - LOADING_IMAGE = null; - ERROR_IMAGE = null; + } catch (Exception ex) { + ex.printStackTrace(); } } @@ -56,24 +59,31 @@ public class Tile { /** * Creates a tile with empty image. * - * @param source - * @param xtile - * @param ytile - * @param zoom + * @param source Tile source + * @param xtile X coordinate + * @param ytile Y coordinate + * @param zoom Zoom level */ public Tile(TileSource source, int xtile, int ytile, int zoom) { - super(); + this(source, xtile, ytile, zoom, LOADING_IMAGE); + } + + /** + * Creates a tile with specified image. + * + * @param source Tile source + * @param xtile X coordinate + * @param ytile Y coordinate + * @param zoom Zoom level + * @param image Image content + */ + public Tile(TileSource source, int xtile, int ytile, int zoom, BufferedImage image) { this.source = source; this.xtile = xtile; this.ytile = ytile; this.zoom = zoom; - this.image = LOADING_IMAGE; - this.key = getTileKey(source, xtile, ytile, zoom); - } - - public Tile(TileSource source, int xtile, int ytile, int zoom, BufferedImage image) { - this(source, xtile, ytile, zoom); this.image = image; + this.key = getTileKey(source, xtile, ytile, zoom); } /** @@ -137,6 +147,7 @@ public class Tile { } /** + * Returns the X coordinate. * @return tile number on the x axis of this tile */ public int getXtile() { @@ -144,6 +155,7 @@ public class Tile { } /** + * Returns the Y coordinate. * @return tile number on the y axis of this tile */ public int getYtile() { @@ -151,6 +163,7 @@ public class Tile { } /** + * Returns the zoom level. * @return zoom level of this tile */ public int getZoom() { @@ -196,11 +209,9 @@ public class Tile { * Paints the tile-image on the {@link Graphics} <code>g</code> at the * position <code>x</code>/<code>y</code>. * - * @param g - * @param x - * x-coordinate in <code>g</code> - * @param y - * y-coordinate in <code>g</code> + * @param g the Graphics object + * @param x x-coordinate in <code>g</code> + * @param y y-coordinate in <code>g</code> */ public void paint(Graphics g, int x, int y) { if (image == null) @@ -285,8 +296,8 @@ public class Tile { * If value is null, the (possibly existing) key/value pair is removed from * the meta data. * - * @param key - * @param value + * @param key Key + * @param value Value */ public void putValue(String key, String value) { if (value == null || value.isEmpty()) { diff --git a/src/org/openstreetmap/gui/jmapviewer/TileController.java b/src/org/openstreetmap/gui/jmapviewer/TileController.java index e16255a..d159ee1 100644 --- a/src/org/openstreetmap/gui/jmapviewer/TileController.java +++ b/src/org/openstreetmap/gui/jmapviewer/TileController.java @@ -6,7 +6,6 @@ import org.openstreetmap.gui.jmapviewer.interfaces.TileCache; import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader; import org.openstreetmap.gui.jmapviewer.interfaces.TileLoaderListener; import org.openstreetmap.gui.jmapviewer.interfaces.TileSource; -import org.openstreetmap.gui.jmapviewer.tilesources.OsmTileSource; public class TileController { protected TileLoader tileLoader; @@ -16,10 +15,10 @@ public class TileController { JobDispatcher jobDispatcher; public TileController(TileSource source, TileCache tileCache, TileLoaderListener listener) { - tileSource = new OsmTileSource.Mapnik(); - tileLoader = new OsmTileLoader(listener); + this.tileSource = source; + this.tileLoader = new OsmTileLoader(listener); this.tileCache = tileCache; - jobDispatcher = JobDispatcher.getInstance(); + this.jobDispatcher = JobDispatcher.getInstance(); } /** @@ -80,7 +79,7 @@ public class TileController { } /** - * + * Removes all jobs from the queue that are currently not being processed. */ public void cancelOutstandingJobs() { jobDispatcher.cancelOutstandingJobs(); diff --git a/src/org/openstreetmap/gui/jmapviewer/interfaces/TileCache.java b/src/org/openstreetmap/gui/jmapviewer/interfaces/TileCache.java index 0082987..cda5d67 100644 --- a/src/org/openstreetmap/gui/jmapviewer/interfaces/TileCache.java +++ b/src/org/openstreetmap/gui/jmapviewer/interfaces/TileCache.java @@ -42,4 +42,9 @@ public interface TileCache { * @return the number of tiles hold by the cache */ public int getTileCount(); + + /** + * Clears the cache deleting all tiles from memory. + */ + public void clear(); } diff --git a/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoaderListener.java b/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoaderListener.java index 075ac9f..ecd566e 100644 --- a/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoaderListener.java +++ b/src/org/openstreetmap/gui/jmapviewer/interfaces/TileLoaderListener.java @@ -9,15 +9,8 @@ public interface TileLoaderListener { * Will be called if a new {@link Tile} has been loaded successfully. * Loaded can mean downloaded or loaded from file cache. * - * @param tile + * @param tile The tile + * @param success {@code true} if the tile has been loaded successfully, {@code false} otherwise */ public void tileLoadingFinished(Tile tile, boolean success); - - /** - * Return the {@link TileCache} class containing {@link Tile} - * data for requested and loaded tiles - * - * @return tile information caching class - */ - public TileCache getTileCache(); } diff --git a/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java b/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java index 74a0284..b8680e8 100644 --- a/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/interfaces/TileSource.java @@ -62,14 +62,23 @@ public interface TileSource extends Attributed { TileUpdate getTileUpdate(); /** - * A tile layer name has to be unique and has to consist only of characters - * valid for filenames. + * A tile layer name as displayed to the user. * * @return Name of the tile layer */ String getName(); /** + * A unique id for this tile source. + * + * Unlike the name it has to be unique and has to consist only of characters + * valid for filenames. + * + * @return the id + */ + String getId(); + + /** * Constructs the tile url. * * @param zoom diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractMapQuestTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractMapQuestTileSource.java index 4dbee39..5db7eca 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractMapQuestTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractMapQuestTileSource.java @@ -30,8 +30,8 @@ public class AbstractMapQuestTileSource extends AbstractOsmTileSource { private int SERVER_NUM = 1; - public AbstractMapQuestTileSource(String name, String base_url) { - super(name, base_url); + public AbstractMapQuestTileSource(String name, String base_url, String id) { + super(name, base_url, id); } @Override diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractOsmTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractOsmTileSource.java index edf1729..ff8f58a 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractOsmTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractOsmTileSource.java @@ -19,9 +19,11 @@ public abstract class AbstractOsmTileSource extends AbstractTMSTileSource { * Constructs a new OSM tile source * @param name Source name as displayed in GUI * @param base_url Source URL + * @param id unique id for the tile source; contains only characters that + * are safe for file names; can be null */ - public AbstractOsmTileSource(String name, String base_url) { - super(name, base_url); + public AbstractOsmTileSource(String name, String base_url, String id) { + super(name, base_url, id); } public int getMaxZoom() { diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java index 37b3c4a..e3cfd19 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/AbstractTMSTileSource.java @@ -9,13 +9,15 @@ public abstract class AbstractTMSTileSource extends AbstractTileSource { protected String name; protected String baseUrl; + protected String id; - public AbstractTMSTileSource(String name, String base_url) { + public AbstractTMSTileSource(String name, String base_url, String id) { this.name = name; this.baseUrl = base_url; if(baseUrl.endsWith("/")) { baseUrl = baseUrl.substring(0,baseUrl.length()-1); } + this.id = id; } @Override @@ -24,6 +26,11 @@ public abstract class AbstractTMSTileSource extends AbstractTileSource { } @Override + public String getId() { + return id; + } + + @Override public int getMaxZoom() { return 21; } diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java index 7504b8a..f8723b6 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/BingAerialTileSource.java @@ -52,7 +52,14 @@ public class BingAerialTileSource extends AbstractTMSTileSource { * Constructs a new {@code BingAerialTileSource}. */ public BingAerialTileSource() { - super("Bing Aerial Maps", "http://example.com/"); + this("Bing"); + } + + /** + * Constructs a new {@code BingAerialTileSource}. + */ + public BingAerialTileSource(String id) { + super("Bing Aerial Maps", "http://example.com/", id); } protected class Attribution { diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOpenAerialTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOpenAerialTileSource.java index e48e88d..719b2e1 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOpenAerialTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOpenAerialTileSource.java @@ -8,7 +8,7 @@ public class MapQuestOpenAerialTileSource extends AbstractMapQuestTileSource { private static final String PATTERN = "http://oatile%d.mqcdn.com/tiles/1.0.0/sat"; public MapQuestOpenAerialTileSource() { - super("MapQuest Open Aerial", PATTERN); + super("MapQuest Open Aerial", PATTERN, "mapquest-oa"); } @Override diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOsmTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOsmTileSource.java index 30f6288..010f9de 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOsmTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/MapQuestOsmTileSource.java @@ -8,7 +8,7 @@ public class MapQuestOsmTileSource extends AbstractMapQuestTileSource { private static final String PATTERN = "http://otile%d.mqcdn.com/tiles/1.0.0/osm"; public MapQuestOsmTileSource() { - super("MapQuest-OSM", PATTERN); + super("MapQuest-OSM", PATTERN, "mapquest-osm"); } @Override diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java index 3d4ab7f..1edaf5d 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/OsmTileSource.java @@ -21,7 +21,7 @@ public class OsmTileSource { * Constructs a new {@code "Mapnik"} tile source. */ public Mapnik() { - super("Mapnik", PATTERN); + super("Mapnik", PATTERN, "MAPNIK"); } @Override @@ -56,7 +56,7 @@ public class OsmTileSource { * Constructs a new {@code CycleMap} tile source. */ public CycleMap() { - super("Cyclemap", PATTERN); + super("Cyclemap", PATTERN, "opencyclemap"); } @Override diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java index 934bd71..be7128a 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/ScanexTileSource.java @@ -45,8 +45,8 @@ public class ScanexTileSource extends TMSTileSource { /* IRS by default */ private ScanexLayer Layer = ScanexLayer.IRS; - public ScanexTileSource(String name, String url, int maxZoom) { - super(name, url, maxZoom); + public ScanexTileSource(String name, String url, String id, int maxZoom) { + super(name, url, id, maxZoom); for (ScanexLayer layer : ScanexLayer.values()) { if (url.equalsIgnoreCase(layer.getName())) { diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java index f22c0ac..23c792d 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/TMSTileSource.java @@ -6,13 +6,13 @@ public class TMSTileSource extends AbstractTMSTileSource { protected int maxZoom; protected int minZoom = 0; - public TMSTileSource(String name, String url, int maxZoom) { - super(name, url); + public TMSTileSource(String name, String url, String id, int maxZoom) { + super(name, url, id); this.maxZoom = maxZoom; } - public TMSTileSource(String name, String url, int minZoom, int maxZoom) { - super(name, url); + public TMSTileSource(String name, String url, String id, int minZoom, int maxZoom) { + super(name, url, id); this.minZoom = minZoom; this.maxZoom = maxZoom; } @@ -27,6 +27,7 @@ public class TMSTileSource extends AbstractTMSTileSource { return (maxZoom == 0) ? super.getMaxZoom() : maxZoom; } + @Override public TileUpdate getTileUpdate() { return TileUpdate.IfNoneMatch; } diff --git a/src/org/openstreetmap/gui/jmapviewer/tilesources/TemplatedTMSTileSource.java b/src/org/openstreetmap/gui/jmapviewer/tilesources/TemplatedTMSTileSource.java index fea0e5a..a5d5c04 100644 --- a/src/org/openstreetmap/gui/jmapviewer/tilesources/TemplatedTMSTileSource.java +++ b/src/org/openstreetmap/gui/jmapviewer/tilesources/TemplatedTMSTileSource.java @@ -26,13 +26,13 @@ public class TemplatedTMSTileSource extends TMSTileSource { PATTERN_SWITCH }; - public TemplatedTMSTileSource(String name, String url, int maxZoom) { - super(name, url, maxZoom); + public TemplatedTMSTileSource(String name, String url, String id, int maxZoom) { + super(name, url, id, maxZoom); handleTemplate(); } - public TemplatedTMSTileSource(String name, String url, int minZoom, int maxZoom) { - super(name, url, minZoom, maxZoom); + public TemplatedTMSTileSource(String name, String url, String id, int minZoom, int maxZoom) { + super(name, url, id, minZoom, maxZoom); handleTemplate(); } -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/jmapviewer.git _______________________________________________ Pkg-grass-devel mailing list Pkg-grass-devel@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-grass-devel