sascha@497: package de.intevation.flys.importer; sascha@497: sascha@497: import java.util.Iterator; sascha@497: import java.util.Map; sascha@497: import java.util.HashMap; sascha@501: import java.util.LinkedHashMap; sascha@497: sascha@497: import java.math.BigDecimal; sascha@497: sascha@497: import org.hibernate.SessionFactory; sascha@497: import org.hibernate.Session; sascha@497: import org.hibernate.Query; sascha@499: import org.hibernate.FlushMode; sascha@497: sascha@497: import de.intevation.flys.backend.SessionFactoryProvider; sascha@497: sascha@497: import de.intevation.flys.model.WstColumnValue; sascha@497: import de.intevation.flys.model.WstColumn; sascha@498: import de.intevation.flys.model.DischargeTableValue; sascha@498: import de.intevation.flys.model.DischargeTable; sascha@500: import de.intevation.flys.model.Range; sascha@500: import de.intevation.flys.model.River; sascha@500: sascha@500: import org.apache.log4j.Logger; sascha@497: sascha@497: public class ImporterSession sascha@497: { sascha@500: private static Logger log = Logger.getLogger(ImporterSession.class); sascha@500: sascha@501: public static final int MAX_WST_CACHE_SIZE = 20; sascha@501: public static final int MAX_AT_CACHE_SIZE = 20; sascha@501: sascha@497: private static final ThreadLocal SESSION = sascha@497: new ThreadLocal() { sascha@497: @Override sascha@497: protected ImporterSession initialValue() { sascha@497: return new ImporterSession(); sascha@497: } sascha@497: }; sascha@497: sascha@497: protected Session databaseSession; sascha@497: sascha@501: protected Map> wstColumnValues; sascha@498: sascha@501: protected Map> sascha@501: dischargeTableValues; sascha@497: sascha@500: protected Map ranges; sascha@500: sascha@497: public static ImporterSession getInstance() { sascha@497: return SESSION.get(); sascha@497: } sascha@497: sascha@497: public ImporterSession() { sascha@497: SessionFactory sessionFactory = sascha@497: SessionFactoryProvider.createSessionFactory(); sascha@497: databaseSession = sessionFactory.openSession(); sascha@502: //databaseSession.setFlushMode(FlushMode.MANUAL); sascha@501: sascha@501: wstColumnValues = sascha@501: new LinkedHashMap>() { sascha@501: @Override sascha@501: protected boolean removeEldestEntry( sascha@501: Map.Entry> eldest sascha@501: ) { sascha@501: return size() > MAX_WST_CACHE_SIZE; sascha@501: } sascha@501: }; sascha@501: sascha@501: dischargeTableValues = sascha@501: new LinkedHashMap>() { sascha@501: @Override sascha@501: protected boolean removeEldestEntry( sascha@501: Map.Entry> eldest sascha@501: ) { sascha@501: return size() > MAX_AT_CACHE_SIZE; sascha@501: } sascha@501: }; sascha@497: } sascha@497: sascha@497: public Session getDatabaseSession() { sascha@497: return databaseSession; sascha@497: } sascha@497: sascha@497: public WstColumnValue getWstColumnValue( sascha@497: WstColumn column, sascha@497: BigDecimal position, sascha@497: BigDecimal w sascha@497: ) { sascha@501: Integer c = column.getId(); sascha@501: sascha@501: Map map = wstColumnValues.get(c); sascha@501: sascha@501: if (map == null) { sascha@501: map = new HashMap(); sascha@501: wstColumnValues.put(c, map); sascha@501: Query query = databaseSession.createQuery( sascha@501: "from WstColumnValue where wstColumn.id=:cid"); sascha@501: query.setParameter("cid", c); sascha@501: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@501: WstColumnValue wcv = (WstColumnValue)iter.next(); sascha@501: map.put(new ValueKey(wcv.getPosition(), wcv.getW()), wcv); sascha@501: } sascha@497: } sascha@497: sascha@501: ValueKey key = new ValueKey(position, w); sascha@497: sascha@501: WstColumnValue wcv = map.get(key); sascha@497: sascha@497: if (wcv != null) { sascha@497: return wcv; sascha@497: } sascha@497: sascha@497: wcv = new WstColumnValue(column, position, w); sascha@497: sascha@497: databaseSession.save(wcv); sascha@497: sascha@501: map.put(key, wcv); sascha@497: sascha@497: return wcv; sascha@497: } sascha@497: sascha@498: public DischargeTableValue getDischargeTableValue( sascha@498: DischargeTable table, sascha@498: BigDecimal q, sascha@498: BigDecimal w sascha@498: ) { sascha@501: Integer t = table.getId(); sascha@498: sascha@501: Map map = sascha@501: dischargeTableValues.get(t); sascha@498: sascha@501: if (map == null) { sascha@501: map = new HashMap(); sascha@501: dischargeTableValues.put(t, map); sascha@501: Query query = databaseSession.createQuery( sascha@501: "from DischargeTableValue where dischargeTable.id=:tid"); sascha@501: query.setParameter("tid", t); sascha@501: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@501: DischargeTableValue dctv = (DischargeTableValue)iter.next(); sascha@501: map.put(new ValueKey(q, w), dctv); sascha@501: } sascha@498: } sascha@498: sascha@501: ValueKey key = new ValueKey(q, w); sascha@498: sascha@501: DischargeTableValue dctv = map.get(key); sascha@498: sascha@501: if (dctv != null) { sascha@501: return dctv; sascha@501: } sascha@498: sascha@501: dctv = new DischargeTableValue(table, q, w); sascha@501: sascha@501: databaseSession.save(dctv); sascha@501: sascha@501: map.put(key, dctv); sascha@501: sascha@501: return dctv; sascha@500: } sascha@500: sascha@500: public Range getRange(River river, BigDecimal a, BigDecimal b) { sascha@500: sascha@500: if (ranges == null) { sascha@500: loadRanges(); sascha@500: } sascha@500: sascha@500: IdValueKey key = new IdValueKey(river.getId(), a, b); sascha@500: sascha@500: Range range = ranges.get(key); sascha@500: sascha@502: if (range != null) { sascha@500: return range; sascha@500: } sascha@500: sascha@500: range = new Range(a, b, river); sascha@500: sascha@500: databaseSession.save(range); sascha@500: sascha@500: ranges.put(key, range); sascha@500: sascha@500: return range; sascha@500: } sascha@500: sascha@500: protected void loadRanges() { sascha@500: log.info("load ranges"); sascha@500: ranges = new HashMap(); sascha@500: sascha@500: Query query = databaseSession.createQuery("from Range"); sascha@500: sascha@500: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@500: Range range = (Range)iter.next(); sascha@500: ranges.put(new IdValueKey(range), range); sascha@500: } sascha@500: log.info(ranges.size() + " values loaded"); sascha@497: } sascha@497: } sascha@497: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :