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@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@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@498: protected Map wstColumnValues; sascha@498: sascha@498: protected Map 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@499: databaseSession.setFlushMode(FlushMode.MANUAL); 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@497: if (wstColumnValues == null) { sascha@497: loadWstColumnValues(); sascha@497: } sascha@497: sascha@500: IdValueKey key = new IdValueKey(column.getId(), position, w); sascha@497: sascha@497: WstColumnValue wcv = wstColumnValues.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@497: wstColumnValues.put(key, wcv); sascha@497: sascha@497: return wcv; sascha@497: } sascha@497: sascha@497: protected void loadWstColumnValues() { sascha@500: log.info("load wst column values"); sascha@498: wstColumnValues = new HashMap(); sascha@497: sascha@497: Query query = databaseSession.createQuery("from WstColumnValue"); sascha@497: sascha@497: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@497: WstColumnValue wcv = (WstColumnValue)iter.next(); sascha@498: wstColumnValues.put(new IdValueKey(wcv), wcv); sascha@498: } sascha@500: log.info(wstColumnValues.size() + " values loaded"); sascha@498: } sascha@498: sascha@498: public DischargeTableValue getDischargeTableValue( sascha@498: DischargeTable table, sascha@498: BigDecimal q, sascha@498: BigDecimal w sascha@498: ) { sascha@498: if (dischargeTableValues == null) { sascha@498: loadDischargeTableValues(); sascha@498: } sascha@498: sascha@500: IdValueKey key = new IdValueKey(table.getId(), q, w); sascha@498: sascha@498: DischargeTableValue dtv = dischargeTableValues.get(key); sascha@498: sascha@498: if (dtv != null) { sascha@498: return dtv; sascha@498: } sascha@498: sascha@498: dtv = new DischargeTableValue(table, q, w); sascha@498: sascha@498: databaseSession.save(dtv); sascha@498: sascha@498: dischargeTableValues.put(key, dtv); sascha@498: sascha@498: return dtv; sascha@498: } sascha@498: sascha@498: protected void loadDischargeTableValues() { sascha@500: log.info("load discharge table values"); sascha@500: sascha@498: dischargeTableValues = new HashMap(); sascha@498: sascha@498: Query query = databaseSession.createQuery("from DischargeTableValue"); sascha@498: sascha@498: for (Iterator iter = query.iterate(); iter.hasNext();) { sascha@498: DischargeTableValue dtv = (DischargeTableValue)iter.next(); sascha@498: dischargeTableValues.put(new IdValueKey(dtv), dtv); sascha@497: } sascha@500: log.info(dischargeTableValues.size() + " values loaded"); 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@500: if (ranges != 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 :