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; teichmann@5446: teichmann@5829: import org.dive4elements.artifacts.common.utils.FileTools.HashedFile; teichmann@5446: teichmann@5829: import org.dive4elements.artifacts.common.utils.FileTools; teichmann@5829: teichmann@5829: import org.dive4elements.river.importer.parsers.AnnotationClassifier; teichmann@5829: import org.dive4elements.river.importer.parsers.AnnotationsParser; teichmann@5829: import org.dive4elements.river.importer.parsers.BedHeightSingleParser; teichmann@5829: import org.dive4elements.river.importer.parsers.CrossSectionParser; teichmann@5829: import org.dive4elements.river.importer.parsers.DA50Parser; teichmann@5829: import org.dive4elements.river.importer.parsers.DA66Parser; teichmann@5829: import org.dive4elements.river.importer.parsers.FlowVelocityMeasurementParser; teichmann@5829: import org.dive4elements.river.importer.parsers.FlowVelocityModelParser; teichmann@5829: import org.dive4elements.river.importer.parsers.HYKParser; teichmann@5829: import org.dive4elements.river.importer.parsers.MeasurementStationsParser; teichmann@5829: import org.dive4elements.river.importer.parsers.MorphologicalWidthParser; teichmann@6335: import org.dive4elements.river.importer.parsers.OfficialLinesConfigParser; teichmann@5829: import org.dive4elements.river.importer.parsers.PRFParser; teichmann@5829: import org.dive4elements.river.importer.parsers.PegelGltParser; rrenkert@7841: import org.dive4elements.river.importer.parsers.PorosityParser; teichmann@5829: import org.dive4elements.river.importer.parsers.SQRelationParser; teichmann@5829: import org.dive4elements.river.importer.parsers.SedimentDensityParser; tom@8056: import org.dive4elements.river.importer.parsers.AbstractSedimentLoadParser; teichmann@8025: import org.dive4elements.river.importer.parsers.SedimentLoadLSParser; tom@8056: import org.dive4elements.river.importer.parsers.SedimentLoadParser; teichmann@5829: import org.dive4elements.river.importer.parsers.W80Parser; teichmann@5829: import org.dive4elements.river.importer.parsers.W80CSVParser; teichmann@5829: import org.dive4elements.river.importer.parsers.WaterlevelDifferencesParser; teichmann@5829: import org.dive4elements.river.importer.parsers.WaterlevelParser; teichmann@5829: import org.dive4elements.river.importer.parsers.WstParser; teichmann@5829: teichmann@5829: import org.dive4elements.river.model.River; teichmann@5829: import org.dive4elements.river.model.Unit; sascha@188: teichmann@8187: import org.dive4elements.river.backend.utils.DouglasPeuker; teichmann@5083: teichmann@5446: import java.io.File; teichmann@5446: import java.io.IOException; teichmann@5446: teichmann@5446: import java.util.ArrayList; teichmann@5446: import java.util.Calendar; teichmann@5446: import java.util.Date; teichmann@5446: import java.util.HashSet; teichmann@5446: import java.util.List; teichmann@5446: import java.util.Map; teichmann@5446: import java.util.Set; tom@7730: import java.util.Iterator; teichmann@5446: teichmann@5446: import org.apache.log4j.Logger; teichmann@5446: teichmann@5446: import org.hibernate.Query; teichmann@5446: import org.hibernate.Session; teichmann@5446: felix@4706: /** Import all river-related data (files) that can be found. */ sascha@177: public class ImportRiver sascha@177: { felix@5016: /** Private logger. */ sascha@184: private static Logger log = Logger.getLogger(ImportRiver.class); sascha@184: sascha@184: public static final String PEGEL_GLT = "PEGEL.GLT"; sascha@184: sascha@483: public static final String FIXATIONS = "Fixierungen"; sascha@483: sascha@482: public static final String EXTRA_LONGITUDINALS = sascha@482: "Zus.L\u00e4ngsschnitte"; sascha@482: sascha@484: public static final String [] OFFICIAL_LINES_FOLDERS = { sascha@484: "Basisdaten", sascha@484: "Fixierungen" }; sascha@484: sascha@484: public static final String OFFICIAL_LINES = sascha@484: "Amtl_Linien.wst"; sascha@484: teichmann@6335: public static final String OFFICIAL_LINES_CONFIG = teichmann@6335: "Amtl_Linien.config"; teichmann@6335: sascha@490: public static final String FLOOD_WATER = "HW-Marken"; sascha@490: sascha@494: public static final String FLOOD_PROTECTION = sascha@494: "HW-Schutzanlagen"; sascha@494: ingo@2806: public static final String MINFO_DIR = "Morphologie"; ingo@2806: ingo@2806: public static final String BED_HEIGHT_DIR = "Sohlhoehen"; ingo@2806: ingo@2806: public static final String BED_HEIGHT_SINGLE_DIR = "Einzeljahre"; ingo@2806: ingo@2815: public static final String SEDIMENT_DENSITY_DIR = "Sedimentdichte"; ingo@2815: rrenkert@7841: public static final String POROSITY_DIR = "Porositaet"; rrenkert@7841: ingo@2821: public static final String MORPHOLOGICAL_WIDTH_DIR = "morphologische_Breite"; ingo@2821: ingo@2826: public static final String FLOW_VELOCITY_DIR = "Geschwindigkeit_Schubspannung"; ingo@2826: ingo@2826: public static final String FLOW_VELOCITY_MODEL = "Modellrechnungen"; ingo@2826: ingo@2826: public static final String FLOW_VELOCITY_MEASUREMENTS = "v-Messungen"; ingo@2826: tom@8032: public static final String SEDIMENT_LOAD_DIR = "Fracht"; ingo@2839: tom@8032: public static final String SEDIMENT_LOAD_LS_DIR = "Laengsschnitte"; ingo@2839: tom@8056: public static final String SEDIMENT_LOAD_MS_DIR = "Messstellen"; tom@8056: tom@8032: public static final String SEDIMENT_LOAD_SINGLE_DIR = "Einzeljahre"; ingo@2839: tom@8032: public static final String SEDIMENT_LOAD_EPOCH_DIR = "Epochen"; tom@8032: tom@8032: public static final String SEDIMENT_LOAD_OFF_EPOCH_DIR = "amtliche Epochen"; felix@6724: ingo@2844: public static final String MINFO_FIXATIONS_DIR = "Fixierungsanalyse"; ingo@2844: ingo@2844: public static final String MINFO_WATERLEVELS_DIR = "Wasserspiegellagen"; ingo@2844: ingo@2851: public static final String MINFO_WATERLEVEL_DIFF_DIR = "Wasserspiegeldifferenzen"; ingo@2851: ingo@4193: public static final String MINFO_BASE_DIR = "Basisdaten"; ingo@4193: ingo@4193: public static final String MINFO_CORE_DATA_FILE = "Stammdaten_Messstellen.csv"; ingo@4193: ingo@3328: public static final String MINFO_SQ_DIR = "Feststofftransport-Abfluss-Beziehung"; ingo@3328: sascha@177: protected String name; sascha@177: rrenkert@7751: protected String modelUuid; rrenkert@7751: felix@5020: protected Long officialNumber; sascha@177: felix@5020: protected File wstFile; felix@5020: felix@5020: protected File bbInfoFile; sascha@177: sascha@184: protected List gauges; sascha@184: sascha@186: protected List annotations; sascha@186: sascha@1220: protected List hyks; sascha@1220: sascha@1204: protected List crossSections; sascha@1204: sascha@482: protected List extraWsts; sascha@482: sascha@483: protected List fixations; sascha@483: sascha@484: protected List officialLines; sascha@484: sascha@490: protected List floodWater; sascha@490: sascha@494: protected List floodProtection; sascha@494: felix@5261: /** Wst-structures from waterlevel-csv files. */ felix@5261: protected List waterlevels; felix@5261: felix@5227: /** Wst-structures from waterlevel-difference-csv files. */ felix@5227: protected List waterlevelDifferences; felix@5227: ingo@2811: protected List bedHeightSingles; ingo@2806: ingo@2811: protected List bedHeightEpochs; ingo@2806: ingo@2815: protected List sedimentDensities; ingo@2815: rrenkert@7841: protected List porosities; rrenkert@7841: ingo@2821: protected List morphologicalWidths; ingo@2821: ingo@2827: protected List flowVelocityModels; ingo@2827: ingo@2832: protected List flowVelocityMeasurements; ingo@2832: tom@8032: protected List sedimentLoadLSs; ingo@2839: tom@8056: protected List sedimentLoads; tom@8056: ingo@4193: protected List measurementStations; ingo@4193: ingo@3328: protected List sqRelations; ingo@3328: sascha@201: protected ImportWst wst; sascha@201: ingo@2347: protected ImportUnit wstUnit; ingo@2347: sascha@765: protected AnnotationClassifier annotationClassifier; sascha@765: felix@5017: /** Database-mapped River instance. */ sascha@188: protected River peer; sascha@188: felix@4778: felix@4778: /** Callback-implementation for CrossSectionParsers. */ teichmann@5083: private class ImportRiverCrossSectionParserCallback teichmann@5083: implements CrossSectionParser.Callback { felix@4778: teichmann@5083: private Set files = new HashSet(); teichmann@5084: private String type; felix@4778: felix@4778: /** felix@4778: * Create new Callback, given type which is used for logging felix@4778: * purposes only. felix@4778: */ teichmann@5084: public ImportRiverCrossSectionParserCallback(String type) { felix@4778: this.type = type; felix@4778: } felix@4778: felix@4778: felix@4778: /** Accept file if not duplicate. */ teichmann@5084: @Override felix@4778: public boolean accept(File file) { felix@4778: HashedFile hf = new HashedFile(file); felix@4778: boolean success = files.add(hf); felix@4778: if (!success) { felix@4778: log.warn(type + " file '" + file + "' seems to be a duplicate."); felix@4778: } felix@4778: return success; felix@4778: } felix@4778: felix@4778: felix@4778: /** Add crosssection. */ teichmann@5084: @Override felix@5806: public void parsed(CrossSectionParser parser) { felix@4778: log.debug("callback from " + type + " parser"); felix@4778: teichmann@5084: String description = parser.getDescription(); teichmann@5084: Integer year = parser.getYear(); teichmann@5084: ImportTimeInterval ti = year != null teichmann@5084: ? new ImportTimeInterval(yearToDate(year)) teichmann@5084: : null; teichmann@5084: teichmann@5084: Map> data = parser.getData(); teichmann@5084: teichmann@5084: List lines = teichmann@5084: new ArrayList(data.size()); teichmann@5084: teichmann@5084: Double simplificationEpsilon = teichmann@5084: Config.INSTANCE.getCrossSectionSimplificationEpsilon(); teichmann@5084: teichmann@5084: long numReadPoints = 0L; teichmann@5084: long numRemainingPoints = 0L; teichmann@5084: teichmann@5084: for (Map.Entry> entry: data.entrySet()) { teichmann@5084: Double km = entry.getKey(); teichmann@5084: List points = entry.getValue(); teichmann@5084: numReadPoints += points.size(); teichmann@5084: if (simplificationEpsilon != null) { teichmann@5084: points = DouglasPeuker.simplify(points, simplificationEpsilon); teichmann@5084: } teichmann@5084: numRemainingPoints += points.size(); teichmann@5084: lines.add(new ImportCrossSectionLine(km, points)); teichmann@5084: } teichmann@5084: teichmann@5084: ImportRiver.this.addCrossSections(description, ti, lines); teichmann@5084: tom@7735: if (simplificationEpsilon != null) { tom@7735: double percent = numReadPoints > 0L tom@7735: ? ((double)numRemainingPoints/numReadPoints)*100d tom@7735: : 0d; teichmann@5084: tom@7735: log.info(String.format( tom@7735: "Number of points in cross section: %d / %d (%.2f%%)", tom@7735: numReadPoints, numRemainingPoints, percent)); tom@7735: } felix@4778: } teichmann@5149: } // ImportRiverCrossSectionParserCallback felix@4778: felix@4778: teichmann@5084: private void addCrossSections( teichmann@5084: String description, teichmann@5084: ImportTimeInterval ti, teichmann@5084: List lines teichmann@5084: ) { teichmann@5084: crossSections.add(new ImportCrossSection(this, description, ti, lines)); teichmann@5084: } teichmann@5084: teichmann@5084: sascha@177: public ImportRiver() { ingo@2832: hyks = new ArrayList(); ingo@2832: crossSections = new ArrayList(); ingo@2832: extraWsts = new ArrayList(); ingo@2832: fixations = new ArrayList(); ingo@2832: officialLines = new ArrayList(); ingo@2832: floodWater = new ArrayList(); felix@5261: waterlevels = new ArrayList(); felix@5227: waterlevelDifferences = new ArrayList(); ingo@2832: floodProtection = new ArrayList(); ingo@2832: sedimentDensities = new ArrayList(); rrenkert@7841: porosities = new ArrayList(); ingo@2832: morphologicalWidths = new ArrayList(); ingo@2832: flowVelocityModels = new ArrayList(); ingo@2832: flowVelocityMeasurements = new ArrayList(); tom@8032: sedimentLoadLSs = new ArrayList(); tom@8056: sedimentLoads = new ArrayList(); ingo@4193: measurementStations = new ArrayList(); ingo@3328: sqRelations = new ArrayList(); sascha@177: } sascha@177: sascha@766: public ImportRiver( sascha@766: String name, rrenkert@7751: String modelUuid, sascha@766: File wstFile, sascha@766: File bbInfoFile, sascha@766: AnnotationClassifier annotationClassifier sascha@766: ) { sascha@482: this(); sascha@766: this.name = name; rrenkert@7751: this.modelUuid = modelUuid; sascha@766: this.wstFile = wstFile; sascha@766: this.bbInfoFile = bbInfoFile; sascha@766: this.annotationClassifier = annotationClassifier; sascha@177: } sascha@177: sascha@177: public String getName() { sascha@177: return name; sascha@177: } sascha@177: sascha@177: public void setName(String name) { sascha@177: this.name = name; sascha@177: } sascha@177: rrenkert@7751: public String getModelUuid() { rrenkert@7751: return modelUuid; rrenkert@7751: } rrenkert@7751: rrenkert@7751: public void setModelUuid(String modelUuid) { rrenkert@7751: this.modelUuid = modelUuid; rrenkert@7751: } rrenkert@7751: felix@5020: public Long getOfficialNumber() { felix@5020: return this.officialNumber; felix@5020: } felix@5020: felix@5020: public void setOfficialNumber(Long officialNumber) { felix@5020: this.officialNumber = officialNumber; felix@5020: } felix@5020: sascha@177: public File getWstFile() { sascha@177: return wstFile; sascha@177: } sascha@177: sascha@177: public void setWstFile(File wstFile) { sascha@177: this.wstFile = wstFile; sascha@177: } sascha@177: sascha@177: public File getBBInfo() { sascha@177: return bbInfoFile; sascha@177: } sascha@177: sascha@177: public void setBBInfo(File bbInfoFile) { sascha@177: this.bbInfoFile = bbInfoFile; sascha@177: } sascha@184: sascha@201: public ImportWst getWst() { sascha@201: return wst; sascha@201: } sascha@201: sascha@201: public void setWst(ImportWst wst) { sascha@201: this.wst = wst; sascha@201: } sascha@201: ingo@2806: public File getMinfoDir() { ingo@2806: File riverDir = wstFile.getParentFile().getParentFile().getParentFile(); ingo@2806: return new File(riverDir, MINFO_DIR); ingo@2806: } ingo@2806: sascha@186: public void parseDependencies() throws IOException { sascha@186: parseGauges(); sascha@186: parseAnnotations(); sascha@1204: parsePRFs(); felix@4712: parseDA66s(); felix@4767: parseDA50s(); felix@4767: parseW80s(); felix@5810: parseW80CSVs(); sascha@1220: parseHYKs(); sascha@197: parseWst(); sascha@482: parseExtraWsts(); sascha@483: parseFixations(); sascha@484: parseOfficialLines(); sascha@490: parseFloodWater(); sascha@494: parseFloodProtection(); tom@8056: parseMeasurementStations(); ingo@2806: parseBedHeight(); ingo@2815: parseSedimentDensity(); rrenkert@7841: parsePorosity(); ingo@2821: parseMorphologicalWidth(); ingo@2826: parseFlowVelocity(); tom@8032: parseSedimentLoadLS(); tom@8056: parseSedimentLoad(); ingo@2844: parseWaterlevels(); ingo@2851: parseWaterlevelDifferences(); ingo@3328: parseSQRelation(); sascha@494: } sascha@494: sascha@494: public void parseFloodProtection() throws IOException { sascha@1223: if (Config.INSTANCE.skipFloodProtection()) { sascha@1223: log.info("skip parsing flood protection"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@494: log.info("Parse flood protection wst file"); sascha@494: sascha@494: File riverDir = wstFile.getParentFile().getParentFile(); sascha@494: sascha@494: File dir = FileTools.repair(new File(riverDir, FLOOD_PROTECTION)); sascha@494: sascha@494: if (!dir.isDirectory() || !dir.canRead()) { sascha@494: log.info("no directory '" + dir + "' found"); sascha@494: return; sascha@494: } sascha@494: sascha@494: File [] files = dir.listFiles(); sascha@494: sascha@494: if (files == null) { sascha@494: log.warn("cannot read '" + dir + "'"); sascha@494: return; sascha@494: } sascha@494: sascha@494: for (File file: files) { sascha@494: if (!file.isFile() || !file.canRead()) { sascha@494: continue; sascha@494: } sascha@494: String name = file.getName().toLowerCase(); sascha@494: if (!(name.endsWith(".zus") || name.endsWith(".wst"))) { sascha@494: continue; sascha@494: } sascha@494: log.info("found file '" + file.getName() + "'"); teichmann@7339: try { teichmann@7339: WstParser wstParser = new WstParser(); teichmann@7339: wstParser.parse(file); teichmann@7339: ImportWst iw = wstParser.getWst(); teichmann@7339: iw.setKind(5); teichmann@7339: iw.setDescription(FLOOD_PROTECTION + "/" + iw.getDescription()); teichmann@7339: floodProtection.add(iw); teichmann@7339: } teichmann@7339: catch (WstParser.ParseException e) { tom@7343: log.error(e.getMessage()); teichmann@7339: } sascha@494: } sascha@490: } sascha@490: felix@5027: public void storeOfficialNumber() { felix@5027: if (Config.INSTANCE.skipBWASTR()) { felix@5027: log.info("skip storing official number."); felix@5027: return; felix@5027: } felix@5027: getPeer().setOfficialNumber(officialNumber); felix@5027: } ingo@2806: ingo@2806: public void parseBedHeight() throws IOException { ingo@2806: File minfoDir = getMinfoDir(); ingo@2806: File bedHeightDir = new File(minfoDir, BED_HEIGHT_DIR); ingo@2806: File singlesDir = new File(bedHeightDir, BED_HEIGHT_SINGLE_DIR); ingo@2806: ingo@2810: if (Config.INSTANCE.skipBedHeightSingle()) { ingo@2810: log.info("skip parsing bed height single."); ingo@2810: } ingo@2810: else { ingo@2844: log.info("Parse bed height single."); ingo@2810: parseBedHeightSingles(singlesDir); ingo@2810: } ingo@2806: } ingo@2806: ingo@2806: ingo@2815: protected void parseSedimentDensity() throws IOException { ingo@2815: if (Config.INSTANCE.skipSedimentDensity()) { ingo@2815: log.info("skip parsing sediment density."); ingo@2815: return; ingo@2815: } ingo@2815: ingo@3327: log.debug("Parse sediment density"); ingo@3327: ingo@2815: File minfoDir = getMinfoDir(); ingo@2815: File sediment = new File(minfoDir, SEDIMENT_DENSITY_DIR); ingo@2815: ingo@2815: File[] files = sediment.listFiles(); ingo@2815: ingo@2815: if (files == null) { sascha@3660: log.warn("Cannot read directory '" + sediment + "'"); ingo@2815: return; ingo@2815: } ingo@2815: ingo@2815: SedimentDensityParser parser = new SedimentDensityParser(); ingo@2815: ingo@2815: for (File file: files) { ingo@2815: parser.parse(file); ingo@2815: } ingo@2815: ingo@2815: sedimentDensities = parser.getSedimentDensities(); ingo@2815: ingo@2815: log.info("Parsed " + sedimentDensities.size() + " sediment densities."); ingo@2815: } ingo@2815: rrenkert@7841: protected void parsePorosity() throws IOException { rrenkert@7841: if (Config.INSTANCE.skipPorosity()) { rrenkert@7841: log.info("skip parsing porosity."); rrenkert@7841: return; rrenkert@7841: } rrenkert@7841: rrenkert@7841: log.debug("Parse porosity"); rrenkert@7841: rrenkert@7841: File minfoDir = getMinfoDir(); rrenkert@7841: File porosity = new File(minfoDir, POROSITY_DIR); rrenkert@7841: rrenkert@7841: File[] files = porosity.listFiles(); rrenkert@7841: rrenkert@7841: if (files == null) { rrenkert@7841: log.warn("Cannot read directory '" + porosity + "'"); rrenkert@7841: return; rrenkert@7841: } rrenkert@7841: rrenkert@7841: PorosityParser parser = new PorosityParser(); rrenkert@7841: rrenkert@7841: for (File file: files) { rrenkert@7841: parser.parse(file); rrenkert@7841: } rrenkert@7841: rrenkert@7841: porosities = parser.getPorosities(); rrenkert@7841: rrenkert@7841: log.info("Parsed " + porosities.size() + " porosities."); rrenkert@7841: } ingo@2815: ingo@2821: protected void parseMorphologicalWidth() throws IOException { ingo@2821: if (Config.INSTANCE.skipMorphologicalWidth()) { ingo@2821: log.info("skip parsing morphological width."); ingo@2821: return; ingo@2821: } ingo@2821: ingo@3327: log.debug("Parse morphological width"); ingo@3327: ingo@2821: File minfoDir = getMinfoDir(); ingo@2821: File morphDir = new File(minfoDir, MORPHOLOGICAL_WIDTH_DIR); ingo@2821: ingo@2821: File[] files = morphDir.listFiles(); ingo@2821: ingo@2821: if (files == null) { sascha@3660: log.warn("Cannot read directory '" + morphDir + "'"); ingo@2821: return; ingo@2821: } ingo@2821: ingo@2821: MorphologicalWidthParser parser = new MorphologicalWidthParser(); ingo@2821: ingo@2821: for (File file: files) { ingo@2821: parser.parse(file); ingo@2821: } ingo@2821: ingo@2821: morphologicalWidths = parser.getMorphologicalWidths(); ingo@2821: ingo@2821: log.info("Parsed " + morphologicalWidths.size() + " morph. widths files."); ingo@2821: } ingo@2821: ingo@2821: ingo@2826: protected void parseFlowVelocity() throws IOException { ingo@2826: if (Config.INSTANCE.skipFlowVelocity()) { ingo@2826: log.info("skip parsing flow velocity"); ingo@2826: return; ingo@2826: } ingo@2826: ingo@3328: log.debug("Parse flow velocity"); ingo@3328: ingo@2826: File minfoDir = getMinfoDir(); ingo@2826: File flowDir = new File(minfoDir, FLOW_VELOCITY_DIR); ingo@2826: File modelDir = new File(flowDir, FLOW_VELOCITY_MODEL); ingo@2826: File measureDir = new File(flowDir, FLOW_VELOCITY_MEASUREMENTS); ingo@2826: ingo@2826: File[] modelFiles = modelDir.listFiles(); ingo@2826: File[] measureFiles = measureDir.listFiles(); ingo@2826: ingo@2826: if (modelFiles == null) { sascha@3660: log.warn("Cannot read directory '" + modelDir + "'"); ingo@2826: } ingo@2826: else { ingo@2828: FlowVelocityModelParser parser = new FlowVelocityModelParser(); ingo@2828: ingo@2826: for (File model: modelFiles) { ingo@2826: log.debug("Parse file '" + model + "'"); ingo@2828: parser.parse(model); ingo@2826: } ingo@2828: ingo@2828: flowVelocityModels = parser.getModels(); ingo@2826: } ingo@2826: ingo@2826: if (measureFiles == null) { sascha@3660: log.warn("Cannot read directory '" + measureDir + "'"); ingo@2826: } ingo@2826: else { ingo@2832: FlowVelocityMeasurementParser parser = ingo@2832: new FlowVelocityMeasurementParser(); ingo@2832: ingo@2826: for (File measurement: measureFiles) { ingo@2826: log.debug("Parse file '" + measurement + "'"); ingo@2832: parser.parse(measurement); ingo@2826: } ingo@2832: ingo@2832: flowVelocityMeasurements = parser.getMeasurements(); ingo@2826: } ingo@2826: } ingo@2826: ingo@2826: tom@8056: private void parseSedimentLoadFiles( felix@6724: File[] files, tom@8056: AbstractSedimentLoadParser parser felix@6724: ) throws IOException { felix@6724: for (File file: files) { felix@6724: if (file.isDirectory()) { felix@6724: for (File child: file.listFiles()) { felix@6724: parser.parse(child); felix@6724: } felix@6724: } felix@6724: else { felix@6724: parser.parse(file); felix@6724: } felix@6724: } felix@6724: } felix@6724: tom@8056: tom@8056: private void parseSedimentLoadDir( tom@8056: File sedimentLoadDir, tom@8056: AbstractSedimentLoadParser parser tom@8056: ) throws IOException { tom@8056: tom@8056: File[] sedimentLoadSubDirs = { tom@8056: new File(sedimentLoadDir, tom@8056: SEDIMENT_LOAD_SINGLE_DIR), tom@8056: new File(sedimentLoadDir, tom@8056: SEDIMENT_LOAD_EPOCH_DIR), tom@8056: new File(sedimentLoadDir, tom@8056: SEDIMENT_LOAD_OFF_EPOCH_DIR), tom@8056: }; tom@8056: tom@8056: for (File subDir : sedimentLoadSubDirs) { tom@8056: File[] files = subDir.listFiles(); tom@8056: tom@8056: if (files == null || files.length == 0) { tom@8056: log.warn("Cannot read directory '" + subDir + "'"); tom@8056: } tom@8056: else { tom@8056: parseSedimentLoadFiles(files, parser); tom@8056: } tom@8056: } tom@8056: } tom@8056: tom@8056: tom@8032: protected void parseSedimentLoadLS() throws IOException { tom@8032: if (Config.INSTANCE.skipSedimentLoadLS()) { tom@8032: log.info("skip parsing sediment load longitudinal section data"); ingo@2839: return; ingo@2839: } ingo@2839: tom@8032: log.debug("Parse sediment load longitudinal section data"); ingo@3327: tom@8056: SedimentLoadLSParser parser = new SedimentLoadLSParser(); tom@8056: tom@8032: File minfoDir = getMinfoDir(); tom@8032: File sedimentLoadDir = new File(minfoDir, SEDIMENT_LOAD_DIR); tom@8032: File sedimentLoadLSDir = new File(sedimentLoadDir, tom@8032: SEDIMENT_LOAD_LS_DIR); ingo@2839: tom@8056: parseSedimentLoadDir(sedimentLoadLSDir, parser); ingo@2839: tom@8056: sedimentLoadLSs = parser.getSedimentLoadLSs(); tom@8056: } ingo@2839: ingo@2840: tom@8056: protected void parseSedimentLoad() throws IOException { tom@8056: if (Config.INSTANCE.skipSedimentLoad()) { tom@8056: log.info("skip parsing sediment load data at measurement stations"); tom@8056: return; ingo@2839: } ingo@2839: tom@8056: log.debug("Parse sediment load data at measurement stations"); felix@6724: tom@8056: SedimentLoadParser parser = new SedimentLoadParser(name); ingo@2840: tom@8056: File minfoDir = getMinfoDir(); tom@8056: File sedimentLoadDir = new File(minfoDir, SEDIMENT_LOAD_DIR); tom@8056: File sedimentLoadMSDir = new File(sedimentLoadDir, tom@8056: SEDIMENT_LOAD_MS_DIR); tom@8056: tom@8056: parseSedimentLoadDir(sedimentLoadMSDir, parser); tom@8056: tom@8056: sedimentLoads = parser.getSedimentLoads(); ingo@2839: } ingo@2839: ingo@2839: ingo@2844: protected void parseWaterlevels() throws IOException { ingo@2844: if (Config.INSTANCE.skipWaterlevels()) { ingo@2844: log.info("skip parsing waterlevels"); ingo@2844: return; ingo@2844: } ingo@2844: ingo@2851: log.info("Parse waterlevels"); ingo@2851: ingo@2844: File minfo = getMinfoDir(); ingo@2844: File fixDir = new File(minfo, MINFO_FIXATIONS_DIR); ingo@2845: File wspDir = new File(fixDir, MINFO_WATERLEVELS_DIR); ingo@2844: ingo@2844: File[] files = wspDir.listFiles(); ingo@2844: ingo@2844: if (files == null) { felix@5262: log.warn("Cannot read directory for wl '" + wspDir + "'"); ingo@2844: return; ingo@2844: } ingo@2844: ingo@2844: WaterlevelParser parser = new WaterlevelParser(); ingo@2844: ingo@2844: for (File file: files) { ingo@2844: parser.parse(file); ingo@2844: } ingo@2844: felix@5050: // The parsed ImportWaterlevels are converted to felix@5050: // 'fixation'-wsts now. felix@5247: for(ImportWst iw: parser.getWaterlevels()) { felix@5227: iw.setDescription("CSV/" + iw.getDescription()); felix@6283: iw.setKind(7); felix@5261: waterlevels.add(iw); felix@5050: } ingo@2851: } ingo@2844: ingo@4193: protected void parseMeasurementStations() throws IOException { ingo@4193: if (Config.INSTANCE.skipMeasurementStations()) { ingo@4193: log.info("skip parsing measurement stations"); ingo@4193: return; ingo@4193: } ingo@4193: ingo@4193: log.info("Parse measurement stations"); ingo@4193: ingo@4193: File minfo = getMinfoDir(); ingo@4193: File minfoBaseDir = new File(minfo, MINFO_BASE_DIR); ingo@4193: File coredataFile = new File(minfoBaseDir, MINFO_CORE_DATA_FILE); ingo@4193: ingo@4193: if (coredataFile == null || !coredataFile.exists()) { rrenkert@5427: log.warn("No core data file '" + coredataFile.getAbsolutePath() + "' found"); ingo@4193: return; ingo@4193: } ingo@4193: ingo@4193: MeasurementStationsParser parser = new MeasurementStationsParser(); ingo@4193: try { ingo@4193: parser.parse(coredataFile); ingo@4193: measurementStations = parser.getMeasurementStations(); ingo@4193: ingo@4193: log.info("Successfully parsed " + measurementStations.size() + " measurement stations."); ingo@4193: } ingo@4193: catch (IOException ioe) { ingo@4193: log.error("unable to parse file '" + coredataFile.getName() + ingo@4193: ": " + ioe.getMessage()); ingo@4193: } ingo@4193: } ingo@4193: ingo@2851: ingo@2851: protected void parseWaterlevelDifferences() throws IOException { ingo@2851: if (Config.INSTANCE.skipWaterlevelDifferences()) { ingo@2851: log.info("skip parsing waterlevel differences"); ingo@2851: return; ingo@2851: } ingo@2851: ingo@2851: log.info("Parse waterlevel differences"); ingo@2851: ingo@2851: File minfo = getMinfoDir(); ingo@2851: File fixDir = new File(minfo, MINFO_FIXATIONS_DIR); ingo@2851: File diffDir = new File(fixDir, MINFO_WATERLEVEL_DIFF_DIR); ingo@2851: ingo@2851: File[] files = diffDir.listFiles(); ingo@2851: ingo@2851: if (files == null) { ingo@2851: log.warn("Cannot read directory '" + diffDir + "'"); ingo@2851: return; ingo@2851: } ingo@2851: ingo@2851: WaterlevelDifferencesParser parser = new WaterlevelDifferencesParser(); ingo@2851: ingo@2851: for (File file: files) { ingo@2851: parser.parse(file); ingo@2851: } ingo@2851: felix@5232: // WaterlevelDifferences become Wsts now. felix@5247: for(ImportWst iw: parser.getDifferences()) { felix@5232: iw.setDescription("CSV/" + iw.getDescription()); felix@6283: iw.setKind(6); felix@5232: waterlevelDifferences.add(iw); felix@5232: } ingo@2844: } ingo@2844: ingo@2844: ingo@3328: protected void parseSQRelation() throws IOException { ingo@3328: if (Config.INSTANCE.skipSQRelation()) { ingo@3329: log.info("skip parsing sq relation"); ingo@3328: return; ingo@3328: } ingo@3328: ingo@3328: log.info("Parse sq relations"); ingo@3328: ingo@3328: File minfo = getMinfoDir(); ingo@3328: File sqDir = new File(minfo, MINFO_SQ_DIR); ingo@3328: ingo@3328: File[] files = sqDir.listFiles(); ingo@3328: ingo@3328: if (files == null) { ingo@3328: log.warn("Cannot read directory '" + sqDir + "'"); ingo@3328: return; ingo@3328: } ingo@3328: ingo@3328: SQRelationParser parser = new SQRelationParser(); ingo@3328: ingo@3328: for (File file: files) { ingo@3328: parser.parse(file); ingo@3328: } ingo@3328: ingo@3328: sqRelations = parser.getSQRelations(); ingo@3328: ingo@3328: log.debug("Parsed " + sqRelations.size() + " SQ relations."); ingo@3328: } ingo@3328: ingo@3328: ingo@2806: protected void parseBedHeightSingles(File dir) throws IOException { ingo@2806: log.debug("Parse bed height singles"); ingo@2806: ingo@2806: File[] files = dir.listFiles(); ingo@2806: ingo@2806: if (files == null) { sascha@3660: log.warn("Cannot read directory '" + dir + "'"); ingo@2806: return; ingo@2806: } ingo@2806: ingo@2806: BedHeightSingleParser parser = new BedHeightSingleParser(); ingo@2806: ingo@2806: for (File file: files) { ingo@2806: parser.parse(file); ingo@2806: } ingo@2806: ingo@2806: bedHeightSingles = parser.getBedHeights(); ingo@2806: } ingo@2806: sascha@490: public void parseFloodWater() throws IOException { sascha@1223: if (Config.INSTANCE.skipFloodWater()) { sascha@1223: log.info("skip parsing flod water"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@490: log.info("Parse flood water wst file"); sascha@490: sascha@490: File riverDir = wstFile.getParentFile().getParentFile(); sascha@490: sascha@490: File dir = FileTools.repair(new File(riverDir, FLOOD_WATER)); sascha@490: sascha@490: if (!dir.isDirectory() || !dir.canRead()) { sascha@490: log.info("no directory '" + dir + "' found"); sascha@490: return; sascha@490: } sascha@490: sascha@490: File [] files = dir.listFiles(); sascha@490: sascha@490: if (files == null) { sascha@490: log.warn("cannot read '" + dir + "'"); sascha@490: return; sascha@490: } sascha@490: sascha@490: for (File file: files) { sascha@490: if (!file.isFile() || !file.canRead()) { sascha@490: continue; sascha@490: } sascha@490: String name = file.getName().toLowerCase(); sascha@490: if (!(name.endsWith(".zus") || name.endsWith(".wst"))) { sascha@490: continue; sascha@490: } sascha@490: log.info("found file '" + file.getName() + "'"); teichmann@7339: try { teichmann@7339: WstParser wstParser = new WstParser(); teichmann@7339: wstParser.parse(file); teichmann@7339: ImportWst iw = wstParser.getWst(); teichmann@7339: iw.setKind(4); teichmann@7339: iw.setDescription(FLOOD_WATER + "/" + iw.getDescription()); teichmann@7339: floodWater.add(iw); teichmann@7339: } teichmann@7339: catch (WstParser.ParseException e) { tom@7343: log.error(e.getMessage()); teichmann@7339: } sascha@490: } sascha@484: } sascha@484: sascha@484: public void parseOfficialLines() throws IOException { sascha@1223: if (Config.INSTANCE.skipOfficialLines()) { sascha@1223: log.info("skip parsing official lines"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@484: log.info("Parse official wst files"); sascha@484: sascha@484: File riverDir = wstFile.getParentFile().getParentFile(); sascha@484: sascha@484: for (String folder: OFFICIAL_LINES_FOLDERS) { sascha@484: File dir = FileTools.repair(new File(riverDir, folder)); sascha@484: sascha@484: if (!dir.isDirectory() || !dir.canRead()) { sascha@484: log.info("no directory '" + folder + "' found"); sascha@484: continue; sascha@484: } sascha@484: sascha@484: File file = FileTools.repair(new File(dir, OFFICIAL_LINES)); sascha@484: if (!file.isFile() || !file.canRead()) { sascha@484: log.warn("no official lines wst file found"); sascha@484: continue; sascha@484: } sascha@484: log.debug("Found WST file: " + file); sascha@484: teichmann@6339: ImportWst iw = new ImportWst(ImportOfficialWstColumn.COLUMN_FACTORY); teichmann@6337: teichmann@6337: WstParser wstParser = new WstParser(iw); teichmann@7339: try { teichmann@7339: wstParser.parse(file); teichmann@7339: } teichmann@7339: catch (WstParser.ParseException e) { tom@7343: log.error(e.getMessage()); teichmann@7339: continue; teichmann@7339: } teichmann@7339: sascha@484: iw.setKind(3); sascha@484: iw.setDescription(folder + "/" + iw.getDescription()); teichmann@6335: teichmann@6335: File configFile = FileTools.repair(new File(dir, OFFICIAL_LINES_CONFIG)); teichmann@6335: if (!configFile.isFile() || !configFile.canRead()) { teichmann@6335: log.warn("no config file for official lines found"); teichmann@6335: } teichmann@6335: else { teichmann@6335: OfficialLinesConfigParser olcp = new OfficialLinesConfigParser(); teichmann@6335: try { teichmann@6335: olcp.parse(configFile); teichmann@6335: } teichmann@6335: catch (IOException ioe) { teichmann@6335: log.warn("Error reading offical lines config", ioe); teichmann@6335: } teichmann@6335: List mainValueNames = olcp.getMainValueNames(); teichmann@6335: if (mainValueNames.isEmpty()) { teichmann@6335: log.warn("config file for offical lines contains no entries"); teichmann@6335: } teichmann@6335: else { teichmann@6345: // Join as much as possible. teichmann@6345: Iterator wi = iw.getColumns().iterator(); teichmann@6345: Iterator si = olcp.getMainValueNames().iterator(); teichmann@6345: while (wi.hasNext() && si.hasNext()) { teichmann@6345: ImportOfficialWstColumn wc = (ImportOfficialWstColumn)wi.next(); teichmann@6345: String name = si.next(); teichmann@6345: ImportOfficialLine iol = new ImportOfficialLine(name, wc); teichmann@6345: wc.setOfficialLine(iol); teichmann@6345: } teichmann@6335: } teichmann@6335: } teichmann@6335: sascha@484: officialLines.add(iw); sascha@484: } // for all folders sascha@484: sascha@483: } sascha@483: sascha@483: public void parseFixations() throws IOException { sascha@1223: if (Config.INSTANCE.skipFixations()) { sascha@1223: log.info("skip parsing fixations"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@483: log.info("Parse fixation wst files"); sascha@483: sascha@483: File riverDir = wstFile.getParentFile().getParentFile(); sascha@483: sascha@483: File fixDir = FileTools.repair( sascha@483: new File(riverDir, FIXATIONS)); sascha@483: sascha@483: if (!fixDir.isDirectory() || !fixDir.canRead()) { sascha@483: log.info("no fixation wst file directory found"); sascha@483: return; sascha@483: } sascha@483: sascha@483: File [] files = fixDir.listFiles(); sascha@483: sascha@483: if (files == null) { sascha@483: log.warn("cannot read fixations wst file directory"); sascha@483: return; sascha@483: } sascha@483: sascha@483: for (File file: files) { sascha@483: if (!file.isFile() || !file.canRead()) { sascha@483: continue; sascha@483: } sascha@483: String name = file.getName().toLowerCase(); sascha@483: if (!name.endsWith(".wst")) { sascha@483: continue; sascha@483: } sascha@483: log.debug("Found WST file: " + file); sascha@483: teichmann@7339: try { teichmann@7339: WstParser wstParser = new WstParser(); teichmann@7339: wstParser.parse(file); teichmann@7339: ImportWst iw = wstParser.getWst(); teichmann@7339: iw.setKind(2); teichmann@7339: iw.setDescription(FIXATIONS+ "/" + iw.getDescription()); teichmann@7339: fixations.add(iw); teichmann@7339: } teichmann@7339: catch (WstParser.ParseException e) { tom@7343: log.error(e.getMessage()); teichmann@7339: } sascha@483: } sascha@482: } sascha@482: sascha@482: public void parseExtraWsts() throws IOException { sascha@1223: if (Config.INSTANCE.skipExtraWsts()) { sascha@1223: log.info("skip parsing extra WST files"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@482: log.info("Parse extra longitudinal wst files"); sascha@482: sascha@482: File riverDir = wstFile.getParentFile().getParentFile(); sascha@482: sascha@482: File extraDir = FileTools.repair( sascha@482: new File(riverDir, EXTRA_LONGITUDINALS)); sascha@482: sascha@482: if (!extraDir.isDirectory() || !extraDir.canRead()) { sascha@482: log.info("no extra longitudinal wst file directory found"); sascha@482: return; sascha@482: } sascha@482: sascha@482: File [] files = extraDir.listFiles(); sascha@482: sascha@482: if (files == null) { sascha@482: log.warn("cannot read extra longitudinal wst file directory"); sascha@482: return; sascha@482: } sascha@482: sascha@482: for (File file: files) { sascha@482: if (!file.isFile() || !file.canRead()) { sascha@482: continue; sascha@482: } sascha@482: String name = file.getName().toLowerCase(); sascha@482: if (!(name.endsWith(".zus") || name.endsWith(".wst"))) { sascha@482: continue; sascha@482: } sascha@482: log.debug("Found WST file: " + file); sascha@482: teichmann@7339: try { teichmann@7339: WstParser wstParser = new WstParser(); teichmann@7339: wstParser.parse(file); teichmann@7339: ImportWst iw = wstParser.getWst(); teichmann@7339: iw.setKind(1); teichmann@7339: iw.setDescription(EXTRA_LONGITUDINALS + "/" + iw.getDescription()); teichmann@7339: extraWsts.add(iw); teichmann@7339: } teichmann@7339: catch (WstParser.ParseException e) { tom@7343: log.error(e.getMessage()); teichmann@7339: } sascha@482: } sascha@482: sascha@197: } sascha@197: sascha@197: public void parseWst() throws IOException { sascha@1223: if (Config.INSTANCE.skipWst()) { sascha@1223: log.info("skip parsing WST file"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@197: WstParser wstParser = new WstParser(); teichmann@7339: try { teichmann@7339: wstParser.parse(wstFile); teichmann@7339: wst = wstParser.getWst(); teichmann@7339: wst.setKmUp(wst.guessWaterLevelIncreasing()); teichmann@7339: } teichmann@7339: catch (WstParser.ParseException e) { tom@7343: log.error(e.getMessage()); teichmann@7339: } sascha@186: } sascha@186: sascha@184: public void parseGauges() throws IOException { sascha@1223: if (Config.INSTANCE.skipGauges()) { sascha@1223: log.info("skip parsing gauges"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@184: File gltFile = new File(wstFile.getParentFile(), PEGEL_GLT); sascha@184: gltFile = FileTools.repair(gltFile); sascha@184: sascha@184: if (!gltFile.isFile() || !gltFile.canRead()) { sascha@184: log.warn("cannot read gauges from '" + gltFile + "'"); sascha@184: return; sascha@184: } sascha@184: sascha@184: PegelGltParser pgltp = new PegelGltParser(); sascha@184: pgltp.parse(gltFile); sascha@184: sascha@184: gauges = pgltp.getGauges(); sascha@189: sascha@189: for (ImportGauge gauge: gauges) { sascha@189: gauge.parseDependencies(); sascha@189: } sascha@184: } sascha@186: sascha@186: public void parseAnnotations() throws IOException { sascha@1223: if (Config.INSTANCE.skipAnnotations()) { sascha@1223: log.info("skip parsing annotations"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@186: File riverDir = wstFile.getParentFile().getParentFile(); sascha@765: AnnotationsParser aparser = sascha@765: new AnnotationsParser(annotationClassifier); sascha@186: aparser.parse(riverDir); sascha@186: sascha@186: annotations = aparser.getAnnotations(); sascha@186: } sascha@188: sascha@1220: public void parseHYKs() { sascha@1223: if (Config.INSTANCE.skipHYKs()) { sascha@1223: log.info("skip parsing HYK files"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@1220: log.info("looking for HYK files"); sascha@1220: HYKParser parser = new HYKParser(); sascha@1220: File riverDir = wstFile sascha@1220: .getParentFile() // Basisdaten sascha@1220: .getParentFile() // Hydrologie sascha@1220: .getParentFile(); // sascha@1220: sascha@1220: parser.parseHYKs(riverDir, new HYKParser.Callback() { sascha@1220: sascha@1220: Set hfs = new HashSet(); sascha@1220: sascha@1220: @Override sascha@1220: public boolean hykAccept(File file) { sascha@1220: HashedFile hf = new HashedFile(file); sascha@1220: boolean success = hfs.add(hf); sascha@1220: if (!success) { sascha@1220: log.warn("HYK file '" + file + "' seems to be a duplicate."); sascha@1220: } sascha@1220: return success; sascha@1220: } sascha@1220: sascha@1220: @Override sascha@1220: public void hykParsed(HYKParser parser) { sascha@1220: log.debug("callback from HYK parser"); sascha@1220: ImportHYK hyk = parser.getHYK(); sascha@1220: hyk.setRiver(ImportRiver.this); sascha@1220: hyks.add(hyk); sascha@1220: } sascha@1220: }); sascha@1220: } sascha@1220: felix@4712: felix@4767: /** Create a W80 Parser and parse w80 files found. */ felix@4767: public void parseW80s() { felix@4767: if (Config.INSTANCE.skipW80s()) { felix@4767: log.info("skip parsing W80s"); felix@4781: return; felix@4767: } felix@4767: W80Parser parser = new W80Parser(); felix@4767: File riverDir = wstFile felix@4767: .getParentFile() // Basisdaten felix@4767: .getParentFile() // Hydrologie felix@4767: .getParentFile(); // felix@4767: felix@4779: ImportRiverCrossSectionParserCallback w80Callback = felix@4779: new ImportRiverCrossSectionParserCallback("w80"); felix@4779: parser.parseW80s(riverDir, w80Callback); felix@4767: } felix@4767: felix@5810: /** Create a W80 Parser and parse w80 files found. */ felix@5810: public void parseW80CSVs() { felix@5810: if (Config.INSTANCE.skipW80CSVs()) { felix@5810: log.info("skip parsing W80 csvs"); felix@5810: return; felix@5810: } felix@5810: W80CSVParser parser = new W80CSVParser(); felix@5810: File riverDir = wstFile felix@5810: .getParentFile() // Basisdaten felix@5810: .getParentFile() // Hydrologie felix@5810: .getParentFile(); // felix@5810: felix@5810: // Construct the Cross-Section-Data path. felix@5810: File csDir = new File(riverDir.getPath() felix@5810: + File.separator + "Geodaesie" felix@5810: + File.separator + "Querprofile" felix@5810: + File.separator + "QP-Daten"); felix@5810: felix@5810: ImportRiverCrossSectionParserCallback w80CSVCallback = felix@5810: new ImportRiverCrossSectionParserCallback("w80-csv"); felix@5810: parser.parseW80CSVs(csDir, w80CSVCallback); felix@5810: } felix@5810: felix@4782: felix@4782: /** felix@4782: * Create and use a DA50Parser, parse the files found, add the felix@4782: * ross-sections found. felix@4782: */ felix@4767: public void parseDA50s() { felix@4767: if (Config.INSTANCE.skipDA50s()) { felix@4767: log.info("skip parsing DA50s"); felix@4781: return; felix@4767: } felix@4782: DA50Parser parser = new DA50Parser(); felix@4782: File riverDir = wstFile felix@4782: .getParentFile() // Basisdaten felix@4782: .getParentFile() // Hydrologie felix@4782: .getParentFile(); // felix@4782: felix@4782: ImportRiverCrossSectionParserCallback da50Callback = felix@4782: new ImportRiverCrossSectionParserCallback("da50"); teichmann@5084: felix@4782: parser.parseDA50s(riverDir, da50Callback); felix@4767: } felix@4767: felix@4724: felix@4712: /** Create a DA66 Parser and parse the da66 files found. */ felix@4712: // TODO this is a copy of parsePRFs, extract interfaces (e.g. CrossSectionParser). felix@4712: public void parseDA66s() { felix@4712: if (Config.INSTANCE.skipDA66s()) { felix@4712: log.info("skip parsing DA66s"); felix@4712: return; felix@4712: } felix@4712: felix@4712: log.info("looking for DA66 files"); felix@4712: DA66Parser parser = new DA66Parser(); felix@4712: File riverDir = wstFile felix@4712: .getParentFile() // Basisdaten felix@4712: .getParentFile() // Hydrologie felix@4712: .getParentFile(); // felix@4712: felix@4779: ImportRiverCrossSectionParserCallback da66Callback = felix@4779: new ImportRiverCrossSectionParserCallback("da66"); teichmann@5084: felix@4779: parser.parseDA66s(riverDir, da66Callback); felix@4712: } felix@4712: felix@4712: /** Create a PRFParser and let it parse the prf files found. */ sascha@1204: public void parsePRFs() { sascha@1223: if (Config.INSTANCE.skipPRFs()) { sascha@1223: log.info("skip parsing PRFs"); sascha@1223: return; sascha@1223: } sascha@1223: sascha@1204: log.info("looking for PRF files"); sascha@1204: PRFParser parser = new PRFParser(); sascha@1204: File riverDir = wstFile sascha@1204: .getParentFile() // Basisdaten sascha@1204: .getParentFile() // Hydrologie sascha@1204: .getParentFile(); // sascha@1206: felix@4779: ImportRiverCrossSectionParserCallback prfCallback = felix@4779: new ImportRiverCrossSectionParserCallback("prf"); felix@4779: parser.parsePRFs(riverDir, prfCallback); sascha@1204: } sascha@1204: sascha@1204: public static Date yearToDate(int year) { sascha@1204: Calendar cal = Calendar.getInstance(); sascha@1204: cal.set(year, 5, 15, 12, 0, 0); sascha@1204: long ms = cal.getTimeInMillis(); sascha@1204: cal.setTimeInMillis(ms - ms%1000); sascha@1204: return cal.getTime(); sascha@1204: } sascha@1204: sascha@190: public void storeDependencies() { tom@6823: /* test whether river is already in database. tom@6823: * Otherwise it makes no sense to skip waterlevel model WST-file tom@6823: * because the altitude reference is taken from there. */ tom@6823: Session session = ImporterSession.getInstance().getDatabaseSession(); tom@6823: Query query = session.createQuery("from River where name=:name"); tom@6823: query.setString("name", name); tom@6823: List rivers = query.list(); tom@6823: if (rivers.isEmpty() && Config.INSTANCE.skipWst()){ tom@6823: log.error("River not yet in database. You cannot skip importing waterlevel model."); tom@6823: return; tom@6823: } tom@6823: ingo@2347: storeWstUnit(); sascha@190: storeAnnotations(); sascha@1221: storeHYKs(); sascha@1204: storeCrossSections(); sascha@190: storeGauges(); sascha@201: storeWst(); sascha@482: storeExtraWsts(); sascha@483: storeFixations(); sascha@484: storeOfficialLines(); sascha@490: storeFloodWater(); sascha@494: storeFloodProtection(); tom@8056: storeMeasurementStations(); ingo@2806: storeBedHeight(); ingo@2815: storeSedimentDensity(); rrenkert@7841: storePorosity(); ingo@2821: storeMorphologicalWidth(); ingo@2826: storeFlowVelocity(); tom@8032: storeSedimentLoadLS(); tom@8056: storeSedimentLoad(); felix@5261: storeWaterlevels(); ingo@2851: storeWaterlevelDifferences(); ingo@3328: storeSQRelations(); felix@5080: storeOfficialNumber(); sascha@201: } sascha@201: ingo@2347: public void storeWstUnit() { ingo@2347: if (wst == null) { tom@6823: log.warn("No unit given. Waterlevel-model WST-file has to be imported already."); ingo@2347: } ingo@2347: else { ingo@2347: wstUnit = wst.getUnit(); ingo@2347: } ingo@2347: } ingo@2347: sascha@1221: public void storeHYKs() { sascha@1223: if (!Config.INSTANCE.skipHYKs()) { sascha@1223: log.info("store HYKs"); sascha@1223: getPeer(); sascha@1223: for (ImportHYK hyk: hyks) { sascha@1223: hyk.storeDependencies(); sascha@1223: } sascha@1221: } sascha@1221: } sascha@1221: sascha@1204: public void storeCrossSections() { felix@5810: if (!Config.INSTANCE.skipPRFs() felix@5810: || !Config.INSTANCE.skipDA66s() felix@5810: || !Config.INSTANCE.skipDA50s() felix@5810: || !Config.INSTANCE.skipW80s() felix@5810: || !Config.INSTANCE.skipW80CSVs()) { sascha@1223: log.info("store cross sections"); sascha@1223: getPeer(); sascha@1223: for (ImportCrossSection crossSection: crossSections) { sascha@1223: crossSection.storeDependencies(); sascha@1223: } sascha@1204: } sascha@1204: } sascha@1204: sascha@201: public void storeWst() { teichmann@7183: if (wst != null && !Config.INSTANCE.skipWst()) { sascha@1223: River river = getPeer(); sascha@483: wst.storeDependencies(river); teichmann@7183: teichmann@7183: // The flow direction of the main wst and the corresponding teichmann@7183: // waterlevels determine if the river is 'km_up'. teichmann@7183: Session session = ImporterSession.getInstance().getDatabaseSession(); teichmann@7183: river.setKmUp(wst.getKmUp()); teichmann@7183: session.save(river); sascha@483: } sascha@483: } sascha@483: sascha@1223: public void storeFixations() { felix@5262: if (!Config.INSTANCE.skipFixations()) { felix@5262: log.info("store fixation wsts"); sascha@1223: River river = getPeer(); felix@5261: for (ImportWst fWst: fixations) { felix@5261: log.debug("Fixation name: " + fWst.getDescription()); felix@5261: fWst.storeDependencies(river); sascha@1223: } sascha@1223: } sascha@1223: } sascha@1223: felix@5232: felix@5261: /** Store wsts from waterlevel-csv files. */ felix@5261: public void storeWaterlevels() { felix@5261: if (!Config.INSTANCE.skipWaterlevels()) felix@5262: felix@5261: log.info("store waterlevel wsts from csv"); felix@5261: River river = getPeer(); felix@5261: for (ImportWst wWst: waterlevels) { felix@5261: log.debug("Waterlevel name: " + wWst.getDescription()); felix@5261: wWst.storeDependencies(river); felix@5261: } felix@5261: } felix@5262: felix@5261: felix@5232: /** Store wsts from waterleveldifference-csv files. */ felix@5232: public void storeWaterlevelDifferences() { felix@5232: if (!Config.INSTANCE.skipWaterlevelDifferences()) teichmann@5280: felix@5232: log.info("store waterleveldifferences wsts from csv"); felix@5232: River river = getPeer(); felix@5232: for (ImportWst dWst: waterlevelDifferences) { felix@5232: log.debug("water.diff.: name " + dWst.getDescription()); felix@5232: dWst.storeDependencies(river); felix@5232: } felix@5232: } teichmann@5280: felix@5232: sascha@482: public void storeExtraWsts() { sascha@1223: if (!Config.INSTANCE.skipExtraWsts()) { sascha@1223: log.info("store extra wsts"); sascha@1223: River river = getPeer(); sascha@1223: for (ImportWst wst: extraWsts) { sascha@1223: log.debug("name: " + wst.getDescription()); sascha@1223: wst.storeDependencies(river); sascha@1223: } sascha@482: } sascha@482: } sascha@482: sascha@484: public void storeOfficialLines() { teichmann@6347: if (Config.INSTANCE.skipOfficialLines() || officialLines.isEmpty()) { teichmann@6347: return; teichmann@6347: } teichmann@6347: teichmann@6347: log.info("store official lines wsts"); teichmann@6347: River river = getPeer(); teichmann@6347: for (ImportWst wst: officialLines) { teichmann@6347: log.debug("name: " + wst.getDescription()); teichmann@6347: wst.storeDependencies(river); teichmann@6347: teichmann@6347: // Store the official lines after the columns are store. teichmann@6347: for (ImportWstColumn wc: wst.getColumns()) { teichmann@6347: ImportOfficialWstColumn owc = (ImportOfficialWstColumn)wc; teichmann@6347: ImportOfficialLine ioc = owc.getOfficialLine(); teichmann@6347: if (ioc != null) { teichmann@6347: if (ioc.getPeer(river) == null) { teichmann@6347: log.warn("Cannot store official line: " + ioc.getName()); teichmann@6347: } teichmann@6347: } sascha@1223: } sascha@484: } sascha@484: } sascha@484: sascha@490: public void storeFloodWater() { sascha@1223: if (!Config.INSTANCE.skipFloodWater()) { sascha@1223: log.info("store flood water wsts"); sascha@1223: River river = getPeer(); sascha@1223: for (ImportWst wst: floodWater) { sascha@1223: log.debug("name: " + wst.getDescription()); sascha@1223: wst.storeDependencies(river); sascha@1223: } sascha@490: } sascha@490: } sascha@490: felix@5262: sascha@494: public void storeFloodProtection() { sascha@1223: if (!Config.INSTANCE.skipFloodProtection()) { sascha@1223: log.info("store flood protection wsts"); sascha@1223: River river = getPeer(); sascha@1223: for (ImportWst wst: floodProtection) { sascha@1223: log.debug("name: " + wst.getDescription()); sascha@1223: wst.storeDependencies(river); sascha@1223: } sascha@494: } sascha@494: } sascha@494: ingo@2806: ingo@2806: public void storeBedHeight() { ingo@2810: if (!Config.INSTANCE.skipBedHeightSingle()) { ingo@2810: log.info("store bed heights single"); ingo@2810: storeBedHeightSingle(); ingo@2810: } ingo@2810: } ingo@2809: ingo@2810: ingo@2810: private void storeBedHeightSingle() { ingo@2810: River river = getPeer(); ingo@2810: ingo@2810: if (bedHeightSingles != null) { ingo@2811: for (ImportBedHeight tmp: bedHeightSingles) { ingo@2811: ImportBedHeightSingle single = (ImportBedHeightSingle) tmp; ingo@2811: ingo@2810: String desc = single.getDescription(); ingo@2810: ingo@2810: log.debug("name: " + desc); ingo@2810: teichmann@7252: single.storeDependencies(river); ingo@2806: } ingo@2810: } ingo@2810: else { ingo@2810: log.info("No single bed heights to store."); ingo@2810: } ingo@2810: } ingo@2806: ingo@2810: ingo@2815: public void storeSedimentDensity() { ingo@2815: if (!Config.INSTANCE.skipSedimentDensity()) { ingo@2815: log.info("store sediment density"); ingo@2815: ingo@2817: River river = getPeer(); ingo@2817: ingo@2817: for (ImportSedimentDensity density: sedimentDensities) { ingo@2817: String desc = density.getDescription(); ingo@2817: ingo@2817: log.debug("name: " + desc); ingo@2817: teichmann@7252: density.storeDependencies(river); ingo@2817: } ingo@2815: } ingo@2815: } ingo@2815: rrenkert@7841: public void storePorosity() { rrenkert@7841: if (!Config.INSTANCE.skipPorosity()) { rrenkert@7841: log.info("store porosity"); rrenkert@7841: rrenkert@7841: River river = getPeer(); rrenkert@7841: rrenkert@7841: for (ImportPorosity porosity: porosities) { rrenkert@7841: String desc = porosity.getDescription(); rrenkert@7841: rrenkert@7841: log.debug("name: " + desc); rrenkert@7841: rrenkert@7841: porosity.storeDependencies(river); rrenkert@7841: } rrenkert@7841: } rrenkert@7841: } rrenkert@7841: ingo@2821: public void storeMorphologicalWidth() { ingo@2821: if (!Config.INSTANCE.skipMorphologicalWidth()) { ingo@2821: log.info("store morphological width"); ingo@2821: ingo@2821: River river = getPeer(); ingo@2821: ingo@2821: for (ImportMorphWidth width: morphologicalWidths) { teichmann@7252: width.storeDependencies(river); ingo@2821: } ingo@2821: } ingo@2821: } ingo@2821: ingo@2826: public void storeFlowVelocity() { ingo@2826: if (!Config.INSTANCE.skipFlowVelocity()) { ingo@2826: log.info("store flow velocity"); ingo@2826: ingo@2827: River river = getPeer(); ingo@2827: ingo@2827: for (ImportFlowVelocityModel flowVelocityModel: flowVelocityModels){ teichmann@7252: flowVelocityModel.storeDependencies(river); ingo@2827: } ingo@2832: ingo@2832: for (ImportFlowVelocityMeasurement m: flowVelocityMeasurements) { teichmann@7252: m.storeDependencies(river); ingo@2832: } ingo@2826: } ingo@2826: } ingo@2826: ingo@2839: tom@8032: public void storeSedimentLoadLS() { tom@8032: if (!Config.INSTANCE.skipSedimentLoadLS()) { tom@8032: log.info("store sediment load longitudinal section data"); ingo@2839: ingo@2839: River river = getPeer(); ingo@2839: tom@8032: for (ImportSedimentLoadLS sedimentLoadLS: sedimentLoadLSs) { tom@8032: sedimentLoadLS.storeDependencies(river); ingo@2839: } ingo@2839: } ingo@2839: } ingo@2839: ingo@2844: tom@8056: public void storeSedimentLoad() { tom@8056: if (!Config.INSTANCE.skipSedimentLoad()) { tom@8056: log.info("store sediment load data at measurement stations"); tom@8056: tom@8056: for (ImportSedimentLoad sedimentLoad: sedimentLoads) { tom@8056: sedimentLoad.storeDependencies(); tom@8056: } tom@8056: } tom@8056: } tom@8056: tom@8056: ingo@4193: public void storeMeasurementStations() { ingo@4193: if (!Config.INSTANCE.skipMeasurementStations()) { ingo@4193: log.info("store measurement stations"); ingo@4193: ingo@4193: River river = getPeer(); ingo@4193: ingo@4193: int count = 0; ingo@4193: ingo@4193: for (ImportMeasurementStation station: measurementStations) { teichmann@7252: boolean success = station.storeDependencies(river); teichmann@7252: if (success) { teichmann@7252: count++; teichmann@7252: } ingo@4193: } ingo@4193: ingo@4193: log.info("stored " + count + " measurement stations."); ingo@4193: } ingo@4193: } ingo@4193: ingo@4193: ingo@3328: public void storeSQRelations() { ingo@3328: if (!Config.INSTANCE.skipSQRelation()) { ingo@3328: log.info("store sq relations"); ingo@3328: ingo@3329: River river = getPeer(); ingo@3329: ingo@3329: int count = 0; ingo@3329: ingo@3329: for (ImportSQRelation sqRelation: sqRelations) { teichmann@7252: sqRelation.storeDependencies(river); teichmann@7252: count++; ingo@3329: } ingo@3329: ingo@3329: log.info("stored " + count + " sq relations."); ingo@3328: } ingo@3328: } ingo@3328: ingo@3328: sascha@188: public void storeAnnotations() { sascha@1223: if (!Config.INSTANCE.skipAnnotations()) { sascha@1223: River river = getPeer(); sascha@1223: for (ImportAnnotation annotation: annotations) { sascha@1223: annotation.getPeer(river); sascha@1223: } sascha@188: } sascha@188: } sascha@188: sascha@190: public void storeGauges() { sascha@1223: if (!Config.INSTANCE.skipGauges()) { sascha@1223: log.info("store gauges:"); sascha@1223: River river = getPeer(); sascha@1223: Session session = ImporterSession.getInstance() sascha@1223: .getDatabaseSession(); sascha@1223: for (ImportGauge gauge: gauges) { sascha@1223: log.info("\tgauge: " + gauge.getName()); sascha@1223: gauge.storeDependencies(river); sascha@1223: ImporterSession.getInstance().getDatabaseSession(); sascha@1223: session.flush(); sascha@1223: } sascha@191: } sascha@190: } sascha@190: sascha@188: public River getPeer() { sascha@188: if (peer == null) { sascha@497: Session session = ImporterSession.getInstance().getDatabaseSession(); sascha@188: Query query = session.createQuery("from River where name=:name"); ingo@2347: felix@5027: Unit u = null; felix@5027: if (wstUnit != null) { felix@5027: u = wstUnit.getPeer(); felix@5027: } ingo@2347: sascha@188: query.setString("name", name); sascha@188: List rivers = query.list(); sascha@188: if (rivers.isEmpty()) { ingo@2347: log.info("Store new river '" + name + "'"); rrenkert@7751: peer = new River(name, u, modelUuid); felix@5027: if (!Config.INSTANCE.skipBWASTR()) { felix@5027: peer.setOfficialNumber(officialNumber); felix@5027: } sascha@188: session.save(peer); sascha@188: } sascha@188: else { sascha@188: peer = rivers.get(0); sascha@188: } sascha@188: } sascha@188: return peer; sascha@188: } sascha@177: } sascha@177: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :