diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java @ 2330:594885703687

Picked changes r4015:4026 from trunk. flys-artifacts/tags/2.6@4028 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Fri, 10 Feb 2012 11:18:27 +0000
parents 61b32380ffdb
children 177b0c91928d
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java	Fri Feb 10 08:28:17 2012 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java	Fri Feb 10 11:18:27 2012 +0000
@@ -903,11 +903,28 @@
         return relateWs(km1, km2, RELATE_WS_SAMPLES, errors);
     }
 
+    private static class ErrorHandler {
+
+        boolean     hasErrors;
+        Calculation errors;
+
+        ErrorHandler(Calculation errors) {
+            this.errors = errors;
+        }
+
+        void error(double km, String key, Object ... args) {
+            if (errors != null && !hasErrors) {
+                hasErrors = true;
+                errors.addProblem(km, key, args);
+            }
+        }
+    } // class ErrorHandler
+
+
     /* TODO: Add optimized methods of relateWs to relate one
      *       start km to many end kms. The index generation/spline stuff for 
      *       the start km is always the same.
      */
-
     public double [][] relateWs(
         double      km1, 
         double      km2,
@@ -951,31 +968,51 @@
         TDoubleArrayList qs1 = new TDoubleArrayList(numSamples);
         TDoubleArrayList qs2 = new TDoubleArrayList(numSamples);
 
-        boolean hadErrors = false;
+        ErrorHandler err = new ErrorHandler(errors);
 
         int i = 0;
         for (double p = 0d; p <= N-1; p += stepWidth, ++i) {
+
+            double q1;
             try {
-                double q1 = iQ1.value(p);
-                double w1 = qW1.value(q1);
-                double q2 = iQ2.value(p);
-                double w2 = qW2.value(q2);
-                ws1.add(w1);
-                ws2.add(w2);
-                qs1.add(q1);
-                qs2.add(q2);
+                q1 = iQ1.value(p);
             }
             catch (ArgumentOutsideDomainException aode) {
-                if (!hadErrors) {
-                    // XXX: I'm not sure if this really can happen
-                    //      and if we should report this more than once.
-                    hadErrors = true;
-                    if (errors != null) {
-                        errors.addProblem("relating.w.w.failed");
-                        log.warn("W~W failed", aode);
-                    }
-                }
+                err.error(km1, "w.w.qkm1.failed", p);
+                continue;
             }
+
+            double w1;
+            try {
+                w1 = qW1.value(q1);
+            }
+            catch (ArgumentOutsideDomainException aode) {
+                err.error(km1, "w.w.wkm1.failed", p);
+                continue;
+            }
+
+            double q2;
+            try {
+                q2 = iQ2.value(p);
+            }
+            catch (ArgumentOutsideDomainException aode) {
+                err.error(km2, "w.w.qkm2.failed", p);
+                continue;
+            }
+
+            double w2;
+            try {
+                w2 = qW2.value(q2);
+            }
+            catch (ArgumentOutsideDomainException aode) {
+                err.error(km2, "w.w.wkm2.failed", p);
+                continue;
+            }
+
+            ws1.add(w1);
+            ws2.add(w2);
+            qs1.add(q1);
+            qs2.add(q2);
         }
 
         return new double [][] {

http://dive4elements.wald.intevation.org