diff backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/ChannelParser.java @ 8971:50416a0df385

Importer for the Schifffahrt (S-INFO) and Oekologie (U-INFO) files
author mschaefer
date Tue, 03 Apr 2018 10:18:30 +0200
parents
children ae76f618d990
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/ChannelParser.java	Tue Apr 03 10:18:30 2018 +0200
@@ -0,0 +1,149 @@
+/* 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.sinfo.parsers;
+
+import java.io.File;
+import java.util.ArrayList;
+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.sinfo.importitem.ChannelKmLineImport;
+import org.dive4elements.river.importer.sinfo.importitem.ChannelSeriesImport;
+import org.dive4elements.river.model.sinfo.Channel;
+import org.dive4elements.river.model.sinfo.ChannelValue;
+
+/**
+ * Reads and parses a channel size file
+ *
+ * @author Matthias Schäfer
+ *
+ */
+public class ChannelParser extends AbstractParser<Channel, ChannelValue, ChannelKmLineImport, ChannelSeriesImport> {
+
+    /***** FIELDS *****/
+
+    private static final Logger log = Logger.getLogger(ChannelParser.class);
+
+    private static final String IMPORT_FILENAME = "Fahrrinne.csv";
+
+    protected static final Pattern META_YEARS = Pattern.compile("^#\\sZeitraum:\\s*([12]\\d\\d\\d)*\\s*-\\s*([12]\\d\\d\\d)*.*", Pattern.CASE_INSENSITIVE);
+
+    private static final Pattern WIDTH_COLUMNTITLE = Pattern.compile("Sollbreite\\s*\\[(.*)\\].*", Pattern.CASE_INSENSITIVE);
+
+    private static final Pattern DEPTH_COLUMNTITLE = Pattern.compile("Solltiefe\\s*\\[(.*)\\].*", Pattern.CASE_INSENSITIVE);
+
+    private int widthColIndex;
+
+    private int depthColIndex;
+
+
+    /***** CONSTRUCTORS *****/
+
+    public ChannelParser(final File importPath, final File rootRelativePath, final ImportRiver river) {
+        super(importPath, rootRelativePath, river);
+        this.widthColIndex = -1;
+        this.depthColIndex = -1;
+    }
+
+
+    /***** METHODS *****/
+
+    @Override
+    protected Logger getLog() {
+        return log;
+    }
+
+    /**
+     * Whether this import type shall be skipped
+     */
+    public static boolean shallSkip() {
+        return Config.INSTANCE.skipSInfoChannel();
+    }
+
+    /**
+     * Creates a list of parsers for all channel import files in a directory
+     */
+    public static List<ChannelParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) {
+        final List<ChannelParser> parsers = new ArrayList<>();
+        parsers.add(new ChannelParser(new File(importDir, IMPORT_FILENAME), new File(relativeDir, IMPORT_FILENAME), river));
+        return parsers;
+    }
+
+    @Override
+    protected boolean handleMetaOther() {
+        if (handleMetaYears())
+            return true;
+        else
+            return false;
+    }
+
+    private boolean handleMetaYears() {
+        final Matcher m = META_YEARS.matcher(this.currentLine);
+        if (m.matches()) {
+            this.metaPatternsMatched.add(META_YEARS);
+            if (m.group(1) != null)
+                this.seriesHeader.setYear_from(Integer.valueOf(m.group(1)));
+            else
+                this.seriesHeader.setYear_from(null);
+            if (m.group(2) != null)
+                this.seriesHeader.setYear_to(Integer.valueOf(m.group(2)));
+            else
+                this.seriesHeader.setYear_to(null);
+            return true;
+        }
+        return false;
+    }
+
+    @Override
+    protected boolean handleMetaColumnTitles() {
+        if (super.handleMetaColumnTitles()) {
+            for (int i = 1; i <= this.columnTitles.size() - 1; i++) {
+                if (DEPTH_COLUMNTITLE.matcher(this.columnTitles.get(i)).matches())
+                    this.depthColIndex = i;
+                else if (WIDTH_COLUMNTITLE.matcher(this.columnTitles.get(i)).matches())
+                    this.widthColIndex = i;
+            }
+            if ((this.widthColIndex < 0) || (this.depthColIndex < 0)) {
+                logError("Columns of width and/or depth values could not be identified, missing column title 'Sollbreite...'/'Sollhöhe...'");
+                this.headerParsingState = ParsingState.STOP;
+                return false;
+            }
+            return true;
+        }
+        else
+            return false;
+    }
+
+    @Override
+    protected ChannelSeriesImport createSeriesImport(final String filename) {
+        return new ChannelSeriesImport(filename);
+    }
+
+    @Override
+    protected ChannelKmLineImport createKmLineImport(final Double km, final String[] values) {
+        if (parseDoubleWithNull(values[this.widthColIndex]) == null) {
+            logError("Invalid width value in line " + this.in.getLineNumber());
+            return null;
+        }
+        if (parseDoubleWithNull(values[this.depthColIndex]) == null) {
+            logError("Invalid depth value in line " + this.in.getLineNumber());
+            return null;
+        }
+        return new ChannelKmLineImport(km, parseDoubleWithNull(values[this.widthColIndex]).doubleValue(),
+                parseDoubleWithNull(values[this.depthColIndex]).doubleValue());
+    }
+}

http://dive4elements.wald.intevation.org