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 :