changeset 8253:b6d54b946f4c

merged.
author Raimund Renkert <rrenkert@intevation.de>
date Wed, 10 Sep 2014 10:02:46 +0200
parents 1e30489d0958 (current diff) 2414154673e9 (diff)
children c87c87544cc6 5b87aaac8447
files
diffstat 18 files changed, 205 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Wed Sep 10 10:01:57 2014 +0200
+++ b/.hgtags	Wed Sep 10 10:02:46 2014 +0200
@@ -96,3 +96,4 @@
 e0d06f4edaa6d0f3a15b8eecfe7696e825ff5062 3.1.3
 8333b9b06c981a231e0c92283de3bfa65b6cc0d9 3.1.3
 6fef38a526c705158f17fa16839ad216d5ec8afc 3.1.4
+d81c4b0d5ca74c14fe7845e62ba83c7161ce6374 3.1.5
--- a/artifacts/doc/conf/meta-data.xml	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/doc/conf/meta-data.xml	Wed Sep 10 10:02:46 2014 +0200
@@ -115,6 +115,7 @@
                   </dc:when>
                   <dc:when test="$out = 'sedimentload_ls'">
                     <dc:call-macro name="annotations"/>
+                    <dc:call-macro name="sedimentload_off_epochs"/>
                   </dc:when>
                   <dc:when test="$out = 'bed_longitudinal_section'">
                     <dc:call-macro name="annotations"/>
@@ -1441,7 +1442,7 @@
              </dc:choose>
              <dc:if test="$kind = 'official'">
                <dc:variable name="info" type="string"
-                            expr="concat('Amtliche Epoche&lt;BR&gt;', $info)"/>
+                            expr="concat('Amtliche Epoche&lt;BR&gt;', dc:get('info'))"/>
              </dc:if>
              <dc:macro-body/>
            </dc:for-each>
@@ -3073,6 +3074,85 @@
       </dc:if>
     </dc:macro>
 
+
+    <dc:macro name="sedimentload_off_epoch_filter">
+        <dc:if test="dc:has-result()">
+          <dc:if test="string-length(dc:get('epochs')) &gt; 0">
+            <dc:variable name="start" type="number"
+                         expr="dc:min-number(dc:find-all('\d{4}', $epochs))"/>
+            <dc:variable name="end" type="number"
+                         expr="dc:max-number(dc:find-all('\d{4}', $epochs))"/>
+          </dc:if>
+          <dc:filter expr="not(number($end) &lt;
+                               number(dc:date-format('yyyy', $startyear))
+                             or number($start) &gt;
+                               number(dc:date-format('yyyy', $endyear)))">
+            <dc:macro-body/>
+          </dc:filter>
+        </dc:if>
+    </dc:macro>
+
+    <dc:macro name="sedimentload_off_epochs">
+      <dc:variable name="sq_time_id" type="number" expr="number($sq_ti_id)"/>
+      <dc:context>
+        <dc:comment> data at measurement stations </dc:comment>
+        <dc:statement>
+          SELECT DISTINCT
+              sl.id               AS slid,
+              slk.kind            AS kind,
+              ti.start_time       AS startyear,
+              ti.stop_time        AS endyear,
+              gf.name             AS fraction
+          FROM     sediment_load sl
+              JOIN sediment_load_kinds slk ON slk.id = sl.kind
+              JOIN sediment_load_values slv
+                  ON sl.id = slv.sediment_load_id
+              JOIN measurement_station ms
+                  ON ms.id = slv.measurement_station_id
+              JOIN rivers r ON ms.river_id = r.id
+              JOIN time_intervals ti ON sl.time_interval_id = ti.id
+              JOIN grain_fraction gf ON gf.id = sl.grain_fraction_id
+          WHERE r.id = ${river_id}
+              AND sq_time_interval_id = ${sq_time_id}
+              AND ms.station BETWEEN ${fromkm} AND ${tokm}
+              AND slk.kind = 'official'
+        </dc:statement>
+        <dc:call-macro name="sedimentload_off_epoch_filter">
+          <dc:call-macro name="loads">
+            <dc:call-macro name="load"/>
+          </dc:call-macro>
+        </dc:call-macro>
+      </dc:context>
+      <dc:context>
+        <dc:comment> longitudinal sections </dc:comment>
+        <dc:statement>
+          SELECT DISTINCT
+              sl.id               AS slid,
+              slk.kind            AS kind,
+              ti.start_time       AS startyear,
+              ti.stop_time        AS endyear,
+              sq_time_interval_id AS sqid,
+              gf.name             AS fraction
+          FROM     sediment_load_ls sl
+              JOIN sediment_load_kinds slk ON slk.id = sl.kind
+              JOIN rivers r ON sl.river_id = r.id
+              JOIN sediment_load_ls_values slv
+                  ON sl.id = slv.sediment_load_ls_id
+              JOIN time_intervals ti ON sl.time_interval_id = ti.id
+              JOIN grain_fraction gf ON gf.id = sl.grain_fraction_id
+          WHERE   r.id = ${river_id}
+              AND sq_time_interval_id = ${sq_time_id}
+              AND slv.station BETWEEN ${fromkm} AND ${tokm}
+              AND slk.kind = 'official'
+        </dc:statement>
+        <dc:call-macro name="sedimentload_off_epoch_filter">
+          <dc:call-macro name="loads">
+            <dc:call-macro name="load_ls"/>
+          </dc:call-macro>
+        </dc:call-macro>
+      </dc:context>
+    </dc:macro>
+
     <!-- Common stuff -->
 
     <dc:macro name="km-filtered-wsts">
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation6.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/Calculation6.java	Wed Sep 10 10:02:46 2014 +0200
@@ -244,7 +244,10 @@
                 : vc.findValueForQ(refTable, value);
 
             if (Double.isNaN(ref)) {
-                addProblem("hist.discharge.no.value.in.ref", value);
+                addProblem("hist.discharge.no.value.in.ref", value,
+                           mode == EvaluationMode.W.getMode()
+                           ? "cm"
+                           : "m\u00b3/s");
                 continue;
             }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadData.java	Wed Sep 10 10:02:46 2014 +0200
@@ -230,6 +230,36 @@
             }
         }
 
+        public void allOfficialLoads(Collection<Load> loads) {
+            for (List<Value> values: grainFractions) {
+                if (values != null) {
+                    for (Value value: values) {
+                        Load load = value.getLoad();
+                        if (load.getKind() == 1) {
+                            loads.add(value.getLoad());
+                        }
+                    }
+                }
+            }
+        }
+
+        public void allLoads(Collection<Load> loads, Integer sqRelationTimeInterval) {
+
+            for (List<Value> values: grainFractions) {
+                if (values == null) {
+                    continue;
+                }
+                for (Value value: values) {
+                    Load load = value.getLoad();
+                    Integer sqId = load.getSQRelationTimeIntervalId();
+                    if ((sqRelationTimeInterval == null)
+                        || sqId != null && sqId.equals(sqRelationTimeInterval)) {
+                        loads.add(load);
+                    }
+                }
+            }
+        }
+
         public double getStation() {
             return station;
         }
@@ -435,6 +465,25 @@
         }
     };
 
+    public static final Comparator<Load> LOAD_TI_CMP = new Comparator<Load>() {
+        @Override
+        public int compare(Load a, Load b) {
+            Date a_start = a.getStartTime();
+            Date a_stop = a.getStopTime();
+            Date b_start = b.getStartTime();
+            Date b_stop = b.getStopTime();
+            if (a_start == null && b_start == null) {
+                return 0;
+            } else if (a_start != null) {
+                return a_start.compareTo(b_start);
+            } else if (a_stop != null) {
+                return a_stop.compareTo(b_stop);
+            } else {
+                return 1;
+            }
+        }
+    };
+
     public static final Comparator<Load> LOAD_SQ_TI_CMP = new Comparator<Load>() {
         @Override
         public int compare(Load a, Load b) {
@@ -454,24 +503,29 @@
     };
 
     /** Find all loads in the range a/b with the according sq_time_interval */
-    public Collection<Load> findLoads(double a, double b, Integer sqRelationTimeInterval) {
+    public Collection<Load> findLoads(double a, double b, final Integer sqRelationTimeInterval) {
         final TreeSet<Load> loads = new TreeSet<Load>(LOAD_ID_CMP);
 
         findStations(a, b, new Visitor() {
             @Override
             public void visit(Station station) {
-                station.allLoads(loads);
+                station.allLoads(loads, sqRelationTimeInterval);
             }
         });
 
-        /* This may not be the most beautiful thing to do but well,.. */
-        for (Iterator<Load> it = loads.iterator(); it.hasNext();) {
-            Integer obj = it.next().getSQRelationTimeIntervalId();
-            if ((obj == null && sqRelationTimeInterval != null) ||
-                    (obj != null && !obj.equals(sqRelationTimeInterval))) {
-                it.remove();
+        return loads;
+    }
+
+    /** Find all official loads with a distinct time interval id */
+    public Collection<Load> findUniqueTiOfficialLoads(double a, double b) {
+        final TreeSet<Load> loads = new TreeSet<Load>(LOAD_TI_CMP);
+
+        findStations(a, b, new Visitor() {
+            @Override
+            public void visit(Station station) {
+                station.allOfficialLoads(loads);
             }
-        }
+        });
 
         return loads;
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/model/minfo/SedimentLoadDataCalculation.java	Wed Sep 10 10:02:46 2014 +0200
@@ -308,7 +308,8 @@
                         filter, sum);
 
                     if (result[0].length == 0 || DoubleUtil.isNaN(result[1])) {
-                        continue;
+                        addProblem("sedimentload.missing.fraction." +
+                            ls.getDescription(), ((Integer)year).toString());
                     }
 
                     transformT2M3(sd, year, result);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/SedimentLoadInfoService.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/SedimentLoadInfoService.java	Wed Sep 10 10:02:46 2014 +0200
@@ -85,8 +85,7 @@
         log.debug("Requested type: " + type + " with sq_ti_id: " + sq_ti_id);
         Collection <Load> loads;
         if (type.equals("off_epoch")) {
-            /* TODO */
-            loads = null;
+            loads = allLoadData.findUniqueTiOfficialLoads(fromD, toD);
         } else if (type.equals("sq_time_intervals")) {
             loads = allLoadData.findUniqueTimeIntervalLoads(fromD, toD);
 
@@ -99,12 +98,16 @@
         } else {
             if (!sq_ti_id.isEmpty()) {
                 Integer id = Integer.parseInt(sq_ti_id);
-                log.debug("Finding only items for id");
                 loads = allLoadData.findLoads(fromD, toD, id);
             } else {
-                log.debug("Finding everything.");
                 loads = allLoadData.findLoads(fromD, toD);
             }
+            for (Iterator<Load> it = loads.iterator(); it.hasNext();) {
+                /* Skip epochs . */
+                if (it.next().isEpoch()) {
+                    it.remove();
+                }
+            }
         }
 
         return buildDocument(loads);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/YearEpochSelect.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/minfo/YearEpochSelect.java	Wed Sep 10 10:02:46 2014 +0200
@@ -43,6 +43,8 @@
     {
         CallMeta meta = context.getMeta();
         Element[] elements;
+
+        /* Disable calculation of official epochs
         if (((D4EArtifact)artifact).getCurrentStateId()
             .equals("state.minfo.sediment.load.year_epoch")
         ) {
@@ -57,7 +59,8 @@
         }
         else {
             elements = new Element[2];
-        }
+            } */
+        elements = new Element[2];
         elements[0] = createItem(
                 ec,
                 new String[] {
--- a/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/ChartGenerator.java	Wed Sep 10 10:02:46 2014 +0200
@@ -16,6 +16,8 @@
 import org.dive4elements.artifacts.CallMeta;
 import org.dive4elements.artifacts.PreferredLocale;
 import org.dive4elements.artifacts.common.utils.XMLUtils;
+
+import org.dive4elements.river.artifacts.access.RiverAccess;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.resources.Resources;
@@ -1412,18 +1414,23 @@
         return Resources.getMsg(context.getMeta(), key, key);
     }
 
+    protected String msg(String key, Object[] args) {
+        return Resources.getMsg(context.getMeta(), key, key, args);
+    }
+
     protected String msg(String key, String def, Object[] args) {
         return Resources.getMsg(context.getMeta(), key, def, args);
     }
 
 
     protected String getRiverName() {
-        D4EArtifact flys = (D4EArtifact) master;
-
-        River river = RiverUtils.getRiver(flys);
-        return (river != null) ? river.getName() : "";
+        return new RiverAccess((D4EArtifact)master).getRiver().getName();
     }
 
+    protected String getRiverUnit() {
+        return new RiverAccess((D4EArtifact)master).getRiver()
+            .getWstUnit().getName();
+    }
 
     protected double[] getRange() {
         D4EArtifact flys = (D4EArtifact) master;
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveExporter.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveExporter.java	Wed Sep 10 10:02:46 2014 +0200
@@ -32,6 +32,7 @@
 
 import org.dive4elements.river.artifacts.D4EArtifact;
 
+import org.dive4elements.river.artifacts.access.RiverAccess;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.model.WQDay;
 import org.dive4elements.river.artifacts.model.CalculationResult;
@@ -60,10 +61,6 @@
     public static final String CSV_Q_HEADER =
         "export.duration.curve.csv.header.q";
 
-    public static final String DEFAULT_CSV_DURATION_HEADER = "D [Tagen]";
-    public static final String DEFAULT_CSV_W_HEADER  = "W [NN + m]";
-    public static final String DEFAULT_CSV_Q_HEADER  = "Q [m\u00b3/s]";
-
     public static final String PDF_HEADER_MODE = "export.duration.pdf.mode";
     public static final String JASPER_FILE = "export.duration.pdf.file";
 
@@ -99,10 +96,13 @@
     protected void writeCSVHeader(CSVWriter writer) {
         log.info("DurationCurveExporter.writeCSVHeader");
 
+        String unit = new RiverAccess((D4EArtifact)master)
+            .getRiver().getWstUnit().getName();
+
         writer.writeNext(new String[] {
-            msg(CSV_W_HEADER, DEFAULT_CSV_W_HEADER),
-            msg(CSV_Q_HEADER, DEFAULT_CSV_Q_HEADER),
-            msg(CSV_DURATION_HEADER, DEFAULT_CSV_DURATION_HEADER)
+            msg(CSV_W_HEADER, new Object[] { unit }),
+            msg(CSV_Q_HEADER),
+            msg(CSV_DURATION_HEADER)
         });
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveGenerator.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/DurationCurveGenerator.java	Wed Sep 10 10:02:46 2014 +0200
@@ -58,8 +58,11 @@
     public static final String I18N_XAXIS_LABEL =
         "chart.duration.curve.xaxis.label";
 
-    public static final String I18N_YAXIS_LABEL =
-        "chart.duration.curve.yaxis.label";
+    public static final String I18N_YAXIS_LABEL_W =
+        "chart.duration.curve.yaxis.label.w";
+
+    public static final String I18N_YAXIS_LABEL_Q =
+        "chart.duration.curve.yaxis.label.q";
 
     public static final String I18N_CHART_TITLE_DEFAULT  =
         "Dauerlinie";
@@ -67,9 +70,6 @@
     public static final String I18N_XAXIS_LABEL_DEFAULT  =
         "Unterschreitungsdauer [Tage]";
 
-    public static final String I18N_YAXIS_LABEL_DEFAULT  =
-        "W [NN + m]";
-
 
     public DurationCurveGenerator() {
         super();
@@ -123,12 +123,10 @@
     protected String getDefaultYAxisLabel(int index) {
         String label = "default";
         if (index == YAXIS.W.idx) {
-            label = msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
+            label = msg(I18N_YAXIS_LABEL_W, new Object[] { getRiverUnit() });
         }
         else if (index == YAXIS.Q.idx) {
-            // TODO i18n for this label
-            label = "Q [m\u00b3/s]";
-            //label = msg(get2YAxisLabelKey(), get2YAxisDefaultLabel());
+            label = msg(I18N_YAXIS_LABEL_Q);
         }
 
         return label;
--- a/artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightExporter.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/MiddleBedHeightExporter.java	Wed Sep 10 10:02:46 2014 +0200
@@ -119,6 +119,8 @@
 
         Collections.sort(data);
 
+        writeCSVHeader(writer);
+
         for (MiddleBedHeightData d: data) {
             data2CSV(writer, d);
         }
@@ -148,8 +150,6 @@
 
         writeMetaData(writer, data);
 
-        writeCSVHeader(writer);
-
         NumberFormat kmF     = Formatter.getMiddleBedHeightKM(context);
         NumberFormat heightF = Formatter.getMiddleBedHeightHeight(context);
         NumberFormat uncertF = Formatter.getMiddleBedHeightUncert(context);
--- a/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/exports/process/BedDiffHeightYearProcessor.java	Wed Sep 10 10:02:46 2014 +0200
@@ -89,10 +89,11 @@
             String river = access.getRiverName();
 
             double radius = scales.getRadius(river, start, end);
+            context.putContextValue("radius", radius);
             generator.addSubtitle(Resources.getMsg(
                 context.getMeta(),
                 I18N_SUBTITLE_RADIUS,
-                new Object[] { radius }));
+                new Object[] { "$RADIUS" }));
         }
     }
 
--- a/artifacts/src/main/resources/messages.properties	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/resources/messages.properties	Wed Sep 10 10:02:46 2014 +0200
@@ -379,7 +379,7 @@
 export.computed.discharge.curve.csv.header.w = W [{0}]
 export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s]
 export.duration.curve.csv.header.duration = D [Days]
-export.duration.curve.csv.header.w = W [NN + m]
+export.duration.curve.csv.header.w = W [{0}]
 export.duration.curve.csv.header.q = Q [m\u00b3/s]
 export.discharge.longitudinal.section.csv.header.km = River-Km
 export.discharge.longitudinal.section.csv.header.w = W [NN + m]
@@ -546,6 +546,7 @@
 w.w.qkm2.failed = Calculating Q for WST index {0,number,#.##} failed.
 w.w.wkm2.failed = Calculating W for Q = {0,number,#.##} /  WST index {1,number,#.##} failed.
 
+hist.discharge.no.value.in.ref = {0} {1} not in reference table
 cannot.find.hist.q.for.w = Cannot find Q for W = {0,number,#.##} in timerange {1, date} - {2, date}
 cannot.find.hist.w.for.q = Cannot find W for Q = {0,number,#.##} in timerange {1, date} - {2, date}
 cannot.find.hist.q.tables = Cannot find Discharge Tables for given timerange.
--- a/artifacts/src/main/resources/messages_de.properties	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/resources/messages_de.properties	Wed Sep 10 10:02:46 2014 +0200
@@ -379,7 +379,7 @@
 export.waterlevel.csv.not.in.gauge.range = au\u00dferh. d. Bez.pegels
 export.computed.discharge.curve.csv.header.w = W [{0}]
 export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s]
-export.duration.curve.csv.header.duration = D [Tagen]
+export.duration.curve.csv.header.duration = D [Tage]
 export.duration.curve.csv.header.w = W [{0}]
 export.duration.curve.csv.header.q = Q [m\u00b3/s]
 export.discharge.longitudinal.section.csv.header.km = Fluss-Km
@@ -549,6 +549,7 @@
 w.w.qkm2.failed = Berechnung von Q f\u00fcr WST-Index {0,number,#.##} fehlgeschlagen. 
 w.w.wkm2.failed = Berechnung von W f\u00fcr Q = {0,number,#.##} / WST-Index {1,number,#.##} fehlgeschlagen. 
 
+hist.discharge.no.value.in.ref = {0} {1} nicht in Bezugskurve enthalten
 cannot.find.hist.q.for.w = Konnte zu W = {0,number,#.##} im Zeitraum ({1,date} - {2,date}) keinen Abfluss ermitteln.
 cannot.find.hist.w.for.q = Konnte zu Q = {0,number,#.##} im Zeitraum ({1,date} - {2,date}) keinen Wasserstand ermitteln.
 cannot.find.hist.q.tables = Konnte f\u00fcr den angegebenen Zeitraum keine Abflusstafeln finden.
--- a/artifacts/src/main/resources/messages_de_DE.properties	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/resources/messages_de_DE.properties	Wed Sep 10 10:02:46 2014 +0200
@@ -179,7 +179,8 @@
 chart.duration.curve.title = Dauerlinie
 chart.duration.curve.subtitle = {0}-km: {1,number,#.###}
 chart.duration.curve.xaxis.label = Unterschreitungsdauer [Tage]
-chart.duration.curve.yaxis.label = W [NN + m]
+chart.duration.curve.yaxis.label.w = W [{0}]
+chart.duration.curve.yaxis.label.q = Q [m\u00b3/s]
 chart.duration.curve.curve.w = Wasserstandsdauerline f\u00fcr {0} (km:{1})
 chart.duration.curve.curve.q = Abflussdauerline f\u00fcr {0} (km:{1})
 chart.historical.discharge.title = Historische Abflusskurven
@@ -376,7 +377,7 @@
 export.waterlevel.csv.not.in.gauge.range = au\u00dferh. d. Bez.pegels
 export.computed.discharge.curve.csv.header.w = W [{0}]
 export.computed.discharge.curve.csv.header.q = Q [m\u00b3/s]
-export.duration.curve.csv.header.duration = D [Tagen]
+export.duration.curve.csv.header.duration = D [Tage]
 export.duration.curve.csv.header.w = W [{0}]
 export.duration.curve.csv.header.q = Q [m\u00b3/s]
 export.discharge.longitudinal.section.csv.header.km = Fluss-Km
@@ -544,6 +545,7 @@
 w.w.qkm2.failed = Berechnung von Q f\u00fcr WST-Index {0,number,#.##} fehlgeschlagen. 
 w.w.wkm2.failed = Berechnung von W f\u00fcr Q = {0,number,#.##} / WST-Index {1,number,#.##} fehlgeschlagen. 
 
+hist.discharge.no.value.in.ref = {0} {1} nicht in Bezugskurve enthalten
 cannot.find.hist.q.for.w = Konnte zu W = {0,number,#.##} im Zeitraum ({1,date} - {2,date}) keinen Abfluss ermitteln.
 cannot.find.hist.w.for.q = Konnte zu Q = {0,number,#.##} im Zeitraum ({1,date} - {2,date}) keinen Wasserstand ermitteln.
 cannot.find.hist.q.tables = Konnte f\u00fcr den angegebenen Zeitraum keine Abflusstafeln finden.
--- a/artifacts/src/main/resources/messages_en.properties	Wed Sep 10 10:01:57 2014 +0200
+++ b/artifacts/src/main/resources/messages_en.properties	Wed Sep 10 10:02:46 2014 +0200
@@ -548,6 +548,7 @@
 w.w.qkm2.failed = Calculating Q for WST index {0,number,#.##} failed.
 w.w.wkm2.failed = Calculating W for Q = {0,number,#.##} /  WST index {1,number,#.##} failed.
 
+hist.discharge.no.value.in.ref = {0} {1} not in reference table
 cannot.find.hist.q.for.w = Cannot find Q for W = {0,number,#.##} in timerange {1, date} - {2, date}
 cannot.find.hist.w.for.q = Cannot find W for Q = {0,number,#.##} in timerange {1, date} - {2, date}
 cannot.find.hist.q.tables = Cannot find Discharge Tables for given timerange.
--- a/contrib/make_flys_release/make_release.sh	Wed Sep 10 10:01:57 2014 +0200
+++ b/contrib/make_flys_release/make_release.sh	Wed Sep 10 10:02:46 2014 +0200
@@ -272,7 +272,8 @@
 cp -r $FLYS_SOURCE_DIR/OpenLayers-2.11 $FLYS_SOURCE_DIR/river/gwt-client/src/main/webapp/
 
 echo "INFO: Downloading smartGWT"
-mvn com.isomorphic:isc-maven-plugin:install -Dproduct=SMARTGWT -Dlicense=LGPL -DbuildNumber=4.1p -DbuildDate=2014-06-17 -Dworkdir=$WORK_DIR
+mvn com.isomorphic:isc-maven-plugin:install -Dproduct=SMARTGWT -Dlicense=LGPL \
+    -DbuildNumber=4.1p -DbuildDate=2014-09-08 -Dworkdir=$WORK_DIR
 
 echo "INFO: compile and build sources"
 mvn -f $FLYS_SOURCE_DIR/framework/pom.xml clean compile package install
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationListGrid.java	Wed Sep 10 10:01:57 2014 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/stationinfo/MeasurementStationListGrid.java	Wed Sep 10 10:02:46 2014 +0200
@@ -81,12 +81,15 @@
 
     private void addStation(MeasurementStation station,
             List<MeasurementStation> empty) {
+        /* switch off sorting stations without range to the end
         if (station.getKmStart() != null && station.getKmEnd() != null) {
             addStation(station);
         }
         else {
             empty.add(station);
         }
+        */
+        addStation(station);
     }
 
     private void addStation(MeasurementStation station) {

http://dive4elements.wald.intevation.org