changeset 9588:c57caff9b00b

Punkt 10.6 CSV-Ausgabe Abflusszeitreihenlänge
author gernotbelger
date Thu, 10 Jan 2019 11:56:39 +0100 (2019-01-10)
parents d116a791b1f8
children 0a30e01719ca
files artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java
diffstat 2 files changed, 58 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculation.java	Thu Jan 10 09:07:16 2019 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/bundu/bezugswst/BezugswstCalculation.java	Thu Jan 10 11:56:39 2019 +0100
@@ -29,6 +29,8 @@
 import org.dive4elements.river.artifacts.model.fixings.FixRealizingResult;
 import org.dive4elements.river.artifacts.model.river.RiverInfoProvider;
 import org.dive4elements.river.artifacts.resources.Resources;
+import org.dive4elements.river.artifacts.services.DynamicMainValuesTimeRangeDeterminationService;
+import org.dive4elements.river.artifacts.services.DynamicMainValuesTimeRangeDeterminationService.GaugeInfoResult;
 import org.dive4elements.river.artifacts.sinfo.tkhstate.BedHeightsFinder;
 import org.dive4elements.river.artifacts.sinfo.tkhstate.WinfoArtifactWrapper;
 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
@@ -85,6 +87,11 @@
         this.missKmFrom = access.getMissingVolFrom();
         this.missKmTo = access.getMissingVolTo();
 
+        final GaugeInfoResult gi = DynamicMainValuesTimeRangeDeterminationService
+                .getCommonTimeRangeForGauges(river.determineGauges(access.getLowerKm(), access.getUpperKm()), startYear, endYear, this.context.getMeta());
+        final int globalAdjustedEndYear = gi.getGlobalEndYear();
+        final int globalAdjustedStartYear = gi.getGlobalStartYear();
+
         final BezugswstCalculationResults results = new BezugswstCalculationResults(calcModeLabel, user, riverInfo, access.getRange(),
                 access.isCalculateMissingVolume());
 
@@ -135,7 +142,7 @@
         final WaterlevelDescriptionBuilder descBuilder = new WaterlevelDescriptionBuilder(winfo, this.context);
         final String qtext = descBuilder.getMetadataQ();
         final BezugswstMainCalculationResult result = new BezugswstMainCalculationResult("bundu-bzws", this.rows, bedHeightsFinder.getInfo(), wstInfo,
-                access.getFunction(), preprocessing, startYear, endYear, ud, qtext, wqkms, this.missKmFrom, this.missKmTo);
+                access.getFunction(), preprocessing, globalAdjustedStartYear, globalAdjustedEndYear, ud, qtext, wqkms, this.missKmFrom, this.missKmTo);
         results.addResult(result, problems);
 
         // Create the missing volume results
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java	Thu Jan 10 09:07:16 2019 +0100
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesTimeRangeDeterminationService.java	Thu Jan 10 11:56:39 2019 +0100
@@ -48,13 +48,25 @@
         }
     }
 
-    private static class GaugeInfoResult {
+    public static class GaugeInfoResult {
         protected final String globalErrorMsg;
         protected final List<GaugeInfo> gaugeInfos;
+        private final Date globalStartDate;
+        private final Date globalEndDate;
 
-        protected GaugeInfoResult(final List<GaugeInfo> gaugeInfos, final String globalErrorMsg) {
+        protected GaugeInfoResult(final List<GaugeInfo> gaugeInfos, final String globalErrorMsg, final Date min, final Date max) {
             this.gaugeInfos = gaugeInfos;
             this.globalErrorMsg = globalErrorMsg;
+            this.globalStartDate = min;
+            this.globalEndDate = max;
+        }
+
+        public int getGlobalEndYear() {
+            return getYearFromDate(this.globalEndDate);
+        }
+
+        public int getGlobalStartYear() {
+            return getYearFromDate(this.globalStartDate);
         }
 
         private static class GaugeInfo {
@@ -81,9 +93,10 @@
      *
      * @throws ServiceException
      */
-    private GaugeInfoResult getCommonTimeRangeForGauges(final List<Gauge> gauges, final Date startTime, final Date endTime, final CallMeta meta)
-            throws ServiceException {
+    public static GaugeInfoResult getCommonTimeRangeForGauges(final List<Gauge> gauges, final int startYear, final int endYear, final CallMeta meta) {
 
+        final Date startTime = getStartDateFromYear(startYear);
+        final Date endTime = getEndDateFromYear(endYear);
         // Query the gauge's daily Q values
         String globalErrorMsg = "";
         final List<GaugeInfoResult.GaugeInfo> gaugeResults = new ArrayList<>();
@@ -122,7 +135,7 @@
         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));
+                    .add(new GaugeInfoResult.GaugeInfo(gi.errorMsg, gi.gauge, gi.startdate != null ? min : null, gi.enddate != null ? max : null));
         }
         if (globalErrorMsg.isEmpty() && (min.getTime() > max.getTime()))
             globalErrorMsg = getMsg(meta, "bundu.wst.gauge_timeranges_disjoint");
@@ -132,12 +145,12 @@
         if (!globalErrorMsg.isEmpty())
             globalErrorMsg = new StringBuilder().append(globalErrorMsg).append("\n").append(getMsg(meta, "bundu.wst.gauge_no_ud_calc_available")).toString();
 
-        final GaugeInfoResult result = new GaugeInfoResult(gaugeResultsSecondTurn, globalErrorMsg);
+        final GaugeInfoResult result = new GaugeInfoResult(gaugeResultsSecondTurn, globalErrorMsg, min, max);
 
         return result;
     }
 
-    private String makeDoesNotCoverErrorMsg(final int startYear, final int endYear, final CallMeta meta) {
+    private static String makeDoesNotCoverErrorMsg(final int startYear, final int endYear, final CallMeta meta) {
         final String msgkey = "bundu.wst.range_does_not_cover";
         return Resources.getMsg(meta, msgkey, msgkey, startYear, endYear);
     }
@@ -147,8 +160,8 @@
         try {
             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:" + ROOT_NODE + "/art:startYear/text()");
-            final Date end = getRequestedEndYear(data, "/art:" + ROOT_NODE + "/art:endYear/text()");
+            final int start = getRequestedStartYear(data, "/art:" + ROOT_NODE + "/art:startYear/text()");
+            final int end = getRequestedEndYear(data, "/art:" + ROOT_NODE + "/art:endYear/text()");
 
             final GaugeInfoResult result = getCommonTimeRangeForGauges(gauges, start, end, callMeta);
 
@@ -160,7 +173,7 @@
         }
     }
 
-    public static final Date getRequestedEndYear(final Document data, final String XPATH_END_YEAR) throws MainValuesServiceException {
+    public static final int getRequestedEndYear(final Document data, final String XPATH_END_YEAR) throws MainValuesServiceException {
 
         final String endStr = XMLUtils.xpathString(data, XPATH_END_YEAR, ArtifactNamespaceContext.INSTANCE);
 
@@ -168,13 +181,7 @@
             throw new MainValuesServiceException("no end year"); // should not happen
 
         try {
-            final int year = Integer.parseInt(endStr);
-
-            // FIXME: timezone? probably must match timezone of database
-            final Calendar cal = Calendar.getInstance();
-            cal.clear();
-            cal.set(year, 11, 31);
-            return cal.getTime();
+            return Integer.parseInt(endStr);
         }
         catch (final NumberFormatException e) {
             e.printStackTrace();
@@ -182,7 +189,7 @@
         }
     }
 
-    public static final Date getRequestedStartYear(final Document data, final String XPATH_START_YEAR) throws MainValuesServiceException {
+    public static final int getRequestedStartYear(final Document data, final String XPATH_START_YEAR) throws MainValuesServiceException {
 
         final String startStr = XMLUtils.xpathString(data, XPATH_START_YEAR, ArtifactNamespaceContext.INSTANCE);
 
@@ -190,13 +197,7 @@
             throw new MainValuesServiceException("no start year");// should not happen
 
         try {
-            final int year = Integer.parseInt(startStr);
-
-            // FIXME: timezone? probably must match timezone of database
-            final Calendar cal = Calendar.getInstance();
-            cal.clear();
-            cal.set(year, 0, 1);
-            return cal.getTime();
+            return Integer.parseInt(startStr);
         }
         catch (final NumberFormatException e) {
             e.printStackTrace();
@@ -204,6 +205,30 @@
         }
     }
 
+    private static Integer getYearFromDate(final Date date) {
+        // FIXME: timezone? probably must match timezone of database
+        final Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.setTime(date);
+        return cal.get(Calendar.YEAR);
+    }
+
+    private static Date getEndDateFromYear(final int year) {
+        // FIXME: timezone? probably must match timezone of database
+        final Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(year, 11, 31);
+        return cal.getTime();
+    }
+
+    private static Date getStartDateFromYear(final int year) {
+        // FIXME: timezone? probably must match timezone of database
+        final Calendar cal = Calendar.getInstance();
+        cal.clear();
+        cal.set(year, 0, 1);
+        return cal.getTime();
+    }
+
     private Document buildDocument(final GaugeInfoResult result, final GlobalContext context, final CallMeta meta) {
 
         final Document doc = XMLUtils.newDocument();

http://dive4elements.wald.intevation.org