Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/SedimentDensityFactory.java @ 4521:71e6fe870c1d
Added objects and factory for sediment densities.
author | Raimund Renkert <rrenkert@intevation.de> |
---|---|
date | Wed, 14 Nov 2012 17:17:02 +0100 |
parents | |
children | 84e02b3f7a4f |
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/minfo/SedimentDensityFactory.java Wed Nov 14 17:17:02 2012 +0100 @@ -0,0 +1,90 @@ +package de.intevation.flys.artifacts.model.minfo; + +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; + +import de.intevation.flys.artifacts.cache.CacheFactory; +import de.intevation.flys.backend.SessionHolder; + + +public class SedimentDensityFactory +{ + /** Private logger to use here. */ + private static Logger log = Logger.getLogger(SedimentDensityFactory.class); + + private static final String DENSITY_CACHE_NAME = "sedimentdensity"; + + /**Query to get sediment density values and kms. */ + private static final String SQL_SELECT_DENSITY = + "SELECT sdv.station AS km, " + + " sdv.density AS density," + + " sdv.year AS year " + + " FROM sediment_density sd" + + " JOIN rivers r ON sd.river_id = r.id " + + " JOIN sediment_density_values sdv ON sd.id = sdv.sediment_density_id" + + " WHERE r.name = :name"; + + private SedimentDensityFactory() {} + + public static SedimentDensity getSedimentDensity( + String river, + double startKm, + double endKm, + int year + ) { + log.debug("getSedimentDensity"); + Cache cache = CacheFactory.getCache(DENSITY_CACHE_NAME); + + if (cache == null) { + log.debug("Cache not configured."); + return getSedimentDensityUncached(river, startKm, endKm, year); + } + + String key = river + startKm + endKm; + Element element = cache.get(key); + if (element != null) { + log.debug("SedimentDensity found in cache!"); + return (SedimentDensity)element.getValue(); + } + SedimentDensity value = + getSedimentDensityUncached(river, startKm, endKm, year); + + if (value != null && key != null) { + log.debug("Store sediment density values in cache."); + element = new Element(key, value); + cache.put(element); + } + return value; + } + + private static SedimentDensity getSedimentDensityUncached( + String river, + double startKm, + double endKm, + int year + ) { + log.debug("getSedimentDensityUncached"); + List<Object[]> results = null; + Session session = SessionHolder.HOLDER.get(); + SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_DENSITY) + .addScalar("km", StandardBasicTypes.DOUBLE) + .addScalar("density", StandardBasicTypes.DOUBLE) + .addScalar("year", StandardBasicTypes.INTEGER); + sqlQuery.setString("name", river); + results = sqlQuery.list(); + SedimentDensity density = new SedimentDensity(); + for (Object[] row : results) { + density.addDensity((Double)row[0], (Double)row[1], (Integer)row[2]); + } + + density.cleanUp(); + return density; + } +}