teichmann@5831: package org.dive4elements.river.artifacts.model.map; rrenkert@5307: rrenkert@5307: import java.util.List; rrenkert@5307: rrenkert@5307: import net.sf.ehcache.Cache; rrenkert@5307: import net.sf.ehcache.Element; rrenkert@5307: rrenkert@5307: import org.apache.log4j.Logger; rrenkert@5307: import org.hibernate.SQLQuery; rrenkert@5307: import org.hibernate.Session; rrenkert@5307: import org.hibernate.type.StandardBasicTypes; rrenkert@5307: import org.hibernatespatial.GeometryUserType; rrenkert@5307: rrenkert@5307: import com.vividsolutions.jts.geom.Geometry; rrenkert@5307: teichmann@5831: import org.dive4elements.river.artifacts.cache.CacheFactory; teichmann@5831: import org.dive4elements.river.backend.SessionHolder; rrenkert@5307: rrenkert@5307: rrenkert@5307: public class HWSFactory rrenkert@5307: { rrenkert@5307: /** Private logger to use here. */ rrenkert@5307: private static Logger log = Logger.getLogger(HWSFactory.class); rrenkert@5307: rrenkert@5307: private static final int HWS_LINES = 0; rrenkert@5307: private static final int HWS_POINTS = 1; rrenkert@5307: rrenkert@5307: public static final String SQL_SELECT_LINES = rrenkert@5307: "SELECT hl.name, hl.geom, hl.id, hl.kind_id, hl.official, fs.name AS fed, hl.description " + rrenkert@5307: " FROM hws_lines hl" + rrenkert@5307: " JOIN rivers r ON hl.river_id = r.id" + rrenkert@5307: " LEFT JOIN fed_states fs ON hl.fed_state_id = fs.id" + rrenkert@5307: " WHERE r.name = :river"; rrenkert@5307: rrenkert@5307: public static final String SQL_SELECT_POINTS = rrenkert@5307: "SELECT hp.name, hp.geom, hp.id, hp.kind_id, hp.official, fs.name AS fed, hp.description " + rrenkert@5307: " FROM hws_points hp" + rrenkert@5307: " JOIN rivers r ON hp.river_id = r.id" + rrenkert@5307: " LEFT JOIN fed_states fs ON hp.fed_state_id = fs.id" + rrenkert@5307: " WHERE r.name = :river"; rrenkert@5307: rrenkert@5307: rrenkert@5307: private HWSFactory() { rrenkert@5307: } rrenkert@5307: rrenkert@5307: rrenkert@5307: public static HWSContainer getHWSLines(String river) { rrenkert@5307: log.debug("HWSFactory.getHWS"); rrenkert@5307: Cache cache = CacheFactory.getCache(StaticHWSCacheKey.CACHE_NAME); rrenkert@5307: rrenkert@5307: StaticHWSCacheKey cacheKey; rrenkert@5307: rrenkert@5307: if (cache != null) { rrenkert@5307: cacheKey = new StaticHWSCacheKey(river, HWS_LINES); rrenkert@5307: Element element = cache.get(cacheKey); rrenkert@5307: if (element != null) { rrenkert@5307: log.debug("Got static hws values from cache"); rrenkert@5307: return (HWSContainer)element.getValue(); rrenkert@5307: } rrenkert@5307: } rrenkert@5307: else { rrenkert@5307: cacheKey = null; rrenkert@5307: } rrenkert@5307: rrenkert@5307: HWSContainer values = getHWSLinesUncached(river); rrenkert@5307: rrenkert@5307: if (values != null && cacheKey != null) { rrenkert@5307: log.debug("Store static hws values in cache."); rrenkert@5307: Element element = new Element(cacheKey, values); rrenkert@5307: cache.put(element); rrenkert@5307: } rrenkert@5307: return values; rrenkert@5307: } rrenkert@5307: rrenkert@5307: public static HWSContainer getHWSPoints(String river) { rrenkert@5307: log.debug("HWSFactory.getHWS"); rrenkert@5307: Cache cache = CacheFactory.getCache(StaticHWSCacheKey.CACHE_NAME); rrenkert@5307: rrenkert@5307: StaticHWSCacheKey cacheKey; rrenkert@5307: rrenkert@5307: if (cache != null) { rrenkert@5307: cacheKey = new StaticHWSCacheKey(river, HWS_LINES); rrenkert@5307: Element element = cache.get(cacheKey); rrenkert@5307: if (element != null) { rrenkert@5307: log.debug("Got static hws values from cache"); rrenkert@5307: return (HWSContainer)element.getValue(); rrenkert@5307: } rrenkert@5307: } rrenkert@5307: else { rrenkert@5307: cacheKey = null; rrenkert@5307: } rrenkert@5307: rrenkert@5307: HWSContainer values = getHWSPointsUncached(river); rrenkert@5307: rrenkert@5307: if (values != null && cacheKey != null) { rrenkert@5307: log.debug("Store static hws values in cache."); rrenkert@5307: Element element = new Element(cacheKey, values); rrenkert@5307: cache.put(element); rrenkert@5307: } rrenkert@5307: return values; rrenkert@5307: } rrenkert@5307: rrenkert@5307: private static HWSContainer getHWSLinesUncached(String river) { rrenkert@5307: if (log.isDebugEnabled()) { rrenkert@5307: log.debug("HWSFactory.getHWSLinesUncached"); rrenkert@5307: } rrenkert@5307: rrenkert@5307: Session session = SessionHolder.HOLDER.get(); rrenkert@5307: SQLQuery sqlQuery = null; rrenkert@5307: HWSContainer container = new HWSContainer(); rrenkert@5307: container.setRiver(river); rrenkert@5307: container.setType(HWS.TYPE.LINE); rrenkert@5307: sqlQuery = session.createSQLQuery(SQL_SELECT_LINES) rrenkert@5307: .addScalar("name", StandardBasicTypes.STRING) rrenkert@5307: .addScalar("geom", GeometryUserType.TYPE) rrenkert@5307: .addScalar("id", StandardBasicTypes.STRING) rrenkert@5307: .addScalar("kind_id", StandardBasicTypes.INTEGER) rrenkert@5307: .addScalar("official", StandardBasicTypes.INTEGER) rrenkert@5307: .addScalar("fed", StandardBasicTypes.STRING) rrenkert@5307: .addScalar("description", StandardBasicTypes.STRING); rrenkert@5307: rrenkert@5307: sqlQuery.setString("river", river); rrenkert@5307: List resultsLines = sqlQuery.list(); rrenkert@5307: teichmann@5329: for (Object [] row: resultsLines) { rrenkert@5307: container.addHws( rrenkert@5307: new HWS( rrenkert@5307: (String) row[0], rrenkert@5307: (Geometry) row[1], rrenkert@5307: (String) row[2], rrenkert@5307: (Integer) row[3], rrenkert@5307: (Integer) row[4], rrenkert@5307: (String) row[5], rrenkert@5307: (String) row[6], rrenkert@5307: HWS.TYPE.LINE)); rrenkert@5307: } rrenkert@5307: rrenkert@5307: return container; rrenkert@5307: } rrenkert@5307: rrenkert@5307: private static HWSContainer getHWSPointsUncached(String river) { rrenkert@5307: if (log.isDebugEnabled()) { rrenkert@5307: log.debug("HWSFactory.getHWSLinesUncached"); rrenkert@5307: } rrenkert@5307: rrenkert@5307: Session session = SessionHolder.HOLDER.get(); rrenkert@5307: SQLQuery sqlQuery = null; rrenkert@5307: HWSContainer container = new HWSContainer(); rrenkert@5307: container.setRiver(river); rrenkert@5307: container.setType(HWS.TYPE.LINE); rrenkert@5307: sqlQuery = session.createSQLQuery(SQL_SELECT_POINTS) rrenkert@5307: .addScalar("name", StandardBasicTypes.STRING) rrenkert@5307: .addScalar("geom", GeometryUserType.TYPE) rrenkert@5307: .addScalar("id", StandardBasicTypes.STRING) rrenkert@5307: .addScalar("kind_id", StandardBasicTypes.INTEGER) rrenkert@5307: .addScalar("official", StandardBasicTypes.INTEGER) rrenkert@5307: .addScalar("fed", StandardBasicTypes.STRING) rrenkert@5307: .addScalar("description", StandardBasicTypes.STRING); rrenkert@5307: rrenkert@5307: sqlQuery.setString("river", river); rrenkert@5307: List resultsPoints = sqlQuery.list(); rrenkert@5307: rrenkert@5307: for (int i = 0; i < resultsPoints.size(); i++) { rrenkert@5307: Object[] row = resultsPoints.get(i); rrenkert@5307: container.addHws( rrenkert@5307: new HWS( rrenkert@5307: (String) row[0], rrenkert@5307: (Geometry) row[1], rrenkert@5307: (String) row[2], rrenkert@5307: (Integer) row[3], rrenkert@5307: (Integer) row[4], rrenkert@5307: (String) row[5], rrenkert@5307: (String) row[6], rrenkert@5307: HWS.TYPE.POINT)); rrenkert@5307: } rrenkert@5307: rrenkert@5307: return container; rrenkert@5307: } rrenkert@5307: }