From 87f6ffa67c2cd4b3e7ce72ed7257ea15526c0052 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 21 Sep 2015 10:07:27 +1200 Subject: Implement geocoder address caching --- src/org/traccar/geocode/JsonReverseGeocoder.java | 29 ++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'src/org/traccar/geocode/JsonReverseGeocoder.java') diff --git a/src/org/traccar/geocode/JsonReverseGeocoder.java b/src/org/traccar/geocode/JsonReverseGeocoder.java index c43641245..442b8551c 100644 --- a/src/org/traccar/geocode/JsonReverseGeocoder.java +++ b/src/org/traccar/geocode/JsonReverseGeocoder.java @@ -25,18 +25,37 @@ import java.io.Reader; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; +import java.util.AbstractMap; +import java.util.LinkedHashMap; +import java.util.Map; public abstract class JsonReverseGeocoder implements ReverseGeocoder { private final String url; - public JsonReverseGeocoder(String url) { + private Map, String> cache; + + public JsonReverseGeocoder(String url, final int cacheSize) { this.url = url; + if (cacheSize > 0) { + this.cache = new LinkedHashMap, String>() { + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > cacheSize; + } + }; + } } @Override public String getAddress(AddressFormat format, double latitude, double longitude) { + if (cache != null) { + String cachedAddress = cache.get(new AbstractMap.SimpleImmutableEntry<>(latitude, longitude)); + if (cachedAddress != null) { + return cachedAddress; + } + } + try { HttpURLConnection conn = (HttpURLConnection) new URL(String.format(url, latitude, longitude)).openConnection(); conn.setRequestProperty("Connection", "close"); // don't keep-alive connections @@ -46,7 +65,13 @@ public abstract class JsonReverseGeocoder implements ReverseGeocoder { Address address = parseAddress(reader.readObject()); while (streamReader.read() > 0); // make sure we reached the end if (address != null) { - return format.format(address); + String formattedAddress = format.format(address); + + if (cache != null) { + cache.put(new AbstractMap.SimpleImmutableEntry<>(latitude, longitude), formattedAddress); + } + + return formattedAddress; } } } finally { -- cgit v1.2.3