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.util.ArrayList; mschaefer@8971: import java.util.List; mschaefer@8971: import java.util.regex.Matcher; mschaefer@8971: import java.util.regex.Pattern; 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.common.AbstractParser; mschaefer@8971: import org.dive4elements.river.importer.common.ParsingState; mschaefer@8971: import org.dive4elements.river.importer.sinfo.importitem.ChannelKmLineImport; mschaefer@8971: import org.dive4elements.river.importer.sinfo.importitem.ChannelSeriesImport; mschaefer@8971: import org.dive4elements.river.model.sinfo.Channel; mschaefer@8971: import org.dive4elements.river.model.sinfo.ChannelValue; mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Reads and parses a channel size file mschaefer@8971: * mschaefer@8971: * @author Matthias Schäfer mschaefer@8971: * mschaefer@8971: */ mschaefer@8971: public class ChannelParser extends AbstractParser { mschaefer@8971: mschaefer@8971: /***** FIELDS *****/ mschaefer@8971: mschaefer@8971: private static final Logger log = Logger.getLogger(ChannelParser.class); mschaefer@8971: mschaefer@8971: private static final String IMPORT_FILENAME = "Fahrrinne.csv"; mschaefer@8971: mschaefer@8971: protected static final Pattern META_YEARS = Pattern.compile("^#\\sZeitraum:\\s*([12]\\d\\d\\d)*\\s*-\\s*([12]\\d\\d\\d)*.*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private static final Pattern WIDTH_COLUMNTITLE = Pattern.compile("Sollbreite\\s*\\[(.*)\\].*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private static final Pattern DEPTH_COLUMNTITLE = Pattern.compile("Solltiefe\\s*\\[(.*)\\].*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private int widthColIndex; mschaefer@8971: mschaefer@8971: private int depthColIndex; mschaefer@8971: mschaefer@8971: mschaefer@8971: /***** CONSTRUCTORS *****/ mschaefer@8971: mschaefer@8971: public ChannelParser(final File importPath, final File rootRelativePath, final ImportRiver river) { mschaefer@8971: super(importPath, rootRelativePath, river); mschaefer@8971: this.widthColIndex = -1; mschaefer@8971: this.depthColIndex = -1; mschaefer@8971: } mschaefer@8971: mschaefer@8971: mschaefer@8971: /***** METHODS *****/ mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected Logger getLog() { mschaefer@8971: return log; mschaefer@8971: } 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.skipSInfoChannel(); mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Creates a list of parsers for all channel 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 ChannelParser(importFile, new File(relativeDir, IMPORT_FILENAME), river)); mschaefer@8971: return parsers; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected boolean handleMetaOther() { mschaefer@8971: if (handleMetaYears()) mschaefer@8971: return true; mschaefer@8971: else mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaYears() { mschaefer@8971: final Matcher m = META_YEARS.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_YEARS); mschaefer@8971: if (m.group(1) != null) mschaefer@8971: this.seriesHeader.setYear_from(Integer.valueOf(m.group(1))); mschaefer@8971: else mschaefer@8971: this.seriesHeader.setYear_from(null); mschaefer@8971: if (m.group(2) != null) mschaefer@8971: this.seriesHeader.setYear_to(Integer.valueOf(m.group(2))); mschaefer@8971: else mschaefer@8971: this.seriesHeader.setYear_to(null); mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected boolean handleMetaColumnTitles() { mschaefer@8971: if (super.handleMetaColumnTitles()) { mschaefer@8971: for (int i = 1; i <= this.columnTitles.size() - 1; i++) { mschaefer@8971: if (DEPTH_COLUMNTITLE.matcher(this.columnTitles.get(i)).matches()) mschaefer@8971: this.depthColIndex = i; mschaefer@8971: else if (WIDTH_COLUMNTITLE.matcher(this.columnTitles.get(i)).matches()) mschaefer@8971: this.widthColIndex = i; mschaefer@8971: } mschaefer@8971: if ((this.widthColIndex < 0) || (this.depthColIndex < 0)) { mschaefer@8971: logError("Columns of width and/or depth values could not be identified, missing column title 'Sollbreite...'/'Sollhöhe...'"); mschaefer@8971: this.headerParsingState = ParsingState.STOP; mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: else mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected ChannelSeriesImport createSeriesImport(final String filename) { mschaefer@8971: return new ChannelSeriesImport(filename); mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected ChannelKmLineImport createKmLineImport(final Double km, final String[] values) { mschaefer@8971: if (parseDoubleWithNull(values[this.widthColIndex]) == null) { mschaefer@8971: logError("Invalid width value in line " + this.in.getLineNumber()); mschaefer@8971: return null; mschaefer@8971: } mschaefer@8971: if (parseDoubleWithNull(values[this.depthColIndex]) == null) { mschaefer@8971: logError("Invalid depth value in line " + this.in.getLineNumber()); mschaefer@8971: return null; mschaefer@8971: } mschaefer@8971: return new ChannelKmLineImport(km, parseDoubleWithNull(values[this.widthColIndex]).doubleValue(), mschaefer@8971: parseDoubleWithNull(values[this.depthColIndex]).doubleValue()); mschaefer@8971: } mschaefer@8971: }