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 :

http://dive4elements.wald.intevation.org