view backend/src/main/java/org/dive4elements/river/importer/ImporterSession.java @ 8027:1e327d86c898

Load grain fractions from database only. Do not store new ones.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 10 Jul 2014 16:11:55 +0200
parents 4c3ccf2b0304
children cdb9f6d97f6a
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3)
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details.
 */

package org.dive4elements.river.importer;

import java.util.HashMap;
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.GrainFraction;
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;

    private Map<String, GrainFraction> grainFractions;

    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 GrainFraction getGrainFraction(String name) {
        if (grainFractions == null) {
            grainFractions = new HashMap<String, GrainFraction>();
            Query query = databaseSession.createQuery("from GrainFraction");
            for (Iterator iter = query.iterate(); iter.hasNext();) {
                GrainFraction gf = (GrainFraction)iter.next();
                grainFractions.put(gf.getName(), gf);
            }
        }
        return grainFractions.get(name);
    }

    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 :

http://dive4elements.wald.intevation.org