comparison gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java @ 12:4ebe57b170d3

Integration of moving through the Artifact-States and rendering the UI. gnv/trunk@91 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Tim Englich <tim.englich@intevation.de>
date Wed, 16 Sep 2009 07:44:26 +0000
parents 3cb753564552
children 2535158e2687
comparison
equal deleted inserted replaced
11:3cb753564552 12:4ebe57b170d3
27 import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; 27 import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException;
28 import de.intevation.gnv.artifactdatabase.objects.Artifact; 28 import de.intevation.gnv.artifactdatabase.objects.Artifact;
29 import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; 29 import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription;
30 import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; 30 import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory;
31 import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; 31 import de.intevation.gnv.artifactdatabase.objects.ArtifactObject;
32 import de.intevation.gnv.artifactdatabase.objects.InputParameter;
32 import de.intevation.gnv.util.XMLUtils; 33 import de.intevation.gnv.util.XMLUtils;
33 34
34 /** 35 /**
35 * @author Tim Englich <tim.englich@intevation.de> 36 * @author Tim Englich <tim.englich@intevation.de>
36 * 37 *
243 ArtifactObject currentArtifact) 244 ArtifactObject currentArtifact)
244 throws ArtifactDatabaseClientException { 245 throws ArtifactDatabaseClientException {
245 try { 246 try {
246 247
247 Document request = this.createDescribeRequestBody(currentArtifact); 248 Document request = this.createDescribeRequestBody(currentArtifact);
248 String url = ((ArtifactFactory)artifactFactory).getDataBaseUrl()+"/artifact/"+ currentArtifact.getId(); 249 String url = this.getArtifactUrl(artifactFactory, currentArtifact);
249 Document result = this.doGetRequest(url); 250 Document result = this.doGetRequest(url);
250 return this.readDescription(result,currentArtifact); 251 return this.readDescription(result,currentArtifact);
251 } catch (IOException e) { 252 } catch (IOException e) {
252 log.error(e,e); 253 log.error(e,e);
253 throw new ArtifactDatabaseClientException(e); 254 throw new ArtifactDatabaseClientException(e);
254 } 255 }
255 } 256 }
257
258 /**
259 * @param artifactFactory
260 * @param currentArtifact
261 * @return
262 */
263 private String getArtifactUrl(ArtifactObject artifactFactory,
264 ArtifactObject currentArtifact) {
265 String url = ((ArtifactFactory)artifactFactory).getDataBaseUrl()+"/artifact/"+ currentArtifact.getId();
266 return url;
267 }
256 268
257 private ArtifactDescription readDescription(Document document, ArtifactObject artifact) throws ArtifactDatabaseClientException{ 269 private ArtifactDescription readDescription(Document document, ArtifactObject artifact) throws ArtifactDatabaseClientException{
258 XMLUtils xmlUtils = new XMLUtils(); 270 XMLUtils xmlUtils = new XMLUtils();
259 if (artifact instanceof ArtifactDescription){ 271 if (artifact instanceof ArtifactDescription){
260 ArtifactDescription ad = (ArtifactDescription)artifact; 272 ArtifactDescription ad = (ArtifactDescription)artifact;
261 Node uiNode = xmlUtils.getNodeXPath(document, "/result/ui"); 273 Node uiNode = xmlUtils.getNodeXPath(document, "/result/ui");
262 uiNode = uiNode.getFirstChild(); 274 // uiNode = uiNode.getFirstChild();
263 Node outputNode = xmlUtils.getNodeXPath(document, "/result/outputs"); 275 Node outputNode = xmlUtils.getNodeXPath(document, "/result/outputs");
264 String currentState = xmlUtils.getStringXPath(document, "/result/state/@name"); 276 String currentState = xmlUtils.getStringXPath(document, "/result/state/@name");
265 NodeList statesList = xmlUtils.getNodeSetXPath(document, "/result/reachable-states/state/@name"); 277 NodeList statesList = xmlUtils.getNodeSetXPath(document, "/result/reachable-states/state/@name");
266 Collection<String> reachableStates = new ArrayList<String>(statesList.getLength()); 278 Collection<String> reachableStates = new ArrayList<String>(statesList.getLength());
267 for (int i = 0; i < statesList.getLength(); i++){ 279 for (int i = 0; i < statesList.getLength(); i++){
268 reachableStates.add(statesList.item(i).getNodeValue()); 280 reachableStates.add(statesList.item(i).getNodeValue());
281 }
282
283 NodeList inputNodes = xmlUtils.getNodeSetXPath(document, "/result/model/input");
284 if (inputNodes != null){
285 Collection<String> inputParameter = new ArrayList<String>(inputNodes.getLength());
286 for (int i = 0; i < inputNodes.getLength(); i++){
287 Node inputNode = inputNodes.item(i);
288 String name = xmlUtils.getStringXPath(inputNode, "@name");
289 inputParameter.add(name);
290 }
291 ad.setInputParameter(inputParameter);
269 } 292 }
270 293
271 ad.setCurrentOut(outputNode); 294 ad.setCurrentOut(outputNode);
272 ad.setCurrentUI(uiNode); 295 ad.setCurrentUI(uiNode);
273 ad.setCurrentState(currentState); 296 ad.setCurrentState(currentState);
278 throw new ArtifactDatabaseClientException("Artifact must be Instance of ArtifactDescription"); 301 throw new ArtifactDatabaseClientException("Artifact must be Instance of ArtifactDescription");
279 } 302 }
280 303
281 304
282 } 305 }
283 306
284 307 /**
285 308 * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doNextStep(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, de.intevation.gnv.artifactdatabase.objects.ArtifactObject, java.lang.String, java.util.Collection)
309 */
310 public ArtifactDescription doNextStep(ArtifactObject artifactFactory,
311 ArtifactObject currentArtifact, String target,
312 Collection<InputParameter> inputParameter)
313 throws ArtifactDatabaseClientException {
314
315 try {
316 // 1 Feed
317 Document feedDocument = this.createFeedRequestBody(currentArtifact, inputParameter);
318 String url = this.getArtifactUrl(artifactFactory, currentArtifact);
319 InputStream feedResult = this.doPostRequest(url, feedDocument);
320 // TODO feedResult auswerten und ggf. Fehler werfen.
321 // 2 Advance
322 Document advanceDocument = this.createAdvanceRequestBody(currentArtifact, target);
323 log.debug(new XMLUtils().writeDocument2String(advanceDocument));
324 InputStream advanceResult = this.doPostRequest(url, advanceDocument);
325 // TODO feedResult auswerten und ggf. Fehler werfen.
326 // 3 Descibe
327 return this.getCurrentStepDescription(artifactFactory, currentArtifact);
328 } catch (IOException e) {
329 log.error(e,e);
330 throw new ArtifactDatabaseClientException(e);
331 }
332 }
333
334 private Document createFeedRequestBody(ArtifactObject currentArtifact,
335 Collection<InputParameter> inputParameter){
336 Document document = new XMLUtils().newDocument();
337 Node rootNode = this.createRootNode(document);
338
339 Element typeNode = this.createArtifactElement(document, "type");
340 typeNode.setAttribute("name", "feed");
341 rootNode.appendChild(typeNode);
342
343 Element uuidNode = this.createArtifactElement(document, "uuid");
344 uuidNode.setAttribute("value", currentArtifact.getId());
345 rootNode.appendChild(uuidNode);
346
347 Element hashNode = this.createArtifactElement(document, "hash");
348 hashNode.setAttribute("value", currentArtifact.getHash());
349 rootNode.appendChild(hashNode);
350
351 Element dataNode = this.createArtifactElement(document, "data");
352 rootNode.appendChild(dataNode);
353 if (inputParameter != null){
354 Iterator<InputParameter> it = inputParameter.iterator();
355 while(it.hasNext()){
356 InputParameter ip = it.next();
357 String name = ip.getName();
358 String[] values = ip.getValues();
359 if (values != null){
360 for (int i = 0; i < values.length; i++){
361 String value = values[i];
362 Element inputNode = this.createArtifactElement(document, "input");
363 inputNode.setAttribute("name", name);
364 inputNode.setAttribute("value", value);
365 dataNode.appendChild(inputNode);
366 }
367 }
368 }
369 }
370
371
372 return document;
373 }
374
375 private Document createAdvanceRequestBody(ArtifactObject currentArtifact, String target){
376 Document document = new XMLUtils().newDocument();
377 Node rootNode = this.createRootNode(document);
378
379 Element typeNode = this.createArtifactElement(document, "type");
380 typeNode.setAttribute("name", "advance");
381 rootNode.appendChild(typeNode);
382
383 Element uuidNode = this.createArtifactElement(document, "uuid");
384 uuidNode.setAttribute("value", currentArtifact.getId());
385 rootNode.appendChild(uuidNode);
386
387 Element hashNode = this.createArtifactElement(document, "hash");
388 hashNode.setAttribute("value", currentArtifact.getHash());
389 rootNode.appendChild(hashNode);
390 Element targetNode = this.createArtifactElement(document, "target");
391 targetNode.setAttribute("name", target);
392 rootNode.appendChild(targetNode);
393 return document;
394 }
286 } 395 }

http://dive4elements.wald.intevation.org