ingo@2063: package de.intevation.flys.artifacts.model; ingo@2063: ingo@2063: import net.sf.ehcache.Cache; ingo@2063: import net.sf.ehcache.Element; ingo@2063: ingo@2063: import org.apache.log4j.Logger; ingo@2063: ingo@2063: import de.intevation.flys.model.Annotation; sascha@2144: import de.intevation.flys.model.FastAnnotations; ingo@2063: ingo@2063: import de.intevation.flys.artifacts.cache.CacheFactory; ingo@2063: felix@4010: felix@4010: /** Make FastAnnotations (db unbound) available. */ ingo@2063: public class LocationProvider { ingo@2063: sascha@2144: private static final Logger log = sascha@2144: Logger.getLogger(LocationProvider.class); sascha@2127: sascha@2127: ingo@2063: public static final String CACHE_KEY = "location-provider"; ingo@2063: sascha@2127: public static final String PREFIX = "lp-"; sascha@2127: ingo@2063: ingo@2063: private LocationProvider() { ingo@2063: } ingo@2063: sascha@2127: public static String getLocation(String river, double km) { ingo@2063: sascha@2144: FastAnnotations fas = getAnnotations(river, km); sascha@2127: sascha@2144: FastAnnotations.Annotation an = fas.findByKm(km); sascha@2144: sascha@2144: return an != null ? an.getPosition() : null; ingo@2063: } ingo@2063: sascha@2144: public static FastAnnotations getAnnotations(String river) { ingo@2289: return getAnnotations(river, Double.MAX_VALUE); sascha@2144: } sascha@2144: sascha@2144: protected static FastAnnotations getAnnotations(String river, double km) { felix@4010: // TODO issue880: Make annotations available _per type_ ingo@2063: ingo@2063: Cache cache = CacheFactory.getCache(CACHE_KEY); ingo@2063: sascha@2127: if (cache == null) { sascha@2144: return uncachedAnnotations(river, km); ingo@2063: } sascha@2127: sascha@2127: String key = PREFIX + river; sascha@2127: sascha@2127: Element element = cache.get(key); sascha@2127: sascha@2127: if (element != null) { sascha@2144: return (FastAnnotations)element.getValue(); ingo@2063: } sascha@2127: sascha@2144: FastAnnotations fas = uncachedAnnotations(river, Double.MAX_VALUE); sascha@2127: sascha@2144: cache.put(new Element(key, fas)); sascha@2127: sascha@2144: return fas; ingo@2063: } ingo@2063: sascha@2144: protected static FastAnnotations uncachedAnnotations( ingo@2063: String river, sascha@2144: double km ingo@2063: ) { sascha@2144: if (km != Double.MAX_VALUE) { sascha@2144: // XXX Fake it by using a standard Annotation. sascha@2144: sascha@2127: Annotation annotation = sascha@2144: AnnotationsFactory.getAnnotation(river, km); sascha@2144: sascha@2127: if (annotation != null) { sascha@2144: FastAnnotations.Annotation fa = sascha@2144: new FastAnnotations.Annotation( sascha@2144: km, Double.NaN, sascha@2144: annotation.getPosition().getValue(), null, null, sascha@2144: Double.NaN, Double.NaN); sascha@2144: return new FastAnnotations( sascha@2144: new FastAnnotations.Annotation [] { fa }); sascha@2127: } sascha@2144: sascha@2144: return new FastAnnotations(new FastAnnotations.Annotation[0]); ingo@2063: } ingo@2063: sascha@2144: long startTime = System.currentTimeMillis(); sascha@2144: sascha@2144: FastAnnotations fas = new FastAnnotations(river); sascha@2144: sascha@2144: long stopTime = System.currentTimeMillis(); sascha@2144: sascha@2144: if (log.isDebugEnabled()) { sascha@2144: log.debug("Loading locations took " + sascha@2144: (stopTime-startTime)/1000f + " secs."); ingo@2063: } ingo@2063: sascha@2144: return fas; ingo@2063: } ingo@2063: } ingo@2063: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :