# HG changeset patch # User mschaefer # Date 1584974412 -3600 # Node ID f0cad5212f49d2a3b7b5c97f5489c2e69d852732 # Parent 75bd347147ade9d5485000f3e8420685f32f22a6 Importer (s/u-info) extensions: iota (salix): detecting, logging, cancelling in case of wrong column titles/units, detecting, logging and skipping lines with missing values diff -r 75bd347147ad -r f0cad5212f49 backend/src/main/java/org/dive4elements/river/importer/uinfo/importitem/SalixSeriesImport.java --- a/backend/src/main/java/org/dive4elements/river/importer/uinfo/importitem/SalixSeriesImport.java Mon Mar 23 15:37:37 2020 +0100 +++ b/backend/src/main/java/org/dive4elements/river/importer/uinfo/importitem/SalixSeriesImport.java Mon Mar 23 15:40:12 2020 +0100 @@ -54,7 +54,7 @@ } @Override - public List querySeriesItem(final Session session, final River river) { + public List querySeriesItem(final Session session, final River river, final boolean doQueryParent) { final Query query = session.createQuery("FROM Salix WHERE river=:river AND lower(filename)=:filename"); query.setParameter("river", river); query.setParameter("filename", this.filename.toLowerCase()); diff -r 75bd347147ad -r f0cad5212f49 backend/src/main/java/org/dive4elements/river/importer/uinfo/parsers/SalixParser.java --- a/backend/src/main/java/org/dive4elements/river/importer/uinfo/parsers/SalixParser.java Mon Mar 23 15:37:37 2020 +0100 +++ b/backend/src/main/java/org/dive4elements/river/importer/uinfo/parsers/SalixParser.java Mon Mar 23 15:40:12 2020 +0100 @@ -41,6 +41,8 @@ private static final String IMPORT_FILENAME = "Iota.csv"; + private static final Pattern META_FIRST = Pattern.compile("^#\\sIota.*", Pattern.CASE_INSENSITIVE); + private static final Pattern META_EVALUATOR = Pattern.compile("^#\\sAuswerter:\\s*([^;]*).*", Pattern.CASE_INSENSITIVE); private enum ColTitlePattern { @@ -58,12 +60,17 @@ } } - private final EnumMap cols = new EnumMap<>(ColTitlePattern.class); + private final EnumMap cols; + + private final EnumMap units; + /***** CONSTRUCTORS *****/ public SalixParser(final File importPath, final File rootRelativePath, final ImportRiver river) { super(importPath, rootRelativePath, river); + this.cols = new EnumMap<>(ColTitlePattern.class); + this.units = new EnumMap<>(ColTitlePattern.class); } /***** METHODS *****/ @@ -98,12 +105,23 @@ @Override protected boolean handleMetaOther() { - if (handleMetaEvaluator()) + if (handleMetaFirst()) + return true; + else if (handleMetaEvaluator()) return true; else return false; } + private boolean handleMetaFirst() { + final Matcher m = META_FIRST.matcher(this.currentLine); + if (m.matches()) { + this.metaPatternsMatched.add(META_FIRST); + return true; + } + return false; + } + private boolean handleMetaEvaluator() { final Matcher m = META_EVALUATOR.matcher(this.currentLine); if (m.matches()) { @@ -118,35 +136,44 @@ protected boolean handleMetaColumnTitles() { if (!super.handleMetaColumnTitles()) return false; - for (final ColTitlePattern col : ColTitlePattern.values()) + for (final ColTitlePattern col : ColTitlePattern.values()) { this.cols.put(col, -1); + this.units.put(col, ""); + } for (int i = 1; i <= this.columnTitles.size() - 1; i++) { for (final ColTitlePattern col : ColTitlePattern.values()) { - if (col.getPattern().matcher(this.columnTitles.get(i)).matches()) { + final Matcher m = col.getPattern().matcher(this.columnTitles.get(i)); + if (m.matches()) { this.cols.put(col, i); + this.units.put(col, m.group(1)); break; } } } if ((this.cols.get(ColTitlePattern.FACTOR) < 0) || (this.cols.get(ColTitlePattern.MWMNW) < 0)) { - logError("Column of the iota value and/or mnw-mw-diff could not be identified"); + logLineError("Column of the iota value and/or mnw-mw-diff could not be identified"); this.headerParsingState = ParsingState.STOP; - return false; + return true; + } + if (!this.units.get(ColTitlePattern.FACTOR).equals("m") || !this.units.get(ColTitlePattern.MWMNW).equals("m")) { + logLineError("Column of the iota value and/or mnw-mw-diff have unsupported units"); + this.headerParsingState = ParsingState.STOP; } return true; } @Override protected SalixKmLineImport createKmLineImport(final Double km, final String[] values) { - if (Double.isNaN(parseDoubleWithNull(values[this.cols.get(ColTitlePattern.FACTOR)]).doubleValue())) { - logError("Iota not found in line " + this.in.getLineNumber()); + final Number factor = parseDoubleCheckNull(values, this.cols.get(ColTitlePattern.FACTOR)); + if ((factor == null) || Double.isNaN(factor.doubleValue())) { + logLineWarning(INVALID_VALUE_ERROR_FORMAT, "iota"); return null; } - if (Double.isNaN(parseDoubleWithNull(values[this.cols.get(ColTitlePattern.MWMNW)]).doubleValue())) { - logError("MNW-MW-diff not found in line " + this.in.getLineNumber()); + final Number mnwmw = parseDoubleCheckNull(values, this.cols.get(ColTitlePattern.MWMNW)); + if ((mnwmw == null) || Double.isNaN(mnwmw.doubleValue())) { + logLineWarning(INVALID_VALUE_ERROR_FORMAT, "MNW-MW-diff"); return null; } - return new SalixKmLineImport(km, parseDoubleWithNull(values[this.cols.get(ColTitlePattern.FACTOR)]).doubleValue(), - parseDoubleWithNull(values[this.cols.get(ColTitlePattern.MWMNW)]).doubleValue()); + return new SalixKmLineImport(km, factor.doubleValue(), mnwmw.doubleValue()); } }