diff backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/FlowDepthParser.java @ 9656:31549fdfaf4f

Importer (s/u-info) extensions: flow-depth: uniform formatting of from-to series names, warning instead of cancelling in case of missing column values, detecting, logging and skipping columns with wrong unit, better counting of inserted/updated values for each column
author mschaefer
date Mon, 23 Mar 2020 15:21:39 +0100
parents 4c5eeaff554c
children
line wrap: on
line diff
--- a/backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/FlowDepthParser.java	Mon Mar 23 15:16:35 2020 +0100
+++ b/backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/FlowDepthParser.java	Mon Mar 23 15:21:39 2020 +0100
@@ -12,7 +12,6 @@
 
 import java.io.File;
 import java.io.FileInputStream;
-import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.LineNumberReader;
 import java.util.ArrayList;
@@ -23,13 +22,16 @@
 import org.apache.log4j.Logger;
 import org.dive4elements.river.importer.Config;
 import org.dive4elements.river.importer.ImportRiver;
+import org.dive4elements.river.importer.ImporterSession;
 import org.dive4elements.river.importer.common.AbstractParser;
 import org.dive4elements.river.importer.common.ParsingState;
 import org.dive4elements.river.importer.sinfo.importitem.FlowDepthColumnSeriesImport;
 import org.dive4elements.river.importer.sinfo.importitem.FlowDepthKmLineImport;
 import org.dive4elements.river.importer.sinfo.importitem.FlowDepthSeriesImport;
+import org.dive4elements.river.model.sinfo.FlowDepth;
 import org.dive4elements.river.model.sinfo.FlowDepthColumn;
 import org.dive4elements.river.model.sinfo.FlowDepthValue;
+import org.hibernate.Session;
 
 /**
  * Reads and parses the header of a flow depth file and handles the parse and store of the columns
@@ -53,7 +55,7 @@
 
     private static final Pattern COLUMN_TITLE = Pattern.compile("Flie((.)|(ss))tiefe\\s*\\((.+?)\\)\\s*\\[m\\].*", Pattern.CASE_INSENSITIVE);
 
-    private final FlowDepthSeriesImport tkhGroup;
+    private final FlowDepthSeriesImport flowdepthGroup;
 
     private final List<FlowDepthColumnParser> colParsers;
 
@@ -62,8 +64,8 @@
 
     public FlowDepthParser(final File importPath, final File rootRelativePath, final ImportRiver river) {
         super(importPath, rootRelativePath, river);
-        this.tkhGroup = new FlowDepthSeriesImport(importPath.getName().replaceAll("\\.csv", ""));
-        this.seriesHeader = new FlowDepthColumnSeriesImport(this.tkhGroup.getFilename(), this.tkhGroup, null, null);
+        this.flowdepthGroup = new FlowDepthSeriesImport(importPath.getName().replaceAll("\\.csv", ""));
+        this.seriesHeader = new FlowDepthColumnSeriesImport(this.flowdepthGroup.getFilename(), this.flowdepthGroup, null, null);
         this.colParsers = new ArrayList<>();
     }
 
@@ -94,7 +96,7 @@
     }
 
     @Override
-    public void parse() throws IOException {
+    public void parse() throws Exception {
         getLog().info("Start parsing:;'" + this.rootRelativePath + "'");
         // this.seriesHeader = createSeriesImport(this.importPath.getName().replaceAll("\\.csv", ""));
         this.metaPatternsMatched.clear();
@@ -106,7 +108,7 @@
                 this.in = new LineNumberReader(new InputStreamReader(new FileInputStream(this.importPath), ENCODING));
             }
             catch (final Exception e) {
-                logError("Could not open (" + e.getMessage() + ")");
+                logError("Could not open (%s)", e.getMessage());
                 this.headerParsingState = ParsingState.STOP;
             }
             this.currentLine = null;
@@ -118,6 +120,8 @@
                 if (this.currentLine.isEmpty())
                     continue;
                 handleMetaLine();
+                if (this.headerParsingState == ParsingState.DONE)
+                    checkMetaData();
             }
         }
         finally {
@@ -152,7 +156,7 @@
         final Matcher m = META_YEAR.matcher(this.currentLine);
         if (m.matches()) {
             this.metaPatternsMatched.add(META_YEAR);
-            this.tkhGroup.setYear(Integer.parseInt(m.group(1)));
+            this.flowdepthGroup.setYear(Integer.parseInt(m.group(1)));
             return true;
         }
         return false;
@@ -167,7 +171,7 @@
         final Matcher m = META_SOUNDING.matcher(this.currentLine);
         if (m.matches()) {
             this.metaPatternsMatched.add(META_SOUNDING);
-            this.tkhGroup.setSounding_info(parseMetaInfo(m.group(1).trim()));
+            this.flowdepthGroup.setSounding_info(parseMetaInfo(m.group(1).trim()));
             return true;
         }
         return false;
@@ -177,7 +181,7 @@
         final Matcher m = META_EVALUATOR.matcher(this.currentLine);
         if (m.matches()) {
             this.metaPatternsMatched.add(META_EVALUATOR);
-            this.tkhGroup.setEvaluation_by(parseMetaInfo(m.group(1).trim()));
+            this.flowdepthGroup.setEvaluation_by(parseMetaInfo(m.group(1).trim()));
             return true;
         }
         return false;
@@ -187,27 +191,40 @@
     protected boolean handleMetaColumnTitles() {
         if (!super.handleMetaColumnTitles())
             return false;
-        this.tkhGroup.setKmrange_info(this.seriesHeader.getKmrange_info());
-        this.tkhGroup.setNotes(this.seriesHeader.getNotes());
+        this.flowdepthGroup.setKmrange_info(this.seriesHeader.getKmrange_info());
+        this.flowdepthGroup.setNotes(this.seriesHeader.getNotes());
         for (int i = 1; i <= this.columnTitles.size() - 1; i++) {
             final Matcher m = COLUMN_TITLE.matcher(this.columnTitles.get(i));
             if (m.matches())
-                this.colParsers.add(new FlowDepthColumnParser(this.importPath, this.rootRelativePath, this.river, this.tkhGroup, i, m.group(4).trim()));
+                this.colParsers.add(new FlowDepthColumnParser(this.importPath, this.rootRelativePath, this.river, this.flowdepthGroup, i, m.group(4).trim()));
             else
-                logWarning("No title found in column " + i + ", skipped");
+                logLineWarning("Invalid title/unit in column %d (%s)", i + 1, this.columnTitles.get(i));
         }
         return true;
     }
 
+    /**
+     * Checks the existence of the active series in the database
+     */
+    @Override
+    protected boolean checkSeriesExistsAlready() {
+        if (!checkRiverExists())
+            return false;
+        final Session session = ImporterSession.getInstance().getDatabaseSession();
+        final List<FlowDepth> rows = this.flowdepthGroup.querySeriesItem(session, this.river.getPeer());
+        return !rows.isEmpty();
+    }
+
+
     @Override
     public void store() {
         if (this.headerParsingState != ParsingState.STOP) {
-            this.tkhGroup.getPeer(this.river.getPeer());
+            this.flowdepthGroup.getPeer(this.river.getPeer());
             for (final FlowDepthColumnParser colParser : this.colParsers)
                 colParser.store();
         }
         else
-            logWarning("Severe parsing errors, not storing series '" + this.tkhGroup.getFilename() + "'");
+            logWarning("Severe parsing errors, not storing series '%s'", this.flowdepthGroup.getFilename());
     }
 
     @Override

http://dive4elements.wald.intevation.org