teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5992: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5992: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer; ingo@2806: ingo@2810: import java.util.ArrayList; ingo@2810: import java.util.List; ingo@2810: ingo@2806: import org.apache.log4j.Logger; ingo@3949: import org.hibernate.Query; ingo@2810: import org.hibernate.Session; ingo@2810: teichmann@5829: import org.dive4elements.river.model.BedHeightEpoch; teichmann@5829: import org.dive4elements.river.model.ElevationModel; teichmann@5829: import org.dive4elements.river.model.Range; teichmann@5829: import org.dive4elements.river.model.River; teichmann@5829: import org.dive4elements.river.model.TimeInterval; ingo@2806: ingo@2806: felix@3957: /** Import Bed Height Data, 'epoch' type from csv file. */ ingo@3943: public class ImportBedHeightEpoch implements ImportBedHeight { ingo@3943: felix@3957: /** Private logger. */ ingo@2806: private static Logger log = Logger.getLogger(ImportBedHeightEpoch.class); ingo@2806: ingo@2810: protected String evaluationBy; felix@3957: felix@3957: /** De facto the file name. */ ingo@2806: protected String description; ingo@2806: ingo@3943: protected ImportTimeInterval timeInterval; ingo@3943: protected ImportRange range; ingo@2810: protected ImportElevationModel curElevationModel; ingo@2810: protected ImportElevationModel oldElevationModel; ingo@2810: ingo@2810: protected List values; ingo@2810: ingo@2810: protected BedHeightEpoch peer; ingo@2810: ingo@2806: public ImportBedHeightEpoch(String description) { ingo@2806: this.description = description; ingo@3943: this.values = new ArrayList(); ingo@2806: } ingo@2806: ingo@2806: public String getDescription() { ingo@2806: return description; ingo@2806: } ingo@2806: ingo@2811: public int getValueCount() { ingo@2811: return values.size(); ingo@2811: } ingo@2811: ingo@2811: public void setTimeInterval(ImportTimeInterval timeInterval) { ingo@2811: this.timeInterval = timeInterval; ingo@2810: } ingo@2810: ingo@2810: public void setEvaluationBy(String evaluationBy) { ingo@2810: this.evaluationBy = evaluationBy; ingo@2810: } ingo@2810: ingo@2810: public void setDescription(String description) { ingo@2810: this.description = description; ingo@2810: } ingo@2810: ingo@2810: public void setRange(ImportRange range) { ingo@2810: this.range = range; ingo@2810: } ingo@2810: ingo@2810: public void setCurElevationModel(ImportElevationModel curElevationModel) { ingo@2810: this.curElevationModel = curElevationModel; ingo@2810: } ingo@2810: ingo@2810: public void setOldElevationModel(ImportElevationModel oldElevationModel) { ingo@2810: this.oldElevationModel = oldElevationModel; ingo@2810: } ingo@2810: felix@3957: /** Does nothing. */ ingo@2811: public void setYear(int year) { ingo@2811: // do nothing ingo@2811: } ingo@2811: felix@3957: /** Does nothing. */ ingo@2811: public void setSoundingWidth(int soundingWidth) { ingo@2811: // do nothing ingo@2811: } ingo@2811: felix@3957: felix@3957: /** Does nothing. */ ingo@2811: public void setLocationSystem(ImportLocationSystem locationSystem) { ingo@2811: // do nothing ingo@2811: } ingo@2811: felix@3957: felix@3957: /** Does nothing. */ ingo@2811: public void setType(ImportBedHeightType type) { ingo@2811: // do nothing ingo@2811: } ingo@2811: ingo@2811: @Override ingo@2811: public void addValue(ImportBedHeightValue value) { ingo@2811: values.add((ImportBedHeightEpochValue) value); ingo@2810: } ingo@2810: ingo@2811: @Override tom@5416: public void storeDependencies(River river) { ingo@2806: log.info("Store dependencies for epoch: '" + getDescription() + "'"); ingo@2810: ingo@3949: BedHeightEpoch peer = getPeer(river); ingo@3949: ingo@2810: if (curElevationModel != null) { ingo@2810: curElevationModel.storeDependencies(); ingo@2810: } ingo@2810: ingo@2810: if (oldElevationModel != null) { ingo@2810: oldElevationModel.storeDependencies(); ingo@2810: } ingo@2810: ingo@3943: if (peer != null) { ingo@3943: log.debug("store values now..."); ingo@2810: ingo@3943: for (ImportBedHeightEpochValue value : values) { ingo@3943: value.storeDependencies(peer); ingo@3943: } ingo@2810: } ingo@2811: ingo@2811: Session session = ImporterSession.getInstance().getDatabaseSession(); ingo@2811: session.flush(); ingo@2810: } ingo@2810: felix@3957: /** felix@3957: * Asserts all dependent entities (ElevationModel, TimeInterval, Range, felix@3957: * BedHeighEpoch) are in db and returns bound (either newly created or felix@3957: * freshly fetched) BedHeightEpoch. felix@3957: */ ingo@2811: @Override ingo@2810: public BedHeightEpoch getPeer(River river) { ingo@2810: if (peer == null) { ingo@3949: ElevationModel theCurModel = null; ingo@3949: if (curElevationModel != null) { ingo@3949: curElevationModel.storeDependencies(); ingo@3949: theCurModel = curElevationModel.getPeer(); ingo@3949: } ingo@2810: ingo@2811: if (theCurModel == null) { sascha@3662: log.warn("BHE: Skip file - invalid current elevation model."); ingo@2811: return null; ingo@2811: } ingo@2811: ingo@3949: TimeInterval theTime = null; ingo@3949: if (timeInterval != null) { ingo@3949: theTime = timeInterval.getPeer(); ingo@3949: } ingo@2810: ingo@2811: if (theTime == null) { sascha@3662: log.warn("BHE: Skip file - invalid time range."); ingo@2811: return null; ingo@2811: } ingo@2811: ingo@2810: Range theRange = range != null ? range.getPeer(river) : null; ingo@2810: ingo@2811: if (theRange == null) { rrenkert@5450: log.warn("BHE: invalid km range."); ingo@2810: } ingo@2810: ingo@3943: Session session = ImporterSession.getInstance() ingo@3943: .getDatabaseSession(); ingo@2810: ingo@3943: Query query = session.createQuery("from BedHeightEpoch where " ingo@3943: + " river=:river and " + " timeInterval=:timeInterval and " ingo@3943: + " curElevationModel=:curElevationModel and " ingo@3943: + " range=:range and " + " evaluationBy=:evaluationBy and " ingo@3943: + " description=:description"); ingo@2810: ingo@2810: query.setParameter("river", river); ingo@2810: query.setParameter("timeInterval", theTime); ingo@2810: query.setParameter("curElevationModel", theCurModel); ingo@2810: query.setParameter("range", theRange); ingo@2810: query.setParameter("evaluationBy", evaluationBy); ingo@2810: query.setParameter("description", description); ingo@2810: ingo@2810: List bedHeights = query.list(); ingo@2810: ingo@2810: if (bedHeights.isEmpty()) { ingo@2810: log.info("Create new BedHeightEpoch DB instance."); ingo@2810: ingo@3943: peer = new BedHeightEpoch(river, theTime, theRange, ingo@2810: theCurModel, ingo@3943: oldElevationModel != null ? oldElevationModel.getPeer() ingo@3943: : null, evaluationBy, description); ingo@2811: ingo@2811: session.save(peer); ingo@2810: } ingo@2810: else { ingo@2810: peer = bedHeights.get(0); ingo@2810: } ingo@2810: } ingo@2810: ingo@2810: return peer; ingo@2806: } ingo@2806: } ingo@2806: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :