package org.openstreetmap.gui.jmapviewer;
//License: GPL. Copyright 2008 by Jan Peter Stotz
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
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;
/**
* A {@link TileLoader} implementation that loads tiles from OSM via HTTP.
*
* @author Jan Peter Stotz
*/
public class OsmTileLoader implements TileLoader {
/**
* Holds the used user agent used for HTTP requests. If this field is
* <code>null</code>, the default Java user agent is used.
*/
public static String USER_AGENT = null;
public static String ACCEPT = "text/html, image/png, image/jpeg, image/gif, */*";
protected TileLoaderListener listener;
public OsmTileLoader(TileLoaderListener listener) {
this.listener = listener;
}
public Runnable createTileLoaderJob(final TileSource source, final int tilex, final int tiley, final int zoom) {
return new Runnable() {
InputStream input = null;
public void run() {
TileCache cache = listener.getTileCache();
Tile tile;
synchronized (cache) {
tile = cache.getTile(source, tilex, tiley, zoom);
if (tile == null || tile.isLoaded() || tile.loading)
return;
tile.loading = true;
}
try {
// Thread.sleep(500);
input = loadTileFromOsm(tile).getInputStream();
tile.loadImage(input);
tile.setLoaded(true);
listener.tileLoadingFinished(tile, true);
input.close();
input = null;
} catch (Exception e) {
tile.setImage(Tile.ERROR_IMAGE);
tile.error = true;
listener.tileLoadingFinished(tile, false);
if (input == null)
System.err.println("failed loading " + zoom + "/" + tilex + "/" + tiley + " " + e.getMessage());
} finally {
tile.loading = false;
tile.setLoaded(true);
}
}
};
}
protected HttpURLConnection loadTileFromOsm(Tile tile) throws IOException {
URL url;
url = new URL(tile.getUrl());
HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
prepareHttpUrlConnection(urlConn);
urlConn.setReadTimeout(30000); // 30 seconds read timeout
return urlConn;
}
protected void prepareHttpUrlConnection(HttpURLConnection urlConn) {
if (USER_AGENT != null)
urlConn.setRequestProperty("User-agent", USER_AGENT);
urlConn.setRequestProperty("Accept", ACCEPT);
}
@Override
public String toString() {
return getClass().getSimpleName();
}
}