Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/states/extreme/ExtremeQInput.java @ 4116:4ffeccc5b5a1
Initial GUI and state for per-segment Q-input for extreme valua analysis.
author | Felix Wolfsteller <felix.wolfsteller@intevation.de> |
---|---|
date | Fri, 12 Oct 2012 15:07:01 +0200 |
parents | |
children | 810db532803a |
comparison
equal
deleted
inserted
replaced
4115:0cc2c3d89a9d | 4116:4ffeccc5b5a1 |
---|---|
1 package de.intevation.flys.artifacts.states.extreme; | |
2 | |
3 import java.util.ArrayList; | |
4 import java.util.List; | |
5 import java.util.Comparator; | |
6 import java.util.Collections; | |
7 | |
8 import org.apache.log4j.Logger; | |
9 | |
10 import org.w3c.dom.Element; | |
11 | |
12 import de.intevation.artifacts.Artifact; | |
13 import de.intevation.artifacts.CallContext; | |
14 | |
15 import de.intevation.flys.artifacts.access.ExtremeAccess; | |
16 | |
17 import de.intevation.artifactdatabase.ProtocolUtils; | |
18 import de.intevation.artifactdatabase.data.StateData; | |
19 | |
20 import de.intevation.artifacts.common.utils.XMLUtils; | |
21 | |
22 import de.intevation.flys.artifacts.model.RiverFactory; | |
23 import de.intevation.flys.artifacts.model.WstValueTable; | |
24 import de.intevation.flys.model.Gauge; | |
25 import de.intevation.flys.artifacts.model.Range; | |
26 import de.intevation.flys.model.River; | |
27 import de.intevation.flys.model.Wst; | |
28 | |
29 import de.intevation.flys.artifacts.FLYSArtifact; | |
30 | |
31 import de.intevation.flys.artifacts.model.RangeWithValues; | |
32 import de.intevation.flys.artifacts.states.DefaultState; | |
33 import de.intevation.flys.artifacts.model.WstValueTableFactory; | |
34 import de.intevation.flys.utils.FLYSUtils; | |
35 | |
36 | |
37 /** TODO Subclass WQAdapted. */ | |
38 | |
39 /** | |
40 * State to input Q data in segments for extreme value calculations.. | |
41 * The data item ranges is expected to have this format <from1>;<to1>;<value1>:<from2>;<to2>;<value2>:... | |
42 * (;;;:;;;:;;;:...) | |
43 */ | |
44 public class ExtremeQInput extends DefaultState { | |
45 | |
46 /** The logger used in this state.*/ | |
47 private static Logger logger = Logger.getLogger(ExtremeQInput.class); | |
48 | |
49 | |
50 /** Trivial, empty constructor. */ | |
51 public ExtremeQInput() { | |
52 } | |
53 | |
54 | |
55 /** | |
56 * Create one element for each 'segment' of the selected river that | |
57 * is within the given kilometer range (TODO). Each element is a tuple of | |
58 * (from;to) where <i>from</i> is the lower bounds of the segment or the | |
59 * lower kilometer range. <i>to</i> is the upper bounds of the segment or | |
60 * the upper kilometer range. | |
61 * | |
62 * @param cr The ElementCreator. | |
63 * @param artifact The FLYS artifact. | |
64 * @param name The name of the data item. | |
65 * @param context The CallContext. | |
66 * | |
67 * @return a list of elements that consist of tuples of the intersected | |
68 * segments of the selected river. | |
69 */ | |
70 @Override | |
71 protected Element[] createItems( | |
72 XMLUtils.ElementCreator cr, | |
73 Artifact artifact, | |
74 String name, | |
75 CallContext context) | |
76 { | |
77 logger.debug("ExtremeQInput.createItems: " + name); | |
78 | |
79 FLYSArtifact flysArtifact = (FLYSArtifact) artifact; | |
80 | |
81 ExtremeAccess access = new ExtremeAccess(flysArtifact); | |
82 River river = RiverFactory.getRiver(access.getRiver()); | |
83 WstValueTable wstValueTable = WstValueTableFactory.getTable(river); | |
84 | |
85 List<Range> ranges = wstValueTable.findSegments(access.getFrom(), | |
86 access.getTo()); | |
87 | |
88 int num = ranges != null ? ranges.size() : 0; | |
89 | |
90 if (num == 0) { | |
91 logger.warn("Selected distance matches no segments."); | |
92 return null; | |
93 } | |
94 | |
95 List<Element> elements = new ArrayList<Element>(); | |
96 | |
97 for (Range range: ranges) { | |
98 elements.add(createItem( | |
99 cr, new String[] { range.getStart() + ";" + range.getEnd(), ""}, new double[] {0,100000})); | |
100 } | |
101 | |
102 Element[] els = new Element[elements.size()]; | |
103 | |
104 return elements.toArray(els); | |
105 } | |
106 | |
107 | |
108 /** Create sub-item ('row') of data thing. */ | |
109 protected Element createItem( | |
110 XMLUtils.ElementCreator cr, | |
111 Object obj, | |
112 double[] q | |
113 ) | |
114 { | |
115 Element item = ProtocolUtils.createArtNode(cr, "item", null, null); | |
116 Element label = ProtocolUtils.createArtNode(cr, "label", null, null); | |
117 Element value = ProtocolUtils.createArtNode(cr, "value", null, null); | |
118 | |
119 String[] arr = (String[]) obj; | |
120 | |
121 label.setTextContent(arr[0]); | |
122 value.setTextContent(arr[1]); | |
123 | |
124 item.appendChild(label); | |
125 item.appendChild(value); | |
126 | |
127 if (q != null) { | |
128 Element qRange = createRangeElement(cr, q, "Q"); | |
129 item.appendChild(qRange); | |
130 } | |
131 | |
132 return item; | |
133 } | |
134 | |
135 | |
136 /** | |
137 * Create elements to set min and max values of segments q (just min makes | |
138 * sense for extremes. | |
139 */ | |
140 protected Element createRangeElement( | |
141 XMLUtils.ElementCreator cr, | |
142 double[] mm, | |
143 String type) | |
144 { | |
145 Element range = ProtocolUtils.createArtNode( | |
146 cr, "range", | |
147 new String[] {"type"}, | |
148 new String[] {type}); | |
149 | |
150 Element min = ProtocolUtils.createArtNode(cr, "min", null, null); | |
151 min.setTextContent(String.valueOf(mm[0])); | |
152 | |
153 Element max = ProtocolUtils.createArtNode(cr, "max", null, null); | |
154 max.setTextContent(String.valueOf(mm[1])); | |
155 | |
156 range.appendChild(min); | |
157 range.appendChild(max); | |
158 | |
159 return range; | |
160 } | |
161 | |
162 | |
163 @Override | |
164 protected String getUIProvider() { | |
165 return "q_segmented_panel"; | |
166 } | |
167 | |
168 | |
169 /** Validate given data (return true). */ | |
170 @Override | |
171 public boolean validate(Artifact artifact) | |
172 throws IllegalArgumentException | |
173 { | |
174 logger.debug("ExtremeQInput.validate"); | |
175 | |
176 FLYSArtifact flys = (FLYSArtifact) artifact; | |
177 logger.debug("ExtremeQInput: " + getData(flys, "ranges")); | |
178 | |
179 /* | |
180 // TODO sort out what has to be validated (prevent negative values?). | |
181 RangeWithValues[] rwvs = extractInput(getData(flys, "ranges")); | |
182 | |
183 if (rwvs == null) { | |
184 throw new IllegalArgumentException("error_missing_wq_data"); | |
185 } | |
186 | |
187 List<Gauge> gauges = FLYSUtils.getGauges(flys); | |
188 River river = FLYSUtils.getRiver(flys); | |
189 Wst wst = WstFactory.getWst(river); | |
190 | |
191 for (Gauge gauge: gauges) { | |
192 Range range = gauge.getRange(); | |
193 double lower = range.getA().doubleValue(); | |
194 double upper = range.getB().doubleValue(); | |
195 | |
196 for (RangeWithValues rwv: rwvs) { | |
197 if (lower <= rwv.getStart() && upper >= rwv.getEnd()) { | |
198 compareQsWithGauge(wst, gauge, rwv.getValues()); | |
199 } | |
200 } | |
201 } | |
202 */ | |
203 | |
204 return true; | |
205 } | |
206 | |
207 | |
208 /** Form RangeWithValue-Array from state data. */ | |
209 protected RangeWithValues[] extractInput(StateData data) { | |
210 if (data == null) { | |
211 return null; | |
212 } | |
213 | |
214 String dataString = (String) data.getValue(); | |
215 String[] ranges = dataString.split(":"); | |
216 | |
217 List<RangeWithValues> rwv = new ArrayList<RangeWithValues>(); | |
218 | |
219 for (String range: ranges) { | |
220 String[] parts = range.split(";"); | |
221 | |
222 double lower = Double.parseDouble(parts[0]); | |
223 double upper = Double.parseDouble(parts[1]); | |
224 | |
225 String[] values = parts[2].split(","); | |
226 | |
227 int num = values.length; | |
228 double[] res = new double[num]; | |
229 | |
230 for (int i = 0; i < num; i++) { | |
231 try { | |
232 res[i] = Double.parseDouble(values[i]); | |
233 } | |
234 catch (NumberFormatException nfe) { | |
235 logger.warn(nfe, nfe); | |
236 } | |
237 } | |
238 | |
239 rwv.add(new RangeWithValues(lower, upper, res)); | |
240 } | |
241 | |
242 return rwv.toArray(new RangeWithValues[rwv.size()]); | |
243 } | |
244 } | |
245 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 : |