Mercurial > dive4elements > river
comparison artifacts/src/main/java/org/dive4elements/river/artifacts/services/DynamicMainValuesService.java @ 9404:bc9a45d2b1fa
common time range for gauges incl. error messages
author | gernotbelger |
---|---|
date | Wed, 15 Aug 2018 13:59:09 +0200 |
parents | 6ebc9357550c |
children | 4cccbd32b680 |
comparison
equal
deleted
inserted
replaced
9403:e2da9c8a7c57 | 9404:bc9a45d2b1fa |
---|---|
14 import java.util.ArrayList; | 14 import java.util.ArrayList; |
15 import java.util.Calendar; | 15 import java.util.Calendar; |
16 import java.util.Date; | 16 import java.util.Date; |
17 import java.util.List; | 17 import java.util.List; |
18 | 18 |
19 import org.dive4elements.artifacts.CallMeta; | |
20 import org.dive4elements.artifacts.GlobalContext; | |
21 import org.dive4elements.artifacts.common.ArtifactNamespaceContext; | |
22 import org.dive4elements.artifacts.common.utils.DateUtils; | 19 import org.dive4elements.artifacts.common.utils.DateUtils; |
23 import org.dive4elements.artifacts.common.utils.XMLUtils; | |
24 import org.dive4elements.river.backend.SessionHolder; | 20 import org.dive4elements.river.backend.SessionHolder; |
25 import org.dive4elements.river.model.Gauge; | 21 import org.dive4elements.river.model.Gauge; |
26 import org.dive4elements.river.model.MainValue; | 22 import org.dive4elements.river.model.MainValue; |
27 import org.dive4elements.river.model.MainValueType; | 23 import org.dive4elements.river.model.MainValueType; |
28 import org.dive4elements.river.model.MainValueType.MainValueTypeKey; | 24 import org.dive4elements.river.model.MainValueType.MainValueTypeKey; |
32 import org.dive4elements.river.model.TimeInterval; | 28 import org.dive4elements.river.model.TimeInterval; |
33 import org.dive4elements.river.model.sinfo.DailyDischargeValue; | 29 import org.dive4elements.river.model.sinfo.DailyDischargeValue; |
34 import org.dive4elements.river.model.sinfo.DailyDischargeValue.OrderByField; | 30 import org.dive4elements.river.model.sinfo.DailyDischargeValue.OrderByField; |
35 import org.dive4elements.river.utils.DoubleUtil; | 31 import org.dive4elements.river.utils.DoubleUtil; |
36 import org.hibernate.Session; | 32 import org.hibernate.Session; |
37 import org.w3c.dom.Document; | |
38 | 33 |
39 import gnu.trove.TDoubleArrayList; | 34 import gnu.trove.TDoubleArrayList; |
40 | 35 |
41 /** | 36 /** |
42 * This service returns the main values of a river's gauge based on the start | 37 * This service returns the main values of a river's gauge based on the start |
43 * and end point of the river. | 38 * and end point of the river. |
44 * | 39 * |
45 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | 40 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> |
46 */ | 41 */ |
47 public class DynamicMainValuesService extends AbstractMainValuesService { | 42 public class DynamicMainValuesService extends AbstractDynamicMainValuesService { |
48 | 43 |
49 private static final long serialVersionUID = 1L; | 44 private static final long serialVersionUID = 1L; |
50 | 45 |
51 private static final String XPATH_START_YEAR = "/art:mainvalues/art:startYear/text()"; | 46 /** |
52 | 47 * Computes a gauge's main values for a period of time based on its daily discharges stored in the database |
53 private static final String XPATH_END_YEAR = "/art:mainvalues/art:endYear/text()"; | 48 */ |
54 | |
55 @Override | 49 @Override |
56 public Document doProcess(final Document data, final GlobalContext context, final CallMeta callMeta) { | |
57 try { | |
58 | |
59 final River river = getRequestedRiver(data); | |
60 final Gauge gauge = getRequestedGauge(data, river); | |
61 final Date startTime = getRequestedStartYear(data); | |
62 final Date endTime = getRequestedEndYear(data); | |
63 | |
64 final List<MainValue> mainValues = getMainValues(river, gauge, startTime, endTime); | |
65 | |
66 return buildDocument(river, gauge, mainValues, context); | |
67 } | |
68 catch (final MainValuesServiceException e) { | |
69 // e.printStackTrace(); | |
70 return error(e.getMessage()); | |
71 } | |
72 catch (final Exception e) { | |
73 e.printStackTrace(); | |
74 return error(e.getMessage()); | |
75 } | |
76 } | |
77 | |
78 private Date getRequestedStartYear(final Document data) throws MainValuesServiceException { | |
79 | |
80 final String startStr = XMLUtils.xpathString(data, XPATH_START_YEAR, ArtifactNamespaceContext.INSTANCE); | |
81 | |
82 if (startStr == null) | |
83 throw new MainValuesServiceException("no start year"); | |
84 | |
85 try { | |
86 final int year = Integer.parseInt(startStr); | |
87 final Calendar cal = Calendar.getInstance(); | |
88 cal.clear(); | |
89 cal.set(year, 0, 1); | |
90 return cal.getTime(); | |
91 } | |
92 catch (final NumberFormatException e) { | |
93 e.printStackTrace(); | |
94 throw new MainValuesServiceException("invalid start year"); | |
95 } | |
96 } | |
97 | |
98 private Date getRequestedEndYear(final Document data) throws MainValuesServiceException { | |
99 | |
100 final String endStr = XMLUtils.xpathString(data, XPATH_END_YEAR, ArtifactNamespaceContext.INSTANCE); | |
101 | |
102 if (endStr == null) | |
103 throw new MainValuesServiceException("no end year"); | |
104 | |
105 try { | |
106 final int year = Integer.parseInt(endStr); | |
107 final Calendar cal = Calendar.getInstance(); | |
108 cal.clear(); | |
109 cal.set(year, 11, 31); | |
110 return cal.getTime(); | |
111 } | |
112 catch (final NumberFormatException e) { | |
113 e.printStackTrace(); | |
114 throw new MainValuesServiceException("invalid end year"); | |
115 } | |
116 } | |
117 | |
118 /** | |
119 * Computes a gauge's main values for a period of time based on its daily discharges stored in the database | |
120 */ | |
121 protected List<MainValue> getMainValues(final River river, final Gauge gauge, final Date startTime, final Date endTime) throws MainValuesServiceException { | 50 protected List<MainValue> getMainValues(final River river, final Gauge gauge, final Date startTime, final Date endTime) throws MainValuesServiceException { |
122 | 51 |
123 final List<MainValue> mainValues = new ArrayList<>(); | 52 final List<MainValue> mainValues = new ArrayList<>(); |
124 computeMainDischargeValues(gauge, startTime, endTime, mainValues); | 53 computeMainDischargeValues(gauge, startTime, endTime, mainValues); |
125 return mainValues; | 54 return mainValues; |
133 | 62 |
134 // Query the gauge's daily Q values | 63 // Query the gauge's daily Q values |
135 final List<DailyDischargeValue> qdvs = DailyDischargeValue.getValues(gauge, startTime, endTime, OrderByField.DAY); | 64 final List<DailyDischargeValue> qdvs = DailyDischargeValue.getValues(gauge, startTime, endTime, OrderByField.DAY); |
136 if (qdvs.isEmpty()) | 65 if (qdvs.isEmpty()) |
137 throw new MainValuesServiceException("no daily discharge values for gauge " + gauge.getName() + " in the requested time period"); | 66 throw new MainValuesServiceException("no daily discharge values for gauge " + gauge.getName() + " in the requested time period"); |
138 // return; // TODO Fehlermeldung | 67 // return; |
139 | 68 |
140 // Build yearly aggregates | 69 // Build yearly aggregates |
141 final TDoubleArrayList mnqs = new TDoubleArrayList(); | 70 final TDoubleArrayList mnqs = new TDoubleArrayList(); |
142 final TDoubleArrayList mqs = new TDoubleArrayList(); | 71 final TDoubleArrayList mqs = new TDoubleArrayList(); |
143 int mqcnt = 0; | 72 int mqcnt = 0; |
150 mhqs.set(j, Math.max(mhqs.get(j), qdv.getDischarge().doubleValue())); | 79 mhqs.set(j, Math.max(mhqs.get(j), qdv.getDischarge().doubleValue())); |
151 mqs.set(j, mqs.get(j) + qdv.getDischarge().doubleValue()); | 80 mqs.set(j, mqs.get(j) + qdv.getDischarge().doubleValue()); |
152 mqcnt++; | 81 mqcnt++; |
153 if (i == qdvs.size() - 1) | 82 if (i == qdvs.size() - 1) |
154 mqs.set(j, mqs.get(j) / mqcnt); | 83 mqs.set(j, mqs.get(j) / mqcnt); |
155 } | 84 } else { |
156 else { | |
157 // Complete mq aggregation | 85 // Complete mq aggregation |
158 if (mqcnt >= 1) { | 86 if (mqcnt >= 1) { |
159 mqs.set(j, mqs.get(j) / mqcnt); | 87 mqs.set(j, mqs.get(j) / mqcnt); |
160 j++; | 88 j++; |
161 } | 89 } |