Mercurial > dive4elements > river
diff backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java @ 8032:fd3a24336e6a
SCHEMA CHANGE and Importer (only longitudinal section data so far): only grain fractions given now in schema are valid. We are handling sediment loads, not yields.
author | "Tom Gottfried <tom@intevation.de>" |
---|---|
date | Mon, 14 Jul 2014 15:36:44 +0200 |
parents | 6954ac9b7591 |
children | 9342d7fe0ee7 |
line wrap: on
line diff
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java Fri Jul 11 13:10:05 2014 +0200 +++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java Mon Jul 14 15:36:44 2014 +0200 @@ -21,16 +21,19 @@ import org.apache.log4j.Logger; +import org.dive4elements.river.importer.ImporterSession; import org.dive4elements.river.importer.ImportGrainFraction; import org.dive4elements.river.importer.ImportSedimentLoadLS; import org.dive4elements.river.importer.ImportSedimentLoadLSValue; import org.dive4elements.river.importer.ImportTimeInterval; import org.dive4elements.river.importer.ImportUnit; + import org.dive4elements.river.model.GrainFraction; + import org.dive4elements.river.utils.DateUtil; +import org.dive4elements.river.utils.EpsilonComparator; - -/** Parses Sediment Yield files. */ +/** Parses sediment load longitudinal section files. */ public class SedimentLoadLSParser extends LineParser { private static final Logger log = @@ -40,33 +43,6 @@ public static final NumberFormat nf = NumberFormat.getInstance(DEFAULT_LOCALE); - public static final String FRAKTION_START = "Fraktion:"; - - public static final String FRACTION_COARSE_STR = - ".*Grobkorn.*"; - - public static final String FRACTION_FINE_MIDDLE_STR = - ".*Fein.Mittel.Kies.*"; - - public static final String FRACTION_SAND = - ".*Sand.*"; - - public static final String FRACTION_SUSP_SAND = - ".*susp.Sand.*"; - - public static final String FRACTION_SUSP_SAND_BED = - ".*bettbild.Anteil.susp.Sand.*"; - - public static final String FRACTION_SUSP_SAND_BED_EPOCH = - ".*susp.Sand.bettbildAnteil.*"; - - public static final String FRACTION_SUSPENDED_SEDIMENT = - ".*Schwebstoff.*"; - - public static final String FRACTION_TOTAL = - ".*gesamt.*"; - - public static final Pattern TIMEINTERVAL_SINGLE = Pattern.compile("\\D*([0-9]+?)\\D*"); @@ -76,23 +52,20 @@ public static final Pattern META_FRACTION = Pattern.compile("^Fraktion: (.*)"); + public static final Pattern META_FRACTION_NAME = + Pattern.compile("^Fraktionsname: (.*)"); + public static final Pattern META_UNIT = Pattern.compile("^Einheit: \\[(.*)\\].*"); public static final Pattern META_COLUMN_NAMES = Pattern.compile("^Fluss-km.*"); - public static final Pattern META_GRAIN_FRACTION_A = - Pattern.compile("\\D*(([0-9]+?,[0-9]+?)\\s*-|([0-9]++)\\s*-)(([0-9]+?,[0-9]+?)|([0-9]++))\\s*([a-zA-Z]+?)\\W*\\D*"); - - public static final Pattern META_GRAIN_FRACTION_B = - Pattern.compile("(<|>){1}\\s*(\\w++)\\s*(([0-9]+?,[0-9]+?)\\s*-|([0-9]++)\\s*-)(([0-9]+?,[0-9]+?)|([0-9]++))\\s*([a-zA-Z]+?)"); - - public static final Pattern META_GRAIN_FRACTION_C = - Pattern.compile("(<|>){1}\\s*((([0-9]+?,[0-9]+?)|([0-9]++))\\s*(\\w+))"); + public static final Pattern META_GRAIN_SIZE = + Pattern.compile("([0-9]*,*[0-9]+)-([0-9]*,*[0-9]+) *mm"); - protected List<ImportSedimentLoadLS> sedimentYields; + protected List<ImportSedimentLoadLS> sedimentLoadLSs; protected ImportSedimentLoadLS[] current; @@ -104,9 +77,13 @@ protected String[] columnNames; + private String upper; + + private String lower; + public SedimentLoadLSParser() { - sedimentYields = new ArrayList<ImportSedimentLoadLS>(); + sedimentLoadLSs = new ArrayList<ImportSedimentLoadLS>(); } @@ -130,7 +107,7 @@ protected void finish() { if (current != null) { for (ImportSedimentLoadLS isy: current) { - sedimentYields.add(isy); + sedimentLoadLSs.add(isy); } } @@ -156,11 +133,14 @@ else if (handleMetaFraction(line)) { return; } + else if (handleMetaFractionName(line)) { + return; + } else if (handleColumnNames(line)) { return; } else { - log.warn("SYP: Unknown meta line: '" + line + "'"); + log.warn("SLLSP: Unknown meta line: '" + line + "'"); } } @@ -181,20 +161,60 @@ Matcher m = META_FRACTION.matcher(line); if (m.matches()) { - String tmp = m.group(1); - - this.grainFraction = buildGrainFraction(tmp); + String interval = m.group(1); - return true; - } - else if (line.startsWith(FRAKTION_START)) { - String newLine = line.replace(FRAKTION_START, "").trim(); - if (newLine.length() == 0) { - log.debug("Found total grain fraction."); - this.grainFraction = new ImportGrainFraction(GrainFraction.UNKNOWN); + Matcher sizes = META_GRAIN_SIZE.matcher(interval); + if (sizes.matches()) { + lower = sizes.group(1); + upper = sizes.group(2); return true; } + + log.warn("SLLSP: Unrecognized grain-size interval. Ignored."); + return true; + + } + + return false; + } + + + public boolean handleMetaFractionName(String line) { + Matcher m = META_FRACTION_NAME.matcher(line); + + if (m.matches()) { + String name = m.group(1); + + + GrainFraction gf = ImporterSession.getInstance().getGrainFraction(name); + + if (gf != null) { + + if (lower != null && upper != null) { + // Validate grain size interval + try { + Double lowval = nf.parse(lower).doubleValue(); + Double upval = nf.parse(upper).doubleValue(); + + if (EpsilonComparator.CMP.compare(lowval, + gf.getLower()) != 0 || + EpsilonComparator.CMP.compare(upval, + gf.getUpper()) != 0) { + log.warn("SLLSP: Invalid grain size for grain fraction '" + + name + "'. Ignored."); + } + } + catch (ParseException pe) { + log.warn("SLLSP: Could not parse grain-size interval. Ignored."); + } + } + + grainFraction = new ImportGrainFraction(gf); + return true; + } + + log.error("SLLSP: Unknown grain fraction: '" + name + "'"); } return false; @@ -207,7 +227,13 @@ if (m.matches()) { columnNames = line.split(SEPERATOR_CHAR); - initializeSedimentYields(); + // 'Fluss-km', 'Hinweise' and at least one data column required + if (columnNames.length < 3) { + log.error("SLLSP: missing columns."); + return true; + } + + initializeSedimentLoadLSs(); return true; } @@ -220,7 +246,7 @@ String[] vals = line.split(SEPERATOR_CHAR); if (vals == null || vals.length < columnNames.length-1) { - log.warn("SYP: skip invalid data line: '" + line + "'"); + log.warn("SLLSP: skip invalid data line: '" + line + "'"); return; } @@ -238,14 +264,14 @@ } } catch (ParseException pe) { - log.warn("SYP: unparseable number in data row '" + line + "':", pe); + log.warn("SLLSP: unparseable number in data row '" + line + "':", pe); } } - /** Initialize SedimentYields from columns, set the kind + /** Initialize SedimentLoadLSs from columns, set the kind * with respect to file location (offical epoch or not?) */ - private void initializeSedimentYields() { + private void initializeSedimentLoadLSs() { // skip first column (Fluss-km) and last column (Hinweise) current = new ImportSedimentLoadLS[columnNames.length-2]; @@ -288,127 +314,18 @@ return new ImportTimeInterval(DateUtil.getStartDateFromYear(year)); } - log.warn("SYP: Unknown time interval string: '" + column + "'"); + log.warn("SLLSP: Unknown time interval string: '" + column + "'"); } catch (ParseException pe) { - log.warn("SYP: Could not parse years: " + column, pe); + log.warn("SLLSP: Could not parse years: " + column, pe); } return null; } - private ImportGrainFraction buildGrainFraction(String gfStr) { - Matcher a = META_GRAIN_FRACTION_A.matcher(gfStr); - if (a.matches()) { - String lowerA = a.group(2); - String lowerB = a.group(3); - - String upperA = a.group(4); - String upperB = a.group(5); - - String lower = lowerA != null ? lowerA : lowerB; - String upper = upperA != null ? upperA : upperB; - - try { - return new ImportGrainFraction( - getGrainFractionTypeName(this.description), - nf.parse(lower).doubleValue(), - nf.parse(upper).doubleValue() - ); - } - catch (ParseException pe) { - log.warn("SYP: Could not parse ranges of: '" + gfStr + "'"); - } - } - - Matcher b = META_GRAIN_FRACTION_B.matcher(gfStr); - if (b.matches()) { - String lowerA = b.group(4); - String lowerB = b.group(5); - String upperA = b.group(6); - String upperB = b.group(7); - - String lower = lowerA != null ? lowerA : lowerB; - String upper = upperA != null ? upperA : upperB; - - try { - return new ImportGrainFraction( - getGrainFractionTypeName(this.description), - nf.parse(lower).doubleValue(), - nf.parse(upper).doubleValue() - ); - } - catch (ParseException pe) { - log.warn("SYP: Could not parse ranges of: '" + gfStr + "'"); - } - } - - Matcher c = META_GRAIN_FRACTION_C.matcher(gfStr); - if (c.matches()) { - String oper = c.group(1); - String valueStr = c.group(3); - - try { - Double value = nf.parse(valueStr).doubleValue(); - - if (oper.equals(">")) { - return new ImportGrainFraction( - getGrainFractionTypeName(this.description), - value, - null - ); - } - else { - return new ImportGrainFraction( - getGrainFractionTypeName(this.description), - null, - value - ); - } - } - catch (ParseException pe) { - log.warn("SYP: Could not parse ranges of: '" + gfStr + "'"); - } - } - - log.warn("SYP: Unknown grain fraction: '" + gfStr + "'"); - return new ImportGrainFraction(GrainFraction.UNKNOWN); - } - - - public static String getGrainFractionTypeName(String filename) { - if (Pattern.matches(FRACTION_COARSE_STR, filename)) { - return GrainFraction.COARSE; - } - else if (Pattern.matches(FRACTION_FINE_MIDDLE_STR, filename)) { - return GrainFraction.FINE_MIDDLE; - } - else if (Pattern.matches(FRACTION_SUSP_SAND_BED, filename) || - Pattern.matches(FRACTION_SUSP_SAND_BED_EPOCH, filename)) { - return GrainFraction.SUSP_SAND_BED; - } - else if (Pattern.matches(FRACTION_SUSP_SAND, filename)) { - return GrainFraction.SUSP_SAND; - } - else if (Pattern.matches(FRACTION_SAND, filename)) { - return GrainFraction.SAND; - } - else if (Pattern.matches(FRACTION_SUSPENDED_SEDIMENT, filename)) { - return GrainFraction.SUSPENDED_SEDIMENT; - } - else if (Pattern.matches(FRACTION_TOTAL, filename)) { - return GrainFraction.TOTAL; - } - else { - log.warn("SYP: Unknown grain fraction '" + filename + "'"); - return GrainFraction.UNKNOWN; - } - } - - - public List<ImportSedimentLoadLS> getSedimentYields() { - return sedimentYields; + public List<ImportSedimentLoadLS> getSedimentLoadLSs() { + return sedimentLoadLSs; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :