Mercurial > dive4elements > river
diff backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java @ 5838:5aa05a7a34b7
Rename modules to more fitting names.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 15:23:37 +0200 |
parents | flys-backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java@18619c1e7c2a |
children | 4dd33b86dc61 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java Thu Apr 25 15:23:37 2013 +0200 @@ -0,0 +1,187 @@ +package org.dive4elements.river.importer; + +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +import java.math.BigDecimal; + +import org.hibernate.SessionFactory; +import org.hibernate.Session; +import org.hibernate.Query; +import org.hibernate.FlushMode; + +import org.dive4elements.river.backend.SessionFactoryProvider; + +import org.dive4elements.river.model.WstColumnValue; +import org.dive4elements.river.model.WstColumn; +import org.dive4elements.river.model.DischargeTableValue; +import org.dive4elements.river.model.DischargeTable; +import org.dive4elements.river.model.Range; +import org.dive4elements.river.model.River; + +import org.apache.log4j.Logger; + +import org.dive4elements.artifacts.common.utils.LRUCache; + +public class ImporterSession +{ + private static Logger log = Logger.getLogger(ImporterSession.class); + + private static final ThreadLocal<ImporterSession> SESSION = + new ThreadLocal<ImporterSession>() { + @Override + protected ImporterSession initialValue() { + return new ImporterSession(); + } + }; + + protected Session databaseSession; + + protected LRUCache<Integer, Map<ValueKey, WstColumnValue>> + wstColumnValues; + + protected LRUCache<Integer, Map<ValueKey, DischargeTableValue>> + dischargeTableValues; + + protected LRUCache<Integer, Map<ValueKey, Range>> + ranges; + + public static ImporterSession getInstance() { + return SESSION.get(); + } + + public ImporterSession() { + SessionFactory sessionFactory = + SessionFactoryProvider.createSessionFactory(); + databaseSession = sessionFactory.openSession(); + //databaseSession.setFlushMode(FlushMode.MANUAL); + + wstColumnValues = + new LRUCache<Integer, Map<ValueKey, WstColumnValue>>(); + + dischargeTableValues = + new LRUCache<Integer, Map<ValueKey, DischargeTableValue>>(); + + ranges = new LRUCache<Integer, Map<ValueKey, Range>>(); + } + + public Session getDatabaseSession() { + return databaseSession; + } + + public WstColumnValue getWstColumnValue( + WstColumn column, + BigDecimal position, + BigDecimal w + ) { + Integer c = column.getId(); + + Map<ValueKey, WstColumnValue> map = wstColumnValues.get(c); + + if (map == null) { + map = new TreeMap<ValueKey, WstColumnValue>( + ValueKey.EPSILON_COMPARATOR); + wstColumnValues.put(c, map); + Query query = databaseSession.createQuery( + "from WstColumnValue where wstColumn.id=:cid"); + query.setParameter("cid", c); + for (Iterator iter = query.iterate(); iter.hasNext();) { + WstColumnValue wcv = (WstColumnValue)iter.next(); + map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv); + } + } + + ValueKey key = new ValueKey(position, w); + + WstColumnValue wcv = map.get(key); + + if (wcv != null) { + return wcv; + } + + wcv = new WstColumnValue(column, position, w); + + databaseSession.save(wcv); + + map.put(key, wcv); + + return wcv; + } + + public DischargeTableValue getDischargeTableValue( + DischargeTable table, + BigDecimal q, + BigDecimal w + ) { + Integer t = table.getId(); + + Map<ValueKey, DischargeTableValue> map = + dischargeTableValues.get(t); + + if (map == null) { + map = new TreeMap<ValueKey, DischargeTableValue>( + ValueKey.EPSILON_COMPARATOR); + dischargeTableValues.put(t, map); + Query query = databaseSession.createQuery( + "from DischargeTableValue where dischargeTable.id=:tid"); + query.setParameter("tid", t); + for (Iterator iter = query.iterate(); iter.hasNext();) { + DischargeTableValue dctv = (DischargeTableValue)iter.next(); + map.put(new ValueKey(dctv.getQ(), dctv.getW()), dctv); + } + } + + ValueKey key = new ValueKey(q, w); + + DischargeTableValue dctv = map.get(key); + + if (dctv != null) { + return dctv; + } + + dctv = new DischargeTableValue(table, q, w); + + databaseSession.save(dctv); + + map.put(key, dctv); + + return dctv; + } + + public Range getRange(River river, BigDecimal a, BigDecimal b) { + Integer r = river.getId(); + + Map<ValueKey, Range> map = ranges.get(r); + + if (map == null) { + map = new TreeMap<ValueKey, Range>( + ValueKey.EPSILON_COMPARATOR); + ranges.put(r, map); + Query query = databaseSession.createQuery( + "from Range where river.id=:rid"); + query.setParameter("rid", r); + for (Iterator iter = query.iterate(); iter.hasNext();) { + Range range = (Range)iter.next(); + map.put(new ValueKey(range.getA(), range.getB()), range); + } + } + + ValueKey key = new ValueKey(a, b); + + Range range = map.get(key); + + if (range != null) { + return range; + } + + range = new Range(a, b, river); + + databaseSession.save(range); + + map.put(key, range); + + return range; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :