diff artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java @ 9409:38201f5b0dd9

Changed bundu bzws workflow to stop in case of missing daily discharge values and other minor changes
author mschaefer
date Thu, 16 Aug 2018 08:47:41 +0200
parents 34cd4faf43f4
children 52314c4ab3be
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java	Thu Aug 16 08:44:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java	Thu Aug 16 08:47:41 2018 +0200
@@ -25,16 +25,12 @@
 import org.dive4elements.river.model.Gauge;
 import org.dive4elements.river.model.River;
 import org.dive4elements.river.model.sinfo.DailyDischargeValue;
-import org.dive4elements.river.model.sinfo.DailyDischargeValue.MinMax;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
 /**
- * This service returns the main values of a river's gauge based on the start
- * and end point of the river.
- *
- * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
+ * This service returns the list of gauges with daily discharge time periods and error messages
  */
 public class DynamicMainValuesTimeRangeDeterminationService extends D4EService {
 
@@ -53,26 +49,20 @@
         }
     }
 
-    /**
-     * Computes a gauge's main values for a period of time based on its daily discharges stored in the database
-     *
-     * @throws Exception
-     */
+    private static class GaugeInfoResult {
+        protected final String globalErrorMsg;
+        protected final List<GaugeInfo> gaugeInfos;
 
-    private static class GaugeInfoResult {
-        private final String globalErrorMsg;
-        private final List<GaugeInfo> gaugeInfos;
-
-        private GaugeInfoResult(final List<GaugeInfo> gaugeInfos, final String globalErrorMsg) {
+        protected GaugeInfoResult(final List<GaugeInfo> gaugeInfos, final String globalErrorMsg) {
             this.gaugeInfos = gaugeInfos;
             this.globalErrorMsg = globalErrorMsg;
         }
 
         private static class GaugeInfo {
-            private final String errorMsg;
-            private final Gauge gauge;
-            private final Date startdate;
-            private final Date enddate;
+            protected final String errorMsg;
+            protected final Gauge gauge;
+            protected final Date startdate;
+            protected final Date enddate;
 
             public GaugeInfo(final String errorMsg, final Gauge gauge, final Date startdate, final Date enddate) {
                 this.errorMsg = errorMsg;
@@ -83,35 +73,41 @@
         }
     }
 
+    /**
+     * Queries the available daily discharge time periods of a list of gauges from the database and checks the overlapping
+     *
+     * @throws ServiceException
+     */
     private GaugeInfoResult getCommonTimeRangeForGauges(final List<Gauge> gauges, final Date startTime, final Date endTime, final CallMeta meta)
             throws ServiceException {
 
         // Query the gauge's daily Q values
+        String globalErrorMsg = "";
         final List<GaugeInfoResult.GaugeInfo> gaugeResults = new ArrayList<>();
         Date min = startTime;
         Date max = endTime;
 
         for (final Gauge gauge : gauges) {
 
-            final Date minGlobalForGauge = DailyDischargeValue.getGlobalMinMax(gauge, MinMax.min);
-            final Date maxGlobalForGauge = DailyDischargeValue.getGlobalMinMax(gauge, MinMax.max);
-            if (minGlobalForGauge == null || maxGlobalForGauge == null) { // der Fall, dass nur eins von beiden null ist, kann eigentlich nciht vorkommen
-                gaugeResults.add(new GaugeInfoResult.GaugeInfo(getMsg(meta, "bundu.wst_no_data_at_all"), gauge, null, null));
-                // TODO : wenn der Workflow abgebrochen werden soll, GlobalErrorMsg setzen, dass mind. ein Pegel überhaupt keine Daten
-                // hat (der Mechnismus auf Client-Seite ist schon implementiert)
-
+            final Date[] gaugeDates = DailyDischargeValue.getTimePeriod(gauge, startTime, endTime);
+            if (gaugeDates[0] == null) {
+                final String msg = Resources.getMsg(meta, "bundu.wst_no_data_at_all", "bundu.wst_no_data_at_all", gauge.getName());
+                final GaugeInfoResult.GaugeInfo gi = new GaugeInfoResult.GaugeInfo(msg, gauge, null, null);
+                gaugeResults.add(gi);
+                if (globalErrorMsg.isEmpty())
+                    globalErrorMsg = msg;
                 continue;
             }
 
-            if (minGlobalForGauge.getTime() > startTime.getTime())
-                min = minGlobalForGauge;
+            if (gaugeDates[0].getTime() > startTime.getTime())
+                min = gaugeDates[0];
 
-            if (maxGlobalForGauge.getTime() < endTime.getTime())
-                max = maxGlobalForGauge;
+            if (gaugeDates[1].getTime() < endTime.getTime())
+                max = gaugeDates[1];
 
             String errormsg = null;
-            if ((maxGlobalForGauge.getTime() < endTime.getTime()) || (minGlobalForGauge.getTime() > startTime.getTime()))
-                errormsg = makeDoesNotCoverErrorMsg(minGlobalForGauge, maxGlobalForGauge, meta);
+            if ((gaugeDates[1].getTime() < endTime.getTime()) || (gaugeDates[0].getTime() > startTime.getTime()))
+                errormsg = makeDoesNotCoverErrorMsg(gaugeDates[0], gaugeDates[1], meta);
 
             gaugeResults.add(new GaugeInfoResult.GaugeInfo(errormsg, gauge, min, max));
         }
@@ -119,10 +115,11 @@
         // common Range and correct errorMsg
         final List<GaugeInfoResult.GaugeInfo> gaugeResultsSecondTurn = new ArrayList<>();
         for (final GaugeInfoResult.GaugeInfo gi : gaugeResults) {
-            gaugeResultsSecondTurn
-                    .add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null, gi.enddate != null ? max : null));
+            gaugeResultsSecondTurn.add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null,
+                    gi.enddate != null ? max : null));
         }
-        final String globalErrorMsg = (min.getTime() > max.getTime()) ? getMsg(meta, "bundu.wst.gauge_timeranges_disjoint") : "";
+        if (globalErrorMsg.isEmpty() && (min.getTime() > max.getTime()))
+            globalErrorMsg = getMsg(meta, "bundu.wst.gauge_timeranges_disjoint");
         final GaugeInfoResult result = new GaugeInfoResult(gaugeResultsSecondTurn, globalErrorMsg);
 
         return result;
@@ -140,10 +137,10 @@
     @Override
     public Document doProcess(final Document data, final GlobalContext context, final CallMeta callMeta) {
         try {
-            final River river = AbstractMainValuesService.getRequestedRiver(data, "/art:" + this.ROOT_NODE + "/art:river/text()");
+            final River river = AbstractMainValuesService.getRequestedRiver(data, "/art:" + ROOT_NODE + "/art:river/text()");
             final List<Gauge> gauges = getRequestedGauges(data, river, callMeta);
-            final Date start = getRequestedStartYear(data, "/art:" + this.ROOT_NODE + "/art:startYear/text()");
-            final Date end = getRequestedEndYear(data, "/art:" + this.ROOT_NODE + "/art:endYear/text()");
+            final Date start = getRequestedStartYear(data, "/art:" + ROOT_NODE + "/art:startYear/text()");
+            final Date end = getRequestedEndYear(data, "/art:" + ROOT_NODE + "/art:endYear/text()");
 
             final GaugeInfoResult result = getCommonTimeRangeForGauges(gauges, start, end, callMeta);
 

http://dive4elements.wald.intevation.org