diff backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/SelectedAdditionalParser.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 bf8a9df86f32
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/SelectedAdditionalParser.java	Tue Apr 03 10:18:30 2018 +0200
@@ -0,0 +1,168 @@
+/* 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.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.LineNumberReader;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+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.ImportParser;
+import org.dive4elements.river.model.River;
+import org.dive4elements.river.model.Wst;
+import org.hibernate.Query;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+
+/**
+ * Reads and parses a selected WST additionals link file
+ *
+ * @author Matthias Schäfer
+ *
+ */
+public class SelectedAdditionalParser implements ImportParser {
+
+    /***** FIELDS *****/
+
+    private static final Logger log = Logger.getLogger(SelectedAdditionalParser.class);
+
+    private static final String IMPORT_Q_FILENAME = "Mit_Abflussdaten.txt";
+
+    private static final String IMPORT_W_FILENAME = "Ohne_Abflussdaten.txt";
+
+    private enum SelectionType {
+        WITH_Q("Q", "with discharge"), //
+        WITHOUT_Q("W", "without discharge");
+
+        private final String key;
+        private final String logText;
+
+        SelectionType(final String key, final String logText) {
+            this.key = key;
+            this.logText = logText;
+        }
+
+        public String getKey() {
+            return this.key;
+        }
+
+        public String getLogText() {
+            return this.logText;
+        }
+    }
+
+    private final File importPath;
+
+    private final File rootRelativePath;
+
+    private final ImportRiver river;
+
+    private final SelectionType selectionType;
+
+    private final List<String> links;
+
+
+    /***** CONSTRUCTORS *****/
+
+    public SelectedAdditionalParser(final File importPath, final File rootRelativePath, final ImportRiver river, final SelectionType selectionType) {
+        this.importPath = importPath;
+        this.rootRelativePath = rootRelativePath;
+        this.river = river;
+        this.selectionType = selectionType;
+        this.links = new ArrayList<>();
+    }
+
+
+    /***** METHODS *****/
+
+    /**
+     * Whether this import type shall be skipped
+     */
+    public static boolean shallSkip() {
+        return Config.INSTANCE.skipSInfoSelectedAdditional();
+    }
+
+    /**
+     * Creates a list of parsers for all selected additionals import files in a directory
+     */
+    public static List<SelectedAdditionalParser> createParsers(final File importDir, final File relativeDir, final ImportRiver river) {
+        final List<SelectedAdditionalParser> parsers = new ArrayList<>();
+        parsers.add(new SelectedAdditionalParser(new File(importDir, IMPORT_Q_FILENAME), new File(relativeDir, IMPORT_Q_FILENAME),
+                river, SelectionType.WITH_Q));
+        parsers.add(new SelectedAdditionalParser(new File(importDir, IMPORT_W_FILENAME), new File(relativeDir, IMPORT_W_FILENAME),
+                river, SelectionType.WITHOUT_Q));
+        return parsers;
+    }
+
+    @Override
+    public void parse() throws IOException {
+        this.links.clear();
+        log.info("Parse '... " + this.rootRelativePath + "'");
+        LineNumberReader in = null;
+        try {
+            in = new LineNumberReader(new InputStreamReader(new FileInputStream(this.importPath), AbstractParser.ENCODING));
+            String line;
+            while (true) {
+                line = in.readLine();
+                if (line == null)
+                    break;
+                if (!line.trim().isEmpty() && !line.trim().startsWith(AbstractParser.START_META_CHAR))
+                    this.links.add(line.trim());
+            }
+            log.info("Number of file links found: " + this.links.size());
+        }
+        finally {
+            if (in != null)
+                in.close();
+        }
+    }
+
+    @Override
+    public void store() {
+        final Session session = ImporterSession.getInstance().getDatabaseSession();
+        final SQLQuery reset = session.createSQLQuery("UPDATE wsts SET sinfo_selection = NULL WHERE (river_id=:river_id) AND (kind=1)"
+                + " AND (sinfo_selection=:seltype)");
+        reset.setParameter("river_id", this.river.getPeer().getId());
+        reset.setParameter("seltype", this.selectionType.getKey());
+        reset.executeUpdate();
+        final Query query = session.createQuery("FROM Wst WHERE (river=:river) AND (kind=1) AND (lower(description) LIKE :path)");
+        query.setParameter("river", this.river);
+        int count = 0;
+        for (final String wstfile : this.links) {
+            count += updateWst(session, query, this.river.getPeer(), wstfile, this.selectionType);
+        }
+        log.info("Updated " + count + " wsts for selected additionals " + this.selectionType.getLogText());
+    }
+
+    private int updateWst(final Session session, final Query query, final River river, final String path, final SelectionType selectionType) {
+        final String pathPattern = path.toLowerCase().replace('/', '_').replace('\\', '_');
+        query.setParameter("path", pathPattern);
+        final List<Wst> rows = query.list();
+        if (rows.isEmpty()) {
+            log.warn("Wst not found for description '" + path + "'" + ";" + this.rootRelativePath);
+            return 0;
+        } else {
+            final Wst wst = rows.get(0);
+            wst.setSInfoSelection(selectionType.getKey());
+            final Serializable id = session.save(wst);
+            return 1;
+        }
+    }
+}

http://dive4elements.wald.intevation.org