package com.workshare.msnos.core.geo;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import com.maxmind.geoip2.DatabaseReader;
import com.workshare.msnos.core.protocols.ip.Network;
public class OfflineLocationFactory implements LocationFactory {
private static final String DB_FILENAME = "geolite2-city.mmdb";
private DatabaseReader database;
OfflineLocationFactory() throws IOException {
this.database = new DatabaseReader.Builder(OfflineLocationFactory.class.getResourceAsStream("/"+DB_FILENAME)).build();
}
public OfflineLocationFactory(DatabaseReader database) {
this.database = database;
}
@Override
public Location make(String host) {
try {
return new Location(database.omni(InetAddress.getByName(asValidatedAddress(host))));
}
catch (Throwable ignore) {
return Location.UNKNOWN;
}
}
public DatabaseReader database() {
return database;
}
private String asValidatedAddress(String host) throws UnknownHostException {
if (Network.isValidDottedIpv4Address(host))
return host;
else {
final InetAddress inet = InetAddress.getByName(host);
final String addr = inet.getHostAddress();
return addr;
}
}
public static LocationFactory build() {
try {
return new OfflineLocationFactory();
} catch (Exception ex) {
return new NoopLocationFactory();
}
}
public static void main(String[] args) throws IOException {
System.out.println(new OfflineLocationFactory().make("54.195.196.98"));
}
// public static void main(String[] args) throws IOException {
// }
}