Mercurial > dive4elements > river
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);