teichmann@6385: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@6385: * Software engineering by Intevation GmbH teichmann@6385: * teichmann@6385: * This file is Free Software under the GNU AGPL (>=v3) teichmann@6385: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@6385: * documentation coming with Dive4Elements River for details. teichmann@6385: */ teichmann@6385: teichmann@6385: package org.dive4elements.river.artifacts.model; teichmann@6385: teichmann@6385: import java.util.ArrayList; teichmann@6385: import java.util.Collections; teichmann@6385: import java.util.HashMap; teichmann@6385: import java.util.List; teichmann@6385: import java.util.Map; teichmann@6385: teichmann@6385: import net.sf.ehcache.Cache; teichmann@6385: import net.sf.ehcache.Element; teichmann@6385: teichmann@6385: import org.dive4elements.river.artifacts.D4EArtifact; teichmann@6385: import org.dive4elements.river.artifacts.cache.CacheFactory; teichmann@6385: import org.dive4elements.river.model.Gauge; teichmann@6385: import org.dive4elements.river.model.MainValue; teichmann@6385: import org.dive4elements.river.model.NamedMainValue; teichmann@6385: import org.dive4elements.river.model.OfficialLine; teichmann@6385: import org.dive4elements.river.model.River; teichmann@6385: import org.dive4elements.river.model.Wst; teichmann@6385: import org.dive4elements.river.model.WstColumn; teichmann@6385: teichmann@6385: public class OfficialLineFinder teichmann@6385: { teichmann@6385: public static final String CACHE_NAME = "official-lines"; teichmann@6385: teichmann@6385: // We will only have one entry in this cache. teichmann@6385: public static final String CACHE_KEY = CACHE_NAME; teichmann@6385: teichmann@6385: public static final double EPSILON = 1e-4; teichmann@6385: teichmann@6385: teichmann@6385: public static class ValueRange extends Range { teichmann@6385: teichmann@6385: private double value; teichmann@6385: private int wstId; teichmann@6385: private int columnPos; teichmann@6385: teichmann@6385: public ValueRange( teichmann@6385: double start, teichmann@6385: double end, teichmann@6385: double value, teichmann@6385: int wstId, teichmann@6385: int columnPos teichmann@6385: ) { teichmann@6385: super(start, end); teichmann@6385: this.value = value; teichmann@6385: this.wstId = wstId; teichmann@6385: this.columnPos = columnPos; teichmann@6385: } teichmann@6385: teichmann@6385: public boolean sameValue(double value) { teichmann@6385: return Math.abs(value - this.value) < EPSILON; teichmann@6385: } teichmann@6385: teichmann@6385: public int getWstId() { teichmann@6385: return wstId; teichmann@6385: } teichmann@6385: teichmann@6385: public int getColumnPos() { teichmann@6385: return columnPos; teichmann@6385: } teichmann@6385: } teichmann@6385: teichmann@6385: public OfficialLineFinder() { teichmann@6385: } teichmann@6385: teichmann@6385: public static Map> getAll() { teichmann@6385: Cache cache = CacheFactory.getCache(CACHE_NAME); teichmann@6385: teichmann@6385: if (cache == null) { teichmann@6385: return getAllUncached(); teichmann@6385: } teichmann@6385: teichmann@6385: Element element = cache.get(CACHE_KEY); teichmann@6385: teichmann@6385: if (element != null) { teichmann@6385: return (Map>)element.getValue(); teichmann@6385: } teichmann@6385: teichmann@6385: Map> result = getAllUncached(); teichmann@6385: if (result != null) { teichmann@6385: cache.put(new Element(CACHE_KEY, result)); teichmann@6385: } teichmann@6385: return result; teichmann@6385: teichmann@6385: } teichmann@6385: teichmann@6385: public static Map> getAllUncached() { teichmann@6385: teichmann@6385: Map> rivers2officialLines = teichmann@6385: new HashMap>(); teichmann@6385: teichmann@6385: teichmann@6385: for (OfficialLine line: OfficialLine.fetchAllOfficalLines()) { teichmann@6385: String name = line.getNamedMainValue().getName(); teichmann@6385: WstColumn wc = line.getWstColumn(); teichmann@6385: Wst wst = wc.getWst(); teichmann@6385: teichmann@6385: List ranges = new ArrayList(); teichmann@6385: teichmann@6385: River river = wst.getRiver(); teichmann@6385: List gauges = river.getGauges(); teichmann@6385: for (Gauge gauge: gauges) { teichmann@6385: List mainValues = gauge.getMainValues(); teichmann@6385: for (MainValue mainValue: mainValues) { teichmann@6385: NamedMainValue nmv = mainValue.getMainValue(); teichmann@6385: if (nmv.getName().equalsIgnoreCase(name)) { teichmann@6385: // found gauge with this main value teichmann@6385: teichmann@6385: double from = gauge.getRange().getA().doubleValue(); teichmann@6385: double to = gauge.getRange().getA().doubleValue(); teichmann@6385: double value = mainValue.getValue().doubleValue(); teichmann@6385: int wstId = wst.getId(); teichmann@6385: int pos = wc.getPosition(); teichmann@6385: ValueRange range = teichmann@6385: new ValueRange(from, to, value, wstId, pos); teichmann@6385: ranges.add(range); teichmann@6385: break; teichmann@6385: } teichmann@6385: } teichmann@6385: } teichmann@6385: teichmann@6385: if (!ranges.isEmpty()) { teichmann@6385: rivers2officialLines.put(river.getName(), ranges); teichmann@6385: } teichmann@6385: } teichmann@6385: teichmann@6385: return rivers2officialLines; teichmann@6385: } teichmann@6385: teichmann@6385: public static List findOfficialLines(D4EArtifact artifact) { teichmann@6385: teichmann@6385: Map> rivers2officialLines = getAll(); teichmann@6385: teichmann@6385: String riverName = artifact.getDataAsString("river"); teichmann@6385: teichmann@6385: if (riverName == null) { teichmann@6385: return Collections.emptyList(); teichmann@6385: } teichmann@6385: teichmann@6385: List ranges = rivers2officialLines.get(riverName); teichmann@6385: teichmann@6385: if (ranges.isEmpty()) { teichmann@6385: return Collections.emptyList(); teichmann@6385: } teichmann@6385: teichmann@6385: // TODO: Figure out all the cases here. teichmann@6385: teichmann@6385: return Collections.emptyList(); teichmann@6385: } teichmann@6385: }