package com.anjlab.ping.services.location.gae;
import static com.anjlab.ping.services.location.Location.parseDouble;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.anjlab.ping.services.Utils;
import com.anjlab.ping.services.location.Location;
import com.anjlab.ping.services.location.LocationResolver;
import com.google.appengine.api.urlfetch.HTTPMethod;
import com.google.appengine.api.urlfetch.HTTPRequest;
import com.google.appengine.api.urlfetch.HTTPResponse;
import com.google.appengine.api.urlfetch.URLFetchService;
public class IPWhoisNetLocationResolver implements LocationResolver {
private static final Logger logger = LoggerFactory.getLogger(IPWhoisNetLocationResolver.class);
private final URLFetchService urlFetchService;
public IPWhoisNetLocationResolver(URLFetchService urlFetchService) {
this.urlFetchService = urlFetchService;
}
public Location resolveLocation(String ip) {
try {
HTTPRequest request = new HTTPRequest(new URL("http://ip-whois.net/ip_geo.php?ip=" + ip), HTTPMethod.GET);
request.getFetchOptions().setDeadline(10d);
request.getFetchOptions().doNotFollowRedirects();
request.getFetchOptions().allowTruncate();
HTTPResponse fetch = urlFetchService.fetch(request);
String responseText = new String(fetch.getContent(), "Windows-1251");
Pattern countryPattern = Pattern.compile("Страна: ([^<]*)<br>");
Pattern regionPattern = Pattern.compile("Регион: ([^<]*)<br>");
Pattern cityPattern = Pattern.compile("Город: ([^<]*)<br>");
Pattern latitudePattern = Pattern.compile("Широта: ([^<]*)<br>");
Pattern longitudePattern = Pattern.compile("Долгота: ([^<]*)<br>");
return new Location(
buildLocationAddress(responseText, countryPattern, regionPattern, cityPattern),
parseDouble(matchGroup(latitudePattern, responseText)),
parseDouble(matchGroup(longitudePattern,responseText)));
} catch (Exception e) {
logger.warn("Error resolving Location from IP", e);
}
return Location.empty();
}
private static String buildLocationAddress(String responseText,
Pattern countryPattern, Pattern regionPattern, Pattern cityPattern) {
StringBuilder builder = new StringBuilder();
appendText(builder, matchGroup(countryPattern, responseText));
appendText(builder, matchGroup(regionPattern, responseText));
appendText(builder, matchGroup(cityPattern, responseText));
return builder.toString();
}
private static void appendText(StringBuilder builder, String text) {
if (!Utils.isNullOrEmpty(text)) {
if (builder.length() > 0) {
builder.append(", ");
}
builder.append(text);
}
}
private static String matchGroup(Pattern pattern, String text) {
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
}