changeset 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 5e3f4b4fcb28
files backend/contrib/import_river.sh backend/contrib/run_hydr_morph.sh backend/doc/documentation/de/importer-hydr-morph.tex backend/doc/schema/oracle-minfo.sql backend/doc/schema/postgresql-minfo.sql backend/src/main/java/org/dive4elements/river/importer/Config.java backend/src/main/java/org/dive4elements/river/importer/ImportGrainFraction.java backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLS.java backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLSValue.java backend/src/main/java/org/dive4elements/river/importer/parsers/LineParser.java backend/src/main/java/org/dive4elements/river/importer/parsers/SedimentLoadLSParser.java backend/src/main/java/org/dive4elements/river/model/SedimentLoadLS.java backend/src/main/java/org/dive4elements/river/model/SedimentLoadLSValue.java
diffstat 14 files changed, 196 insertions(+), 262 deletions(-) [+]
line wrap: on
line diff
--- a/backend/contrib/import_river.sh	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/contrib/import_river.sh	Mon Jul 14 15:36:44 2014 +0200
@@ -235,7 +235,7 @@
     -Dflys.backend.importer.skip.waterlevels=true \
     -Dflys.backend.importer.skip.sq.relation=true \
     -Dflys.backend.importer.skip.sediment.density=true \
-    -Dflys.backend.importer.skip.sediment.yield=true \
+    -Dflys.backend.importer.skip.sediment.load.ls=true \
     -Dflys.backend.importer.skip.morphological.width=true \
     -Dflys.backend.importer.skip.flow.velocity=true \
     -Dflys.backend.importer.skip.bed.height.single=true \
@@ -282,7 +282,7 @@
     -Dflys.backend.importer.skip.waterlevels=false \
     -Dflys.backend.importer.skip.sq.relation=false \
     -Dflys.backend.importer.skip.sediment.density=false \
-    -Dflys.backend.importer.skip.sediment.yield=false \
+    -Dflys.backend.importer.skip.sediment.load.ls=false \
     -Dflys.backend.importer.skip.morphological.width=false \
     -Dflys.backend.importer.skip.flow.velocity=false \
     -Dflys.backend.importer.skip.bed.height.single=false \
@@ -329,7 +329,7 @@
     -Dflys.backend.importer.skip.waterlevels=true \
     -Dflys.backend.importer.skip.sq.relation=true \
     -Dflys.backend.importer.skip.sediment.density=true \
-    -Dflys.backend.importer.skip.sediment.yield=true \
+    -Dflys.backend.importer.skip.sediment.load.ls=true \
     -Dflys.backend.importer.skip.morphological.width=true \
     -Dflys.backend.importer.skip.flow.velocity=true \
     -Dflys.backend.importer.skip.bed.height.single=true \
--- a/backend/contrib/run_hydr_morph.sh	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/contrib/run_hydr_morph.sh	Mon Jul 14 15:36:44 2014 +0200
@@ -47,7 +47,7 @@
 IMPORTER_SKIP_MORPHOLOGICAL_WIDTH=false
 IMPORTER_SKIP_POROSITY=false
 IMPORTER_SKIP_SEDIMENT_DENSITY=false
-IMPORTER_SKIP_SEDIMENT_YIELD=false
+IMPORTER_SKIP_SEDIMENT_LOAD_LS=false
 IMPORTER_SKIP_SQ_RELATION=false
 IMPORTER_SKIP_WATERLEVELS=false
 IMPORTER_SKIP_WATERLEVEL_DIFFERENCES=false
@@ -95,7 +95,7 @@
     -Dflys.backend.importer.skip.official.lines=$IMPORTER_SKIP_OFFICIAL_LINES \
     -Dflys.backend.importer.skip.prfs=$IMPORTER_SKIP_PRFS \
     -Dflys.backend.importer.skip.sediment.density=$IMPORTER_SKIP_SEDIMENT_DENSITY \
-    -Dflys.backend.importer.skip.sediment.yield=$IMPORTER_SKIP_SEDIMENT_YIELD \
+    -Dflys.backend.importer.skip.sediment.load.ls=$IMPORTER_SKIP_SEDIMENT_LOAD_LS \
     -Dflys.backend.importer.skip.sq.relation=$IMPORTER_SKIP_SQ_RELATION \
     -Dflys.backend.importer.skip.w80s=$IMPORTER_SKIP_W80S \
     -Dflys.backend.importer.skip.w80.csvs=$IMPORTER_SKIP_W80_CSVS \
--- a/backend/doc/documentation/de/importer-hydr-morph.tex	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/doc/documentation/de/importer-hydr-morph.tex	Mon Jul 14 15:36:44 2014 +0200
@@ -211,13 +211,18 @@
 \textit{Morphologie/Geschwindigkeit\_Schubspannung/Modellrechnungen} und\\
 \textit{Morphologie/Geschwindigkeit\_Schubspannung/v-Messungen} geladen.
 
-\subsubsection{Sedimentfracht}
-Der Import der Sedimentfracht kann mit
-\textbf{-Dflys.backend.importer.skip.sediment.yield=true}
-unterdrückt werden. Es werden die CSV-Dateien aus dem Verzeichnis
-\textit{Morphologie/Fracht} geladen. Dabei werden die Dateien aus dem
-Unterverzeichnissen \textit{Einzeljahre} und \textit{Epochen} entsprechend als
-\textit{Einzeljahre} und \textit{Epochen} gespeichert.
+\subsubsection{Sedimentfracht (Längsschnitt-Daten)}
+Mit
+\textbf{-Dflys.backend.importer.skip.sediment.load.ls=true}
+kann der Import der Längsschnitt-Daten (auf freier Strecke)
+der Sedimentfracht unterdrückt werden.
+Es werden die CSV-Dateien aus dem Verzeichnis
+\textit{Morphologie/Fracht/Laengsschnitte} geladen. 
+Dabei werden die Dateien aus dem
+Unterverzeichnissen \textit{Einzeljahre}, \textit{Epochen}
+und \textit{amtliche Epochen} entsprechend als
+\textit{Einzeljahre}, \textit{Epochen} und
+\textit{amtliche Epochen} gespeichert.
 
 \subsubsection{Wasserspiegellagen für M-INFO}
 Mit \textbf{-Dflys.backend.importer.skip.waterlevels=true}
--- a/backend/doc/schema/oracle-minfo.sql	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/doc/schema/oracle-minfo.sql	Mon Jul 14 15:36:44 2014 +0200
@@ -243,8 +243,21 @@
     name    VARCHAR(64)    NOT NULL,
     lower   NUMBER(38,3),
     upper   NUMBER(38,3),
-    PRIMARY KEY (id)
+    PRIMARY KEY (id),
+    UNIQUE(name, lower, upper)
 );
+-- single fractions
+INSERT INTO grain_fraction VALUES (1, 'coarse', 16, 200);
+INSERT INTO grain_fraction VALUES (2, 'fine_middle', 2, 16);
+INSERT INTO grain_fraction VALUES (3, 'sand', 0.063, 2);
+INSERT INTO grain_fraction VALUES (4, 'susp_sand', 0.063, 2);
+INSERT INTO grain_fraction VALUES (5, 'susp_sand_bed', 0.063, 2);
+INSERT INTO grain_fraction VALUES (6, 'suspended_sediment', 0, 0.063);
+-- aggregations of fractions
+INSERT INTO grain_fraction VALUES (7, 'total', 0, 200);
+INSERT INTO grain_fraction VALUES (8, 'bed_load', 0.063, 200);
+INSERT INTO grain_fraction VALUES (9, 'suspended_load', 0, 2);
+
 
 --lookup table for sediment yield kinds
 CREATE TABLE sediment_yield_kinds (
--- a/backend/doc/schema/postgresql-minfo.sql	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/doc/schema/postgresql-minfo.sql	Mon Jul 14 15:36:44 2014 +0200
@@ -243,8 +243,20 @@
     name    VARCHAR(64)    NOT NULL,
     lower   NUMERIC,
     upper   NUMERIC,
-    PRIMARY KEY (id)
+    PRIMARY KEY (id),
+    UNIQUE(name, lower, upper)
 );
+-- single fractions
+INSERT INTO grain_fraction VALUES (1, 'coarse', 16, 200);
+INSERT INTO grain_fraction VALUES (2, 'fine_middle', 2, 16);
+INSERT INTO grain_fraction VALUES (3, 'sand', 0.063, 2);
+INSERT INTO grain_fraction VALUES (4, 'susp_sand', 0.063, 2);
+INSERT INTO grain_fraction VALUES (5, 'susp_sand_bed', 0.063, 2);
+INSERT INTO grain_fraction VALUES (6, 'suspended_sediment', 0, 0.063);
+-- aggregations of fractions
+INSERT INTO grain_fraction VALUES (7, 'total', 0, 200);
+INSERT INTO grain_fraction VALUES (8, 'bed_load', 0.063, 200);
+INSERT INTO grain_fraction VALUES (9, 'suspended_load', 0, 2);
 
 
 --lookup table for sediment yield kinds
--- a/backend/src/main/java/org/dive4elements/river/importer/Config.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/Config.java	Mon Jul 14 15:36:44 2014 +0200
@@ -85,8 +85,8 @@
     public static final String SKIP_FLOW_VELOCITY =
         "flys.backend.importer.skip.flow.velocity";
 
-    public static final String SKIP_SEDIMENT_YIELD =
-        "flys.backend.importer.skip.sediment.yield";
+    public static final String SKIP_SEDIMENT_LOAD_LS =
+        "flys.backend.importer.skip.sediment.load.ls";
 
     public static final String SKIP_WATERLEVELS =
         "flys.backend.importer.skip.waterlevels";
@@ -227,8 +227,8 @@
         return getFlag(SKIP_FLOW_VELOCITY);
     }
 
-    public boolean skipSedimentYield() {
-        return getFlag(SKIP_SEDIMENT_YIELD);
+    public boolean skipSedimentLoadLS() {
+        return getFlag(SKIP_SEDIMENT_LOAD_LS);
     }
 
     public boolean skipWaterlevels() {
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportGrainFraction.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportGrainFraction.java	Mon Jul 14 15:36:44 2014 +0200
@@ -13,24 +13,10 @@
 
 public class ImportGrainFraction {
 
-    private String name;
-
-    private Double lower;
-    private Double upper;
-
-    public ImportGrainFraction(String name) {
-        this.name = name;
-    }
+    private GrainFraction peer;
 
-
-    public ImportGrainFraction(
-        String     name,
-        Double     lower,
-        Double     upper
-    ) {
-        this.name  = name;
-        this.lower = lower;
-        this.upper = upper;
+    public ImportGrainFraction(GrainFraction gf) {
+        this.peer = gf;
     }
 
 
@@ -40,7 +26,7 @@
 
 
     public GrainFraction getPeer() {
-        return ImporterSession.getInstance().getGrainFraction(name);
+        return peer;
     }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportRiver.java	Mon Jul 14 15:36:44 2014 +0200
@@ -104,13 +104,15 @@
 
     public static final String FLOW_VELOCITY_MEASUREMENTS = "v-Messungen";
 
-    public static final String SEDIMENT_YIELD_DIR = "Fracht";
+    public static final String SEDIMENT_LOAD_DIR = "Fracht";
 
-    public static final String SEDIMENT_YIELD_SINGLE_DIR = "Einzeljahre";
+    public static final String SEDIMENT_LOAD_LS_DIR = "Laengsschnitte";
 
-    public static final String SEDIMENT_YIELD_EPOCH_DIR = "Epochen";
+    public static final String SEDIMENT_LOAD_SINGLE_DIR = "Einzeljahre";
 
-    public static final String SEDIMENT_YIELD_OFF_EPOCH_DIR = "amtliche Epochen";
+    public static final String SEDIMENT_LOAD_EPOCH_DIR = "Epochen";
+
+    public static final String SEDIMENT_LOAD_OFF_EPOCH_DIR = "amtliche Epochen";
 
     public static final String MINFO_FIXATIONS_DIR = "Fixierungsanalyse";
 
@@ -172,7 +174,7 @@
 
     protected List<ImportFlowVelocityMeasurement> flowVelocityMeasurements;
 
-    protected List<ImportSedimentLoadLS> sedimentYields;
+    protected List<ImportSedimentLoadLS> sedimentLoadLSs;
 
     protected List<ImportMeasurementStation> measurementStations;
 
@@ -288,7 +290,7 @@
         morphologicalWidths       = new ArrayList<ImportMorphWidth>();
         flowVelocityModels        = new ArrayList<ImportFlowVelocityModel>();
         flowVelocityMeasurements  = new ArrayList<ImportFlowVelocityMeasurement>();
-        sedimentYields            = new ArrayList<ImportSedimentLoadLS>();
+        sedimentLoadLSs           = new ArrayList<ImportSedimentLoadLS>();
         measurementStations       = new ArrayList<ImportMeasurementStation>();
         sqRelations               = new ArrayList<ImportSQRelation>();
     }
@@ -381,7 +383,7 @@
         parsePorosity();
         parseMorphologicalWidth();
         parseFlowVelocity();
-        parseSedimentYield();
+        parseSedimentLoadLS();
         parseWaterlevels();
         parseWaterlevelDifferences();
         parseMeasurementStations();
@@ -593,7 +595,7 @@
     }
 
 
-    private void parseSedimentYieldDir(
+    private void parseSedimentLoadLSDir(
         File[] files,
         SedimentLoadLSParser parser
     ) throws IOException {
@@ -609,20 +611,25 @@
        }
     }
 
-    protected void parseSedimentYield() throws IOException {
-        if (Config.INSTANCE.skipSedimentYield()) {
-            log.info("skip parsing sediment yield data");
+    protected void parseSedimentLoadLS() throws IOException {
+        if (Config.INSTANCE.skipSedimentLoadLS()) {
+            log.info("skip parsing sediment load longitudinal section data");
             return;
         }
 
-        log.debug("Parse sediment yield data");
+        log.debug("Parse sediment load longitudinal section data");
 
-        File minfoDir         = getMinfoDir();
-        File sedimentYieldDir = new File(minfoDir, SEDIMENT_YIELD_DIR);
+        File minfoDir          = getMinfoDir();
+        File sedimentLoadDir   = new File(minfoDir, SEDIMENT_LOAD_DIR);
+        File sedimentLoadLSDir = new File(sedimentLoadDir,
+                                          SEDIMENT_LOAD_LS_DIR);
 
-        File singleDir   = new File(sedimentYieldDir, SEDIMENT_YIELD_SINGLE_DIR);
-        File epochDir    = new File(sedimentYieldDir, SEDIMENT_YIELD_EPOCH_DIR);
-        File offEpochDir = new File(sedimentYieldDir, SEDIMENT_YIELD_OFF_EPOCH_DIR);
+        File singleDir   = new File(sedimentLoadLSDir,
+                                    SEDIMENT_LOAD_SINGLE_DIR);
+        File epochDir    = new File(sedimentLoadLSDir,
+                                    SEDIMENT_LOAD_EPOCH_DIR);
+        File offEpochDir = new File(sedimentLoadLSDir,
+                                    SEDIMENT_LOAD_OFF_EPOCH_DIR);
 
         File[] singles   = singleDir.listFiles();
         File[] epochs    = epochDir.listFiles();
@@ -634,24 +641,24 @@
             log.warn("Cannot read directory '" + singleDir + "'");
         }
         else {
-            parseSedimentYieldDir(singles, parser);
+            parseSedimentLoadLSDir(singles, parser);
         }
 
         if (epochs == null || epochs.length == 0) {
             log.warn("Cannot read directory '" + epochDir + "'");
         }
         else {
-            parseSedimentYieldDir(epochs, parser);
+            parseSedimentLoadLSDir(epochs, parser);
         }
 
         if (offEpochs == null || offEpochs.length == 0) {
             log.warn("Cannot read directory '" + offEpochDir + "'");
         }
         else {
-            parseSedimentYieldDir(offEpochs, parser);
+            parseSedimentLoadLSDir(offEpochs, parser);
         }
 
-        sedimentYields = parser.getSedimentYields();
+        sedimentLoadLSs = parser.getSedimentLoadLSs();
     }
 
 
@@ -1255,7 +1262,7 @@
         storePorosity();
         storeMorphologicalWidth();
         storeFlowVelocity();
-        storeSedimentYield();
+        storeSedimentLoadLS();
         storeWaterlevels();
         storeWaterlevelDifferences();
         storeMeasurementStations();
@@ -1495,14 +1502,14 @@
     }
 
 
-    public void storeSedimentYield() {
-        if (!Config.INSTANCE.skipSedimentYield()) {
-            log.info("store sediment yield data");
+    public void storeSedimentLoadLS() {
+        if (!Config.INSTANCE.skipSedimentLoadLS()) {
+            log.info("store sediment load longitudinal section data");
 
             River river = getPeer();
 
-            for (ImportSedimentLoadLS sedimentYield: sedimentYields) {
-                sedimentYield.storeDependencies(river);
+            for (ImportSedimentLoadLS sedimentLoadLS: sedimentLoadLSs) {
+                sedimentLoadLS.storeDependencies(river);
             }
         }
     }
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLS.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLS.java	Mon Jul 14 15:36:44 2014 +0200
@@ -83,7 +83,7 @@
                 i++;
             }
 
-            log.info("stored " + i + " sediment yield values.");
+            log.info("stored " + i + " sediment load values.");
         }
     }
 
@@ -98,14 +98,14 @@
         TimeInterval ti = timeInterval != null ? timeInterval.getPeer() : null;
 
         if (ti == null || u == null) {
-            log.warn("Skip invalid SedimentYield: time interval or unit null!");
+            log.warn("Skip invalid SedimentLoadLS: time interval or unit null!");
             return null;
         }
 
         if (peer == null) {
             Session session = ImporterSession.getInstance()
                 .getDatabaseSession();
-            Query query = session.createQuery("from SedimentYield where "
+            Query query = session.createQuery("from SedimentLoadLS where "
                 + "   river=:river and "
                 + "   grainFraction=:grainFraction and " + "   unit=:unit and "
                 + "   timeInterval=:timeInterval and "
@@ -117,16 +117,16 @@
             query.setParameter("timeInterval", ti);
             query.setParameter("description", description);
 
-            List<SedimentLoadLS> yields = query.list();
-            if (yields.isEmpty()) {
-                log.debug("create new SedimentYield");
+            List<SedimentLoadLS> loads = query.list();
+            if (loads.isEmpty()) {
+                log.debug("create new SedimentLoadLS");
 
                 peer = new SedimentLoadLS(river, u, ti, gf, description);
                 peer.setKind(this.kind);
                 session.save(peer);
             }
             else {
-                peer = yields.get(0);
+                peer = loads.get(0);
             }
         }
 
--- a/backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLSValue.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/ImportSedimentLoadLSValue.java	Mon Jul 14 15:36:44 2014 +0200
@@ -31,28 +31,28 @@
     }
 
 
-    public void storeDependencies(SedimentLoadLS sedimentYield) {
-        getPeer(sedimentYield);
+    public void storeDependencies(SedimentLoadLS sedimentLoadLS) {
+        getPeer(sedimentLoadLS);
     }
 
 
-    public SedimentLoadLSValue getPeer(SedimentLoadLS sedimentYield) {
+    public SedimentLoadLSValue getPeer(SedimentLoadLS sedimentLoadLS) {
         if (peer == null) {
             Session session = ImporterSession.getInstance().getDatabaseSession();
             Query query = session.createQuery(
-                "from SedimentYieldValue where " +
-                "   sedimentYield=:sedimentYield and " +
+                "from SedimentLoadLSValue where " +
+                "   sedimentLoadLS=:sedimentLoadLS and " +
                 "   station=:station and " +
                 "   value=:value"
             );
 
-            query.setParameter("sedimentYield", sedimentYield);
+            query.setParameter("sedimentLoadLS", sedimentLoadLS);
             query.setParameter("station", station);
             query.setParameter("value", value);
 
             List<SedimentLoadLSValue> values = query.list();
             if (values.isEmpty()) {
-                peer = new SedimentLoadLSValue(sedimentYield, station, value);
+                peer = new SedimentLoadLSValue(sedimentLoadLS, station, value);
                 session.save(peer);
             }
             else {
--- a/backend/src/main/java/org/dive4elements/river/importer/parsers/LineParser.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/importer/parsers/LineParser.java	Mon Jul 14 15:36:44 2014 +0200
@@ -113,12 +113,8 @@
     protected static String stripMetaLine(String line) {
         String tmp = line.substring(1, line.length());
 
-        if (tmp.startsWith(" ")) {
-            return tmp.substring(1, tmp.length());
-        }
-        else {
-            return tmp;
-        }
+        // meta-lines often have trailing semicolons in real data
+        return tmp.replaceAll(SEPERATOR_CHAR + "*$", "").trim();
     }
 
     public static double getDouble(String doubleString) throws ParseException {
--- 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 :
--- a/backend/src/main/java/org/dive4elements/river/model/SedimentLoadLS.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/SedimentLoadLS.java	Mon Jul 14 15:36:44 2014 +0200
@@ -24,7 +24,7 @@
 import javax.persistence.OneToOne;
 
 
-/** SedimentYield of a certain Fraction with possibly many values. */
+/** SedimentLoadLS of a certain Fraction with possibly many values. */
 @Entity
 @Table(name = "sediment_yield")
 public class SedimentLoadLS
--- a/backend/src/main/java/org/dive4elements/river/model/SedimentLoadLSValue.java	Fri Jul 11 13:10:05 2014 +0200
+++ b/backend/src/main/java/org/dive4elements/river/model/SedimentLoadLSValue.java	Mon Jul 14 15:36:44 2014 +0200
@@ -32,23 +32,21 @@
 
     private Integer id;
 
-    private SedimentLoadLS sedimentYield;
+    private SedimentLoadLS sedimentLoadLS;
 
     private Double station;
     private Double value;
 
-    private Unit unit;
-
 
     public SedimentLoadLSValue() {
     }
 
     public SedimentLoadLSValue(
-        SedimentLoadLS sedimentYield,
+        SedimentLoadLS sedimentLoadLS,
         Double        station,
         Double        value
     ) {
-        this.sedimentYield = sedimentYield;
+        this.sedimentLoadLS = sedimentLoadLS;
         this.station       = station;
         this.value         = value;
     }
@@ -72,12 +70,12 @@
 
     @OneToOne
     @JoinColumn(name = "sediment_yield_id" )
-    public SedimentLoadLS getSedimentYield() {
-        return sedimentYield;
+    public SedimentLoadLS getSedimentLoadLS() {
+        return sedimentLoadLS;
     }
 
-    public void setSedimentYield(SedimentLoadLS sedimentYield) {
-        this.sedimentYield = sedimentYield;
+    public void setSedimentLoadLS(SedimentLoadLS sedimentLoadLS) {
+        this.sedimentLoadLS = sedimentLoadLS;
     }
 
     @Column(name="station")

http://dive4elements.wald.intevation.org