teichmann@5844: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5844: * Software engineering by Intevation GmbH teichmann@5844: * teichmann@5844: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5844: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5844: * documentation coming with Dive4Elements River for details. teichmann@5844: */ teichmann@5844: teichmann@5829: package org.dive4elements.river.importer; sascha@184: sascha@184: import java.io.File; sascha@184: sascha@493: import java.util.ArrayList; sascha@192: import java.util.List; sascha@192: sascha@189: import java.math.BigDecimal; sascha@189: teichmann@5829: import org.dive4elements.artifacts.common.utils.FileTools; ingo@1234: teichmann@5829: import org.dive4elements.river.model.River; teichmann@5829: import org.dive4elements.river.model.Gauge; sascha@189: sascha@192: import org.hibernate.Session; sascha@192: import org.hibernate.Query; sascha@192: sascha@189: import java.io.IOException; sascha@189: sascha@492: import org.apache.log4j.Logger; sascha@492: teichmann@5829: import org.dive4elements.river.importer.parsers.AtFileParser; teichmann@5829: import org.dive4elements.river.importer.parsers.StaFileParser; sascha@1211: felix@5805: /** Gauge not in DB. */ sascha@184: public class ImportGauge sascha@184: { sascha@492: private static Logger log = Logger.getLogger(ImportGauge.class); sascha@492: sascha@492: public static final String HISTORICAL_DISCHARGE_TABLES = sascha@492: "Histor.Abflusstafeln"; sascha@492: sascha@185: protected ImportRange range; sascha@184: sascha@189: protected File staFile; sascha@189: protected File atFile; sascha@189: sascha@189: protected String name; sascha@189: protected BigDecimal aeo; sascha@189: protected BigDecimal datum; sascha@192: protected BigDecimal station; sascha@2371: protected Long officialNumber; sascha@189: sascha@189: protected Gauge peer; sascha@184: ingo@198: protected ImportDischargeTable dischargeTable; ingo@198: sascha@195: protected List mainValueTypes; sascha@195: protected List namedMainValues; sascha@195: protected List mainValues; sascha@493: protected List historicalDischargeTables; sascha@195: sascha@184: public ImportGauge() { sascha@493: historicalDischargeTables = new ArrayList(); sascha@184: } sascha@184: sascha@185: public ImportGauge(ImportRange range, File staFile, File atFile) { sascha@493: this(); sascha@185: this.range = range; sascha@184: this.staFile = staFile; sascha@184: this.atFile = atFile; sascha@184: } sascha@184: sascha@185: public void setRange(ImportRange range) { sascha@185: this.range = range; sascha@184: } sascha@184: sascha@184: public void setStaFile(File staFile) { sascha@184: this.staFile = staFile; sascha@184: } sascha@184: sascha@184: public File getStaFile() { sascha@184: return staFile; sascha@184: } sascha@184: sascha@184: public void setAtFile(File atFile) { sascha@184: this.atFile = atFile; sascha@184: } sascha@184: sascha@184: public File getAtFile() { sascha@184: return atFile; sascha@184: } sascha@189: sascha@189: public BigDecimal getAeo() { sascha@189: return aeo; sascha@189: } sascha@189: sascha@189: public void setAeo(BigDecimal aeo) { sascha@189: this.aeo = aeo; sascha@189: } sascha@189: sascha@189: public String getName() { sascha@189: return name; sascha@189: } sascha@189: sascha@189: public void setName(String name) { sascha@189: this.name = name; sascha@189: } sascha@189: sascha@189: public BigDecimal getDatum() { sascha@189: return datum; sascha@189: } sascha@189: sascha@189: public void setDatum(BigDecimal datum) { sascha@189: this.datum = datum; sascha@189: } sascha@189: sascha@192: public BigDecimal getStation() { sascha@192: return station; sascha@192: } sascha@192: sascha@192: public void setStation(BigDecimal station) { sascha@192: this.station = station; sascha@192: } sascha@192: sascha@2371: public Long getOfficialNumber() { sascha@2371: return officialNumber; sascha@2371: } sascha@2371: sascha@2371: public void setOfficialNumber(Long officialNumber) { sascha@2371: this.officialNumber = officialNumber; sascha@2371: } sascha@2371: ingo@198: public ImportDischargeTable getDischargeTable() { ingo@198: return dischargeTable; ingo@198: } ingo@198: ingo@198: public void setDischargeTable(ImportDischargeTable dischargeTable) { ingo@198: this.dischargeTable = dischargeTable; ingo@198: } ingo@198: sascha@195: public List getMainValueTypes() { sascha@195: return mainValueTypes; sascha@195: } sascha@195: sascha@195: public void setMainValueTypes(List mainValueTypes) { sascha@195: this.mainValueTypes = mainValueTypes; sascha@195: } sascha@195: sascha@195: public List getNamedMainValues() { sascha@195: return namedMainValues; sascha@195: } sascha@195: sascha@195: public void setNamedMainValues(List namedMainValues) { sascha@195: this.namedMainValues = namedMainValues; sascha@195: } sascha@195: sascha@195: public List getMainValues() { sascha@195: return mainValues; sascha@195: } sascha@195: sascha@195: public void setMainValues(List mainValues) { sascha@195: this.mainValues = mainValues; sascha@195: } sascha@195: sascha@189: public void parseDependencies() throws IOException { sascha@189: StaFileParser sfp = new StaFileParser(); sascha@189: sfp.parse(this); ingo@198: ingo@198: AtFileParser afp = new AtFileParser(); sascha@492: setDischargeTable(afp.parse(getAtFile())); sascha@492: parseHistoricalDischargeTables(); sascha@492: } sascha@492: sascha@492: public void parseHistoricalDischargeTables() throws IOException { teichmann@4135: if (Config.INSTANCE.skipHistoricalDischargeTables()) { teichmann@4135: log.info("skip historical discharge tables"); teichmann@4135: return; teichmann@4135: } teichmann@4135: sascha@492: log.info("parse historical discharge tables"); sascha@492: sascha@492: File riverDir = atFile.getParentFile().getParentFile(); sascha@492: sascha@492: File histDischargeDir = FileTools.repair( sascha@492: new File(riverDir, HISTORICAL_DISCHARGE_TABLES)); sascha@492: sascha@492: if (!histDischargeDir.isDirectory() || !histDischargeDir.canRead()) { sascha@492: log.info("cannot find '" + histDischargeDir + "'"); sascha@492: return; sascha@492: } sascha@492: sascha@492: histDischargeDir = FileTools.repair( sascha@492: new File(histDischargeDir, getName())); sascha@492: sascha@492: if (!histDischargeDir.isDirectory() || !histDischargeDir.canRead()) { sascha@492: log.info("cannot find '" + histDischargeDir + "'"); sascha@492: return; sascha@492: } sascha@492: sascha@492: File [] files = histDischargeDir.listFiles(); sascha@492: sascha@492: if (files == null) { sascha@492: log.info("cannot read directory '" + histDischargeDir + "'"); sascha@492: return; sascha@492: } sascha@492: sascha@492: for (File file: files) { sascha@492: if (!file.isFile() || !file.canRead()) { sascha@492: continue; sascha@492: } sascha@492: String name = file.getName().toLowerCase(); sascha@492: if (!name.endsWith(".at")) { sascha@492: continue; sascha@492: } sascha@492: log.info("found at file '" + file.getName() + "'"); sascha@492: sascha@492: AtFileParser afp = new AtFileParser(); sascha@493: historicalDischargeTables.add( sascha@493: afp.parse(file, HISTORICAL_DISCHARGE_TABLES + "/", 1)); sascha@492: } sascha@189: } sascha@189: sascha@191: public void storeDependencies(River river) { sascha@195: sascha@192: Gauge gauge = getPeer(river); sascha@195: sascha@499: log.info("store main value types"); sascha@195: for (ImportMainValueType mainValueType: mainValueTypes) { sascha@195: mainValueType.getPeer(); sascha@195: } sascha@195: sascha@499: log.info("store named main values"); sascha@195: for (ImportNamedMainValue namedMainValue: namedMainValues) { sascha@195: namedMainValue.getPeer(); sascha@195: } sascha@195: sascha@499: log.info("store main values"); sascha@195: for (ImportMainValue mainValue: mainValues) { sascha@195: mainValue.getPeer(river); sascha@195: } sascha@195: ingo@198: storeDischargeTable(gauge); sascha@493: storeHistoricalDischargeTable(gauge); ingo@198: } ingo@198: ingo@198: public void storeDischargeTable(Gauge gauge) { sascha@499: log.info("store discharge table"); ingo@198: dischargeTable.getPeer(gauge); ingo@198: dischargeTable.storeDependencies(gauge); sascha@191: } sascha@191: sascha@493: public void storeHistoricalDischargeTable(Gauge gauge) { sascha@499: log.info("store historical discharge tables"); sascha@493: for (ImportDischargeTable hdt: historicalDischargeTables) { sascha@493: hdt.storeDependencies(gauge); sascha@493: } sascha@493: } sascha@493: sascha@189: public Gauge getPeer(River river) { sascha@189: if (peer == null) { sascha@497: Session session = ImporterSession.getInstance().getDatabaseSession(); sascha@192: Query query = session.createQuery( sascha@192: "from Gauge where name=:name " + sascha@193: "and river.id=:river"); sascha@192: query.setString("name", name); sascha@193: query.setParameter("river", river.getId()); sascha@192: List gauges = query.list(); sascha@192: if (gauges.isEmpty()) { sascha@192: peer = new Gauge( sascha@192: name, river, sascha@464: station, aeo, datum, sascha@2371: officialNumber, sascha@192: range.getPeer(river)); sascha@192: session.save(peer); sascha@192: } sascha@192: else { sascha@192: peer = gauges.get(0); sascha@192: } sascha@189: } sascha@189: return peer; sascha@189: } sascha@184: } sascha@184: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :