extract QueryResult from ITileDataSink

This commit is contained in:
Hannes Janetzek 2014-10-05 03:31:25 +02:00
parent ff630fdcfa
commit 9642c8c5aa
15 changed files with 61 additions and 43 deletions

View File

@ -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;

View File

@ -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();
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;
}

View File

@ -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 */

View File

@ -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;

View File

@ -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;

View File

@ -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,
}
}

View File

@ -0,0 +1,8 @@
package org.oscim.tiling;
public enum QueryResult {
SUCCESS,
FAILED,
TILE_NOT_FOUND,
DELAYED,
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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;