From 1bd71abf66a11b91adb80c883390e1fd7149eb28 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 1 Sep 2011 23:59:20 +0000
Subject: [PATCH] cache country codes

---
 .../src/net/i2p/router/transport/GeoIP.java   | 35 ++++++++++++++-----
 1 file changed, 27 insertions(+), 8 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java
index a701a24aff..bebef719d2 100644
--- a/router/java/src/net/i2p/router/transport/GeoIP.java
+++ b/router/java/src/net/i2p/router/transport/GeoIP.java
@@ -42,6 +42,8 @@ class GeoIP {
     private final Log _log;
     private final RouterContext _context;
     private final Map<String, String> _codeToName;
+    /** code to itself to prevent String proliferation */
+    private final Map<String, String> _codeCache;
     private final Map<Long, String> _IPToCountry;
     private final Set<Long> _pendingSearch;
     private final Set<Long> _notFound;
@@ -51,7 +53,8 @@ class GeoIP {
     public GeoIP(RouterContext context) {
         _context = context;
         _log = context.logManager().getLog(GeoIP.class);
-        _codeToName = new ConcurrentHashMap();
+        _codeToName = new ConcurrentHashMap(256);
+        _codeCache = new ConcurrentHashMap(256);
         _IPToCountry = new ConcurrentHashMap();
         _pendingSearch = new ConcurrentHashSet();
         _notFound = new ConcurrentHashSet();
@@ -160,7 +163,9 @@ class GeoIP {
                         continue;
                     }
                     String[] s = line.split(",");
-                    _codeToName.put(s[0].toLowerCase(), s[1]);
+                    String lc = s[0].toLowerCase();
+                    _codeToName.put(lc, s[1]);
+                    _codeCache.put(lc, lc);
                 } catch (IndexOutOfBoundsException ioobe) {
                 }
             }
@@ -201,7 +206,7 @@ class GeoIP {
     private String[] readGeoIPFile(Long[] search) {
         File GeoFile = new File(_context.getBaseDir(), GEOIP_DIR_DEFAULT);
         GeoFile = new File(GeoFile, GEOIP_FILE_DEFAULT);
-        if (GeoFile == null || (!GeoFile.exists())) {
+        if (!GeoFile.exists()) {
             if (_log.shouldLog(Log.WARN))
                 _log.warn("GeoIP file not found: " + GeoFile.getAbsolutePath());
             return new String[0];
@@ -226,7 +231,12 @@ class GeoIP {
                         idx++;
                     }
                     while (idx < search.length && search[idx].longValue() >= ip1 && search[idx].longValue() <= ip2) {
-                        rv[idx++] = s[2].toLowerCase();
+                        String lc = s[2].toLowerCase();
+                        // replace the new string with the identical one from the cache
+                        String cached = _codeCache.get(lc);
+                        if (cached == null)
+                            cached = lc;
+                        rv[idx++] = cached;
                     }
                 } catch (IndexOutOfBoundsException ioobe) {
                 } catch (NumberFormatException nfe) {
@@ -240,8 +250,8 @@ class GeoIP {
             if (in != null) try { in.close(); } catch (IOException ioe) {}
         }
 
-        if (_log.shouldLog(Log.WARN)) {
-            _log.warn("GeoIP processing finished, time: " + (_context.clock().now() - start));
+        if (_log.shouldLog(Log.INFO)) {
+            _log.info("GeoIP processing finished, time: " + (_context.clock().now() - start));
         }
         return rv;
     }
@@ -291,8 +301,8 @@ class GeoIP {
     }
 
     /**
-     * Get the country for an IP
-     * @return lower-case code, generally two letters.
+     * Get the country for an IP from the cache.
+     * @return lower-case code, generally two letters, or null.
      */
     public String get(String ip) {
         InetAddress pi;
@@ -306,6 +316,10 @@ class GeoIP {
         return get(pib);
     }
 
+    /**
+     * Get the country for an IP from the cache.
+     * @return lower-case code, generally two letters, or null.
+     */
     public String get(byte ip[]) {
         if (ip.length != 4)
             return null;
@@ -323,6 +337,11 @@ class GeoIP {
         return ((long) rv) & 0xffffffffl;
     }
 
+    /**
+     * Get the country for a country code
+     * @param two-letter lower case code
+     * @return untranslated name or null
+     */
     public String fullName(String code) {
         return _codeToName.get(code);
     }
-- 
GitLab