view backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLS.java @ 9709:b74f817435fe

comment removed
author dnt_bjoernsen <d.tironi@bjoernsen.de>
date Wed, 27 Jan 2021 11:47:38 +0100
parents 392bbcd8a88b
children
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.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.dive4elements.river.importer.common.StoreMode;
import org.dive4elements.river.model.GrainFraction;
import org.dive4elements.river.model.River;
import org.dive4elements.river.model.SedimentLoadLS;
import org.dive4elements.river.model.TimeInterval;
import org.dive4elements.river.model.Unit;
import org.hibernate.Query;
import org.hibernate.Session;


public class ImportSedimentLoadLS {

    private static Logger log = Logger.getLogger(ImportSedimentLoadLS.class);

    private ImportGrainFraction grainFraction;

    private ImportUnit unit;

    private ImportTimeInterval timeInterval;

    private ImportTimeInterval sqTimeInterval;

    private final String description;

    private Integer kind;

    private final List<ImportSedimentLoadLSValue> values;

    protected StoreMode storeMode;

    private SedimentLoadLS peer;

    public ImportSedimentLoadLS(final String description) {
        this.values = new ArrayList<>();
        this.description = description;
        this.storeMode = StoreMode.NONE;
    }

    public void setTimeInterval(final ImportTimeInterval timeInterval) {
        this.timeInterval = timeInterval;
    }

    public void setSQTimeInterval(final ImportTimeInterval sqTimeInterval) {
        this.sqTimeInterval = sqTimeInterval;
    }

    public void setUnit(final ImportUnit unit) {
        this.unit = unit;
    }

    public void setGrainFraction(final ImportGrainFraction grainFraction) {
        this.grainFraction = grainFraction;
    }

    public void setKind(final Integer kind) {
        this.kind = kind;
    }

    public void addValue(final ImportSedimentLoadLSValue value) {
        this.values.add(value);
    }

    public void storeDependencies(final River river) {
        log.info("store dependencies for '" + this.description + "'");

        final SedimentLoadLS peer = getPeer(river);

        if (peer != null) {
            int i = 0;

            for (final ImportSedimentLoadLSValue value : this.values) {
                value.storeDependencies(peer, this.storeMode);
                i++;
            }

            log.info("stored " + i + " sediment load values.");
        }
    }

    public SedimentLoadLS getPeer(final River river) {
        log.debug("get peer");

        final GrainFraction gf = this.grainFraction != null ? this.grainFraction.getPeer()
                : null;

        final Unit u = this.unit != null ? this.unit.getPeer() : null;

        final TimeInterval ti = (this.timeInterval != null) ? this.timeInterval.getPeer() : null;
        final TimeInterval sqti = (this.sqTimeInterval != null) ? this.sqTimeInterval.getPeer() : null;

        if (ti == null || u == null) {
            log.warn(
                    "Skip invalid SedimentLoadLS: time interval or unit null!");
            return null;
        }

        if (this.peer == null) {
            final Session session = ImporterSession.getInstance()
                    .getDatabaseSession();

            final String sqtquery = this.sqTimeInterval == null ?
                    "sq_time_interval_id is null" :
                        "sqTimeInterval = :sqTimeInterval";
            final Query query = session.createQuery("from SedimentLoadLS where "
                    + "   river=:river and "
                    + "   grainFraction=:grainFraction and "
                    + "   unit=:unit and "
                    + "   timeInterval=:timeInterval and "
                    + "   description=:description and "
                    + "   kind = :kind and " +
                    sqtquery);

            query.setParameter("river", river);
            query.setParameter("grainFraction", gf);
            query.setParameter("unit", u);
            query.setParameter("timeInterval", ti);
            if (sqti != null) {
                query.setParameter("sqTimeInterval", sqti);
            }
            query.setParameter("description", this.description);
            query.setParameter("kind", this.kind);

            final List<SedimentLoadLS> loads = query.list();
            if (loads.isEmpty()) {
                log.debug("create new SedimentLoadLS");

                this.peer = new SedimentLoadLS(river, u, ti, sqti, gf, this.description);
                this.peer.setKind(this.kind);
                session.save(this.peer);
                this.storeMode = StoreMode.INSERT;
            }
            else {
                this.peer = loads.get(0);
                this.storeMode = StoreMode.UPDATE;
            }
        }

        return this.peer;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org