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 }

http://dive4elements.wald.intevation.org