rrenkert@4521: package de.intevation.flys.artifacts.model.minfo; rrenkert@4521: rrenkert@4521: import java.util.List; rrenkert@4521: rrenkert@4521: import net.sf.ehcache.Cache; rrenkert@4521: import net.sf.ehcache.Element; rrenkert@4521: rrenkert@4521: import org.apache.log4j.Logger; rrenkert@4521: import org.hibernate.SQLQuery; rrenkert@4521: import org.hibernate.Session; rrenkert@4521: import org.hibernate.type.StandardBasicTypes; rrenkert@4521: rrenkert@4521: import de.intevation.flys.artifacts.cache.CacheFactory; rrenkert@4521: import de.intevation.flys.backend.SessionHolder; rrenkert@4521: rrenkert@4521: rrenkert@4521: public class SedimentDensityFactory rrenkert@4521: { rrenkert@4521: /** Private logger to use here. */ rrenkert@4521: private static Logger log = Logger.getLogger(SedimentDensityFactory.class); rrenkert@4521: rrenkert@4521: private static final String DENSITY_CACHE_NAME = "sedimentdensity"; rrenkert@4521: rrenkert@4521: /**Query to get sediment density values and kms. */ rrenkert@4521: private static final String SQL_SELECT_DENSITY = rrenkert@4521: "SELECT sdv.station AS km, " + rrenkert@4521: " sdv.density AS density," + rrenkert@4521: " sdv.year AS year " + rrenkert@4521: " FROM sediment_density sd" + rrenkert@4521: " JOIN rivers r ON sd.river_id = r.id " + rrenkert@4521: " JOIN sediment_density_values sdv ON sd.id = sdv.sediment_density_id" + rrenkert@4521: " WHERE r.name = :name"; rrenkert@4521: rrenkert@4521: private SedimentDensityFactory() {} rrenkert@4521: rrenkert@4521: public static SedimentDensity getSedimentDensity( rrenkert@4521: String river, rrenkert@4521: double startKm, rrenkert@4521: double endKm, rrenkert@4521: int year rrenkert@4521: ) { rrenkert@4521: log.debug("getSedimentDensity"); rrenkert@4521: Cache cache = CacheFactory.getCache(DENSITY_CACHE_NAME); rrenkert@4521: rrenkert@4521: if (cache == null) { rrenkert@4521: log.debug("Cache not configured."); rrenkert@4521: return getSedimentDensityUncached(river, startKm, endKm, year); rrenkert@4521: } rrenkert@4521: rrenkert@4521: String key = river + startKm + endKm; rrenkert@4521: Element element = cache.get(key); rrenkert@4521: if (element != null) { rrenkert@4521: log.debug("SedimentDensity found in cache!"); rrenkert@4521: return (SedimentDensity)element.getValue(); rrenkert@4521: } rrenkert@4521: SedimentDensity value = rrenkert@4521: getSedimentDensityUncached(river, startKm, endKm, year); rrenkert@4521: rrenkert@4521: if (value != null && key != null) { rrenkert@4521: log.debug("Store sediment density values in cache."); rrenkert@4521: element = new Element(key, value); rrenkert@4521: cache.put(element); rrenkert@4521: } rrenkert@4521: return value; rrenkert@4521: } rrenkert@4521: rrenkert@4521: private static SedimentDensity getSedimentDensityUncached( rrenkert@4521: String river, rrenkert@4521: double startKm, rrenkert@4521: double endKm, rrenkert@4521: int year rrenkert@4521: ) { rrenkert@4521: log.debug("getSedimentDensityUncached"); rrenkert@4521: List results = null; rrenkert@4521: Session session = SessionHolder.HOLDER.get(); rrenkert@4521: SQLQuery sqlQuery = session.createSQLQuery(SQL_SELECT_DENSITY) rrenkert@4521: .addScalar("km", StandardBasicTypes.DOUBLE) rrenkert@4521: .addScalar("density", StandardBasicTypes.DOUBLE) rrenkert@4521: .addScalar("year", StandardBasicTypes.INTEGER); rrenkert@4521: sqlQuery.setString("name", river); rrenkert@4521: results = sqlQuery.list(); rrenkert@4521: SedimentDensity density = new SedimentDensity(); rrenkert@4521: for (Object[] row : results) { rrenkert@4521: density.addDensity((Double)row[0], (Double)row[1], (Integer)row[2]); rrenkert@4521: } rrenkert@4521: rrenkert@4521: density.cleanUp(); rrenkert@4521: return density; rrenkert@4521: } rrenkert@4521: }