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.DepthEvolutionKmLineImport; mschaefer@8971: import org.dive4elements.river.importer.sinfo.importitem.DepthEvolutionSeriesImport; mschaefer@8971: import org.dive4elements.river.model.sinfo.DepthEvolution; mschaefer@8971: import org.dive4elements.river.model.sinfo.DepthEvolutionValue; mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Reads and parses a depth evolution file mschaefer@8971: * mschaefer@8971: * @author Matthias Schäfer mschaefer@8971: * mschaefer@8971: */ mschaefer@8971: public class DepthEvolutionParser extends AbstractParser { mschaefer@8971: mschaefer@8971: /***** FIELDS *****/ mschaefer@8971: mschaefer@8971: private static final Logger log = Logger.getLogger(DepthEvolutionParser.class); mschaefer@8971: mschaefer@8971: protected static final Pattern META_REFERENCE_YEAR = Pattern.compile("^#\\sBezugsjahr:\\s*([12]\\d\\d\\d).*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: protected static final Pattern META_START_YEAR = Pattern.compile("^#\\sAusgangsjahr:\\s*([12]\\d\\d\\d).*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private static final Pattern META_CURR_SOUNDING = Pattern.compile("^#\\sAktuelle Peilung\\s*/\\s*Epoche:\\s*([^;]*).*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private static final Pattern META_OLD_SOUNDING = Pattern.compile("^#\\sHistorische Peilung\\s*/\\s*Epoche:\\s*([^;]*).*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private static final Pattern META_CURR_WSP = Pattern.compile("^#\\sAktuelle Wasserspiegellage:\\s*([^;]*).*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@8971: private static final Pattern META_OLD_WSP = Pattern.compile("^#\\sHistorische Wasserspiegellage:\\s*([^;]*).*", Pattern.CASE_INSENSITIVE); mschaefer@8971: mschaefer@9032: private enum GroupDirectory { mschaefer@9032: NONE(DepthEvolution.Group.NONE, ""), // mschaefer@9032: AKTUELL(DepthEvolution.Group.AKTUELL, "Bezug_aktueller_GLW"), // mschaefer@9032: ETAPPE(DepthEvolution.Group.ETAPPE, "GLW-Etappen"); mschaefer@9032: mschaefer@9032: private final DepthEvolution.Group group; mschaefer@9032: private final String dirname; mschaefer@9032: mschaefer@9032: GroupDirectory(final DepthEvolution.Group group, final String dirname) { mschaefer@9032: this.group = group; mschaefer@9032: this.dirname = dirname; mschaefer@9032: } mschaefer@9032: mschaefer@9032: public DepthEvolution.Group getGroup() { mschaefer@9032: return this.group; mschaefer@9032: } mschaefer@9032: mschaefer@9032: public String getDirName() { mschaefer@9032: return this.dirname; mschaefer@9032: } mschaefer@9032: mschaefer@9032: public static GroupDirectory forDirName(final String dirname) { mschaefer@9032: for (final GroupDirectory gd : GroupDirectory.values()) { mschaefer@9032: if (dirname.equalsIgnoreCase(gd.getDirName())) mschaefer@9032: return gd; mschaefer@9032: } mschaefer@9032: return NONE; mschaefer@9032: } mschaefer@9032: } mschaefer@9032: mschaefer@8971: mschaefer@8971: /***** CONSTRUCTORS *****/ mschaefer@8971: mschaefer@8971: public DepthEvolutionParser(final File importPath, final File rootRelativePath, final ImportRiver river) { mschaefer@8971: super(importPath, rootRelativePath, river); 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.skipSInfoDepthEvolution(); mschaefer@8971: } mschaefer@8971: mschaefer@8971: /** mschaefer@8971: * Creates a list of parsers for all depth_evolution 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: if (importDir.exists()) mschaefer@8988: for (final File file : listFiles(importDir, ".csv")) mschaefer@8988: parsers.add(new DepthEvolutionParser(file, new File(relativeDir, file.getName()), river)); mschaefer@8971: return parsers; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected boolean handleMetaOther() { mschaefer@8971: if (handleMetaStartYear()) mschaefer@8971: return true; mschaefer@8971: else if (handleMetaReferenceYear()) mschaefer@8971: return true; mschaefer@8971: else if (handleMetaCurrSounding()) mschaefer@8971: return true; mschaefer@8971: else if (handleMetaOldSounding()) mschaefer@8971: return true; mschaefer@8971: else if (handleMetaCurrGlw()) mschaefer@8971: return true; mschaefer@8971: else if (handleMetaOldGlw()) mschaefer@8971: return true; mschaefer@8971: else mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaStartYear() { mschaefer@8971: final Matcher m = META_START_YEAR.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_START_YEAR); mschaefer@8971: this.seriesHeader.setStart_year(Integer.parseInt(m.group(1))); mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaReferenceYear() { mschaefer@8971: final Matcher m = META_REFERENCE_YEAR.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_REFERENCE_YEAR); mschaefer@8971: this.seriesHeader.setReference_year(Integer.parseInt(m.group(1))); mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaCurrSounding() { mschaefer@8971: final Matcher m = META_CURR_SOUNDING.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_CURR_SOUNDING); mschaefer@8971: this.seriesHeader.setCurr_sounding(parseMetaInfo(m.group(1).trim())); mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaOldSounding() { mschaefer@8971: final Matcher m = META_OLD_SOUNDING.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_OLD_SOUNDING); mschaefer@8971: this.seriesHeader.setOld_sounding(parseMetaInfo(m.group(1).trim())); mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaCurrGlw() { mschaefer@8971: final Matcher m = META_CURR_WSP.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_CURR_WSP); mschaefer@8971: this.seriesHeader.setCurr_glw(parseMetaInfo(m.group(1).trim())); mschaefer@8971: return true; mschaefer@8971: } mschaefer@8971: return false; mschaefer@8971: } mschaefer@8971: mschaefer@8971: private boolean handleMetaOldGlw() { mschaefer@8971: final Matcher m = META_OLD_WSP.matcher(this.currentLine); mschaefer@8971: if (m.matches()) { mschaefer@8971: this.metaPatternsMatched.add(META_OLD_WSP); mschaefer@8971: this.seriesHeader.setOld_glw(parseMetaInfo(m.group(1).trim())); 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: if (!this.metaPatternsMatched.contains(META_START_YEAR) || !this.metaPatternsMatched.contains(META_REFERENCE_YEAR) mschaefer@8971: || !this.metaPatternsMatched.contains(META_CURR_SOUNDING) || !this.metaPatternsMatched.contains(META_OLD_SOUNDING) mschaefer@8971: || !this.metaPatternsMatched.contains(META_CURR_WSP) || !this.metaPatternsMatched.contains(META_OLD_WSP)) { mschaefer@8971: logError("One or more of the required meta infos are missing"); mschaefer@8971: this.headerParsingState = ParsingState.STOP; 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 DepthEvolutionSeriesImport createSeriesImport(final String filename) { mschaefer@9032: final DepthEvolutionSeriesImport series = new DepthEvolutionSeriesImport(filename); mschaefer@9032: series.setGroup(GroupDirectory.forDirName(this.importPath.getParentFile().getName()).getGroup()); mschaefer@9032: return series; mschaefer@8971: } mschaefer@8971: mschaefer@8971: @Override mschaefer@8971: protected DepthEvolutionKmLineImport createKmLineImport(final Double km, final String[] values) { mschaefer@8971: if (parseDoubleWithNull(values[1]) == null) { mschaefer@8971: logError("Invalid total change in line " + this.in.getLineNumber()); mschaefer@8971: return null; mschaefer@8971: } mschaefer@8971: if (parseDoubleWithNull(values[2]) == null) { mschaefer@8971: logError("Invalid change per year in line " + this.in.getLineNumber()); mschaefer@8971: return null; mschaefer@8971: } mschaefer@8971: // cm to m mschaefer@8971: return new DepthEvolutionKmLineImport(km, parseDoubleWithNull(values[1]).doubleValue() / 100.0, mschaefer@8971: parseDoubleWithNull(values[2]).doubleValue() / 100.0); mschaefer@8971: } mschaefer@8971: }