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 }