mschaefer@8971: /* Copyright (C) 2017 by Bundesanstalt für Gewässerkunde mschaefer@8971: * Software engineering by mschaefer@8971: * Björnsen Beratende Ingenieure GmbH mschaefer@8971: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt mschaefer@8971: * mschaefer@8971: * This file is Free Software under the GNU AGPL (>=v3) mschaefer@8971: * and comes with ABSOLUTELY NO WARRANTY! Check out the mschaefer@8971: * documentation coming with Dive4Elements River for details. mschaefer@8971: */ mschaefer@8971: mschaefer@8971: package org.dive4elements.river.importer.sinfo.parsers; mschaefer@8971: mschaefer@8971: import java.io.File; mschaefer@8971: import java.io.FileInputStream; mschaefer@8971: import java.io.IOException; mschaefer@8971: import java.io.InputStreamReader; mschaefer@8971: import java.io.LineNumberReader; mschaefer@8971: import java.io.Serializable; mschaefer@8971: import java.util.ArrayList; mschaefer@8988: import java.util.HashMap; mschaefer@8971: import java.util.List; mschaefer@8971: mschaefer@8971: import org.apache.log4j.Logger; mschaefer@8971: import org.dive4elements.river.importer.Config; mschaefer@8971: import org.dive4elements.river.importer.ImportRiver; mschaefer@8971: import org.dive4elements.river.importer.ImporterSession; mschaefer@8971: import org.dive4elements.river.importer.common.AbstractParser; mschaefer@8971: import org.dive4elements.river.importer.common.ImportParser; mschaefer@8971: import org.dive4elements.river.model.River; mschaefer@8971: import org.dive4elements.river.model.Wst; mschaefer@8971: import org.hibernate.Query; mschaefer@8971: import org.hibernate.SQLQuery; mschaefer@8971: import org.hibernate.Session; mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Reads and parses a selected WST additionals link file mschaefer@8971: * mschaefer@8971: * @author Matthias Schäfer mschaefer@8971: * mschaefer@8971: */ mschaefer@8971: public class SelectedAdditionalParser implements ImportParser { mschaefer@8971: mschaefer@8971: /***** FIELDS *****/ mschaefer@8971: mschaefer@8971: private static final Logger log = Logger.getLogger(SelectedAdditionalParser.class); mschaefer@8971: mschaefer@8988: private static final String IMPORT_FILENAME = "Zus_Laengsschnitte.txt"; mschaefer@8971: mschaefer@8971: private enum SelectionType { mschaefer@8971: WITH_Q("Q", "with discharge"), // mschaefer@8971: WITHOUT_Q("W", "without discharge"); mschaefer@8971: mschaefer@8971: private final String key; mschaefer@8971: private final String logText; mschaefer@8971: mschaefer@8971: SelectionType(final String key, final String logText) { mschaefer@8971: this.key = key; mschaefer@8971: this.logText = logText; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public String getKey() { mschaefer@8971: return this.key; mschaefer@8971: } mschaefer@8971: mschaefer@8971: public String getLogText() { mschaefer@8971: return this.logText; mschaefer@8971: } mschaefer@8988: mschaefer@8988: public static SelectionType parse(final String path) { mschaefer@8988: if (path.toLowerCase().endsWith(".wst")) mschaefer@8988: return WITH_Q; mschaefer@8988: else mschaefer@8988: return WITHOUT_Q; mschaefer@8988: } mschaefer@8971: } mschaefer@8971: mschaefer@8971: private final File importPath; mschaefer@8971: mschaefer@8971: private final File rootRelativePath; mschaefer@8971: mschaefer@8971: private final ImportRiver river; mschaefer@8971: mschaefer@8988: private final HashMap links; mschaefer@8971: mschaefer@8971: mschaefer@8971: /***** CONSTRUCTORS *****/ mschaefer@8971: mschaefer@8988: public SelectedAdditionalParser(final File importPath, final File rootRelativePath, final ImportRiver river) { mschaefer@8971: this.importPath = importPath; mschaefer@8971: this.rootRelativePath = rootRelativePath; mschaefer@8971: this.river = river; mschaefer@8988: this.links = new HashMap<>(); mschaefer@8971: } mschaefer@8971: mschaefer@8971: mschaefer@8971: /***** METHODS *****/ mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Whether this import type shall be skipped mschaefer@8971: */ mschaefer@8971: public static boolean shallSkip() { mschaefer@8971: return Config.INSTANCE.skipSInfoSelectedAdditional(); mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Creates a list of parsers for all selected additionals import files in a directory mschaefer@8971: */ mschaefer@8971: public static List createParsers(final File importDir, final File relativeDir, final ImportRiver river) { mschaefer@8971: final List parsers = new ArrayList<>(); mschaefer@8988: final File importFile = new File(importDir, IMPORT_FILENAME); mschaefer@8988: if (importFile.exists()) mschaefer@8988: parsers.add(new SelectedAdditionalParser(importFile, new File(relativeDir, IMPORT_FILENAME), river)); mschaefer@8971: return parsers; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: public void parse() throws IOException { mschaefer@8971: this.links.clear(); mschaefer@8971: log.info("Parse '... " + this.rootRelativePath + "'"); mschaefer@8971: LineNumberReader in = null; mschaefer@8971: try { mschaefer@8971: in = new LineNumberReader(new InputStreamReader(new FileInputStream(this.importPath), AbstractParser.ENCODING)); mschaefer@8971: String line; mschaefer@8971: while (true) { mschaefer@8971: line = in.readLine(); mschaefer@8971: if (line == null) mschaefer@8971: break; mschaefer@8988: if (!line.trim().isEmpty() && !line.trim().startsWith(AbstractParser.START_META_CHAR) && !this.links.containsKey(line.trim())) mschaefer@8988: this.links.put(line.trim(), SelectionType.parse(line.trim())); mschaefer@8971: } mschaefer@8971: log.info("Number of file links found: " + this.links.size()); mschaefer@8971: } mschaefer@8971: finally { mschaefer@8971: if (in != null) mschaefer@8971: in.close(); mschaefer@8971: } mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: public void store() { mschaefer@8971: final Session session = ImporterSession.getInstance().getDatabaseSession(); mschaefer@8971: final SQLQuery reset = session.createSQLQuery("UPDATE wsts SET sinfo_selection = NULL WHERE (river_id=:river_id) AND (kind=1)" mschaefer@8988: + " AND (sinfo_selection IS NOT NULL)"); mschaefer@8971: reset.setParameter("river_id", this.river.getPeer().getId()); mschaefer@8971: reset.executeUpdate(); mschaefer@8971: final Query query = session.createQuery("FROM Wst WHERE (river=:river) AND (kind=1) AND (lower(description) LIKE :path)"); mschaefer@8977: query.setParameter("river", this.river.getPeer()); mschaefer@8971: int count = 0; mschaefer@8988: for (final String wstfile : this.links.keySet()) { mschaefer@8988: count += updateWst(session, query, this.river.getPeer(), wstfile, this.links.get(wstfile)); mschaefer@8971: } mschaefer@8988: log.info("Updated " + count + " wsts for selected additionals"); mschaefer@8971: } mschaefer@8971: mschaefer@8971: private int updateWst(final Session session, final Query query, final River river, final String path, final SelectionType selectionType) { mschaefer@8971: final String pathPattern = path.toLowerCase().replace('/', '_').replace('\\', '_'); mschaefer@8971: query.setParameter("path", pathPattern); mschaefer@8971: final List rows = query.list(); mschaefer@8971: if (rows.isEmpty()) { mschaefer@8971: log.warn("Wst not found for description '" + path + "'" + ";" + this.rootRelativePath); mschaefer@8971: return 0; mschaefer@8971: } else { mschaefer@8971: final Wst wst = rows.get(0); mschaefer@8971: wst.setSInfoSelection(selectionType.getKey()); mschaefer@8971: final Serializable id = session.save(wst); mschaefer@8971: return 1; mschaefer@8971: } mschaefer@8971: } mschaefer@8971: }