diff --git a/vtm-jeo/src/org/oscim/layers/JeoTileSource.java b/vtm-jeo/src/org/oscim/layers/JeoTileSource.java index 46330f2e..35781bb3 100644 --- a/vtm-jeo/src/org/oscim/layers/JeoTileSource.java +++ b/vtm-jeo/src/org/oscim/layers/JeoTileSource.java @@ -1,8 +1,8 @@ package org.oscim.layers; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; -import static org.oscim.tiling.ITileDataSink.QueryResult.TILE_NOT_FOUND; +import static org.oscim.tiling.QueryResult.FAILED; +import static org.oscim.tiling.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.TILE_NOT_FOUND; import java.io.ByteArrayInputStream; import java.io.IOException; diff --git a/vtm-playground/src/org/oscim/test/TileRenderTest.java b/vtm-playground/src/org/oscim/test/TileRenderTest.java index dbfb1ee0..a43eb28f 100644 --- a/vtm-playground/src/org/oscim/test/TileRenderTest.java +++ b/vtm-playground/src/org/oscim/test/TileRenderTest.java @@ -20,6 +20,7 @@ import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.map.Map; import org.oscim.renderer.MapRenderer; import org.oscim.theme.VtmThemes; +import org.oscim.tiling.QueryResult; import org.oscim.tiling.TileSource; import org.oscim.tiling.source.oscimap4.OSciMap4TileSource; @@ -100,7 +101,7 @@ public class TileRenderTest extends GdxMapApp { log.debug("load {}", tile); tileLoader[0].loadTile(tile); - tileManager.jobCompleted(tile, true); + tileManager.jobCompleted(tile, QueryResult.SUCCESS); } else { tileManager.update(mapPosition); MapTile t = tileManager.getTileJob(); @@ -108,7 +109,7 @@ public class TileRenderTest extends GdxMapApp { log.debug("load {}", t); tileLoader[0].loadTile(t); - tileManager.jobCompleted(t, true); + tileManager.jobCompleted(t, QueryResult.SUCCESS); t = tileManager.getTileJob(); } diff --git a/vtm-web/src/org/oscim/gdx/emu/org/oscim/layers/tile/TileLoader.java b/vtm-web/src/org/oscim/gdx/emu/org/oscim/layers/tile/TileLoader.java index fd0fea69..9b5d184c 100644 --- a/vtm-web/src/org/oscim/gdx/emu/org/oscim/layers/tile/TileLoader.java +++ b/vtm-web/src/org/oscim/gdx/emu/org/oscim/layers/tile/TileLoader.java @@ -14,13 +14,13 @@ */ package org.oscim.layers.tile; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.FAILED; import org.oscim.backend.canvas.Bitmap; import org.oscim.core.MapElement; import org.oscim.renderer.MapRenderer; import org.oscim.tiling.ITileDataSink; +import org.oscim.tiling.QueryResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -115,13 +115,12 @@ public abstract class TileLoader implements ITileDataSink { */ @Override public void completed(QueryResult result) { - boolean success = (result == SUCCESS) && !isInterrupted; long now = MapRenderer.frametime; //log.debug("completed {} diff time:{}", mTile, (now - lastLoadTime)); lastLoadTime = now; - mTileManager.jobCompleted(mTile, success); + mTileManager.jobCompleted(mTile, result); mTile = null; mWorking = false; diff --git a/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/UrlTileDataSource.java b/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/UrlTileDataSource.java index 544d6c7b..e8d5b45b 100644 --- a/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/UrlTileDataSource.java +++ b/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/UrlTileDataSource.java @@ -14,8 +14,8 @@ */ package org.oscim.tiling.source; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.FAILED; +import static org.oscim.tiling.QueryResult.SUCCESS; import java.io.IOException; import java.io.InputStream; diff --git a/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/bitmap/BitmapTileSource.java b/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/bitmap/BitmapTileSource.java index 8e7186bc..66fa1def 100644 --- a/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/bitmap/BitmapTileSource.java +++ b/vtm-web/src/org/oscim/gdx/emu/org/oscim/tiling/source/bitmap/BitmapTileSource.java @@ -5,8 +5,8 @@ import org.oscim.layers.tile.LoadDelayTask; import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.TileLoader; import org.oscim.tiling.ITileDataSink; -import org.oscim.tiling.ITileDataSink.QueryResult; import org.oscim.tiling.ITileDataSource; +import org.oscim.tiling.QueryResult; import org.oscim.tiling.source.LwHttp; import org.oscim.tiling.source.UrlTileSource; import org.slf4j.Logger; diff --git a/vtm-web/src/org/oscim/tiling/source/JsonTileDataSource.java b/vtm-web/src/org/oscim/tiling/source/JsonTileDataSource.java index c8fb1bee..8584b387 100644 --- a/vtm-web/src/org/oscim/tiling/source/JsonTileDataSource.java +++ b/vtm-web/src/org/oscim/tiling/source/JsonTileDataSource.java @@ -16,8 +16,8 @@ */ package org.oscim.tiling.source; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.FAILED; +import static org.oscim.tiling.QueryResult.SUCCESS; import java.io.InputStream; diff --git a/vtm/src/org/oscim/layers/tile/TileLoader.java b/vtm/src/org/oscim/layers/tile/TileLoader.java index 6b501900..d77726c5 100644 --- a/vtm/src/org/oscim/layers/tile/TileLoader.java +++ b/vtm/src/org/oscim/layers/tile/TileLoader.java @@ -16,12 +16,13 @@ */ package org.oscim.layers.tile; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.FAILED; +import static org.oscim.tiling.QueryResult.SUCCESS; import org.oscim.backend.canvas.Bitmap; import org.oscim.core.MapElement; import org.oscim.tiling.ITileDataSink; +import org.oscim.tiling.QueryResult; import org.oscim.utils.PausableThread; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -95,9 +96,9 @@ public abstract class TileLoader extends PausableThread implements ITileDataSink boolean ok = (result == SUCCESS); if (ok && (isCanceled() || isInterrupted())) - ok = false; + result = QueryResult.FAILED; - mTileManager.jobCompleted(mTile, ok); + mTileManager.jobCompleted(mTile, result); mTile = null; } diff --git a/vtm/src/org/oscim/layers/tile/TileManager.java b/vtm/src/org/oscim/layers/tile/TileManager.java index 7bb13414..d953be4a 100644 --- a/vtm/src/org/oscim/layers/tile/TileManager.java +++ b/vtm/src/org/oscim/layers/tile/TileManager.java @@ -37,6 +37,7 @@ import org.oscim.layers.tile.MapTile.TileNode; import org.oscim.map.Map; import org.oscim.map.Viewport; import org.oscim.renderer.BufferObject; +import org.oscim.tiling.QueryResult; import org.oscim.utils.ScanBox; import org.oscim.utils.quadtree.TileIndex; import org.slf4j.Logger; @@ -576,29 +577,33 @@ public class TileManager { * @param tile * Tile ready for upload in TileRenderLayer */ - public void jobCompleted(MapTile tile, boolean success) { + public void jobCompleted(MapTile tile, QueryResult result) { /* send TILE_LOADED event on main-loop */ - mMap.post(new JobCompletedEvent(tile, success)); + mMap.post(new JobCompletedEvent(tile, result)); /* locked means the tile is visible or referenced by * a tile that might be visible. */ - if (tile.isLocked()) - mMap.render(); + if (tile.isLocked()) { + if (result == QueryResult.DELAYED && tile.isLocked()) + mMap.updateMap(false); + else + mMap.render(); + } } class JobCompletedEvent implements Runnable { final MapTile tile; - final boolean success; + final QueryResult result; - public JobCompletedEvent(MapTile tile, boolean success) { + public JobCompletedEvent(MapTile tile, QueryResult result) { this.tile = tile; - this.success = success; + this.result = result; } @Override public void run() { - if (success && tile.state(LOADING)) { + if (result == QueryResult.SUCCESS && tile.state(LOADING)) { tile.setState(NEW_DATA); events.fire(TILE_LOADED, tile); mTilesToUpload++; @@ -606,7 +611,7 @@ public class TileManager { } // TODO use mMap.update(true) to retry tile loading? log.debug("Load: {} {} state:{}", - tile, success ? "success" : "failed", + tile, result, tile.state()); /* got orphaned tile */ diff --git a/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java b/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java index 47b271da..b8219ca7 100644 --- a/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java @@ -13,6 +13,7 @@ import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileManager; import org.oscim.renderer.bucket.ExtrusionBucket; import org.oscim.tiling.ITileDataSource; +import org.oscim.tiling.QueryResult; import org.oscim.tiling.TileSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 720630b3..12c1c38d 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -41,6 +41,7 @@ import org.oscim.theme.styles.RenderStyle; import org.oscim.theme.styles.SymbolStyle; import org.oscim.theme.styles.TextStyle; import org.oscim.tiling.ITileDataSource; +import org.oscim.tiling.QueryResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/vtm/src/org/oscim/tiling/ITileDataSink.java b/vtm/src/org/oscim/tiling/ITileDataSink.java index dac9e2b0..7a597cd0 100644 --- a/vtm/src/org/oscim/tiling/ITileDataSink.java +++ b/vtm/src/org/oscim/tiling/ITileDataSink.java @@ -40,11 +40,4 @@ public interface ITileDataSink { * Notify loader that tile loading is completed. */ void completed(QueryResult result); - - public static enum QueryResult { - SUCCESS, - FAILED, - TILE_NOT_FOUND, - DELAYED, - } } diff --git a/vtm/src/org/oscim/tiling/QueryResult.java b/vtm/src/org/oscim/tiling/QueryResult.java new file mode 100644 index 00000000..efe83247 --- /dev/null +++ b/vtm/src/org/oscim/tiling/QueryResult.java @@ -0,0 +1,8 @@ +package org.oscim.tiling; + +public enum QueryResult { + SUCCESS, + FAILED, + TILE_NOT_FOUND, + DELAYED, +} \ No newline at end of file diff --git a/vtm/src/org/oscim/tiling/source/UrlTileDataSource.java b/vtm/src/org/oscim/tiling/source/UrlTileDataSource.java index e04fbbdb..a808f290 100644 --- a/vtm/src/org/oscim/tiling/source/UrlTileDataSource.java +++ b/vtm/src/org/oscim/tiling/source/UrlTileDataSource.java @@ -16,8 +16,9 @@ */ package org.oscim.tiling.source; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.DELAYED; +import static org.oscim.tiling.QueryResult.FAILED; +import static org.oscim.tiling.QueryResult.SUCCESS; import java.io.IOException; import java.io.InputStream; @@ -31,6 +32,7 @@ import org.oscim.tiling.ITileCache.TileReader; import org.oscim.tiling.ITileCache.TileWriter; import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSource; +import org.oscim.tiling.QueryResult; import org.oscim.utils.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,7 +73,8 @@ public class UrlTileDataSource implements ITileDataSource { } } - boolean ok = false; + QueryResult res = FAILED; + TileWriter cacheWriter = null; try { mConn.sendRequest(tile); @@ -80,21 +83,27 @@ public class UrlTileDataSource implements ITileDataSource { cacheWriter = cache.writeTile(tile); mConn.setCache(cacheWriter.getOutputStream()); } - ok = mTileDecoder.decode(tile, sink, is); + if (mTileDecoder.decode(tile, sink, is)) + res = SUCCESS; } catch (SocketException e) { log.debug("{} Socket Error: {}", tile, e.getMessage()); } catch (SocketTimeoutException e) { log.debug("{} Socket Timeout", tile); + res = DELAYED; } catch (UnknownHostException e) { log.debug("{} Unknown host: {}", tile, e.getMessage()); } catch (IOException e) { log.debug("{} Network Error: {}", tile, e.getMessage()); } finally { - ok = mConn.requestCompleted(ok); + boolean ok = (res == SUCCESS); + + if (!mConn.requestCompleted(ok) && ok) + res = FAILED; + if (cacheWriter != null) cacheWriter.complete(ok); - sink.completed(ok ? SUCCESS : FAILED); + sink.completed(res); } } diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java index fe6de087..5a041843 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java @@ -19,8 +19,8 @@ package org.oscim.tiling.source.mapfile; import static org.oscim.core.GeometryBuffer.GeometryType.LINE; import static org.oscim.core.GeometryBuffer.GeometryType.POLY; -import static org.oscim.tiling.ITileDataSink.QueryResult.FAILED; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.FAILED; +import static org.oscim.tiling.QueryResult.SUCCESS; import java.io.IOException; import java.io.RandomAccessFile; diff --git a/vtm/src/org/oscim/tiling/source/test/TestTileSource.java b/vtm/src/org/oscim/tiling/source/test/TestTileSource.java index 4f734edc..b6404444 100644 --- a/vtm/src/org/oscim/tiling/source/test/TestTileSource.java +++ b/vtm/src/org/oscim/tiling/source/test/TestTileSource.java @@ -16,7 +16,7 @@ */ package org.oscim.tiling.source.test; -import static org.oscim.tiling.ITileDataSink.QueryResult.SUCCESS; +import static org.oscim.tiling.QueryResult.SUCCESS; import org.oscim.core.MapElement; import org.oscim.core.Tag;