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; ingo@2063: import de.intevation.flys.model.Position; sascha@2127: import de.intevation.flys.model.Range; ingo@2063: ingo@2063: import de.intevation.flys.artifacts.cache.CacheFactory; ingo@2063: import de.intevation.flys.artifacts.model.AnnotationsFactory; ingo@2063: sascha@2127: import java.util.Map; sascha@2127: import java.util.TreeMap; sascha@2127: import java.util.Comparator; sascha@2127: import java.util.Iterator; sascha@2127: sascha@2127: import java.io.Serializable; sascha@2127: ingo@2063: ingo@2063: public class LocationProvider { ingo@2063: sascha@2127: public static final double EPSILON = 1e-5; sascha@2127: sascha@2127: public static class KmComparator sascha@2127: implements Serializable, Comparator sascha@2127: { sascha@2127: @Override sascha@2127: public int compare(Double a, Double b) { sascha@2127: double diff = a - b; sascha@2127: if (diff < -EPSILON) return -1; sascha@2127: if (diff > +EPSILON) return +1; sascha@2127: return 0; sascha@2127: } sascha@2127: } // class KmComparator 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 static final Logger logger = ingo@2063: Logger.getLogger(LocationProvider.class); ingo@2063: ingo@2063: ingo@2063: private LocationProvider() { ingo@2063: } ingo@2063: sascha@2127: public static String getLocation(String river, double km) { ingo@2063: sascha@2127: Double KM = Double.valueOf(km); sascha@2127: sascha@2127: return getKmMap(river, KM).get(KM); ingo@2063: } ingo@2063: sascha@2127: protected static Map getKmMap(String river, double km) { ingo@2063: ingo@2063: Cache cache = CacheFactory.getCache(CACHE_KEY); ingo@2063: sascha@2127: if (cache == null) { sascha@2127: return uncachedKmMap(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@2127: return (Map)element.getValue(); ingo@2063: } sascha@2127: sascha@2127: Map map = uncachedKmMap(river, null); sascha@2127: sascha@2127: cache.put(new Element(key, map)); sascha@2127: sascha@2127: return map; ingo@2063: } ingo@2063: sascha@2127: protected static Map uncachedKmMap( ingo@2063: String river, sascha@2127: Double queryKm ingo@2063: ) { sascha@2127: Map map = sascha@2127: new TreeMap(new KmComparator()); sascha@2127: sascha@2127: if (queryKm != null) { sascha@2127: Annotation annotation = sascha@2127: AnnotationsFactory.getAnnotation(river, queryKm); sascha@2127: if (annotation != null) { sascha@2127: map.put(queryKm, annotation.getPosition().getValue()); sascha@2127: } sascha@2127: return map; ingo@2063: } ingo@2063: sascha@2127: for (Iterator iter = sascha@2127: AnnotationsFactory.getAnnotationsIterator(river); sascha@2127: iter.hasNext(); sascha@2127: ) { sascha@2127: Annotation annotation = iter.next(); sascha@2127: Position pos = annotation.getPosition(); sascha@2127: Range range = annotation.getRange(); sascha@2127: Double km = range.getA().doubleValue(); sascha@2127: map.put(km, pos.getValue()); ingo@2063: } ingo@2063: sascha@2127: return map; ingo@2063: } ingo@2063: } ingo@2063: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :