package net.iubris.ulysses.data; import java.util.Collection; import java.util.Map.Entry; import java.util.concurrent.ConcurrentSkipListMap; import javax.inject.Inject; import javax.inject.Singleton; import roboguice.util.Ln; import net.iubris.ulysses.model.GeoAddress; import net.iubris.ulysses.model.Location; import net.iubris.ulysses.persist.Persister; @Singleton public class GeoAddressCache { private final ConcurrentSkipListMap<Location, GeoAddress> cache = new ConcurrentSkipListMap<>(); private final Persister persister; @Inject public GeoAddressCache(Persister persister) { this.persister = persister; init(); } public void init() { if (cache.size()==0) { Collection<GeoAddress> geoAddresses = persister.getGeoAddresses(); // debug start Ln.d("Populating cache with "+geoAddresses.size()+" geoAddresses"); for (GeoAddress geoAddress : geoAddresses) { Ln.d("geoAddress:"+geoAddress); } // debug end for (GeoAddress geoAddress : geoAddresses) { try { cache.put(geoAddress.getLocation(), geoAddress); } catch(NullPointerException e) { Ln.d("removing geoaddress:"+geoAddress+" (transient:"+geoAddress.isTransient()+") "+" from db, since its location or itself is null"); geoAddress.delete(); persister.find(geoAddress); } } persister.getGeoAddresses(); } } // always overwritten public GeoAddress save(GeoAddress geoAddress) { Ln.d("putting: "+geoAddress); try { GeoAddress geoAddressMaybeExistant = cache.put(geoAddress.getLocation(), geoAddress); persister.saveGeoAddress(geoAddress); return geoAddressMaybeExistant; } catch(NullPointerException e) { // we don't care too much if 'save' fails.. return null; } } public GeoAddress find(Location location) { Ln.d("finding by: "+location+" within:"); for (Entry<Location, GeoAddress> entry: cache.entrySet()) { Ln.d("location:"+entry.getKey()+", geoAddress:"+entry.getValue()); } GeoAddress geoAddress = cache.get(location); if (geoAddress!=null) { Ln.d("found geoAddress:"+geoAddress); } return geoAddress; } }