mschaefer@8971: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@8971: * Software engineering by mschaefer@8971: * Björnsen Beratende Ingenieure GmbH mschaefer@8971: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@8971: * mschaefer@8971: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@8971: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@8971: * documentation coming with Dive4Elements River for details. mschaefer@8971: */ mschaefer@8971: mschaefer@8971: package org.dive4elements.river.importer.common; mschaefer@8971: mschaefer@8971: import java.util.ArrayList; mschaefer@8971: import java.util.EnumMap; mschaefer@8971: import java.util.List; mschaefer@8971: import java.util.Map; mschaefer@8971: mschaefer@8971: import org.apache.log4j.Logger; mschaefer@8971: import org.dive4elements.river.importer.ImporterSession; mschaefer@8971: import org.dive4elements.river.model.River; mschaefer@8971: import org.hibernate.Session; mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Abstract base class of a km bound data series of a river importing from a file mschaefer@8971: * mschaefer@8971: * @author Matthias Schäfer mschaefer@8971: * mschaefer@8971: */ mschaefer@8971: public abstract class AbstractSeriesImport> mschaefer@8971: { mschaefer@8971: /***** FIELDS *****/ mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Name of the imported file without type extension mschaefer@8971: */ mschaefer@8971: protected String filename; mschaefer@8971: mschaefer@8971: protected String kmrange_info; mschaefer@8971: mschaefer@8971: protected String comment; mschaefer@8971: mschaefer@8971: protected final List values; mschaefer@8971: mschaefer@8971: protected SERIES peer; mschaefer@8971: mschaefer@8971: protected Map valueStoreCount; mschaefer@8971: mschaefer@8971: protected StoreMode seriesStoreMode; mschaefer@8971: mschaefer@8971: mschaefer@8971: /***** CONSTRUCTORS *****/ mschaefer@8971: mschaefer@8971: AbstractSeriesImport() { mschaefer@8971: this.values = new ArrayList<>(); mschaefer@8971: this.valueStoreCount = new EnumMap<>(StoreMode.class); mschaefer@8971: for (final StoreMode mode : StoreMode.values()) mschaefer@8971: this.valueStoreCount.put(mode, Integer.valueOf(0)); mschaefer@8971: } mschaefer@8971: mschaefer@8971: public AbstractSeriesImport(final String filename) { mschaefer@8971: this(); mschaefer@8971: setFilename(filename); mschaefer@8971: } mschaefer@8971: mschaefer@8971: mschaefer@8971: /***** METHODS *****/ mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Gets the class's logger mschaefer@8971: */ mschaefer@8971: public abstract Logger getLog(); mschaefer@8971: mschaefer@8971: void setFilename(final String filename) { mschaefer@8971: this.filename = filename; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public String getFilename() { mschaefer@8971: return this.filename; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public String getKmrange_info() { mschaefer@8971: return this.kmrange_info; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void setKmrange_info(final String kmrange_info) { mschaefer@8971: this.kmrange_info = kmrange_info; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public String getComment() { mschaefer@8971: return this.comment; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void setComment(final String comment) { mschaefer@8971: this.comment = comment; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public int getValueCount() { mschaefer@8971: return this.values.size(); mschaefer@8971: } mschaefer@8971: mschaefer@8971: public void addValue(final KMLINE value) { mschaefer@8971: this.values.add(value); mschaefer@8971: } mschaefer@8971: mschaefer@8971: public int getValueStoreCount(final StoreMode mode) { mschaefer@8971: return this.valueStoreCount.get(mode).intValue(); mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Stores the data series and their values in the database mschaefer@8971: * mschaefer@8971: * @param river mschaefer@8971: */ mschaefer@8971: public StoreMode store(final River river) { mschaefer@8971: logStoreInfo(); mschaefer@8971: for (final StoreMode mode : StoreMode.values()) mschaefer@8971: this.valueStoreCount.put(mode, Integer.valueOf(0)); mschaefer@8971: final SERIES peer = getPeer(river); mschaefer@8971: if (peer != null) { mschaefer@8971: for (final KMLINE value : this.values) { mschaefer@8971: incrementValueStoreCount(value.store(peer, this.seriesStoreMode)); mschaefer@8971: } mschaefer@8971: } mschaefer@8971: ImporterSession.getInstance().getDatabaseSession().flush(); mschaefer@8971: return this.seriesStoreMode; mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Writes the store start info to the log mschaefer@8971: */ mschaefer@8971: protected void logStoreInfo() { mschaefer@8971: getLog().info("Store series '" + getFilename() + "'"); mschaefer@8971: } mschaefer@8971: mschaefer@8971: private void incrementValueStoreCount(final StoreMode mode) { mschaefer@8971: this.valueStoreCount.put(mode, Integer.valueOf(this.valueStoreCount.get(mode).intValue() + 1)); mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Gets the model object of the data series, inserting it into the database if not already existing mschaefer@8971: */ mschaefer@8971: public SERIES getPeer(final River river) { mschaefer@8971: if (this.peer != null) { mschaefer@8971: this.seriesStoreMode = StoreMode.NONE; mschaefer@8971: return this.peer; mschaefer@8971: } mschaefer@8971: final Session session = ImporterSession.getInstance().getDatabaseSession(); mschaefer@8971: final List rows = querySeriesItem(session, river); mschaefer@8971: if (rows.isEmpty()) { mschaefer@8971: getLog().info("Create new database instance"); mschaefer@8971: this.peer = createSeriesItem(river); mschaefer@8971: session.save(this.peer); mschaefer@8971: this.seriesStoreMode = StoreMode.INSERT; mschaefer@8971: } else { mschaefer@8971: this.peer = rows.get(0); mschaefer@8971: this.seriesStoreMode = StoreMode.UPDATE; mschaefer@8971: } mschaefer@8971: return this.peer; mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Queries the series item(s) from the database mschaefer@8971: */ mschaefer@8971: public abstract List querySeriesItem(final Session session, final River river); mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Creates a new value item mschaefer@8971: */ mschaefer@8971: public abstract SERIES createSeriesItem(final River river); mschaefer@8971: }