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