Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/CrossSectionFactory.java @ 3786:4adc35aa655c
merged flys-artifacts/2.9.1
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:47 +0200 |
parents | b2ea89a665bc |
children |
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/CrossSectionFactory.java Fri Sep 28 12:14:47 2012 +0200 @@ -0,0 +1,112 @@ +package de.intevation.flys.artifacts.model; + +import java.util.List; + +import net.sf.ehcache.Cache; +import net.sf.ehcache.Element; + +import de.intevation.flys.backend.SessionHolder; +import de.intevation.flys.model.CrossSection; +import de.intevation.flys.model.River; + +import de.intevation.flys.artifacts.cache.CacheFactory; + +import org.hibernate.Session; +import org.hibernate.Query; + + +/** + * Get Cross Sections. + */ +public class CrossSectionFactory { + + protected final static String CACHE_NAME = "cross_sections"; + + // TODO use caching consistently, streamline acces. + /** + * Get CrossSections for an instantiated River. + * + * @param river river object. + * + * @return List of Cross Sections of river. + */ + public static List<CrossSection> getCrossSections(River river) { + return getCrossSections(river.getName()); + } + + + /** + * Get Cross Sections for a river by name. + * + * @param riverName name of the river of interest. + * + * @return List of Cross Sections of river. + */ + public static List<CrossSection> getCrossSections(String riverName) { + Session session = SessionHolder.HOLDER.get(); + Query query = session.createQuery( + "from CrossSection where river.name = :rivername"); + query.setParameter("rivername", riverName); + return query.list(); + } + + + /** + * True if the given section is the "newest" for that river. + * @param section Given section + * @return true if the section has the most advanced end of its validity interval + * or the most advanced start of its validity interval. + */ + public static boolean isNewest(CrossSection section) { + Session session = SessionHolder.HOLDER.get(); + Query query = session.createQuery( + "from CrossSection where river.id = :riverid " + + " order by timeInterval.stopTime desc, timeInterval.startTime desc"); + query.setParameter("riverid", section.getRiver().getId()); + + List result = query.list(); + + if (result == null || result.isEmpty()) { + return true; + } + else { + CrossSection cs = (CrossSection) result.get(0); + return section.getId().equals(cs.getId()); + } + } + + + /** + * Get a specific CrossSection from db. + * @param id The dbid of the cross-section to load. + */ + public static CrossSection getCrossSection(int id) { + Cache cache = CacheFactory.getCache(CACHE_NAME); + if (cache != null) { + Element element = cache.get(Integer.valueOf(id)); + if (element != null) { + return (CrossSection) element.getValue(); + } + } + + CrossSection section = getCrossSectionUncached(id); + if (cache != null) { + Element element = new Element(Integer.valueOf(id), section); + cache.put(element); + } + + return section; + } + + + /** Get specific CrossSection from database. */ + protected static CrossSection getCrossSectionUncached(int id) { + Session session = SessionHolder.HOLDER.get(); + Query query = session.createQuery( + "from CrossSection where id=:id"); + query.setParameter("id", id); + List<CrossSection> list = query.list(); + return list.isEmpty() ? null : list.get(0); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :