Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/HYKFactory.java @ 2139:923256599afe
Somewhat improved hyk handling and rendering.
flys-artifacts/trunk@3717 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Thu, 19 Jan 2012 12:52:44 +0000 |
parents | 04b6b6a4564d |
children | 345a236f7075 |
line wrap: on
line source
package de.intevation.flys.artifacts.model; import java.util.ArrayList; import java.util.List; import java.math.BigDecimal; import net.sf.ehcache.Cache; import net.sf.ehcache.Element; import org.apache.log4j.Logger; import org.hibernate.Query; import org.hibernate.Session; import de.intevation.flys.model.HYKFormation; import de.intevation.flys.model.HYKFlowZone; import de.intevation.flys.artifacts.cache.CacheFactory; import de.intevation.flys.backend.SessionHolder; /** * Factory to access HYKs (hydrographic values). */ public class HYKFactory { private static Logger logger = Logger.getLogger(HYKFactory.class); public static String HYK_CACHE_NAME = "hykache"; /** Do not instantiate a HYKFactory. */ private HYKFactory() { } /** * Get List of Zones for given river and km. */ public static Object getHYKs(int hykid, double km) { logger.debug("HYKFactory.getHYKs"); Cache cache = CacheFactory.getCache(HYK_CACHE_NAME); String cacheKey; if (cache != null) { cacheKey = "" + hykid + "_" + km; Element element = cache.get(cacheKey); if (element != null) { logger.debug("Got hyk from cache"); return (List<Zone>)element.getValue(); } } else { cacheKey = null; } List<Zone> zones = getZonesUncached(hykid, km); if (zones != null && cacheKey != null) { logger.debug("Store hykzones in cache."); Element element = new Element(cacheKey, zones); cache.put(element); } return zones; } public static String getHykName(int hykid) { logger.debug("HYKFactory.getHykName " + hykid); Session session = SessionHolder.HOLDER.get(); // TODO respect interval better. respect multiples (sort, limit), // TODO respect flow direction of river. Query query = session.createQuery( "select description from HYK where id = :hykid "); query.setParameter("hykid", hykid); return (String) query.uniqueResult(); } /** * * @param column the position columns value * @param wst_id database id of the wst * @return according WKms. */ // TODO we also need to know the HYK-id to specify which set we are // inspecting. public static List<Zone> getZonesUncached(int hykid, double km) { if (logger.isDebugEnabled()) { logger.debug("HYKFactory.getZoneUncached " + hykid + " km " + km); } Session session = SessionHolder.HOLDER.get(); // TODO respect interval better. respect multiples (sort, limit), // TODO respect flow direction of river. Query query = session.createQuery( "from HYKFormation where entry.HYK.id = :hykid " + " and :km between entry.km - cast(distance_vl/1000.0 + 0.001 as big_decimal) and " + " entry.km + cast(distance_vl/1000.0 + 0.001 as big_decimal)" + " order by entry.km asc"); query.setParameter("hykid", hykid); query.setParameter("km", new BigDecimal(km)); logger.debug("Big km " + new BigDecimal(km)); List<HYKFormation> forms = query.list(); List<Zone> zones = new ArrayList<Zone>(); // TODO limit query by one; sensible sorting. // Take the first one. if (forms.size() >= 1) { HYKFormation form = forms.get(0); // Create respective zones. for (HYKFlowZone flowZone: form.getZones()) { Zone z = new Zone(flowZone.getA().doubleValue(), flowZone.getB().doubleValue(), flowZone.getType().getName()); zones.add(z); } } return zones; } /** Labelled section. */ public static class Zone { /** Lower end of segment. */ protected double from; /** Upper end of segment. */ protected double to; /** The label. */ protected String name; /** Constructor for labelled section. */ public Zone (double from, double to, String name) { this.from = from; this.to = to; this.name = name; } /** Get upper value. */ public double getTo() { return to; } /** Get lower value. */ public double getFrom() { return from; } /** Get name (type). */ public String getName() { return name; } } // public static class Zone } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :