package com.github.windbender.service;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.nio.charset.Charset;
import org.joda.time.DateTimeZone;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.amazonaws.util.json.JSONException;
import com.amazonaws.util.json.JSONObject;
import com.github.windbender.core.LatLonPair;
public class GeoNameTimeZoneGetter implements TimeZoneGetter {
Logger log = LoggerFactory.getLogger(GeoNameTimeZoneGetter.class);
public static void main(String[] args) {
GeoNameTimeZoneGetter gntzg = new GeoNameTimeZoneGetter("demo");
DateTimeZone dtz0 = gntzg.getTimeZone(new LatLonPair(38.5, -122.0));
TimeZoneGetter timeZoneGetter = new CompositeTimeZoneGetter(new CachingTimeZoneGetter(new GeoNameTimeZoneGetter("demo")), new StupidTimeZoneGetter());
DateTimeZone dtz = timeZoneGetter.getTimeZone(new LatLonPair(38.5, -122.0));
System.out.println("got timezone "+dtz);
}
String username;
public GeoNameTimeZoneGetter(String username) {
super();
this.username = username;
}
static private Double reduced(Double in) {
long minutes = new Double(in * 60).longValue();
return minutes / 60.0;
}
private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
}
public static JSONObject readJsonFromUrl(String url) throws IOException,
JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is,
Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = new JSONObject(jsonText);
return json;
} finally {
is.close();
}
}
public DateTimeZone getTimeZone(LatLonPair location) {
// should reduce accuracy to 1 mile. 1 mile is ROUGHLY 1/60 of a degree.
// Unless you're in alaska etc
double nlat = reduced(location.getLat());
double nlon = reduced(location.getLon());
// now make a URL:
// http://api.geonames.org/timezoneJSON?lat=47.01&lng=10.2&username=demo
String url = "http://api.geonames.org/timezoneJSON?lat=" + nlat
+ "&lng=" + nlon + "&username=" + username;
JSONObject obj = null;
try {
obj = readJsonFromUrl(url);
String s = obj.get("timezoneId").toString();
DateTimeZone dtz = DateTimeZone.forID(s);
return dtz;
} catch (IOException e) {
log.error("unable to contact the timezone machine",e);
} catch (JSONException e) {
log.warn("unable to parse response from the timezone machine which was: "+obj.toString(),e);
}
return null;
}
}