Mercurial > dive4elements > river
diff backend/src/main/java/org/dive4elements/river/importer/uinfo/parsers/VegetationParser.java @ 9014:201817aa7b1c
Added the missing vegetation import classes
author | mschaefer |
---|---|
date | Wed, 18 Apr 2018 12:11:39 +0200 |
parents | |
children | df6f1b5806f6 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/backend/src/main/java/org/dive4elements/river/importer/uinfo/parsers/VegetationParser.java Wed Apr 18 12:11:39 2018 +0200 @@ -0,0 +1,187 @@ +/* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde + * Software engineering by + * Björnsen Beratende Ingenieure GmbH + * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt + * + * 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.uinfo.parsers; + +import java.io.File; +import java.util.ArrayList; +import java.util.EnumMap; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.log4j.Logger; +import org.dive4elements.river.importer.Config; +import org.dive4elements.river.importer.ImportRiver; +import org.dive4elements.river.importer.common.AbstractParser; +import org.dive4elements.river.importer.common.ParsingState; +import org.dive4elements.river.importer.uinfo.importitem.VegetationSeriesImport; +import org.dive4elements.river.importer.uinfo.importitem.VegetationZoneImport; +import org.dive4elements.river.model.uinfo.Vegetation; +import org.dive4elements.river.model.uinfo.VegetationZone; + +/** + * Reads and parses a vegetation zones file + * + * @author Matthias Schäfer + * + */ +public class VegetationParser extends AbstractParser<Vegetation, VegetationZone, VegetationZoneImport, VegetationSeriesImport> { + + /***** FIELDS *****/ + + private static final Logger log = Logger.getLogger(VegetationParser.class); + + private static final Pattern META_NAME = Pattern.compile("^#\\sEinteilung:\\s*([^;]*).*", Pattern.CASE_INSENSITIVE); + + private static final Pattern META_COLUMNTITLES = Pattern.compile("^#*\\s*Vegetationstyp\\s*;.+", Pattern.CASE_INSENSITIVE); + + private enum ColTitlePattern { + OVERFLOW_LIMIT("((.)|(Ue))berflutungsdauer-bis\\s*\\[(.*)\\].*"), // + CLASSNO("Vegetationsklasse.*"); + + private final Pattern pattern; + + ColTitlePattern(final String regexp) { + this.pattern = Pattern.compile(regexp, Pattern.CASE_INSENSITIVE); + } + + public Pattern getPattern() { + return this.pattern; + } + } + + private final EnumMap<ColTitlePattern, Integer> cols = new EnumMap<>(ColTitlePattern.class); + + private int previousClassNo; + + private int previousDaysLimit; + + + /***** CONSTRUCTORS *****/ + + public VegetationParser(final File importPath, final File rootRelativePath, final ImportRiver river) { + super(importPath, rootRelativePath, river); + this.previousClassNo = 0; + this.previousDaysLimit = -1; + } + + + /***** METHODS *****/ + + @Override + protected Logger getLog() { + return log; + } + + /** + * Whether this import type shall be skipped + */ + public static boolean shallSkip() { + return Config.INSTANCE.skipUInfoVegetation(); + } + + /** + * Creates a list of parsers for all vegetation import files in a directory + */ + public static List<VegetationParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) { + final List<VegetationParser> parsers = new ArrayList<>(); + if (importDir.exists()) { + for (final File file : listFiles(importDir, ".csv")) + parsers.add(new VegetationParser(file, new File(relativeDir, file.getName()), river)); + } + return parsers; + } + + @Override + protected KmMode kmMode() { + return KmMode.NONE; + } + + @Override + protected VegetationSeriesImport createSeriesImport(final String filename) { + return new VegetationSeriesImport(filename); + } + + @Override + protected boolean handleMetaOther() { + if (handleMetaName()) + return true; + else + return false; + } + + private boolean handleMetaName() { + final Matcher m = META_NAME.matcher(this.currentLine); + if (m.matches()) { + this.metaPatternsMatched.add(META_NAME); + this.seriesHeader.setName(parseMetaInfo(m.group(1).trim())); + return true; + } + return false; + } + + @Override + protected boolean handleMetaColumnTitles() { + if (!META_COLUMNTITLES.matcher(this.currentLine).matches()) + return false; + this.metaPatternsMatched.add(META_COLUMNTITLES); + this.columnTitles.clear(); + final String[] titles = this.currentLine.split(SEPARATOR_CHAR, 0); + for (int i = 0; i <= titles.length - 1; i++) + this.columnTitles.add(titles[i].trim()); + for (final ColTitlePattern col : ColTitlePattern.values()) + this.cols.put(col, -1); + for (int i = 1; i <= this.columnTitles.size() - 1; i++) { + for (final ColTitlePattern col : ColTitlePattern.values()) { + if (col.getPattern().matcher(this.columnTitles.get(i)).matches()) { + this.cols.put(col, i); + break; + } + } + } + if ((this.cols.get(ColTitlePattern.OVERFLOW_LIMIT) < 0) || (this.cols.get(ColTitlePattern.CLASSNO) < 0)) { + logError("Column of the overflow duration limit and/or vegetation zone class could not be identified"); + this.headerParsingState = ParsingState.STOP; + return true; + } + this.previousClassNo = 0; + this.previousDaysLimit = 0; + return true; + } + + @Override + protected VegetationZoneImport createKmLineImport(final Double km, final String[] values) { + int daysLimit = 367; + int classNo = 0; + try { + if (!values[this.cols.get(ColTitlePattern.OVERFLOW_LIMIT)].trim().isEmpty()) + daysLimit = Integer.parseInt(values[this.cols.get(ColTitlePattern.OVERFLOW_LIMIT)]); + classNo = Integer.parseInt(values[this.cols.get(ColTitlePattern.CLASSNO)]); + } + catch (final Exception e) { + logError("Overflow days limit and/or vegetation zone class could not be parsed: line " + this.in.getLineNumber()); + return null; + } + // Check completeness of vegetation zone type set, if needed + // if (classNo != this.previousClassNo + 1) { + // logError("Wrong vegetation zone class number or wrong class order: line " + this.in.getLineNumber()); + // return null; + // } + // if (!this.types.containsKey(Integer.valueOf(classNo))) { + // logError("Unknown vegetation zone class: line " + this.in.getLineNumber()); + // return null; + // } + this.previousClassNo = classNo; + final Integer minDays = Integer.valueOf(this.previousDaysLimit); + this.previousDaysLimit = daysLimit + 1; + return new VegetationZoneImport(classNo, minDays, Integer.valueOf(this.previousDaysLimit)); + } +}