Mercurial > dive4elements > river
view backend/src/main/java/org/dive4elements/river/importer/sinfo/parsers/ChannelParser.java @ 9011:a44200bf0547
A few directory and file name changes
author | mschaefer |
---|---|
date | Wed, 18 Apr 2018 07:43:04 +0200 |
parents | ae76f618d990 |
children | 3b3c7513472e |
line wrap: on
line source
/* 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<>(); final File importFile = new File(importDir, IMPORT_FILENAME); if (importFile.exists()) parsers.add(new ChannelParser(importFile, 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()); } }