001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/sos/ComponentDescriptionDocument.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.sos;
037
038 import java.io.IOException;
039 import java.net.MalformedURLException;
040 import java.net.URI;
041 import java.net.URISyntaxException;
042 import java.net.URL;
043 import java.util.ArrayList;
044 import java.util.List;
045
046 import org.deegree.framework.xml.XMLParsingException;
047 import org.deegree.framework.xml.XMLTools;
048 import org.deegree.model.metadata.iso19115.Address;
049 import org.deegree.model.metadata.iso19115.CitedResponsibleParty;
050 import org.deegree.model.metadata.iso19115.ContactInfo;
051 import org.deegree.model.metadata.iso19115.FunctionCode;
052 import org.deegree.model.metadata.iso19115.Linkage;
053 import org.deegree.model.metadata.iso19115.OnlineResource;
054 import org.deegree.model.metadata.iso19115.Phone;
055 import org.deegree.model.metadata.iso19115.RoleCode;
056 import org.deegree.ogcbase.OGCDocument;
057 import org.deegree.ogcwebservices.sos.sensorml.BasicResponse;
058 import org.deegree.ogcwebservices.sos.sensorml.Classifier;
059 import org.deegree.ogcwebservices.sos.sensorml.ComponentDescription;
060 import org.deegree.ogcwebservices.sos.sensorml.CoordinateReferenceSystem;
061 import org.deegree.ogcwebservices.sos.sensorml.Discussion;
062 import org.deegree.ogcwebservices.sos.sensorml.EngineeringCRS;
063 import org.deegree.ogcwebservices.sos.sensorml.GeoLocation;
064 import org.deegree.ogcwebservices.sos.sensorml.GeoPositionModel;
065 import org.deegree.ogcwebservices.sos.sensorml.GeographicCRS;
066 import org.deegree.ogcwebservices.sos.sensorml.Identifier;
067 import org.deegree.ogcwebservices.sos.sensorml.LocationModel;
068 import org.deegree.ogcwebservices.sos.sensorml.ProjectedCRS;
069 import org.deegree.ogcwebservices.sos.sensorml.Quantity;
070 import org.deegree.ogcwebservices.sos.sensorml.Reference;
071 import org.deegree.ogcwebservices.sos.sensorml.ResponseModel;
072 import org.deegree.ogcwebservices.sos.sensorml.TypedQuantity;
073 import org.w3c.dom.Node;
074 import org.xml.sax.SAXException;
075
076 /**
077 * gets the metadata from a XSL transformed wfs result
078 *
079 * @author <a href="mailto:mkulbe@lat-lon.de">Matthias Kulbe </a>
080 * @author last edited by: $Author: mschneider $
081 *
082 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
083 */
084 public abstract class ComponentDescriptionDocument extends OGCDocument {
085
086 /**
087 * exceptions decleration must be there because this method will be overeritten by extending
088 * classes
089 *
090 * @throws IOException
091 * @throws SAXException
092 */
093 public abstract void createEmptyDocument()
094 throws IOException, SAXException;
095
096 /**
097 * gets the identifiedAs part of a item
098 *
099 * @param node
100 * @return the identifiedAs part of a item (maybe <code>null</code>)
101 * @throws XMLParsingException
102 */
103 protected Identifier getIdentifiedAs( Node node )
104 throws XMLParsingException {
105
106 if ( node != null ) {
107 // value is required
108 String value = XMLTools.getRequiredNodeAsString( node, "sml:Identifier/text()", nsContext );
109 // type is optional
110 String type = XMLTools.getNodeAsString( node, "sml:Identifier/@type", nsContext, null );
111 // codeSpace is optional
112 String codeSpace = XMLTools.getNodeAsString( node, "sml:Identifier/@codespace", nsContext, null );
113
114 int typeId = 0;
115
116 // type must compare to one of this values
117 if ( type == null ) {
118 typeId = 0;
119 } else if ( "shortName".equalsIgnoreCase( type ) ) {
120 typeId = 1;
121 } else if ( "longName".equalsIgnoreCase( type ) ) {
122 typeId = 2;
123 } else if ( "serialNumber".equalsIgnoreCase( type ) ) {
124 typeId = 3;
125 } else if ( "modelNumber".equalsIgnoreCase( type ) ) {
126 typeId = 4;
127 } else if ( "missionNumber".equalsIgnoreCase( type ) ) {
128 typeId = 5;
129 } else if ( "partNumber".equalsIgnoreCase( type ) ) {
130 typeId = 6;
131 } else {
132 throw new XMLParsingException( type + " is not a valid type for Identifier" );
133 }
134
135 return new Identifier( value, typeId, codeSpace );
136 }
137 return null;
138 }
139
140 /**
141 * gets the classifiedAs part of a item
142 *
143 * @param node
144 * @return the classifiedAs part of a item (maybe <code>null</code>)
145 * @throws XMLParsingException
146 */
147 protected Classifier getClassifiedAs( Node node )
148 throws XMLParsingException {
149
150 if ( node != null ) {
151 // value is required
152 String value = XMLTools.getRequiredNodeAsString( node, "sml:Classifier/text()", nsContext );
153 // type ist required
154 String type = XMLTools.getRequiredNodeAsString( node, "sml:Classifier/@type", nsContext );
155 // codeSpace is optional
156 String codeSpace = XMLTools.getNodeAsString( node, "sml:Classifier/@codespace", nsContext, null );
157
158 return new Classifier( value, type, codeSpace );
159 }
160 return null;
161
162 }
163
164 /**
165 * gets the attachedTo part of a Item
166 *
167 * @param node
168 * @return the attachedTo part of a Item (maybe <code>null</code>)
169 * @throws XMLParsingException
170 */
171 protected String getAttachedTo( Node node )
172 throws XMLParsingException {
173 if ( node != null ) {
174 return XMLTools.getNodeAsString( node, "sml:Component/text()", nsContext, null );
175 }
176 return null;
177 }
178
179 /**
180 * gets the hasCRS part of a Item
181 *
182 * @param node
183 * @return the hasCRS part of a Item (maybe <code>null</code>)
184 * @throws XMLParsingException
185 */
186 protected EngineeringCRS getHasCRS( Node node )
187 throws XMLParsingException {
188 if ( node != null ) {
189 return getEngineeringCRS( node );
190 }
191 return null;
192 }
193
194 /**
195 *
196 * @param node
197 * @return the crs
198 * @throws XMLParsingException
199 */
200 protected EngineeringCRS getEngineeringCRS( Node node )
201 throws XMLParsingException {
202 if ( node != null ) {
203 String srsName = XMLTools.getRequiredNodeAsString( node, "gml:EngineeringCRS/gml:srsName/text()", nsContext );
204 return new EngineeringCRS( srsName );
205 }
206 return null;
207 }
208
209 /**
210 *
211 * @param node
212 * @return the crs
213 * @throws XMLParsingException
214 */
215 protected CoordinateReferenceSystem getCoordinateReferenceSystemCRS( Node node )
216 throws XMLParsingException {
217 if ( node != null ) {
218 // is GeographicCRS
219 if ( ( XMLTools.getNode( node, "gml:GeographicCRS", nsContext ) ) != null ) {
220 String srsName = XMLTools.getNodeAsString( node, "gml:GeographicCRS/gml:srsName/text()", nsContext,
221 null );
222 if ( srsName != null ) {
223 return new GeographicCRS( srsName );
224 }
225
226 }
227
228 // is ProjectedCRS
229 if ( ( XMLTools.getNode( node, "gml:ProjectedCRS", nsContext ) ) != null ) {
230 String srsName = XMLTools.getNodeAsString( node, "gml:ProjectedCRS/gml:srsName/text()", nsContext, null );
231 if ( srsName != null ) {
232 return new ProjectedCRS( srsName );
233 }
234
235 }
236
237 }
238 return null;
239 }
240
241 /**
242 *
243 * @param node
244 * @return the geo location?
245 * @throws XMLParsingException
246 * @throws URISyntaxException
247 */
248 protected Object getUsesParametersFromGeoLocation( Node node )
249 throws XMLParsingException, URISyntaxException {
250 if ( node != null ) {
251 if ( ( XMLTools.getNode( node, "sml:GeoLocation", nsContext ) ) != null ) {
252 String id = XMLTools.getNodeAsString( node, "sml:GeoLocation/@id", nsContext, null );
253
254 // required
255 Quantity latitude = getQuantity( XMLTools.getRequiredNode( node, "sml:GeoLocation/sml:latitude",
256 nsContext ) );
257 Quantity longitude = getQuantity( XMLTools.getRequiredNode( node, "sml:GeoLocation/sml:longitude",
258 nsContext ) );
259
260 // optional
261 Quantity altitude = getQuantity( XMLTools.getNode( node, "sml:GeoLocation/sml:altitude", nsContext ) );
262 Quantity trueHeading = getQuantity( XMLTools.getNode( node, "sml:GeoLocation/sml:trueHeading",
263 nsContext ) );
264 Quantity speed = getQuantity( XMLTools.getNode( node, "sml:GeoLocation/sml:speed", nsContext ) );
265
266 return new GeoLocation( id, latitude, longitude, altitude, trueHeading, speed );
267 }
268
269 }
270 return null;
271 }
272
273 /**
274 *
275 * @param node
276 * @return the basic response?
277 * @throws XMLParsingException
278 * @throws URISyntaxException
279 */
280 protected Object getUsesParametersFromResponseModel( Node node )
281 throws XMLParsingException, URISyntaxException {
282 if ( node != null ) {
283 if ( ( XMLTools.getNode( node, "sml:BasicResponse", nsContext ) ) != null ) {
284
285 // required
286 TypedQuantity resolution = getTypedQuantity( XMLTools.getRequiredNode(
287 node,
288 "sml:BasicResponse/sml:resolution",
289 nsContext ) );
290
291 return new BasicResponse( resolution );
292 }
293
294 // can add other types, but now not implemented
295
296 }
297 return null;
298 }
299
300 /**
301 *
302 * @param node
303 * @return the quantity
304 * @throws XMLParsingException
305 * @throws URISyntaxException
306 */
307 protected Quantity getQuantity( Node node )
308 throws XMLParsingException, URISyntaxException {
309 if ( node != null ) {
310 String value = XMLTools.getRequiredNodeAsString( node, "sml:Quantity/text()", nsContext );
311
312 if ( value != null ) {
313 Quantity temp = new Quantity( Double.parseDouble( value ) );
314
315 // gets the uom parameter
316 String paramUom = XMLTools.getNodeAsString( node, "sml:Quantity/@uom", nsContext, null );
317 if ( paramUom != null ) {
318
319 temp.setUom( new URI( paramUom ) );
320 }
321
322 // gets the min parameter
323 String paramMin = XMLTools.getNodeAsString( node, "sml:Quantity/@min", nsContext, null );
324 if ( paramMin != null ) {
325
326 temp.setMin( Double.parseDouble( paramMin ) );
327 }
328
329 // gets the max parameter
330 String paramMax = XMLTools.getNodeAsString( node, "sml:Quantity/@max", nsContext, null );
331 if ( paramMax != null ) {
332
333 temp.setMax( Double.parseDouble( paramMax ) );
334 }
335
336 // gets the fixed parameter
337 String paramFixed = XMLTools.getNodeAsString( node, "sml:Quantity/@fixed", nsContext, null );
338 if ( paramFixed != null ) {
339 if ( paramFixed.equalsIgnoreCase( "true" ) ) {
340
341 temp.setFixed( true );
342 } else if ( paramFixed.equalsIgnoreCase( "false" ) ) {
343
344 temp.setFixed( false );
345 }
346 }
347 return temp;
348 }
349
350 }
351
352 return null;
353 }
354
355 /**
356 *
357 * @param node
358 * @return the bean
359 * @throws XMLParsingException
360 * @throws URISyntaxException
361 */
362 protected TypedQuantity getTypedQuantity( Node node )
363 throws XMLParsingException, URISyntaxException {
364 if ( node != null ) {
365
366 String value = XMLTools.getRequiredNodeAsString( node, "sml:TypedQuantity/text()", nsContext );
367
368 String type = XMLTools.getRequiredNodeAsString( node, "sml:TypedQuantity/@type", nsContext );
369
370 TypedQuantity temp = new TypedQuantity( Double.parseDouble( value ), new URI( type ) );
371
372 // gets the uom parameter
373 String paramUom = XMLTools.getNodeAsString( node, "sml:TypedQuantity/@uom", nsContext, null );
374 if ( paramUom != null ) {
375
376 temp.setUom( new URI( paramUom ) );
377 }
378
379 // gets the min parameter
380 String paramMin = XMLTools.getNodeAsString( node, "sml:TypedQuantity/@min", nsContext, null );
381 if ( paramMin != null ) {
382
383 temp.setMin( Double.parseDouble( paramMin ) );
384 }
385
386 // gets the max parameter
387 String paramMax = XMLTools.getNodeAsString( node, "sml:TypedQuantity/@max", nsContext, null );
388 if ( paramMax != null ) {
389
390 temp.setMax( Double.parseDouble( paramMax ) );
391 }
392
393 // gets the fixed parameter
394 String paramFixed = XMLTools.getNodeAsString( node, "sml:TypedQuantity/@fixed", nsContext, null );
395 if ( paramFixed != null ) {
396 if ( paramFixed.equalsIgnoreCase( "false" ) ) {
397
398 temp.setFixed( false );
399 }
400 }
401
402 // gets the codeSpace parameter
403 String codeSpaceAsString = XMLTools.getNodeAsString( node, "sml:TypedQuantity/@codeSpace", nsContext, null );
404 if ( codeSpaceAsString != null ) {
405 URI codeSpace = new URI( codeSpaceAsString );
406 temp.setCodeSpace( codeSpace );
407 }
408 return temp;
409 }
410
411 return null;
412 }
413
414 /**
415 *
416 * @param node
417 * @return the bean
418 * @throws XMLParsingException
419 * @throws MalformedURLException
420 */
421 protected ComponentDescription getDescribedBy( Node node )
422 throws MalformedURLException, XMLParsingException {
423 if ( node != null ) {
424
425 boolean create = false;
426
427 // get optional id
428 String id = XMLTools.getNodeAsString( node, "sml:ComponentDescription/@id", nsContext, null );
429 if ( id != null )
430 create = true;
431
432 // get optional description
433 ArrayList<Discussion> descriptions = new ArrayList<Discussion>();
434 List<Node> descriptionList = XMLTools.getNodes( node, "sml:ComponentDescription/sml:description", nsContext );
435 if ( ( descriptionList != null ) && ( descriptionList.size() > 0 ) )
436 create = true;
437 for ( int i = 0; i < descriptionList.size(); i++ ) {
438 descriptions.add( getDiscussion( descriptionList.get( i ) ) );
439 }
440
441 // get optional reference
442 List<Node> referenceList = XMLTools.getNodes( node, "sml:ComponentDescription/sml:reference", nsContext );
443 if ( ( referenceList != null ) && ( referenceList.size() > 0 ) ) {
444 create = true;
445
446 }
447 ArrayList<Reference> references = new ArrayList<Reference>( referenceList.size() );
448 for ( int i = 0; i < referenceList.size(); i++ ) {
449 Reference actreference = getReference( referenceList.get( i ) );
450 if ( actreference != null ) {
451 references.add( actreference );
452 }
453 }
454
455 // get optional operatedBy
456 List<Node> operatedByList = XMLTools.getNodes( node, "sml:ComponentDescription/sml:operatedBy", nsContext );
457 if ( ( operatedByList != null ) && ( operatedByList.size() > 0 ) ) {
458 create = true;
459
460 }
461 ArrayList<CitedResponsibleParty> operatedBys = new ArrayList<CitedResponsibleParty>( operatedByList.size() );
462 for ( int i = 0; i < operatedByList.size(); i++ ) {
463 CitedResponsibleParty actResponsibleParty = getResponsibleParty( operatedByList.get( i ) );
464 if ( actResponsibleParty != null ) {
465 operatedBys.add( actResponsibleParty );
466 }
467 }
468
469 // get optional manufactedBy
470 List<Node> manufactedByList = XMLTools.getNodes( node, "sml:ComponentDescription/sml:manufactedBy",
471 nsContext );
472 if ( ( manufactedByList != null ) && ( manufactedByList.size() > 0 ) ) {
473 create = true;
474
475 }
476 ArrayList<CitedResponsibleParty> manufactedBys = new ArrayList<CitedResponsibleParty>(
477 manufactedByList.size() );
478 for ( int i = 0; i < manufactedByList.size(); i++ ) {
479 CitedResponsibleParty actResponsibleParty = getResponsibleParty( manufactedByList.get( i ) );
480 if ( actResponsibleParty != null ) {
481 manufactedBys.add( actResponsibleParty );
482 }
483 }
484
485 // get optional deployedBys
486 List<Node> deployedByList = XMLTools.getNodes( node, "sml:ComponentDescription/sml:deployedBy", nsContext );
487 if ( ( deployedByList != null ) && ( deployedByList.size() > 0 ) ) {
488 create = true;
489
490 }
491 ArrayList<CitedResponsibleParty> deployedBys = new ArrayList<CitedResponsibleParty>( deployedByList.size() );
492 for ( int i = 0; i < deployedByList.size(); i++ ) {
493 CitedResponsibleParty actResponsibleParty = getResponsibleParty( deployedByList.get( i ) );
494 if ( actResponsibleParty != null ) {
495 deployedBys.add( actResponsibleParty );
496 }
497 }
498
499 if ( create ) {
500 return new ComponentDescription(
501 id,
502 ( manufactedBys.toArray( new CitedResponsibleParty[manufactedBys.size()] ) ),
503 ( deployedBys.toArray( new CitedResponsibleParty[deployedBys.size()] ) ),
504 ( operatedBys.toArray( new CitedResponsibleParty[operatedBys.size()] ) ),
505 ( descriptions.toArray( new Discussion[descriptions.size()] ) ),
506 ( references.toArray( new Reference[references.size()] ) ) );
507 }
508
509 }
510 return null;
511
512 }
513
514 /**
515 *
516 * @param node
517 * @return the bean
518 * @throws XMLParsingException
519 * @throws URISyntaxException
520 */
521 protected LocationModel getLocatedUsing( Node node )
522 throws XMLParsingException, URISyntaxException {
523
524 if ( node != null ) {
525 if ( ( XMLTools.getNode( node, "sml:GeoPositionModel", nsContext ) ) != null ) {
526
527 String id = XMLTools.getNodeAsString( node, "sml:GeoPositionModel/@id", nsContext, null );
528
529 // get identifiedAs
530 ArrayList<Identifier> identifiers = new ArrayList<Identifier>();
531 List<Node> identifierList = XMLTools.getNodes( node, "sml:GeoPositionModel/sml:identifiedAs", nsContext );
532 for ( int i = 0; i < identifierList.size(); i++ ) {
533 identifiers.add( getIdentifiedAs( identifierList.get( i ) ) );
534 }
535
536 // get ClassifiedAs
537 ArrayList<Classifier> classifiers = new ArrayList<Classifier>();
538 List<Node> classifierList = XMLTools.getNodes( node, "sml:GeoPositionModel/sml:classifiedAs", nsContext );
539 for ( int i = 0; i < classifierList.size(); i++ ) {
540 classifiers.add( getClassifiedAs( classifierList.get( i ) ) );
541 }
542
543 // get optional description
544 ArrayList<Discussion> descriptions = new ArrayList<Discussion>();
545 List<Node> descriptionList = XMLTools.getNodes( node, "sml:GeoPositionModel/sml:description", nsContext );
546 for ( int i = 0; i < descriptionList.size(); i++ ) {
547 descriptions.add( getDiscussion( descriptionList.get( i ) ) );
548 }
549
550 // get sourceCRS
551 Node tNode = XMLTools.getRequiredNode( node, "sml:GeoPositionModel/sml:sourceCRS", nsContext );
552 EngineeringCRS sourceCRS = getEngineeringCRS( tNode );
553
554 // get referenceCRS
555 tNode = XMLTools.getRequiredNode( node, "sml:GeoPositionModel/sml:referenceCRS", nsContext );
556 CoordinateReferenceSystem referenceCRS = getCoordinateReferenceSystemCRS( tNode );
557
558 // get usesParameters
559 ArrayList<Object> usesParameters = new ArrayList<Object>();
560 List<Node> usesParametersList = XMLTools.getNodes( node, "sml:GeoPositionModel/sml:usesParameters",
561 nsContext );
562 if ( ( usesParametersList == null ) || ( usesParametersList.size() <= 0 ) ) {
563 throw new XMLParsingException( "at least one usesParameters required" );
564 }
565 for ( int i = 0; i < usesParametersList.size(); i++ ) {
566 usesParameters.add( getUsesParametersFromGeoLocation( usesParametersList.get( i ) ) );
567 }
568
569 return new GeoPositionModel( id, ( identifiers.toArray( new Identifier[identifiers.size()] ) ),
570 ( classifiers.toArray( new Classifier[classifiers.size()] ) ),
571 ( descriptions.toArray( new Discussion[descriptions.size()] ) ),
572 sourceCRS, referenceCRS,
573 usesParameters.toArray( new Object[usesParameters.size()] ) );
574 }
575
576 }
577 return null;
578
579 }
580
581 /**
582 *
583 * @param node
584 * @return the bean
585 * @throws XMLParsingException
586 * @throws URISyntaxException
587 */
588 protected ResponseModel getDerivedFrom( Node node )
589 throws XMLParsingException, URISyntaxException {
590
591 if ( node != null ) {
592
593 String id = XMLTools.getNodeAsString( node, "sml:ResponseModel/@id", nsContext, null );
594
595 // get identifiedAs
596 ArrayList<Identifier> identifiers = new ArrayList<Identifier>();
597 List<Node> identifierList = XMLTools.getNodes( node, "sml:ResponseModel/sml:identifiedAs", nsContext );
598 for ( int i = 0; i < identifierList.size(); i++ ) {
599 identifiers.add( getIdentifiedAs( identifierList.get( i ) ) );
600 }
601
602 // get ClassifiedAs
603 ArrayList<Classifier> classifiers = new ArrayList<Classifier>();
604 List<Node> classifierList = XMLTools.getNodes( node, "sml:ResponseModel/sml:classifiedAs", nsContext );
605 for ( int i = 0; i < classifierList.size(); i++ ) {
606 classifiers.add( getClassifiedAs( classifierList.get( i ) ) );
607 }
608
609 // get optional description
610 ArrayList<Discussion> descriptions = new ArrayList<Discussion>();
611 List<Node> descriptionList = XMLTools.getNodes( node, "sml:ResponseModel/sml:description", nsContext );
612 for ( int i = 0; i < descriptionList.size(); i++ ) {
613 descriptions.add( getDiscussion( descriptionList.get( i ) ) );
614 }
615
616 // get usesParameters
617 // in spec this parameter is optional, but now is required for set
618 // time resolution
619 ArrayList<Object> usesParameters = new ArrayList<Object>();
620 List<Node> usesParametersList = XMLTools.getNodes( node, "sml:ResponseModel/sml:usesParameters", nsContext );
621 for ( int i = 0; i < usesParametersList.size(); i++ ) {
622 usesParameters.add( getUsesParametersFromResponseModel( usesParametersList.get( i ) ) );
623 }
624
625 // only creats the object if least one value set
626 if ( ( id != null ) || ( identifiers.size() > 0 ) || ( classifiers.size() > 0 )
627 || ( descriptions.size() > 0 ) || ( usesParameters.size() > 0 ) ) {
628 return new ResponseModel( id, ( identifiers.toArray( new Identifier[identifiers.size()] ) ),
629 ( classifiers.toArray( new Classifier[classifiers.size()] ) ),
630 ( descriptions.toArray( new Discussion[descriptions.size()] ) ),
631 usesParameters.toArray( new Object[usesParameters.size()] ) );
632 }
633 }
634 return null;
635
636 }
637
638 /**
639 *
640 * @param node
641 * @return the bean
642 * @throws MalformedURLException
643 * @throws XMLParsingException
644 */
645 protected Reference getReference( Node node )
646 throws MalformedURLException, XMLParsingException {
647
648 if ( node != null ) {
649 Object getvalue = null;
650
651 getvalue = getOnlineResource( node );
652
653 if ( getvalue != null ) {
654
655 return new Reference( getvalue );
656 }
657 }
658 return null;
659
660 }
661
662 /**
663 *
664 * @param node
665 * @return the bean
666 * @throws XMLParsingException
667 */
668 protected Discussion getDiscussion( Node node )
669 throws XMLParsingException {
670 if ( node != null ) {
671 // required
672 String value = XMLTools.getRequiredNodeAsString( node, "text()", nsContext );
673 URI topic = null;
674 // optional
675 String topicString = XMLTools.getNodeAsString( node, "@topic", nsContext, null );
676 URI codeSpace = null;
677 // optional
678 String codeSpaceString = XMLTools.getNodeAsString( node, "@codeSpace", nsContext, null );
679 // optional
680 String id = XMLTools.getNodeAsString( node, "@id", nsContext, null );
681
682 try {
683 if ( topicString != null )
684 topic = new URI( topicString );
685
686 if ( codeSpaceString != null )
687 codeSpace = new URI( codeSpaceString );
688 } catch ( URISyntaxException e ) {
689 throw new XMLParsingException( "URISyntaxException: not a valid URI" );
690 }
691
692 return new Discussion( value, topic, codeSpace, id );
693 }
694 return null;
695
696 }
697
698 /**
699 *
700 * @param node
701 * @return the bean
702 * @throws XMLParsingException
703 * @throws MalformedURLException
704 */
705 protected OnlineResource getOnlineResource( Node node )
706 throws XMLParsingException, MalformedURLException {
707
708 if ( node != null ) {
709 String function = XMLTools.getNodeAsString( node, "iso19115:CI_OnlineResource/iso19115:function/text()",
710 nsContext, null );
711
712 String linkageString = XMLTools.getNodeAsString( node,
713 "iso19115:CI_OnlineResource/iso19115:linkage/text()",
714 nsContext, null );
715
716 String protocol = XMLTools.getNodeAsString( node, "iso19115:CI_OnlineResource/iso19115:protocol/text()",
717 nsContext, null );
718
719 String applicationProfile = XMLTools.getNodeAsString(
720 node,
721 "iso19115:CI_OnlineResource/iso19115:applicationProfile/text()",
722 nsContext, null );
723
724 String name = XMLTools.getNodeAsString( node, "iso19115:CI_OnlineResource/iso19115:name/text()", nsContext,
725 null );
726
727 String description = XMLTools.getNodeAsString( node,
728 "iso19115:CI_OnlineResource/iso19115:description/text()",
729 nsContext, null );
730
731 if ( linkageString != null ) {
732 return new OnlineResource( applicationProfile, new FunctionCode( function ),
733 new Linkage( new URL( linkageString ) ), description, name, protocol );
734 }
735 }
736 return null;
737 }
738
739 /**
740 *
741 * @param node
742 * @return the bean
743 * @throws XMLParsingException
744 */
745 protected Phone getPhone( Node node )
746 throws XMLParsingException {
747
748 if ( node != null ) {
749 // get voices
750 String[] voices = XMLTools.getNodesAsStrings( node, "iso19115:phone/iso19115:voice/text()", nsContext );
751 // get facsimiles
752 String[] facsimiles = XMLTools.getNodesAsStrings( node, "iso19115:phone/iso19115:facsimile/text()",
753 nsContext );
754 return new Phone( facsimiles, null, null, voices );
755 }
756 return null;
757 }
758
759 /**
760 *
761 * @param node
762 * @return the bean
763 * @throws XMLParsingException
764 */
765 protected Address getAddress( Node node )
766 throws XMLParsingException {
767
768 if ( node != null ) {
769 String city = XMLTools.getNodeAsString( node, "iso19115:address/iso19115:city/text()", nsContext, null );
770
771 String administrativeArea = XMLTools.getNodeAsString(
772 node,
773 "iso19115:address/iso19115:administrativeArea/text()",
774 nsContext, null );
775
776 String postalCode = XMLTools.getNodeAsString( node, "iso19115:address/iso19115:postalCode/text()",
777 nsContext, null );
778
779 String country = XMLTools.getNodeAsString( node, "iso19115:address/iso19115:country/text()", nsContext,
780 null );
781
782 // get deliveryPoints
783 String[] deliveryPoints = XMLTools.getNodesAsStrings( node,
784 "iso19115:address/iso19115:deliveryPoint/text()",
785 nsContext );
786 // get electronicMailAdresses
787 String[] electronicMailAdresses = XMLTools.getNodesAsStrings(
788 node,
789 "iso19115:address/iso19115:electronicMailAddress/text()",
790 nsContext );
791 return new Address( administrativeArea, city, country, deliveryPoints, electronicMailAdresses, postalCode );
792 }
793 return null;
794 }
795
796 /**
797 *
798 * @param node
799 * @return the bean
800 * @throws MalformedURLException
801 * @throws XMLParsingException
802 */
803 protected ContactInfo getContactInfo( Node node )
804 throws MalformedURLException, XMLParsingException {
805
806 if ( node != null ) {
807 Phone phone = getPhone( node );
808 Address address = getAddress( node );
809 OnlineResource onlineResource = getOnlineResource( node );
810 String hoursOfService = XMLTools.getNodeAsString( node, "iso19115:hoursOfService/text()", nsContext, null );
811 String contactInstructions = XMLTools.getNodeAsString( node, "iso19115:contactInstructions/text()",
812 nsContext, null );
813
814 return new ContactInfo( address, contactInstructions, hoursOfService, onlineResource, phone );
815 }
816 return null;
817 }
818
819 /**
820 *
821 * @param node
822 * @return the bean
823 * @throws XMLParsingException
824 * @throws XMLParsingException
825 * @throws MalformedURLException
826 */
827 protected CitedResponsibleParty getResponsibleParty( Node node )
828 throws MalformedURLException, XMLParsingException {
829
830 if ( node != null ) {
831 // gets individualNames
832 String[] individualNames = XMLTools.getNodesAsStrings(
833 node,
834 "iso19115:CI_ResponsibleParty/iso19115:individualName/text()",
835 nsContext );
836
837 // gets organisationNames
838 String[] organisationNames = XMLTools.getNodesAsStrings(
839 node,
840 "iso19115:CI_ResponsibleParty/iso19115:organisationName/text()",
841 nsContext );
842
843 // gets positionNames
844 String[] positionNames = XMLTools.getNodesAsStrings(
845 node,
846 "iso19115:CI_ResponsibleParty/iso19115:positionName/text()",
847 nsContext );
848
849 // gets role_CodeList
850 List<Node> role_CodeListList = XMLTools.getNodes(
851 node,
852 "iso19115:CI_ResponsibleParty/iso19115:role/iso19115:CI_RoleCode_CodeList",
853 nsContext );
854 ArrayList<RoleCode> role_CodeList = new ArrayList<RoleCode>( role_CodeListList.size() );
855 for ( int i = 0; i < role_CodeListList.size(); i++ ) {
856 role_CodeList.add( new RoleCode( XMLTools.getRequiredNodeAsString( role_CodeListList.get( i ),
857 "text()", nsContext ) ) );
858 }
859
860 // gets contactInfo
861 List<Node> contactInfoList = XMLTools.getNodes( node, "iso19115:CI_ResponsibleParty/iso19115:contactInfo",
862 nsContext );
863 ArrayList<ContactInfo> contactInfo = new ArrayList<ContactInfo>( contactInfoList.size() );
864 for ( int i = 0; i < contactInfoList.size(); i++ ) {
865 contactInfo.add( getContactInfo( contactInfoList.get( i ) ) );
866 }
867
868 return new CitedResponsibleParty( contactInfo.toArray( new ContactInfo[contactInfo.size()] ),
869 individualNames, organisationNames, positionNames,
870 role_CodeList.toArray( new RoleCode[role_CodeList.size()] ) );
871 }
872 return null;
873 }
874 }