view flys-backend/src/main/java/de/intevation/flys/importer/ImporterSession.java @ 498:8ab04de0b879

Importer: Cache the discharge table values, too. flys-backend/trunk@1852 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 08 May 2011 17:55:49 +0000
parents 67fd63e4ef66
children cce054f27dac
line wrap: on
line source
package de.intevation.flys.importer;

import java.util.Iterator;
import java.util.Map;
import java.util.HashMap;

import java.math.BigDecimal;

import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Query;

import de.intevation.flys.backend.SessionFactoryProvider;

import de.intevation.flys.model.WstColumnValue;
import de.intevation.flys.model.WstColumn;
import de.intevation.flys.model.DischargeTableValue;
import de.intevation.flys.model.DischargeTable;

public class ImporterSession
{
    private static final ThreadLocal<ImporterSession> SESSION =
        new ThreadLocal<ImporterSession>() {
            @Override
            protected ImporterSession initialValue() {
                return new ImporterSession();
            }
        };

    protected Session databaseSession;

    protected Map<IdValueKey, WstColumnValue> wstColumnValues;

    protected Map<IdValueKey, DischargeTableValue> dischargeTableValues;

    public static ImporterSession getInstance() {
        return SESSION.get();
    }

    public ImporterSession() {
        SessionFactory sessionFactory =
            SessionFactoryProvider.createSessionFactory();
        databaseSession = sessionFactory.openSession();
    }

    public Session getDatabaseSession() {
        return databaseSession;
    }

    public WstColumnValue getWstColumnValue(
        WstColumn  column,
        BigDecimal position,
        BigDecimal w
    ) {
        if (wstColumnValues == null) {
            loadWstColumnValues();
        }

        IdValueKey key = new IdValueKey(
            column.getId(),
            position.doubleValue(),
            w.doubleValue());

        WstColumnValue wcv = wstColumnValues.get(key);

        if (wcv != null) {
            return wcv;
        }

        wcv = new WstColumnValue(column, position, w);

        databaseSession.save(wcv);

        wstColumnValues.put(key, wcv);

        return wcv;
    }

    protected void loadWstColumnValues() {
        wstColumnValues = new HashMap<IdValueKey, WstColumnValue>();

        Query query = databaseSession.createQuery("from WstColumnValue");

        for (Iterator iter = query.iterate(); iter.hasNext();) {
            WstColumnValue wcv = (WstColumnValue)iter.next();
            wstColumnValues.put(new IdValueKey(wcv), wcv);
        }
    }

    public DischargeTableValue getDischargeTableValue(
        DischargeTable table,
        BigDecimal     q,
        BigDecimal     w
    ) {
        if (dischargeTableValues == null) {
            loadDischargeTableValues();
        }

        IdValueKey key = new IdValueKey(
            table.getId(),
            q.doubleValue(),
            w.doubleValue());

        DischargeTableValue dtv = dischargeTableValues.get(key);

        if (dtv != null) {
            return dtv;
        }

        dtv = new DischargeTableValue(table, q, w);

        databaseSession.save(dtv);

        dischargeTableValues.put(key, dtv);

        return dtv;
    }

    protected void loadDischargeTableValues() {
        dischargeTableValues = new HashMap<IdValueKey, DischargeTableValue>();

        Query query = databaseSession.createQuery("from DischargeTableValue");

        for (Iterator iter = query.iterate(); iter.hasNext();) {
            DischargeTableValue dtv = (DischargeTableValue)iter.next();
            dischargeTableValues.put(new IdValueKey(dtv), dtv);
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org