// License: WTFPL. For details, see LICENSE file.
package geochat;
import java.awt.EventQueue;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.json.Json;
import javax.json.JsonException;
import javax.json.JsonObject;
import org.openstreetmap.josm.Main;
/**
* A static class to query the server and return parsed JSON hash.
*
* @author zverik
*/
public final class JsonQueryUtil implements Runnable {
/**
* Query the server synchronously.
* @param query Query string, starting with action. Example: <tt>get&lat=1.0&lon=-2.0&uid=12345</tt>
* @return Parsed JsonObject if the query was successful, <tt>null</tt> otherwise.
* @throws IOException There was a problem connecting to the server or parsing JSON.
*/
public static JsonObject query(String query) throws IOException {
try {
String serverURL = Main.pref.get("geochat.server", "http://zverik.dev.openstreetmap.org/osmochat.php?action=");
URL url = new URL(serverURL + query);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.connect();
if (connection.getResponseCode() != 200) {
throw new IOException("HTTP Response code " + connection.getResponseCode() + " (" + connection.getResponseMessage() + ")");
}
InputStream inp = connection.getInputStream();
if (inp == null)
throw new IOException("Empty response");
try {
return Json.createReader(inp).readObject();
} catch (JsonException e) {
throw new IOException("Failed to parse JSON: " + e.getMessage());
} finally {
connection.disconnect();
}
} catch (MalformedURLException ex) {
throw new IOException("Malformed URL: " + ex.getMessage());
}
}
// Asynchronous operation
private String query;
private JsonQueryCallback callback;
private JsonQueryUtil() {}
private JsonQueryUtil(String query, JsonQueryCallback callback) {
this.query = query;
this.callback = callback;
}
/**
* Query the server asynchronously.
* @param query Query string (see {@link #query}).
* @param callback Callback listener to process the JSON response.
*/
public static void queryAsync(String query, JsonQueryCallback callback) {
Main.worker.submit(new JsonQueryUtil(query, callback));
}
private void doRealRun() {
JsonObject obj;
try {
obj = query(query);
} catch (IOException e) {
Main.warn(e.getClass().getName() + " while connecting to a chat server: " + e.getMessage());
obj = null;
}
if (callback != null)
callback.processJson(obj);
}
@Override
public void run() {
if (EventQueue.isDispatchThread()) {
new Thread(new Runnable() {
@Override
public void run() {
doRealRun();
}
}).start();
} else {
doRealRun();
}
}
}