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));
+    }
+}

http://dive4elements.wald.intevation.org