001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wps/describeprocess/ProcessDescriptionDocument.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 package org.deegree.ogcwebservices.wps.describeprocess;
037
038 import static org.deegree.ogcbase.CommonNamespaces.OWSNS;
039
040 import java.net.URI;
041 import java.net.URISyntaxException;
042 import java.util.ArrayList;
043 import java.util.List;
044
045 import org.deegree.datatypes.Code;
046 import org.deegree.datatypes.values.Closure;
047 import org.deegree.datatypes.values.TypedLiteral;
048 import org.deegree.datatypes.values.ValueRange;
049 import org.deegree.datatypes.xlink.SimpleLink;
050 import org.deegree.framework.log.ILogger;
051 import org.deegree.framework.log.LoggerFactory;
052 import org.deegree.framework.xml.XMLFragment;
053 import org.deegree.framework.xml.XMLParsingException;
054 import org.deegree.framework.xml.XMLTools;
055 import org.deegree.ogcwebservices.MetadataType;
056 import org.deegree.ogcwebservices.wps.describeprocess.ProcessDescription.DataInputs;
057 import org.deegree.ogcwebservices.wps.describeprocess.ProcessDescription.ProcessOutputs;
058 import org.deegree.owscommon.OWSMetadata;
059 import org.deegree.owscommon.com110.OWSAllowedValues;
060 import org.w3c.dom.Element;
061
062 /**
063 * ProcessDescriptionDocument.java
064 *
065 * Created on 10.03.2006. 15:18:02h
066 *
067 * @author <a href="mailto:christian@kiehle.org">Christian Kiehle</a>
068 * @author <a href="mailto:christian.heier@gmx.de">Christian Heier</a>
069 *
070 * @version 1.0.
071 *
072 * @since 2.0
073 */
074
075 public class ProcessDescriptionDocument extends XMLFragment {
076
077 /**
078 *
079 */
080 private static final long serialVersionUID = 7104894360064209850L;
081
082 private static ILogger LOG = LoggerFactory.getLogger( ProcessDescriptionDocument.class );
083
084 /**
085 *
086 * @return the bean created from the root element.
087 * @throws XMLParsingException
088 */
089 public ProcessDescription parseProcessDescription()
090 throws XMLParsingException {
091
092 Element root = getRootElement();
093
094 Element processDescriptionNode = (Element) XMLTools.getRequiredNode( root, "wps:ProcessDescription", nsContext );
095
096 String responsibleClass = getResponsibleClass( processDescriptionNode );
097
098 Code identifier = getIdentifier( processDescriptionNode );
099
100 String title = getTitle( processDescriptionNode );
101
102 String _abstract = getAbstract( processDescriptionNode );
103
104 List<MetadataType> metadataTypeList = getMetadata( processDescriptionNode );
105
106 DataInputs dataInputs = null;
107
108 ProcessOutputs processOutputs = null;
109
110 // Get optional attribute "processVersion" from <wps:ProcessDescription>
111 // node
112 String processVersion = null;
113 String versionAttribute = processDescriptionNode.getAttribute( "processVersion" );
114 if ( null != versionAttribute && !"".equals( versionAttribute ) ) {
115 processVersion = versionAttribute;
116 }
117
118 // Get optional attribute "storeSupported" from <wps:ProcessDescription>
119 // node
120 Boolean storeSupported = new Boolean( false );
121 String storeSupportedAttribute = processDescriptionNode.getAttribute( "storeSupported" );
122 if ( null != storeSupportedAttribute && !"".equals( storeSupportedAttribute ) ) {
123 storeSupported = Boolean.valueOf( storeSupportedAttribute );
124 }
125
126 // Get optional attribute "statusSupported" from
127 // <wps:ProcessDescription> node
128 Boolean statusSupported = new Boolean( false );
129 String statusSupportedAttribute = processDescriptionNode.getAttribute( "statusSupported" );
130 if ( null != statusSupportedAttribute && !"".equals( statusSupportedAttribute ) ) {
131 statusSupported = Boolean.valueOf( statusSupportedAttribute );
132 }
133
134 // Get optional node <wps:DataInputs> from <wps:ProcessDescription> node
135
136 Element dataInputsNode = XMLTools.getRequiredElement( processDescriptionNode, "wps:DataInputs", nsContext );
137
138 if ( null != dataInputsNode ) {
139
140 List<Element> inputNodesList = XMLTools.getElements( dataInputsNode, "wps:Input", nsContext );
141
142 if ( null != inputNodesList && 0 != inputNodesList.size() ) {
143
144 int size = inputNodesList.size();
145 dataInputs = new DataInputs();
146 List<InputDescription> inputDescriptions = new ArrayList<InputDescription>( size );
147 for ( int i = 0; i < size; i++ ) {
148 if ( inputNodesList.get( i ) != null ) {
149 inputDescriptions.add( i, getInputDescription( inputNodesList.get( i ) ) );
150 }
151 }
152 dataInputs.setInputDescriptions( inputDescriptions );
153 }
154 }
155
156 // Get mandatory node <wps:ProcessOutputs> from <wps:ProcessDescription>
157 // node.
158
159 Element processOutputsNode = (Element) XMLTools.getRequiredNode( processDescriptionNode, "wps:ProcessOutputs",
160 nsContext );
161
162 List<Element> outputNodesList = XMLTools.getRequiredElements( processOutputsNode, "wps:Output", nsContext );
163 int size = outputNodesList.size();
164 processOutputs = new ProcessOutputs();
165 processOutputs.output = new ArrayList<OutputDescription>( size );
166 for ( int i = 0; i < size; i++ ) {
167 processOutputs.output.add( i, getOutputDescription( outputNodesList.get( i ) ) );
168 }
169
170 return new ProcessDescription( responsibleClass, identifier, title, _abstract, processVersion,
171 metadataTypeList, dataInputs, processOutputs, statusSupported, storeSupported );
172
173 }
174
175 private String getResponsibleClass( Element processDescriptionNode )
176 throws XMLParsingException {
177
178 // Get resonsible class for process execution from deegreeParams section
179 String responsibleClass = null;
180 Element deegreeParamsNode = (Element) XMLTools.getRequiredNode( processDescriptionNode,
181 "deegreewps:deegreeParams", nsContext );
182 responsibleClass = XMLTools.getRequiredNodeAsString( deegreeParamsNode, "deegreewps:responsibleClass/text()",
183 nsContext );
184
185 return responsibleClass;
186 }
187
188 /**
189 * @param e
190 * processDescriptionNode
191 * @throws XMLParsingException
192 */
193 private List<MetadataType> getMetadata( Element e )
194 throws XMLParsingException {
195 List<MetadataType> metadataTypeList = null;
196
197 // Get optional nodes <ows:Metadata>
198 List<Element> metadataTypeNodes = XMLTools.getElements( e, "ows:Metadata", nsContext );
199 if ( null != metadataTypeNodes && 0 != metadataTypeNodes.size() ) {
200 int size = metadataTypeNodes.size();
201 metadataTypeList = new ArrayList<MetadataType>( size );
202 for ( int i = 0; i < size; i++ ) {
203 metadataTypeList.add( i, getMetadataType( metadataTypeNodes.get( i ) ) );
204 }
205 }
206 return metadataTypeList;
207 }
208
209 /**
210 * @param e
211 * processDescriptionNode
212 * @throws XMLParsingException
213 */
214 private String getAbstract( Element e )
215 throws XMLParsingException {
216 String _abstract = null;
217
218 // Get optional node <ows:Abstract>
219 String owsAbstract = XMLTools.getNodeAsString( e, "ows:Abstract/text()", nsContext, null );
220 if ( null != owsAbstract && !"".equals( owsAbstract ) ) {
221 _abstract = owsAbstract;
222 }
223 return _abstract;
224 }
225
226 /**
227 * @param e
228 * processDescriptionNode
229 * @throws XMLParsingException
230 */
231 private String getTitle( Element e )
232 throws XMLParsingException {
233 // Get required node <ows:Title>
234 return XMLTools.getRequiredNodeAsString( e, "ows:Title/text()", nsContext );
235 }
236
237 /**
238 * @param e
239 * processDescriptionNode
240 * @throws XMLParsingException
241 */
242 private Code getIdentifier( Element e )
243 throws XMLParsingException {
244 // Get required node <ows:Identifier>
245 String identifierAsString = XMLTools.getRequiredNodeAsString( e, "ows:Identifier/text()", nsContext );
246 return new Code( identifierAsString, null );
247 }
248
249 /**
250 * Creates an object representation of a <code>ows:Metadata</code> section.
251 *
252 * @param metadataTypeNode
253 * @return object representation of the <code>ows:Metadata</code> section
254 */
255 private MetadataType getMetadataType( Element metadataTypeNode ) {
256
257 // FIXME MetadataType contained in Deegree does not correspond with
258 // current OWS MetadataType definition
259 MetadataType metadataType = null;
260
261 // Only attribute xlink:title supported by now, e.g. <ows:Metadata
262 // xlink:title="buffer"/>
263 String title = metadataTypeNode.getAttributeNS( XLNNS.toString(), "title" );
264
265 if ( null != title && !"".equals( title ) ) {
266 metadataType = new MetadataType();
267 metadataType.value = title;
268 }
269
270 return metadataType;
271 }
272
273 private InputDescription getInputDescription( Element inputDescriptionNode )
274 throws XMLParsingException {
275
276 Code identifier = getIdentifier( inputDescriptionNode );
277
278 String title = getTitle( inputDescriptionNode );
279
280 String _abstract = getAbstract( inputDescriptionNode );
281
282 ComplexData complexData = null;
283
284 LiteralInput literalData = null;
285
286 SupportedCRSs boundingBoxData = null;
287
288 Element boundingBoxDataNode = (Element) XMLTools.getNode( inputDescriptionNode, "wps:BoundingBoxData",
289 nsContext );
290
291 Element complexDataNode = (Element) XMLTools.getNode( inputDescriptionNode, "wps:ComplexData", nsContext );
292
293 Element literalDataNode = (Element) XMLTools.getNode( inputDescriptionNode, "wps:LiteralData", nsContext );
294
295 if ( null == boundingBoxDataNode && null == complexDataNode && null == literalDataNode ) {
296 throw new XMLParsingException(
297 "A required data type is missing, one of wps:ComplexData or wps:LiteralData is missing from inputDescriptionNode with localname: "
298 + inputDescriptionNode.getLocalName() );
299 }
300
301 if ( null != boundingBoxDataNode && null == complexDataNode && null == literalDataNode ) {
302 boundingBoxData = getSupportedCRSsType( boundingBoxDataNode );
303 }
304 if ( null == boundingBoxDataNode && null != complexDataNode && null == literalDataNode ) {
305 complexData = getComplexDataType( complexDataNode );
306 }
307 if ( null == boundingBoxDataNode && null == complexDataNode && null != literalDataNode ) {
308 literalData = getLiteralInputType( literalDataNode );
309
310 }
311 int occurs = XMLTools.getNodeAsInt( inputDescriptionNode, "wps:MinimumOccurs/text()", nsContext, 1 );
312
313 return new InputDescription( identifier, title, _abstract, boundingBoxData, complexData, literalData, occurs );
314 }
315
316 @SuppressWarnings("unchecked")
317 private SupportedCRSs getSupportedCRSsType( Element boundingBoxDataNode )
318 throws XMLParsingException {
319
320 List<URI> crsList = null;
321
322 // Get required nodes <wps:CRS>
323 List<Element> crsNodes = XMLTools.getRequiredElements( boundingBoxDataNode, "wps:CRS", nsContext );
324 if ( null != crsNodes && 0 != crsNodes.size() ) {
325 int size = crsNodes.size();
326 crsList = new ArrayList<URI>( size );
327 for ( int i = 0; i < size; i++ ) {
328
329 String crs = XMLTools.getNodeAsString( crsNodes.get( i ), "/text()", nsContext, null );
330
331 crsList.add( i, buildURIFromString( crs ) );
332 }
333 }
334
335 // Get required attribute "defaultCRS" from node <wps:BoundingBoxData>
336 URI defaultCRS = buildURIFromString( boundingBoxDataNode.getAttribute( "defaultCRS" ) );
337
338 return new SupportedCRSs( crsList, defaultCRS );
339
340 }
341
342 /**
343 * @param complexDataNode
344 * @return the complex data bean created from the node.
345 * @throws XMLParsingException
346 */
347 private ComplexData getComplexDataType( Element complexDataNode )
348 throws XMLParsingException {
349 String defaultEncoding = null;
350 String defaultFormat = null;
351 String defaultSchema = null;
352 List<SupportedComplexData> supportedComplexDataList = null;
353
354 // Get optional attribute "defaultFormat" from <wps:ComplexData> node
355 String defaultFormatAttribute = complexDataNode.getAttribute( "defaultFormat" );
356 if ( null != defaultFormatAttribute && !"".equals( defaultFormatAttribute ) ) {
357 defaultFormat = defaultFormatAttribute;
358 }
359
360 // Get optional attribute "defaultEncoding" from <wps:ComplexData> node
361 String defaultEncodingAttribute = complexDataNode.getAttribute( "defaultEncoding" );
362 if ( null != defaultEncodingAttribute && !"".equals( defaultEncodingAttribute ) ) {
363 defaultEncoding = defaultEncodingAttribute;
364 }
365
366 // Get optional attribute "defaultSchema" from <wps:ComplexData> node
367 String defaultSchemaAttribute = complexDataNode.getAttribute( "defaultSchema" );
368 if ( null != defaultSchemaAttribute && !"".equals( defaultSchemaAttribute ) ) {
369 defaultSchema = defaultSchemaAttribute;
370 }
371
372 List<Element> supportedComplexDataNodes = XMLTools.getElements( complexDataNode, "wps:SupportedComplexData",
373 nsContext );
374 if ( null != supportedComplexDataNodes && 0 != supportedComplexDataNodes.size() ) {
375 int size = supportedComplexDataNodes.size();
376 supportedComplexDataList = new ArrayList<SupportedComplexData>( size );
377 for ( int i = 0; i < size; i++ ) {
378 supportedComplexDataList.add( i, getSupportedComplexData( supportedComplexDataNodes.get( i ) ) );
379 }
380 }
381
382 return new ComplexData( defaultEncoding, defaultFormat, defaultSchema, supportedComplexDataList );
383 }
384
385 /**
386 * @param supportedComplexDataNode
387 * element
388 * @return the bean created from the element
389 * @throws XMLParsingException
390 */
391 private SupportedComplexData getSupportedComplexData( Element supportedComplexDataNode )
392 throws XMLParsingException {
393 String encoding = null;
394 String format = null;
395 String schema = null;
396
397 // Get optional node <wps:Encoding>
398 String wpsEncoding = XMLTools.getNodeAsString( supportedComplexDataNode, "wps:Encoding/text()", nsContext, null );
399 if ( null != wpsEncoding && !"".equals( wpsEncoding ) ) {
400 encoding = wpsEncoding;
401 }
402
403 // Get optional node <wps:Format>
404 String wpsFormat = XMLTools.getNodeAsString( supportedComplexDataNode, "wps:Format/text()", nsContext, null );
405 if ( null != wpsFormat && !"".equals( wpsFormat ) ) {
406 format = wpsFormat;
407 }
408
409 // Get optional node <wps:Schema>
410 String wpsSchema = XMLTools.getNodeAsString( supportedComplexDataNode, "wps:Schema/text()", nsContext, null );
411 if ( null != wpsSchema && !"".equals( wpsSchema ) ) {
412 schema = wpsSchema;
413 }
414 return new SupportedComplexData( encoding, format, schema );
415 }
416
417 /**
418 * @return the bean created from the element
419 */
420 private LiteralInput getLiteralInputType( Element literalDataNode )
421 throws XMLParsingException {
422 OWSMetadata domainMetadataType = null;
423 SupportedUOMs supportedUOMsType = null;
424 OWSAllowedValues allowedValues = null;
425 boolean anyValueAllowed = false;
426 ValueRange defaultValue = null;
427 OWSMetadata valuesReference = null;
428
429 // Get optional node <ows:DataType>
430 Element dataTypeNode = (Element) XMLTools.getNode( literalDataNode, "ows:DataType", nsContext );
431 if ( null != dataTypeNode ) {
432 domainMetadataType = getDomainMetadataTypeFromContent( dataTypeNode );
433 }
434
435 // Get optional node <wps:SupportedUOMs>
436 Element supportedUOMsNode = (Element) XMLTools.getNode( literalDataNode, "wps:SupportedUOMs", nsContext );
437 if ( null != supportedUOMsNode ) {
438 supportedUOMsType = getSupportedUOMs( supportedUOMsNode );
439 }
440
441 // Get optional node <wps:AllowedValues>
442 Element allowedValuesNode = (Element) XMLTools.getNode( literalDataNode, "ows:AllowedValues", nsContext );
443 // Get optional node <wps:AnyValue>
444 Element anyValueNode = (Element) XMLTools.getNode( literalDataNode, "ows:AnyValue", nsContext );
445 // Get optional node <wps:ValuesReference>
446 Element valuesReferenceNode = (Element) XMLTools.getNode( literalDataNode, "ows:ValuesReference", nsContext );
447
448 if ( null != allowedValuesNode && null == anyValueNode && null == valuesReferenceNode ) {
449 allowedValues = getOWSAllowedValues( allowedValuesNode );
450 } else if ( null == allowedValuesNode && null != anyValueNode && null == valuesReferenceNode ) {
451 anyValueAllowed = true;
452 } else if ( null == allowedValuesNode && null == anyValueNode && null != valuesReferenceNode ) {
453 String reference = valuesReferenceNode.getAttributeNS( OWSNS.toString(), "reference" );
454 String value = XMLTools.getNodeAsString( valuesReferenceNode, "/text()", nsContext, null );
455 if ( null != value ) {
456 URI referenceURI = buildURIFromString( reference );
457 valuesReference = new OWSMetadata( null, new SimpleLink( referenceURI ), value );
458 }
459 } else {
460 throw new XMLParsingException(
461 "A required data type is missing, one of ows:AllowedValues, ows:AnyValue or ows:ValuesReference is missing from context node: "
462 + literalDataNode.getLocalName() );
463 }
464
465 // Get optional node <wps:DefaultValue>
466 Element defaultValueNode = (Element) XMLTools.getNode( literalDataNode, "ows:DefaultValue", nsContext );
467 if ( null != defaultValueNode ) {
468 defaultValue = getOwsRange( defaultValueNode );
469 }
470
471 return new LiteralInput( domainMetadataType, supportedUOMsType, allowedValues, anyValueAllowed, defaultValue,
472 valuesReference );
473 }
474
475 private URI buildURIFromString( String reference )
476 throws XMLParsingException {
477 URI referenceURI = null;
478 try {
479 referenceURI = new URI( reference );
480 } catch ( URISyntaxException e ) {
481 String msg = "The URI syntax is malformed. " + e.getMessage();
482 LOG.logError( msg );
483 throw new XMLParsingException( msg, e );
484 }
485 return referenceURI;
486 }
487
488 private SupportedUOMs getSupportedUOMs( Element supportedUOMsNode )
489 throws XMLParsingException {
490 List<Element> uomNodesList = XMLTools.getElements( supportedUOMsNode, "ows:UOM", nsContext );
491
492 List<OWSMetadata> domainMetadataTypeList = null;
493 if ( null != uomNodesList && 0 != uomNodesList.size() ) {
494 int uomNodesListSize = uomNodesList.size();
495 domainMetadataTypeList = new ArrayList<OWSMetadata>( uomNodesListSize );
496 for ( int i = 0; i < uomNodesListSize; i++ ) {
497 Element nodeListElement = uomNodesList.get( i );
498
499 domainMetadataTypeList.add( i, getDomainMetadataTypeFromAttribute( nodeListElement ) );
500 }
501 }
502 String defaultuom = supportedUOMsNode.getAttribute( "defaultUOM" );
503 URI defaultUOMURI = buildURIFromString( defaultuom );
504 OWSMetadata defaultUOMObject = new OWSMetadata( null, new SimpleLink( defaultUOMURI ), null );
505
506 return new SupportedUOMs( defaultUOMObject, domainMetadataTypeList );
507 }
508
509 private OWSMetadata getDomainMetadataTypeFromContent( Element e )
510 throws XMLParsingException {
511 String owsDataType = XMLTools.getNodeAsString( e, "/text()", nsContext, null );
512 String reference = e.getAttributeNS( OWSNS.toString(), "reference" );
513 URI referenceURI = buildURIFromString( reference );
514 return new OWSMetadata( null, new SimpleLink( referenceURI ), owsDataType );
515 }
516
517 private OWSMetadata getDomainMetadataTypeFromAttribute( Element e )
518 throws XMLParsingException {
519 String reference = e.getAttributeNS( OWSNS.toString(), "reference" );
520 URI referenceURI = buildURIFromString( reference );
521
522 return new OWSMetadata( null, new SimpleLink( referenceURI ), null );
523 }
524
525 @SuppressWarnings("unchecked")
526 private OWSAllowedValues getOWSAllowedValues( Element e )
527 throws XMLParsingException {
528 TypedLiteral[] owsValues = null;
529 ValueRange[] valueRanges = null;
530
531 // gets a Node list of type ows:Value
532 List owsValueNodeList = XMLTools.getNodes( e, "ows:Value", nsContext );
533
534 if ( null != owsValueNodeList && 0 != owsValueNodeList.size() ) {
535 int size = owsValueNodeList.size();
536 owsValues = new TypedLiteral[size];
537 for ( int i = 0; i < size; i++ ) {
538 owsValues[i] = ( getOwsValue( (Element) owsValueNodeList.get( i ) ) );
539 }
540 }
541
542 List owsRangeNodeList = XMLTools.getNodes( e, "ows:Range", nsContext );
543
544 if ( null != owsRangeNodeList && 0 != owsRangeNodeList.size() ) {
545 int size = owsRangeNodeList.size();
546 valueRanges = new ValueRange[size];
547 for ( int i = 0; i < size; i++ ) {
548 valueRanges[i] = ( getOwsRange( (Element) owsRangeNodeList.get( i ) ) );
549 }
550 }
551
552 return new OWSAllowedValues( owsValues, valueRanges );
553 }
554
555 /**
556 * @param element
557 * @return the bean created from the element
558 * @throws XMLParsingException
559 */
560 private ValueRange getOwsRange( Element element )
561 throws XMLParsingException {
562
563 TypedLiteral maximum = getOwsValue( (Element) XMLTools.getNode( element, "ows:MaximumValue", nsContext ) );
564
565 TypedLiteral minimum = getOwsValue( (Element) XMLTools.getNode( element, "ows:MinimumValue", nsContext ) );
566
567 Closure rangeClosure = null;
568
569 String rangeClosureAttribute = element.getAttributeNS( OWSNS.toString(), "rangeClosure" );
570 if ( "closed".equalsIgnoreCase( rangeClosureAttribute ) ) {
571 rangeClosure = new Closure( Closure.CLOSED );
572 } else if ( "open".equalsIgnoreCase( rangeClosureAttribute ) ) {
573 rangeClosure = new Closure( Closure.OPENED );
574 } else if ( "closed-open".equalsIgnoreCase( rangeClosureAttribute ) ) {
575 rangeClosure = new Closure( Closure.CLOSED_OPENED );
576 } else if ( "open-closed".equalsIgnoreCase( rangeClosureAttribute ) ) {
577 rangeClosure = new Closure( Closure.OPENED_CLOSED );
578 } else {
579 throw new XMLParsingException( "Attribute range closure contains invalid value." );
580 }
581
582 TypedLiteral spacing = null;
583
584 Element spacingNode = (Element) XMLTools.getNode( element, "ows:Spacing", nsContext );
585 if ( null != spacingNode ) {
586 spacing = getOwsValue( spacingNode );
587 }
588
589 return new ValueRange( minimum, maximum, spacing, null, null, false, rangeClosure );
590 }
591
592 /**
593 * @param element
594 * @return the bean created from the element.
595 * @throws XMLParsingException
596 */
597 private TypedLiteral getOwsValue( Element element )
598 throws XMLParsingException {
599 String value = XMLTools.getNodeAsString( element, "/text()", nsContext, null );
600 return new TypedLiteral( value, null );
601 }
602
603 /**
604 * @param outputDescriptionNode
605 * element
606 * @return the bean created from the element.
607 * @throws XMLParsingException
608 */
609 private OutputDescription getOutputDescription( Element outputDescriptionNode )
610 throws XMLParsingException {
611 Code identifier = getIdentifier( outputDescriptionNode );
612
613 String title = getTitle( outputDescriptionNode );
614
615 String _abstract = getAbstract( outputDescriptionNode );
616
617 Element boundingBoxOutputNode = (Element) XMLTools.getNode( outputDescriptionNode, "wps:BoundingBoxOutput",
618 nsContext );
619 Element complexOutputNode = (Element) XMLTools.getNode( outputDescriptionNode, "wps:ComplexOutput", nsContext );
620 Element literalOutputNode = (Element) XMLTools.getNode( outputDescriptionNode, "wps:LiteralOutput", nsContext );
621
622 SupportedCRSs boundingBoxOutput = null;
623 ComplexData complexOutput = null;
624 LiteralOutput literalOutput = null;
625
626 if ( null != boundingBoxOutputNode && null == complexOutputNode && null == literalOutputNode ) {
627 boundingBoxOutput = getSupportedCRSsType( boundingBoxOutputNode );
628 } else if ( null == boundingBoxOutputNode && null != complexOutputNode && null == literalOutputNode ) {
629 complexOutput = getComplexDataType( complexOutputNode );
630 } else if ( null == boundingBoxOutputNode && null == complexOutputNode && null != literalOutputNode ) {
631 Element dataTypeNode = (Element) XMLTools.getNode( literalOutputNode, "ows:DataType", nsContext );
632 OWSMetadata domainMetadataType = getDomainMetadataTypeFromContent( dataTypeNode );
633 Element supportedUOMsNode = (Element) XMLTools.getNode( literalOutputNode, "wps:SupportedUOMs", nsContext );
634 SupportedUOMs supportedUOMsType = null;
635 if ( null != supportedUOMsNode ) {
636 supportedUOMsType = getSupportedUOMs( supportedUOMsNode );
637 }
638 literalOutput = new LiteralOutput( domainMetadataType, supportedUOMsType );
639 } else {
640 throw new XMLParsingException(
641 "A required data type is missing, one of wps:BoundingBoxOutput, wps:ComplexOutput or wps:LiteralOutput is missing from context node: "
642 + outputDescriptionNode.getLocalName() );
643 }
644
645 return new OutputDescription( identifier, title, _abstract, boundingBoxOutput, complexOutput, literalOutput );
646 }
647 }