001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wps/execute/ExecuteRequest.java $ 002 /*---------------------------------------------------------------------------- 003 This file is part of deegree, http://deegree.org/ 004 Copyright (C) 2001-2009 by: 005 Department of Geography, University of Bonn 006 and 007 lat/lon GmbH 008 009 This library is free software; you can redistribute it and/or modify it under 010 the terms of the GNU Lesser General Public License as published by the Free 011 Software Foundation; either version 2.1 of the License, or (at your option) 012 any later version. 013 This library is distributed in the hope that it will be useful, but WITHOUT 014 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 015 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 016 details. 017 You should have received a copy of the GNU Lesser General Public License 018 along with this library; if not, write to the Free Software Foundation, Inc., 019 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 020 021 Contact information: 022 023 lat/lon GmbH 024 Aennchenstr. 19, 53177 Bonn 025 Germany 026 http://lat-lon.de/ 027 028 Department of Geography, University of Bonn 029 Prof. Dr. Klaus Greve 030 Postfach 1147, 53001 Bonn 031 Germany 032 http://www.geographie.uni-bonn.de/deegree/ 033 034 e-mail: info@deegree.org 035 ----------------------------------------------------------------------------*/ 036 037 package org.deegree.ogcwebservices.wps.execute; 038 039 import static org.deegree.ogcbase.CommonNamespaces.OWSNS; 040 041 import java.net.MalformedURLException; 042 import java.net.URI; 043 import java.net.URISyntaxException; 044 import java.net.URL; 045 import java.util.ArrayList; 046 import java.util.HashMap; 047 import java.util.List; 048 import java.util.Map; 049 050 import org.deegree.datatypes.Code; 051 import org.deegree.datatypes.values.TypedLiteral; 052 import org.deegree.framework.log.ILogger; 053 import org.deegree.framework.log.LoggerFactory; 054 import org.deegree.framework.xml.NamespaceContext; 055 import org.deegree.framework.xml.XMLParsingException; 056 import org.deegree.framework.xml.XMLTools; 057 import org.deegree.model.crs.CRSFactory; 058 import org.deegree.model.crs.CoordinateSystem; 059 import org.deegree.model.crs.UnknownCRSException; 060 import org.deegree.model.feature.GMLFeatureCollectionDocument; 061 import org.deegree.model.spatialschema.Envelope; 062 import org.deegree.model.spatialschema.GeometryFactory; 063 import org.deegree.ogcbase.CommonNamespaces; 064 import org.deegree.ogcwebservices.InvalidParameterValueException; 065 import org.deegree.ogcwebservices.MissingParameterValueException; 066 import org.deegree.ogcwebservices.OGCWebServiceException; 067 import org.deegree.ogcwebservices.OperationNotSupportedException; 068 import org.deegree.ogcwebservices.wps.WPSRequestBaseType; 069 import org.deegree.ogcwebservices.wps.execute.IOValue.ComplexValueReference; 070 import org.w3c.dom.Element; 071 072 /** 073 * ExecuteRequest.java 074 * 075 * Created on 09.03.2006. 23:16:00h 076 * 077 * WPS Execute operation request, to execute one identified Process. If a process is to be run multiple times, each run 078 * shall be submitted as a separate Execute request. 079 * 080 * 081 * @author <a href="mailto:christian@kiehle.org">Christian Kiehle</a> 082 * @author <a href="mailto:christian.heier@gmx.de">Christian Heier</a> 083 * @author last edited by: $Author: mschneider $ 084 * 085 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $ 086 */ 087 public class ExecuteRequest extends WPSRequestBaseType { 088 089 /** 090 * 091 */ 092 private static final long serialVersionUID = -2943128923230930885L; 093 094 private static ILogger LOG = LoggerFactory.getLogger( ExecuteRequest.class ); 095 096 private static NamespaceContext nsContext = CommonNamespaces.getNamespaceContext(); 097 098 /** 099 * @param version 100 * @param id 101 * @param vendorSpecificParameter 102 * @param inputs 103 * @param identifier 104 * @param definitions 105 * @param status 106 * @param store 107 */ 108 public ExecuteRequest( String version, String id, Map<String, String> vendorSpecificParameter, 109 ExecuteDataInputs inputs, Code identifier, OutputDefinitions definitions, boolean status, 110 boolean store ) { 111 super( version, id, vendorSpecificParameter ); 112 113 dataInputs = inputs; 114 this.identifier = identifier; 115 outputDefinitions = definitions; 116 this.status = status; 117 this.store = store; 118 } 119 120 /** 121 * Identifier of the Process to be executed. This Process identifier shall be as listed in the ProcessOfferings 122 * section of the WPS Capabilities document. 123 */ 124 protected Code identifier; 125 126 /** 127 * List of input (or parameter) values provided to the process, including each of the Inputs needed to execute the 128 * process. It is possible to have no inputs provided only when all the inputs are predetermined fixed resources. In 129 * all other cases, at least one input is required. 130 */ 131 protected ExecuteDataInputs dataInputs; 132 133 /** 134 * List of definitions of the outputs (or parameters) requested from the process. These outputs are not normally 135 * identified, unless the client is specifically requesting a limited subset of outputs, and/or is requesting output 136 * formats and/or schemas and/or encodings different from the defaults and selected from the alternatives identified 137 * in the process description, or wishes to customize the descriptive information about the output. 138 */ 139 protected OutputDefinitions outputDefinitions; 140 141 /** 142 * Specifies if the Execute operation response shall be returned quickly with status information, or not returned 143 * until process execution is complete. This parameter shall not be included unless the corresponding 144 * "statusSupported" parameter is included and is "true" in the ProcessDescription for this process. 145 */ 146 protected boolean status; 147 148 /** 149 * Specifies if the complex valued output(s) of this process should be stored by the process as web-accessible 150 * resources. If store is "true", the server shall store all the complex valued output(s) of the process so that the 151 * client can retrieve them as required. If store is "false", all the complex valued output(s) shall be encoded in 152 * the Execute operation response. This parameter shall not be included unless the corresponding "storeSupported" 153 * parameter is included and is "true" in the ProcessDescription for this process. 154 */ 155 protected boolean store; 156 157 /** 158 * @return Returns the identifier. 159 */ 160 public Code getIdentifier() { 161 return identifier; 162 } 163 164 /** 165 * @return Returns the dataInputs. 166 */ 167 public ExecuteDataInputs getDataInputs() { 168 return dataInputs; 169 } 170 171 /** 172 * @return Returns the outputDefinitions. 173 */ 174 public OutputDefinitions getOutputDefinitions() { 175 return outputDefinitions; 176 } 177 178 /** 179 * @return true if status is set. 180 */ 181 public boolean isStatus() { 182 return status; 183 } 184 185 /** 186 * @return true if can store 187 */ 188 public boolean isStore() { 189 return store; 190 } 191 192 /** 193 * 194 * KVP-encoded transfer of the execute operation request is not supported. 195 * 196 * @see "OGC 05-007r4 Subclause 10.2.2" 197 * @param map 198 * @return the Execute request created from the map. 199 * @throws OGCWebServiceException 200 * 201 */ 202 public static ExecuteRequest create( Map<String, String> map ) 203 throws OGCWebServiceException { 204 String msg = "KVP-encoded transfer of the execute operation request is not supported."; 205 LOG.logError( msg ); 206 throw new OperationNotSupportedException( msg ); 207 } 208 209 /** 210 * 211 * @param id 212 * @param executeNode 213 * @return the ExcuteRequest wrapper for the xml encoded request. 214 * @throws OGCWebServiceException 215 * @throws MissingParameterValueException 216 * @throws InvalidParameterValueException 217 */ 218 public static ExecuteRequest create( String id, Element executeNode ) 219 throws OGCWebServiceException, MissingParameterValueException, 220 InvalidParameterValueException { 221 222 // get attribute version from <wps:Execute> Node 223 String version = getVersion( executeNode ); 224 225 // get attribute status from <wps:Execute> Node 226 boolean status = getStatus( executeNode ); 227 228 // get attribute store from <wps:Execute> Node 229 boolean store = getStore( executeNode ); 230 231 Map<String, String> vendorSpecificParameters = null; 232 233 // get <ows:Identifier> from <wps:Execute> Node 234 Code identifier = getIdentifier( executeNode ); 235 236 // get <wps:DataInputs> from <wps:Execute> Node 237 ExecuteDataInputs dataInputs = getDataInputs( executeNode ); 238 239 // get <wps:OutputDefinitions> from <wps:Execute> Node 240 OutputDefinitions outputDefinitions = getOutputDefinitions( executeNode ); 241 242 return new ExecuteRequest( version, id, vendorSpecificParameters, dataInputs, identifier, outputDefinitions, 243 status, store ); 244 } 245 246 /** 247 * 248 * @param executeNode 249 * @return version 250 * @throws InvalidParameterValueException 251 * @throws MissingParameterValueException 252 */ 253 private static final String getVersion( Element executeNode ) 254 throws InvalidParameterValueException, MissingParameterValueException { 255 String version = null; 256 try { 257 version = XMLTools.getRequiredAttrValue( "version", null, executeNode ); 258 } catch ( XMLParsingException xmlex ) { 259 String msg = "Operation Request does not include parameter value and this server did not declare a default value for that parameter."; 260 LOG.logDebug( msg ); 261 throw new MissingParameterValueException( "Version", msg ); 262 } 263 if ( "".equals( version ) ) { 264 String msg = "Operation Request contains an invalid parameter value"; 265 LOG.logDebug( msg ); 266 throw new InvalidParameterValueException( "Version", msg ); 267 } 268 if ( !supportedVersion.equals( version ) ) { 269 String msg = "Operation Request contains an invalid parameter value"; 270 LOG.logDebug( msg ); 271 throw new InvalidParameterValueException( "Version", msg ); 272 } 273 return version; 274 } 275 276 /** 277 * 278 * @param executeNode 279 * @return status 280 * @throws InvalidParameterValueException 281 */ 282 private static final boolean getStatus( Element executeNode ) 283 throws InvalidParameterValueException { 284 boolean status = false; 285 String statusString = XMLTools.getAttrValue( executeNode, null, "status", null ); 286 if ( null != statusString ) { 287 if ( "true".equalsIgnoreCase( statusString ) || "false".equalsIgnoreCase( statusString ) ) { 288 status = new Boolean( statusString ); 289 } else { 290 String msg = "Operation Request contains an invalid parameter value"; 291 LOG.logDebug( msg ); 292 throw new InvalidParameterValueException( "status", msg ); 293 } 294 } 295 return status; 296 } 297 298 /** 299 * 300 * @param executeNode 301 * @return store 302 * @throws InvalidParameterValueException 303 */ 304 private static final boolean getStore( Element executeNode ) 305 throws InvalidParameterValueException { 306 boolean store = false; 307 String storeString = XMLTools.getAttrValue( executeNode, null, "store", null ); 308 if ( null != storeString ) { 309 if ( "true".equalsIgnoreCase( storeString ) || "false".equalsIgnoreCase( storeString ) ) { 310 store = new Boolean( storeString ); 311 } else { 312 String msg = "Operation Request contains an invalid parameter value"; 313 LOG.logDebug( msg ); 314 throw new InvalidParameterValueException( "store", msg ); 315 } 316 } 317 return store; 318 } 319 320 /** 321 * 322 * @param e 323 * @return identifier 324 * @throws InvalidParameterValueException 325 * @throws MissingParameterValueException 326 */ 327 private static Code getIdentifier( Element e ) 328 throws InvalidParameterValueException, MissingParameterValueException { 329 // Get required node <ows:Identifier> 330 String identifierAsString = null; 331 332 try { 333 identifierAsString = XMLTools.getRequiredNodeAsString( e, "ows:Identifier/text()", nsContext ); 334 } catch ( XMLParsingException ex ) { 335 String msg = "Operation Request does not include parameter value and this server did not declare a default value for that parameter."; 336 LOG.logDebug( msg ); 337 throw new MissingParameterValueException( "Identifier", msg ); 338 } 339 340 if ( "".equals( identifierAsString ) ) { 341 String msg = "Operation Request contains an invalid parameter value"; 342 LOG.logDebug( msg ); 343 throw new InvalidParameterValueException( "Identifier", msg ); 344 } 345 return new Code( identifierAsString, null ); 346 } 347 348 /** 349 * 350 * @param executeNode 351 * @return dataInputs 352 * @throws MissingParameterValueException 353 * @throws InvalidParameterValueException 354 */ 355 @SuppressWarnings("unchecked") 356 private static ExecuteDataInputs getDataInputs( Element executeNode ) 357 throws MissingParameterValueException, InvalidParameterValueException { 358 // Get optional node <DataInputs> 359 ExecuteDataInputs dataInputs = null; 360 try { 361 Element dataInputsNode = (Element) XMLTools.getNode( executeNode, "wps:DataInputs", nsContext ); 362 363 // dataInputsNode may be null, if not null, at least one <Input> has 364 // to be defined 365 if ( null != dataInputsNode ) { 366 LOG.logInfo( "DataInputs: " + dataInputsNode ); 367 List dataInputNodeList = XMLTools.getNodes( dataInputsNode, "wps:Input", nsContext ); 368 369 if ( null != dataInputNodeList && 0 != dataInputNodeList.size() ) { 370 dataInputs = new ExecuteDataInputs(); 371 int size = dataInputNodeList.size(); 372 HashMap inputs = new HashMap<String, IOValue>( size ); 373 for ( int i = 0; i < size; i++ ) { 374 IOValue ioValue = getIOValue( (Element) dataInputNodeList.get( i ) ); 375 376 inputs.put( ioValue.getIdentifier().getCode(), ioValue ); 377 } 378 dataInputs.setInputs( inputs ); 379 } else { 380 throw new MissingParameterValueException( "Input", 381 "If DataInputs node provided, at least one input node has to be defined." ); 382 } 383 } 384 } catch ( XMLParsingException ex ) { 385 String msg = "Optional node DataInputs not declared"; 386 LOG.logDebug( msg ); 387 } 388 389 return dataInputs; 390 } 391 392 /** 393 * 394 * @param inputNode 395 * @return IOValue 396 * @throws InvalidParameterValueException 397 * @throws MissingParameterValueException 398 */ 399 private static IOValue getIOValue( Element inputNode ) 400 throws InvalidParameterValueException, MissingParameterValueException { 401 Code identifier = getIdentifier( inputNode ); 402 String title = getTitle( inputNode ); 403 String _abstract = getAbstract( inputNode ); 404 Envelope boundingBox = getBoundingBox( inputNode ); 405 ComplexValue complexValue = getComplexValue( inputNode ); 406 ComplexValueReference complexValueReference = getValueReference( inputNode ); 407 TypedLiteral literalValue = getLiteralValue( inputNode ); 408 409 return new IOValue( identifier, title, _abstract, boundingBox, complexValue, complexValueReference, 410 literalValue ); 411 } 412 413 /** 414 * 415 * @param e 416 * @return title 417 * @throws MissingParameterValueException 418 * @throws InvalidParameterValueException 419 */ 420 private static String getTitle( Element e ) 421 throws MissingParameterValueException, InvalidParameterValueException { 422 String title; 423 try { 424 title = XMLTools.getRequiredNodeAsString( e, "ows:Title/text()", nsContext ); 425 } catch ( XMLParsingException ex ) { 426 String msg = "Operation Request does not include parameter value and this server did not declare a default value for that parameter."; 427 throw new MissingParameterValueException( "Title", msg ); 428 } 429 430 if ( "".equals( title ) ) { 431 throw new InvalidParameterValueException( "Title", "Operation Request contains an invalid parameter Value" ); 432 } 433 return title; 434 } 435 436 /** 437 * 438 * @param e 439 * @return abstact 440 */ 441 private static String getAbstract( Element e ) { 442 String _abstract = null; 443 try { 444 _abstract = XMLTools.getNodeAsString( e, "ows:Abstract/text()", nsContext, null ); 445 } catch ( XMLParsingException ex ) { 446 // optional Node 447 } 448 return _abstract; 449 } 450 451 /** 452 * 453 * @param e 454 * @return boundingBox 455 * @throws MissingParameterValueException 456 * @throws InvalidParameterValueException 457 */ 458 private static Envelope getBoundingBox( Element e ) 459 throws MissingParameterValueException, InvalidParameterValueException { 460 Envelope boundingBox = null; 461 462 try { 463 Element boundingBoxValueNode = (Element) XMLTools.getNode( e, "wps:BoundingBoxValue", nsContext ); 464 465 if ( null != boundingBoxValueNode ) { 466 double minX = 0; 467 double minY = 0; 468 double maxX = 0; 469 double maxY = 0; 470 String crsName = null; 471 String crs = null; 472 try { 473 crs = XMLTools.getRequiredNodeAsString( boundingBoxValueNode, "@crs", nsContext ); 474 String lowerCornerValue = XMLTools.getRequiredNodeAsString( boundingBoxValueNode, 475 "ows:LowerCorner/text()", nsContext ); 476 String[] lowerCornerValues = lowerCornerValue.split( " " ); 477 if ( lowerCornerValues.length != 2 ) { 478 throw new InvalidParameterValueException( "lowerCornerNode", "Two parameters are mandatory." ); 479 } 480 minX = Double.parseDouble( lowerCornerValues[0] ); 481 minY = Double.parseDouble( lowerCornerValues[1] ); 482 } catch ( XMLParsingException ex ) { 483 throw new MissingParameterValueException( 484 "LowerCornerNode", 485 "Operation Request does not include " 486 + "parameter value and this server did " 487 + "not declare a default value for that " 488 + "parameter." ); 489 } 490 try { 491 String upperCornerValue = XMLTools.getRequiredNodeAsString( boundingBoxValueNode, 492 "ows:UpperCorner/text()", nsContext ); 493 String[] upperCornerValues = upperCornerValue.split( " " ); 494 if ( upperCornerValues.length != 2 ) { 495 throw new InvalidParameterValueException( "upperCornerNode", "Two parameters are mandatory." ); 496 } 497 maxX = Double.parseDouble( upperCornerValues[0] ); 498 maxY = Double.parseDouble( upperCornerValues[1] ); 499 } catch ( XMLParsingException ex ) { 500 throw new MissingParameterValueException( 501 "LowerCornerNode", 502 "Operation Request does not include parameter value and this server did not declare a default value for that parameter." ); 503 } 504 505 crsName = crs.substring( 16 ); 506 507 CoordinateSystem cs; 508 try { 509 cs = CRSFactory.create( crsName ); 510 } catch ( UnknownCRSException e1 ) { 511 throw new InvalidParameterValueException( ExecuteRequest.class.getName(), e1.getMessage() ); 512 } 513 514 boundingBox = GeometryFactory.createEnvelope( minX, minY, maxX, maxY, cs ); 515 } 516 } catch ( XMLParsingException ex ) { 517 // optionalNode 518 } 519 return boundingBox; 520 } 521 522 /** 523 * 524 * @param e 525 * @return complexValue 526 * @throws InvalidParameterValueException 527 */ 528 private static ComplexValue getComplexValue( Element e ) 529 throws InvalidParameterValueException { 530 ComplexValue complexValue = null; 531 532 try { 533 Element complexValueNode = (Element) XMLTools.getNode( e, "wps:ComplexValue", nsContext ); 534 if ( null != complexValueNode ) { 535 String format = null; 536 URI encoding = null; 537 URL schema = null; 538 Object value = null; 539 try { 540 541 format = complexValueNode.getAttribute( "format" ); 542 if ( null != format ) { 543 if ( "".equals( format ) ) { 544 throw new InvalidParameterValueException( "ComplexValue", 545 "Attribute format must not be empty if provided." ); 546 547 } 548 } 549 String enc = complexValueNode.getAttribute( "encoding" ); 550 if ( null != enc ) { 551 if ( "".equals( enc ) ) { 552 throw new InvalidParameterValueException( "ComplexValue", 553 "Attribute encoding must not be empty if provided." ); 554 } 555 encoding = new URI( enc ); 556 } 557 558 String scheme = complexValueNode.getAttribute( "schema" ); 559 if ( null != scheme ) { 560 if ( "".equals( scheme ) ) { 561 throw new InvalidParameterValueException( "ComplexValue", 562 "Attribute schema must not be empty if provided." ); 563 } 564 schema = new URL( scheme ); 565 } 566 567 /** 568 * FIXME complexValue may contain any type of data specified by the attributes format, encoding and 569 * schema dynamically extract the content of this node according to specified format, encoding , 570 * schema 571 * 572 * @see OGC05-007r4 Table 35. At the moment only a GML FeatureCollection is supported. 573 * 574 * does using xmlfragment make more sense?? 575 */ 576 Element complexValueContent = XMLTools.getFirstChildElement( complexValueNode ); 577 if ( null != complexValueContent ) { 578 try { 579 580 GMLFeatureCollectionDocument gmlFeatureCollectionDoc = new GMLFeatureCollectionDocument(); 581 gmlFeatureCollectionDoc.setRootElement( complexValueContent ); 582 value = gmlFeatureCollectionDoc.parse(); 583 584 } catch ( XMLParsingException ex1 ) { 585 LOG.logInfo( "Provided content cannot be parsed as featurecollection" ); 586 } 587 } 588 589 } catch ( URISyntaxException uriEx ) { 590 throw new InvalidParameterValueException( "ComplexValue", 591 "Operation Request contains an invalid parameter Value" ); 592 } catch ( MalformedURLException mue ) { 593 throw new InvalidParameterValueException( "ComplexValue", 594 "Operation Request contains an invalid parameter Value" ); 595 } 596 597 complexValue = new ComplexValue( format, encoding, schema, value ); 598 } 599 600 } catch ( XMLParsingException ex ) { 601 // optionalNode 602 } 603 604 return complexValue; 605 606 } 607 608 /** 609 * 610 * @param e 611 * @return complexValueReference 612 * @throws InvalidParameterValueException 613 */ 614 private static ComplexValueReference getValueReference( Element e ) 615 throws InvalidParameterValueException { 616 ComplexValueReference complexValueReference = null; 617 618 Element complexValueReferenceNode; 619 try { 620 complexValueReferenceNode = (Element) XMLTools.getNode( e, "wps:ComplexValueReference", nsContext ); 621 622 if ( null != complexValueReferenceNode ) { 623 String format = null; 624 URI encoding = null; 625 URL schema = null; 626 URL reference = null; 627 628 format = complexValueReferenceNode.getAttribute( "format" ); 629 if ( null != format ) { 630 if ( "".equals( format ) ) { 631 throw new InvalidParameterValueException( "ComplexValueReference", 632 "Attribute format must not be empty if provided." ); 633 } 634 } 635 636 String enc = complexValueReferenceNode.getAttribute( "encoding" ); 637 if ( null != enc ) { 638 if ( "".equals( enc ) ) { 639 throw new InvalidParameterValueException( "ComplexValueReference", 640 "Attribute encoding must not be empty if provided." ); 641 } 642 try { 643 encoding = new URI( enc ); 644 } catch ( URISyntaxException e1 ) { 645 throw new InvalidParameterValueException( "ComplexValueReference", 646 "Provided content of attribute encoding could not be parsed as URI." ); 647 } 648 } 649 650 String scheme = complexValueReferenceNode.getAttribute( "schema" ); 651 if ( null != scheme ) { 652 if ( "".equals( scheme ) ) { 653 throw new InvalidParameterValueException( "ComplexValueReference", 654 "Attribute schema must not be empty if provided." ); 655 } 656 try { 657 schema = new URL( scheme ); 658 } catch ( MalformedURLException e1 ) { 659 throw new InvalidParameterValueException( "ComplexValueReference", 660 "Provided content of attribute schema could not be parsed as URL." ); 661 } 662 } 663 664 String referenceString = complexValueReferenceNode.getAttributeNS( OWSNS.toString(), "reference" ); 665 if ( "".equals( referenceString ) ) { 666 throw new InvalidParameterValueException( "ComplexValueReference", 667 "Mandatory attibute reference must not be empty." ); 668 } 669 try { 670 reference = new URL( referenceString ); 671 } catch ( MalformedURLException e1 ) { 672 throw new InvalidParameterValueException( "ComplexValueReference", 673 "Provided content of attribute reference could not be parsed as URL." ); 674 675 } 676 677 complexValueReference = new IOValue.ComplexValueReference( format, encoding, schema, reference ); 678 } 679 } catch ( XMLParsingException e1 ) { 680 // optional element 681 } 682 683 return complexValueReference; 684 } 685 686 /** 687 * 688 * @param e 689 * @return literalValue 690 * @throws InvalidParameterValueException 691 */ 692 private static TypedLiteral getLiteralValue( Element e ) 693 throws InvalidParameterValueException { 694 TypedLiteral literalValue = null; 695 696 Element literalValueNode; 697 try { 698 literalValueNode = (Element) XMLTools.getNode( e, "wps:LiteralValue", nsContext ); 699 if ( null != literalValueNode ) { 700 String value = null; 701 URI dataType = null; 702 URI uom = null; 703 String dataTypeString = literalValueNode.getAttribute( "dataType" ); 704 if ( null != dataTypeString ) { 705 if ( "".equals( dataTypeString ) ) { 706 throw new InvalidParameterValueException( "LiteralValue", 707 "Attribute data type must not be empty if provided." ); 708 } 709 try { 710 dataType = new URI( dataTypeString ); 711 } catch ( URISyntaxException e1 ) { 712 throw new InvalidParameterValueException( "LiteralValue", 713 "Provided content of attribute data type could not be parsed as URI." ); 714 } 715 } 716 717 String uomString = literalValueNode.getAttribute( "uom" ); 718 if ( null != uomString ) { 719 if ( "".equals( uomString ) ) { 720 throw new InvalidParameterValueException( "LiteralValue", 721 "Attribute uom must not be empty if provided." ); 722 } 723 } 724 try { 725 uom = new URI( uomString ); 726 } catch ( URISyntaxException e1 ) { 727 throw new InvalidParameterValueException( "LiteralValue", 728 "Provided content of attribute uom could not be parsed as URI." ); 729 } 730 value = XMLTools.getNodeAsString( literalValueNode, "/text()", nsContext, null ); 731 732 literalValue = new TypedLiteral( value, dataType, uom ); 733 } 734 735 } catch ( XMLParsingException e1 ) { 736 // optional Element 737 } 738 739 return literalValue; 740 } 741 742 /** 743 * 744 * @param executeNode 745 * @return outputDefinitions 746 * @throws MissingParameterValueException 747 * @throws InvalidParameterValueException 748 */ 749 @SuppressWarnings("unchecked") 750 private static OutputDefinitions getOutputDefinitions( Element executeNode ) 751 throws MissingParameterValueException, InvalidParameterValueException { 752 OutputDefinitions outputDefinitions = null; 753 754 try { 755 Element outputDefinitionsNode = (Element) XMLTools.getNode( executeNode, "wps:OutputDefinitions", nsContext ); 756 757 if ( null != outputDefinitionsNode ) { 758 759 // outputDefinitionsNode may be null, if not null, at least one <Input> has to be defined 760 LOG.logInfo( "outputDefinitionsNode: " + outputDefinitionsNode ); 761 List outputNodeList = XMLTools.getNodes( outputDefinitionsNode, "wps:Output", nsContext ); 762 763 if ( null != outputNodeList && 0 != outputNodeList.size() ) { 764 outputDefinitions = new OutputDefinitions(); 765 int size = outputNodeList.size(); 766 List outputs = new ArrayList<OutputDefinition>( size ); 767 for ( int i = 0; i < size; i++ ) { 768 outputs.add( i, getOutputDefinition( (Element) outputNodeList.get( i ) ) ); 769 } 770 771 outputDefinitions.setOutputDefinitions( outputs ); 772 } else { 773 throw new MissingParameterValueException( "Output", 774 "If OutputDefinitions node provided, at least one output node has to be defined." ); 775 } 776 } 777 778 } catch ( XMLParsingException ex ) { 779 // Optional element 780 } 781 782 return outputDefinitions; 783 } 784 785 /** 786 * 787 * @param outputNode 788 * @return outputDefinitions 789 * @throws InvalidParameterValueException 790 * @throws MissingParameterValueException 791 */ 792 private static OutputDefinition getOutputDefinition( Element outputNode ) 793 throws InvalidParameterValueException, MissingParameterValueException { 794 795 Code identifier = getIdentifier( outputNode ); 796 String title = getTitle( outputNode ); 797 String _abstract = getAbstract( outputNode ); 798 String format = null; 799 URI encoding = null; 800 URL schema = null; 801 URI uom = null; 802 803 format = outputNode.getAttribute( "format" ); 804 if ( null != format ) { 805 if ( "".equals( format ) ) { 806 throw new InvalidParameterValueException( "Output", "Attribute format must not be empty if provided." ); 807 } 808 } 809 810 String enc = outputNode.getAttribute( "encoding" ); 811 if ( null != enc ) { 812 if ( "".equals( enc ) ) { 813 throw new InvalidParameterValueException( "Output", "Attribute encoding must not be empty if provided." ); 814 } 815 try { 816 encoding = new URI( enc ); 817 } catch ( URISyntaxException e1 ) { 818 throw new InvalidParameterValueException( "Output", 819 "Provided content of attribute encoding could not be parsed as URI." ); 820 } 821 } 822 823 String scheme = outputNode.getAttribute( "schema" ); 824 if ( null != scheme ) { 825 if ( "".equals( scheme ) ) { 826 throw new InvalidParameterValueException( "Output", "Attribute schema must not be empty if provided." ); 827 } 828 try { 829 schema = new URL( scheme ); 830 } catch ( MalformedURLException e1 ) { 831 throw new InvalidParameterValueException( "Output", 832 "Provided content of attribute schema could not be parsed as URL." ); 833 } 834 } 835 836 String uomString = outputNode.getAttribute( "uom" ); 837 if ( null != uomString ) { 838 if ( "".equals( uomString ) ) { 839 throw new InvalidParameterValueException( "Output", "Attribute uom must not be empty if provided." ); 840 } 841 } 842 try { 843 uom = new URI( uomString ); 844 } catch ( URISyntaxException e1 ) { 845 throw new InvalidParameterValueException( "Output", 846 "Provided content of attribute uom could not be parsed as URI." ); 847 } 848 849 return new OutputDefinition( identifier, title, _abstract, encoding, format, schema, uom ); 850 } 851 852 }