comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/WQKmsInterpolArtifact.java @ 3812:f788d2d901d6

merged flys-artifacts/pre2.6-2011-12-05
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 28 Sep 2012 12:14:53 +0200
parents f07d64d5cbe1
children e8fc770d2f8c
comparison
equal deleted inserted replaced
3808:5fab0fe3c445 3812:f788d2d901d6
1 package de.intevation.flys.artifacts;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import org.apache.log4j.Logger;
7
8 import org.w3c.dom.Document;
9
10 import de.intevation.artifactdatabase.state.Facet;
11 import de.intevation.artifactdatabase.state.DefaultOutput;
12 import de.intevation.artifactdatabase.state.State;
13
14 import de.intevation.artifacts.Artifact;
15 import de.intevation.artifacts.ArtifactFactory;
16 import de.intevation.artifacts.ArtifactNamespaceContext;
17 import de.intevation.artifacts.CallMeta;
18
19 import de.intevation.flys.artifacts.model.FacetTypes;
20 import de.intevation.flys.artifacts.model.WQKms;
21 import de.intevation.flys.artifacts.model.WQFacet;
22 import de.intevation.flys.artifacts.model.WKmsFactory;
23 import de.intevation.flys.artifacts.model.WQKmsFactory;
24 import de.intevation.flys.artifacts.model.WstValueTable;
25 import de.intevation.flys.artifacts.model.WstValueTableFactory;
26
27 import de.intevation.flys.artifacts.states.StaticState;
28 import de.intevation.flys.artifacts.resources.Resources;
29
30 import de.intevation.artifacts.common.utils.XMLUtils;
31
32 /**
33 * Artifact to access additional "waterlevel/discharge"-type of data, like
34 * fixation measurements, but doing so with costy interpolation.
35 *
36 * This artifact neglects (Static)FLYSArtifacts capabilities of interaction
37 * with the StateEngine by overriding the getState*-methods.
38 */
39 public class WQKmsInterpolArtifact
40 extends StaticFLYSArtifact
41 implements FacetTypes
42 {
43 /** The logger for this class. */
44 private static Logger logger =
45 Logger.getLogger(WQKmsInterpolArtifact.class);
46
47 /** XPath to access initial parameter. */
48 public static final String XPATH_DATA =
49 "/art:action/art:ids/@value";
50
51 public static final String STATIC_STATE_NAME =
52 "state.additional_wqkms.interpol.static";
53
54 /** One and only state to be in. */
55 protected transient State state = null;
56
57
58 /**
59 * Trivial Constructor.
60 */
61 public WQKmsInterpolArtifact() {
62 logger.debug("WQKmsInterpolArtifact.WQKmsInterpolArtifact");
63 }
64
65
66 /**
67 * Gets called from factory, to set things up.
68 */
69 @Override
70 public void setup(
71 String identifier,
72 ArtifactFactory factory,
73 Object context,
74 CallMeta callMeta,
75 Document data)
76 {
77 logger.debug("WQKmsInterpolArtifact.setup");
78
79 state = new StaticState(STATIC_STATE_NAME);
80
81 List<Facet> fs = new ArrayList<Facet>();
82 String code = XMLUtils.xpathString(
83 data, XPATH_DATA, ArtifactNamespaceContext.INSTANCE);
84
85 // TODO Go for JSON, one day.
86 //ex.: flood_protection-wstv-114-12
87 if (code != null) {
88 String [] parts = code.split("-");
89
90 if (parts.length >= 4) {
91 int wst = Integer.valueOf(parts[3]);
92 int col = -1;
93 String colpos = parts[2];
94 // Are we interested in a single column or in all columns?
95 if (colpos.equals("A")) {
96 ; // Take all.
97 }
98 else {
99 col = Integer.valueOf(colpos);
100 addStringData("col_pos", parts[2]);
101 }
102 addStringData("wst_id", parts[3]);
103 String wkmsName = (col > 0)
104 ? WKmsFactory.getWKmsName(col, wst)
105 : WKmsFactory.getWKmsName(wst);
106 String name;
107 if (parts[0].startsWith("height")){
108 name = STATIC_WQ_ANNOTATIONS;
109 }
110 else if (parts[0].startsWith("flood")) {
111 name = STATIC_WKMS_INTERPOL;
112 }
113 else {
114 name = STATIC_WQ;
115 }
116
117 Facet facet = new WQFacet(name,
118 Resources.getMsg(
119 callMeta,
120 wkmsName,
121 wkmsName));
122 fs.add(facet);
123 facets.put(state.getID(), fs);
124 }
125 }
126
127 spawnState();
128 super.setup(identifier, factory, context, callMeta, data);
129 }
130
131
132 /**
133 * Initialize the static state with output.
134 * @return static state
135 */
136 protected State spawnState() {
137 state = new StaticState(STATIC_STATE_NAME);
138 List<Facet> fs = facets.get(STATIC_STATE_NAME);
139 DefaultOutput output = new DefaultOutput(
140 "general",
141 "general",
142 "image/png",
143 fs,
144 "chart");
145
146 state.getOutputs().add(output);
147
148 return state;
149 }
150
151
152 /**
153 * Called via setup.
154 *
155 * @param artifact The master-artifact.
156 */
157 @Override
158 protected void initialize(
159 Artifact artifact,
160 Object context,
161 CallMeta meta)
162 {
163 logger.debug("WQKmsInterpolArtifact.initialize");
164 WINFOArtifact winfo = (WINFOArtifact) artifact;
165 importData(winfo, "river");
166 importData(winfo, "ld_locations");
167 }
168
169
170 /**
171 * Get a list containing the one and only State.
172 * @param context ignored.
173 * @return list with one and only state.
174 */
175 @Override
176 protected List<State> getStates(Object context) {
177 ArrayList<State> states = new ArrayList<State>();
178 states.add(getState());
179 return states;
180 }
181
182
183 /**
184 * Get WQ at a given km.
185 */
186 public double [][] getWQAtKm(double km) {
187
188 WstValueTable interpolator = null;
189 // Get WstValueTable
190 if (getDataAsString("col_pos") != null) {
191 interpolator = WstValueTableFactory.getWstColumnTable(
192 getDataAsInt("wst_id"), getDataAsInt("col_pos"));
193 }
194 else {
195 interpolator = WstValueTableFactory.getTable(
196 getDataAsInt("wst_id"));
197 }
198
199 double [][] vs = interpolator.interpolateWQColumnwise(
200 getDataAsDouble("ld_locations"));
201
202 for (int x = 0; x < vs[1].length; x++) {
203 logger.debug("getWQAtKm: Q/W " + vs[0][x] + " / " + vs[1][x]);
204 }
205
206 return vs;
207 }
208
209
210 /**
211 * Get a DataItem casted to int (0 if fails).
212 */
213 public int getDataAsInt(String dataName) {
214 String val = getDataAsString(dataName);
215 try {
216 return Integer.valueOf(val);
217 }
218 catch (NumberFormatException e) {
219 logger.warn("Could not get data " + dataName + " as int", e);
220 return 0;
221 }
222 }
223
224
225 /**
226 * Get a DataItem casted to double (0 if fails).
227 */
228 public double getDataAsDouble(String dataName) {
229 String val = getDataAsString(dataName);
230 try {
231 return Double.valueOf(val);
232 }
233 catch (NumberFormatException e) {
234 logger.warn("Could not get data " + dataName + " as double", e);
235 return 0;
236 }
237 }
238
239
240 /**
241 * Get the "current" state (there is but one).
242 * @param cc ignored.
243 * @return the "current" (only possible) state.
244 */
245 @Override
246 public State getCurrentState(Object cc) {
247 return getState();
248 }
249
250
251 /**
252 * Get the only possible state.
253 * @return the state.
254 */
255 protected State getState() {
256 return getState(null, null);
257 }
258
259
260 /**
261 * Get the state.
262 * @param context ignored.
263 * @param stateID ignored.
264 * @return the state.
265 */
266 @Override
267 protected State getState(Object context, String stateID) {
268 return (state != null)
269 ? state
270 : spawnState();
271 }
272
273
274 /**
275 * Get WQKms from factory.
276 * @param TODO idx param is not needed
277 * @return WQKms according to parameterization (can be null);
278 */
279 public WQKms getWQKms(int idx) {
280 logger.debug("WQKmsInterpolArtifact.getWQKms");
281 logger.warn("Stub, getWQKms not yet implemented.");
282
283 return WQKmsFactory.getWQKms(
284 Integer.valueOf(getDataAsString("col_pos")),
285 Integer.valueOf(getDataAsString("wst_id")));
286 }
287
288
289 /**
290 * Determines Facets initial disposition regarding activity (think of
291 * selection in Client ThemeList GUI). This will be checked one time
292 * when the facet enters a collections describe document.
293 *
294 * @param facetName name of the facet.
295 * @param index index of the facet.
296 *
297 * @return Always 0. Static Data will enter plots inactive.
298 */
299 @Override
300 public int getInitialFacetActivity(
301 String outputName,
302 String facetName,
303 int index)
304 {
305 return 0;
306 }
307 }
308 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :

http://dive4elements.wald.intevation.org