teichmann@5831: package org.dive4elements.river.artifacts.model; sascha@3143: teichmann@5831: import org.dive4elements.river.artifacts.cache.CacheFactory; sascha@3143: teichmann@5831: import org.dive4elements.river.backend.SessionHolder; sascha@3143: teichmann@5831: import org.dive4elements.river.model.River; sascha@3143: sascha@3143: import java.util.ArrayList; sascha@3143: import java.util.List; sascha@3143: sascha@3143: import net.sf.ehcache.Cache; sascha@3143: import net.sf.ehcache.Element; sascha@3143: sascha@3143: import org.apache.log4j.Logger; sascha@3143: sascha@3143: import org.hibernate.SQLQuery; sascha@3143: import org.hibernate.Session; sascha@3143: sascha@3143: import org.hibernate.type.StandardBasicTypes; sascha@3143: felix@5343: /** Get GaugeFinders. */ sascha@3143: public class GaugeFinderFactory sascha@3143: { sascha@3143: private static Logger log = Logger.getLogger(GaugeFinderFactory.class); sascha@3143: sascha@3143: public static final String CACHE_NAME = "gauge-finders"; sascha@3143: sascha@3143: public static final String SQL_GAUGES = sascha@3143: "SELECT" + sascha@3143: " g.id AS gauge_id," + sascha@3421: " g.name AS name," + sascha@3143: " r.a AS a," + sascha@3143: " r.b AS b " + sascha@3143: "FROM gauges g" + sascha@3143: " JOIN ranges r ON g.range_id = r.id " + sascha@3143: "WHERE" + sascha@3143: " g.river_id = :river_id " + sascha@3143: "ORDER BY r.a"; sascha@3143: sascha@3143: private static GaugeFinderFactory INSTANCE; sascha@3143: sascha@3143: protected GaugeFinderFactory() { sascha@3143: } sascha@3143: sascha@3143: public static synchronized GaugeFinderFactory getInstance() { sascha@3143: if (INSTANCE == null) { sascha@3143: INSTANCE = new GaugeFinderFactory(); sascha@3143: } sascha@3143: sascha@3143: return INSTANCE; sascha@3143: } sascha@3143: sascha@3143: public GaugeFinder getGaugeFinder(String riverName) { sascha@3143: River river = RiverFactory.getRiver(riverName); sascha@3143: return river != null sascha@3143: ? getGaugeFinder(river.getId(), river.getKmUp()) sascha@3143: : null; sascha@3143: } sascha@3143: sascha@3143: public synchronized GaugeFinder getGaugeFinder( sascha@3143: int riverId, sascha@3143: boolean isKmUp sascha@3143: ) { sascha@3143: Cache cache = CacheFactory.getCache(CACHE_NAME); sascha@3143: sascha@3143: if (cache == null) { sascha@3143: return getUncached(riverId, isKmUp); sascha@3143: } sascha@3143: sascha@3143: String cacheKey = riverId + "-" + isKmUp; sascha@3143: Element element = cache.get(cacheKey); sascha@3143: sascha@3143: if (element != null) { sascha@3143: return (GaugeFinder)element.getValue(); sascha@3143: } sascha@3143: sascha@3143: GaugeFinder finder = getUncached(riverId, isKmUp); sascha@3143: sascha@3143: if (finder != null) { sascha@3143: cache.put(new Element(cacheKey, finder)); sascha@3143: } sascha@3143: sascha@3143: return finder; sascha@3143: } sascha@3143: sascha@3143: protected GaugeFinder loadGauges( sascha@3143: Session session, sascha@3143: int riverId, sascha@3143: boolean isKmUp sascha@3143: ) { sascha@3143: SQLQuery query = session.createSQLQuery(SQL_GAUGES) sascha@3143: .addScalar("gauge_id", StandardBasicTypes.INTEGER) sascha@3421: .addScalar("name", StandardBasicTypes.STRING) sascha@3143: .addScalar("a", StandardBasicTypes.DOUBLE) sascha@3143: .addScalar("b", StandardBasicTypes.DOUBLE); sascha@3143: sascha@3143: query.setInteger("river_id", riverId); sascha@3143: sascha@3143: List list = query.list(); sascha@3143: sascha@3143: if (list.isEmpty()) { sascha@3143: log.warn("River " + riverId + " has no gauges."); sascha@3143: return null; sascha@3143: } sascha@3143: sascha@3143: List gauges = new ArrayList(); sascha@3143: sascha@3143: for (Object [] row: list) { sascha@3143: int gaugeId = (Integer)row[0]; sascha@3421: String name = (String) row[1]; sascha@3421: double start = (Double) row[2]; sascha@3421: double end = (Double) row[3]; sascha@3421: GaugeRange gauge = new GaugeRange(start, end, name, gaugeId); sascha@3143: gauges.add(gauge); sascha@3143: } sascha@3143: sascha@3143: return new GaugeFinder(gauges, isKmUp); sascha@3143: } sascha@3143: sascha@3143: protected GaugeFinder getUncached(int riverId, boolean isKmUp) { sascha@3143: Session session = SessionHolder.HOLDER.get(); sascha@3143: sascha@3143: GaugeFinder finder = loadGauges(session, riverId, isKmUp); sascha@3143: sascha@3143: if (finder == null sascha@3143: || !finder.loadDischargeSectors(session, riverId)) { sascha@3143: return null; sascha@3143: } sascha@3152: sascha@3143: return finder; sascha@3143: } sascha@3143: } sascha@3143: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :