Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/GaugeFinderFactory.java @ 3143:29022c93027d
FixA: Create a cached GaugeFinderFactory to access the gauge along a river
flys-artifacts/trunk@4751 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Thu, 21 Jun 2012 16:46:05 +0000 |
parents | |
children | 368d1837ce5d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/GaugeFinderFactory.java Thu Jun 21 16:46:05 2012 +0000 @@ -0,0 +1,130 @@ +package de.intevation.flys.artifacts.model; + +import de.intevation.flys.artifacts.cache.CacheFactory; + +import de.intevation.flys.backend.SessionHolder; + +import de.intevation.flys.model.River; + +import java.util.ArrayList; +import java.util.List; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.Element; + +import org.apache.log4j.Logger; + +import org.hibernate.SQLQuery; +import org.hibernate.Session; + +import org.hibernate.type.StandardBasicTypes; + +public class GaugeFinderFactory +{ + private static Logger log = Logger.getLogger(GaugeFinderFactory.class); + + public static final String CACHE_NAME = "gauge-finders"; + + public static final String SQL_GAUGES = + "SELECT" + + " g.id AS gauge_id," + + " r.a AS a," + + " r.b AS b " + + "FROM gauges g" + + " JOIN ranges r ON g.range_id = r.id " + + "WHERE" + + " g.river_id = :river_id " + + "ORDER BY r.a"; + + private static GaugeFinderFactory INSTANCE; + + protected GaugeFinderFactory() { + } + + public static synchronized GaugeFinderFactory getInstance() { + if (INSTANCE == null) { + INSTANCE = new GaugeFinderFactory(); + } + + return INSTANCE; + } + + public GaugeFinder getGaugeFinder(String riverName) { + River river = RiverFactory.getRiver(riverName); + return river != null + ? getGaugeFinder(river.getId(), river.getKmUp()) + : null; + } + + public synchronized GaugeFinder getGaugeFinder( + int riverId, + boolean isKmUp + ) { + Cache cache = CacheFactory.getCache(CACHE_NAME); + + if (cache == null) { + return getUncached(riverId, isKmUp); + } + + String cacheKey = riverId + "-" + isKmUp; + Element element = cache.get(cacheKey); + + if (element != null) { + return (GaugeFinder)element.getValue(); + } + + GaugeFinder finder = getUncached(riverId, isKmUp); + + if (finder != null) { + cache.put(new Element(cacheKey, finder)); + } + + return finder; + } + + protected GaugeFinder loadGauges( + Session session, + int riverId, + boolean isKmUp + ) { + SQLQuery query = session.createSQLQuery(SQL_GAUGES) + .addScalar("gauge_id", StandardBasicTypes.INTEGER) + .addScalar("a", StandardBasicTypes.DOUBLE) + .addScalar("b", StandardBasicTypes.DOUBLE); + + query.setInteger("river_id", riverId); + + List<Object []> list = query.list(); + + if (list.isEmpty()) { + log.warn("River " + riverId + " has no gauges."); + return null; + } + + List<GaugeRange> gauges = new ArrayList<GaugeRange>(); + + for (Object [] row: list) { + int gaugeId = (Integer)row[0]; + double start = (Double) row[1]; + double end = (Double) row[2]; + GaugeRange gauge = new GaugeRange(start, end, gaugeId); + gauges.add(gauge); + } + + return new GaugeFinder(gauges, isKmUp); + } + + protected GaugeFinder getUncached(int riverId, boolean isKmUp) { + Session session = SessionHolder.HOLDER.get(); + + GaugeFinder finder = loadGauges(session, riverId, isKmUp); + + if (finder == null + || !finder.loadDischargeSectors(session, riverId)) { + return null; + } + + return finder; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :