// License: GPL. Copyright 2007 by Immanuel Scholz and others
package org.openstreetmap.josm.io;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.zip.Inflater;
import java.util.zip.InflaterInputStream;
import java.util.zip.GZIPInputStream;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.gui.PleaseWaitDialog;
import org.xml.sax.SAXException;
/**
* This DataReader reads directly from the REST API of the osm server.
*
* It supports plain text transfer as well as gzip or deflate encoded transfers;
* if compressed transfers are unwanted, set property osm-server.use-compression
* to false.
*
* @author imi
*/
public abstract class OsmServerReader extends OsmConnection {
/**
* Open a connection to the given url and return a reader on the input stream
* from that connection. In case of user cancel, return null
.
* @param urlStr The exact url to connect to.
* @param pleaseWaitDlg
* @return An reader reading the input stream (servers answer) or null
.
*/
protected InputStream getInputStream(String urlStr, PleaseWaitDialog pleaseWaitDlg) throws IOException {
String version = Main.pref.get("osm-server.version", "0.5");
urlStr = Main.pref.get("osm-server.url")+"/"+version+"/" + urlStr;
return getInputStreamRaw(urlStr, pleaseWaitDlg);
}
protected InputStream getInputStreamRaw(String urlStr, PleaseWaitDialog pleaseWaitDlg) throws IOException {
// System.out.println("download: "+urlStr);
initAuthentication();
URL url = new URL(urlStr);
activeConnection = (HttpURLConnection)url.openConnection();
if (cancel) {
activeConnection.disconnect();
return null;
}
if (Main.pref.getBoolean("osm-server.use-compression", true))
activeConnection.setRequestProperty("Accept-Encoding", "gzip, deflate");
activeConnection.setConnectTimeout(15000);
try {
activeConnection.connect();
}
catch (Exception e) {
throw new IOException(tr("Couldn't connect to the osm server. Please check your internet connection."));
}
if (isAuthCancelled() && activeConnection.getResponseCode() == 401)
return null;
if (activeConnection.getResponseCode() == 500)
{
throw new IOException(tr("Server returned internal error. Try a reduced area or retry after waiting some time."));
}
// System.out.println("got return: "+activeConnection.getResponseCode());
String encoding = activeConnection.getContentEncoding();
InputStream inputStream = new ProgressInputStream(activeConnection, pleaseWaitDlg);
if (encoding != null && encoding.equalsIgnoreCase("gzip")) {
inputStream = new GZIPInputStream(inputStream);
}
else if (encoding != null && encoding.equalsIgnoreCase("deflate")) {
inputStream = new InflaterInputStream(inputStream, new Inflater(true));
}
return inputStream;
}
public abstract DataSet parseOsm() throws SAXException, IOException;
}