Mercurial > dive4elements > gnv-client
comparison gnv-artifacts/src/main/java/de/intevation/gnv/state/MeasurementState.java @ 634:58c32df1a44d
Improved the describe document so that we are able to render a measurement-parameter-matrix with these data.
gnv-artifacts/trunk@713 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Ingo Weinzierl <ingo.weinzierl@intevation.de> |
---|---|
date | Fri, 26 Feb 2010 13:53:05 +0000 |
parents | |
children | 1946c4e9a878 |
comparison
equal
deleted
inserted
replaced
633:7a136b99ad71 | 634:58c32df1a44d |
---|---|
1 package de.intevation.gnv.state; | |
2 | |
3 import de.intevation.artifacts.CallMeta; | |
4 import de.intevation.artifactdatabase.XMLUtils; | |
5 | |
6 import de.intevation.gnv.artifacts.ressource.RessourceFactory; | |
7 import de.intevation.gnv.geobackend.base.Result; | |
8 import de.intevation.gnv.geobackend.base.ResultDescriptor; | |
9 import de.intevation.gnv.state.describedata.ExtendedKeyValueData; | |
10 import de.intevation.gnv.state.describedata.KeyValueDescibeData; | |
11 import de.intevation.gnv.state.describedata.NamedArrayList; | |
12 import de.intevation.gnv.state.describedata.NamedCollection; | |
13 import de.intevation.gnv.transition.DefaultTransition; | |
14 | |
15 import java.util.ArrayList; | |
16 import java.util.Arrays; | |
17 import java.util.Collection; | |
18 import java.util.Iterator; | |
19 import java.util.List; | |
20 | |
21 import org.apache.log4j.Logger; | |
22 | |
23 import org.w3c.dom.Document; | |
24 import org.w3c.dom.Element; | |
25 import org.w3c.dom.Node; | |
26 | |
27 /** | |
28 * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) | |
29 */ | |
30 public class MeasurementState | |
31 extends DefaultState | |
32 { | |
33 private static Logger logger = Logger.getLogger(MeasurementState.class); | |
34 | |
35 public static final String SQL_KEY_PARAMETERID = "PARAMETERID"; | |
36 | |
37 | |
38 private class ParameterMatrix { | |
39 private final Logger logger = | |
40 Logger.getLogger(ParameterMatrix.class); | |
41 | |
42 private List measurements; | |
43 private List mDescriptions; | |
44 private List parameters; | |
45 private boolean[][] values; | |
46 | |
47 public ParameterMatrix(Collection data, String[] parameter) { | |
48 measurements = new ArrayList(data.size()); | |
49 mDescriptions = new ArrayList(data.size()); | |
50 parameters = new ArrayList(parameter.length); | |
51 | |
52 values = new boolean[data.size()][parameter.length]; | |
53 for (int i = 0; i < data.size(); i++) { | |
54 Arrays.fill(values[i], false); | |
55 } | |
56 | |
57 initParameters(parameter); | |
58 initMeasurements(data); | |
59 } | |
60 | |
61 private void initMeasurements(Collection data) { | |
62 Iterator iter = data.iterator(); | |
63 while (iter.hasNext()) { | |
64 ExtendedKeyValueData value = (ExtendedKeyValueData) iter.next(); | |
65 String key = value.getKey(); | |
66 String val = value.getValue(); | |
67 String parameter = value.getParameter(); | |
68 | |
69 int i = measurements.indexOf(key); | |
70 int j = parameters.indexOf(parameter); | |
71 int tmp = mDescriptions.indexOf(val); | |
72 | |
73 if (i < 0) { | |
74 measurements.add(key); | |
75 i = measurements.indexOf(key); | |
76 } | |
77 | |
78 if (j < 0) { | |
79 logger.warn("Not a valid parameter: " + parameter); | |
80 } | |
81 | |
82 if (tmp < 0) { | |
83 mDescriptions.add(val); | |
84 tmp = mDescriptions.indexOf(val); | |
85 } | |
86 | |
87 if (i >= 0 && i < measurements.size() && j >= 0 | |
88 && j < parameters.size()) | |
89 { | |
90 values[i][j] = true; | |
91 } | |
92 } | |
93 } | |
94 | |
95 private void initParameters(String[] parameter) { | |
96 int count = parameter.length; | |
97 for (int i = 0; i < count; i++) { | |
98 parameters.add(parameter[i]); | |
99 } | |
100 } | |
101 | |
102 public int measurementSize() { | |
103 if (measurements != null) | |
104 return measurements.size(); | |
105 | |
106 return 0; | |
107 } | |
108 | |
109 public int parameterSize() { | |
110 if (parameters != null) | |
111 return parameters.size(); | |
112 | |
113 return 0; | |
114 } | |
115 | |
116 public String getMeasurement(int idx) { | |
117 if (idx >= 0 && idx < measurements.size()) | |
118 return (String) measurements.get(idx); | |
119 | |
120 logger.warn("Index is out of bounds: " + idx); | |
121 return ""; | |
122 } | |
123 | |
124 public String getParameter(int idx) { | |
125 if (idx >= 0 && idx < parameters.size()) { | |
126 logger.debug("############### PARAM: " + parameters.get(idx)); | |
127 return (String) parameters.get(idx); | |
128 } | |
129 | |
130 logger.warn("Index is out of bounds: " + idx); | |
131 return ""; | |
132 } | |
133 | |
134 public String getMDescription(int idx) { | |
135 if (mDescriptions != null) { | |
136 return (String) mDescriptions.get(idx); | |
137 } | |
138 | |
139 return null; | |
140 } | |
141 | |
142 public boolean isValid(int i, int j) { | |
143 if (i < 0 || i > measurements.size() | |
144 || j < 0 || j > parameters.size()) | |
145 { | |
146 logger.warn("Index out of bounds: " + i + "|" + j); | |
147 return false; | |
148 } | |
149 | |
150 return values[i][j]; | |
151 } | |
152 } // End of ParameterMatrix | |
153 | |
154 | |
155 public MeasurementState() { | |
156 super(); | |
157 } | |
158 | |
159 @Override | |
160 protected NamedCollection<KeyValueDescibeData> extractKVP( | |
161 Collection<Result> result, | |
162 String keyid, | |
163 String valueid | |
164 ) { | |
165 NamedCollection<KeyValueDescibeData> kvdd = | |
166 new NamedArrayList<KeyValueDescibeData>(dataName, result.size()); | |
167 | |
168 kvdd.setMultiSelect(true); | |
169 | |
170 int keyPos = -1; | |
171 int valPos = -1; | |
172 int parPos = -1; | |
173 | |
174 for (Result res: result) { | |
175 if (keyPos < 0 || valPos < 0 || parPos < 0) { | |
176 ResultDescriptor rd = res.getResultDescriptor(); | |
177 | |
178 keyPos = rd.getColumnIndex(keyid); | |
179 valPos = rd.getColumnIndex(valueid); | |
180 parPos = rd.getColumnIndex(SQL_KEY_PARAMETERID); | |
181 } | |
182 | |
183 kvdd.add(new ExtendedKeyValueData( | |
184 res.getString(keyPos), | |
185 res.getString(valPos), | |
186 getID(), | |
187 res.getString(parPos))); | |
188 } | |
189 | |
190 return kvdd; | |
191 } | |
192 | |
193 | |
194 @Override | |
195 protected void appendToDynamicNode( | |
196 XMLUtils.ElementCreator artCreator, | |
197 XMLUtils.ElementCreator creator, | |
198 Document document, | |
199 Node dynamicNode, | |
200 CallMeta callMeta, | |
201 Object o | |
202 ) { | |
203 NamedArrayList all = (NamedArrayList) o; | |
204 String name = all.getName(); | |
205 RessourceFactory factory = RessourceFactory.getInstance(); | |
206 | |
207 Element matrixNode = creator.create("group"); | |
208 Element matrixLabel = creator.create("label"); | |
209 matrixLabel.setTextContent(factory.getRessource( | |
210 callMeta.getLanguages(), all.getName(), all.getName())); | |
211 creator.addAttr(matrixNode, "mode", "matrix"); | |
212 matrixNode.appendChild(matrixLabel); | |
213 | |
214 InputData inputParam = inputData.get("parameterid"); | |
215 ParameterMatrix matrix = new ParameterMatrix(all, inputParam.splitValue()); | |
216 | |
217 int measurements = matrix.measurementSize(); | |
218 int parameters = matrix.parameterSize(); | |
219 | |
220 for (int i = 0; i < measurements; i++) { | |
221 Element select = creator.create("select"); | |
222 creator.addAttr(select, "label", matrix.getMDescription(i)); | |
223 | |
224 for (int j = 0; j < parameters; j++) { | |
225 Element item = creator.create("item"); | |
226 Element label = creator.create("label"); | |
227 Element value = creator.create("value"); | |
228 | |
229 creator.addAttr(item, "ref", name); | |
230 creator.addAttr( | |
231 item, | |
232 "parameter", | |
233 inputParam.getDescription(matrix.getParameter(j))); | |
234 | |
235 if (!matrix.isValid(i, j)) { | |
236 creator.addAttr(item, "disabled", "true"); | |
237 } | |
238 else { | |
239 creator.addAttr(item, "disabled", "false"); | |
240 } | |
241 | |
242 label.setTextContent(matrix.getMDescription(i)); | |
243 value.setTextContent(matrix.getMeasurement(i)); | |
244 | |
245 item.appendChild(label); | |
246 item.appendChild(value); | |
247 select.appendChild(item); | |
248 } | |
249 | |
250 matrixNode.appendChild(select); | |
251 } | |
252 | |
253 dynamicNode.appendChild(matrixNode); | |
254 } | |
255 } | |
256 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: |