Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java @ 5831:bd047b71ab37
Repaired internal references
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 12:06:39 +0200 |
parents | flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/minfo/BedHeightFactory.java@58bdf95df5e4 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/BedHeightFactory.java Thu Apr 25 12:06:39 2013 +0200 @@ -0,0 +1,178 @@ +package org.dive4elements.river.artifacts.model.minfo; + + +import java.util.Date; +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 org.dive4elements.river.artifacts.cache.CacheFactory; +import org.dive4elements.river.artifacts.model.StaticBedHeightCacheKey; +import org.dive4elements.river.backend.SessionHolder; + +public class BedHeightFactory { + /** Private logger to use here. */ + private static Logger log = Logger.getLogger(BedHeightFactory.class); + + /** Query to get km and ws for wst_id and column_pos. */ + public static final String SQL_SELECT_SINGLE = + "SELECT bhsv.height, bhsv.station, bhsv.data_gap, bhsv.sounding_width, bhs.year " + + " FROM bed_height_single bhs" + + " JOIN bed_height_single_values bhsv on bhsv.bed_height_single_id = bhs.id" + + " WHERE bhs.id = :height_id"; + + /** Query to get name for wst_id and column_pos. */ + public static final String SQL_SELECT_EPOCH = + "SELECT bv.height, bv.station, ti.start_time, ti.stop_time" + + " FROM bed_height_epoch b" + + " JOIN bed_height_epoch_values bv ON b.id = bv.bed_height_epoch_id" + + " JOIN time_intervals ti ON b.time_interval_id = ti.id" + + " WHERE b.id = :height_id"; + + /** Query to get name (description) for wst_id. */ + public static final String SQL_SELECT_DESCR_SINGLE = + "SELECT description FROM bed_height_single "+ + "WHERE id = :height_id"; + + /** Query to get name (description) for wst_id. */ + public static final String SQL_SELECT_DESCR_EPOCH = + "SELECT description from bed_height_epoch "+ + "WHERE id = :height_id"; + + + private BedHeightFactory() { + } + + + /** + * Get WKms for given column and wst_id, caring about the cache. + */ + public static BedHeight getHeight(String type, int height_id, int time) { + log.debug("BedHeightFactory.getHeight"); + Cache cache = CacheFactory.getCache(StaticBedHeightCacheKey.CACHE_NAME); + + StaticBedHeightCacheKey cacheKey; + + if (cache != null) { + cacheKey = new StaticBedHeightCacheKey(height_id, time); + Element element = cache.get(cacheKey); + if (element != null) { + log.debug("Got static bedheight values from cache"); + return (BedHeight)element.getValue(); + } + } + else { + cacheKey = null; + } + + BedHeight values = getBedHeightUncached(type, height_id, time); + + if (values != null && cacheKey != null) { + log.debug("Store static bed height values in cache."); + Element element = new Element(cacheKey, values); + cache.put(element); + } + return values; + } + + /** Get name for a WKms. */ + public static String getHeightName(String type, int height_id) { + log.debug("BedHeightFactory.getHeightName height_id/" + height_id); + + String name = null; + Session session = SessionHolder.HOLDER.get(); + + SQLQuery nameQuery = null; + if (type.equals("single")) { + nameQuery = session.createSQLQuery(SQL_SELECT_DESCR_SINGLE) + .addScalar("description", StandardBasicTypes.STRING); + nameQuery.setInteger("height_id", height_id); + } + else if (type.equals("epoch")) { + nameQuery = session.createSQLQuery(SQL_SELECT_DESCR_EPOCH) + .addScalar("description", StandardBasicTypes.STRING); + nameQuery.setInteger("height_id", height_id); + } + else { + return "none"; + } + List<String> names = nameQuery.list(); + if (!names.isEmpty()) { + name = names.get(0); + } + + return name; + } + + + /** + * Get WKms from db. + * @param column the position columns value + * @param wst_id database id of the wst + * @return according WKms. + */ + public static BedHeight getBedHeightUncached( + String type, + int height_id, + int time) + { + if (log.isDebugEnabled()) { + log.debug("BedHeightFactory.getBedHeightUncached"); + } + + Session session = SessionHolder.HOLDER.get(); + SQLQuery sqlQuery = null; + if (type.equals("single")) { + BedHeightSingle height = + new BedHeightSingle(getHeightName(type, height_id)); + sqlQuery = session.createSQLQuery(SQL_SELECT_SINGLE) + .addScalar("height", StandardBasicTypes.DOUBLE) + .addScalar("station", StandardBasicTypes.DOUBLE) + .addScalar("data_gap", StandardBasicTypes.DOUBLE) + .addScalar("sounding_width", StandardBasicTypes.DOUBLE) + .addScalar("year", StandardBasicTypes.INTEGER); + sqlQuery.setInteger("height_id", height_id); + List<Object []> results = sqlQuery.list(); + + for (int i = 0; i < results.size(); i++) { + Object[] row = results.get(i); + log.debug("got station: " + (Double)row[1]); + height.add( + (Double) row[0], + (Double) row[1], + (Double) row[2], + (Double) row[3], + (Integer) row[4]); + } + return height; + } + else if (type.equals("epoch")) { + BedHeightEpoch height = + new BedHeightEpoch(getHeightName(type, height_id)); + sqlQuery = session.createSQLQuery(SQL_SELECT_EPOCH) + .addScalar("height", StandardBasicTypes.DOUBLE) + .addScalar("station", StandardBasicTypes.DOUBLE) + .addScalar("start_time", StandardBasicTypes.DATE) + .addScalar("stop_time", StandardBasicTypes.DATE); + sqlQuery.setInteger("height_id", height_id); + List<Object []> results = sqlQuery.list(); + + for (Object [] row: results) { + height.add( + (Double) row[0], + (Double) row[1], + (Date) row[2], + (Date) row[3]); + } + return height; + } + return new BedHeight(); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :