/geocodeip/src/main/java/com/derickson/geocodeip/GeoCodeIp.java

https://github.com/derickson/geocodeip · Java · 106 lines · 82 code · 16 blank · 8 comment · 16 complexity · c01a69befe78a65a28b03088ec3f8d2d MD5 · raw file

  1. package com.derickson.geocodeip;
  2. import java.net.UnknownHostException;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.Set;
  9. import com.mongodb.BasicDBList;
  10. import com.mongodb.DB;
  11. import com.mongodb.DBCollection;
  12. import com.mongodb.DBCursor;
  13. import com.mongodb.DBObject;
  14. import com.mongodb.MongoClient;
  15. public class GeoCodeIp {
  16. private boolean isInitialized = false;
  17. private HashMap<Integer,DBObject> gazes = new HashMap<Integer,DBObject>(256);
  18. private List<Double> zeroZero = new ArrayList<Double>(2);
  19. public GeoCodeIp() {
  20. zeroZero.add(new Double(0.0));
  21. zeroZero.add(new Double(0.0));
  22. load();
  23. }
  24. private void load(){
  25. System.out.println("Loading IP to Geo Gazateer");
  26. MongoClient client = null;
  27. try {
  28. client = new MongoClient("localhost", 27017);
  29. DB gazDB = client.getDB("gaz");
  30. DBCollection gazCache = gazDB.getCollection("gazCache");
  31. if(gazCache.count() > 0){
  32. DBCursor cursor = gazCache.find();
  33. //System.out.print("Loading: ");
  34. //int i=0;
  35. while(cursor.hasNext()){
  36. DBObject obj = cursor.next();
  37. Integer objId = (Integer) obj.get("_id");
  38. //System.out.print(objId+", " );
  39. //if(i % 10 == 0) System.out.println("");
  40. gazes.put( objId , obj);
  41. //++i;
  42. }
  43. //System.out.println("");
  44. } else {
  45. //TODO load from the CSV file
  46. }
  47. } catch (UnknownHostException e) {
  48. e.printStackTrace();
  49. } finally {
  50. if(client != null) client.close();
  51. //System.out.println("Done Loading");
  52. if(gazes.size() == 256) this.isInitialized = true;
  53. }
  54. }
  55. public List<Double> getLonLat(final String ip){
  56. String[] ipParts = ip.split("\\.");
  57. if(ipParts.length != 4) return zeroZero;
  58. Integer gazIndex = new Integer(ipParts[0]);
  59. int fourth = Integer.parseInt(ipParts[3]);
  60. String prefix = ipParts[0]+"_"+ipParts[1]+"_"+ipParts[2];
  61. DBObject gaz = gazes.get(gazIndex);
  62. if( gaz.containsField(prefix)){
  63. BasicDBList entry = null;
  64. DBObject gazEntries = (DBObject) gaz.get(prefix);
  65. Set<String> keySet = gazEntries.keySet();
  66. int keySetSize = keySet.size();
  67. if(keySetSize == 1){
  68. entry = (BasicDBList) gazEntries.get( keySet.iterator().next() );
  69. } else {
  70. int[] keySetInt = new int[keySetSize];
  71. int i = 0;
  72. for(String key : keySet){
  73. keySetInt[i] = Integer.parseInt(key);
  74. ++i;
  75. }
  76. Arrays.sort(keySetInt);
  77. for(i=0; i<keySetSize; ++i){
  78. int key = keySetInt[i];
  79. if(key <= fourth){
  80. entry = (BasicDBList) gazEntries.get( Integer.toString(key) );
  81. } else {
  82. break;
  83. }
  84. }
  85. }
  86. return (List<Double>) entry.get(2);
  87. }
  88. return zeroZero;
  89. }
  90. }