001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/sos/XMLFactory.java $ 002 /*---------------- FILE HEADER ------------------------------------------ 003 004 This file is part of deegree. 005 Copyright (C) 2001-2006 by: 006 EXSE, Department of Geography, University of Bonn 007 http://www.giub.uni-bonn.de/deegree/ 008 lat/lon GmbH 009 http://www.lat-lon.de 010 011 This library is free software; you can redistribute it and/or 012 modify it under the terms of the GNU Lesser General Public 013 License as published by the Free Software Foundation; either 014 version 2.1 of the License, or (at your option) any later version. 015 016 This library is distributed in the hope that it will be useful, 017 but WITHOUT ANY WARRANTY; without even the implied warranty of 018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 019 Lesser General Public License for more details. 020 021 You should have received a copy of the GNU Lesser General Public 022 License along with this library; if not, write to the Free Software 023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 024 025 Contact: 026 027 Andreas Poth 028 lat/lon GmbH 029 Aennchenstraße 19 030 53177 Bonn 031 Germany 032 E-Mail: poth@lat-lon.de 033 034 Prof. Dr. Klaus Greve 035 lat/lon GmbH 036 Aennchenstraße 19 037 53177 Bonn 038 Germany 039 E-Mail: fitzke@lat-lon.de 040 041 ---------------------------------------------------------------------------*/ 042 package org.deegree.ogcwebservices.sos; 043 044 import java.net.URI; 045 import java.util.ArrayList; 046 047 import org.deegree.framework.log.ILogger; 048 import org.deegree.framework.log.LoggerFactory; 049 import org.deegree.framework.xml.XMLFragment; 050 import org.deegree.framework.xml.XMLTools; 051 import org.deegree.model.metadata.iso19115.Address; 052 import org.deegree.model.metadata.iso19115.CitedResponsibleParty; 053 import org.deegree.model.metadata.iso19115.ContactInfo; 054 import org.deegree.model.metadata.iso19115.OnlineResource; 055 import org.deegree.model.metadata.iso19115.Phone; 056 import org.deegree.model.metadata.iso19115.RoleCode; 057 import org.deegree.ogcbase.CommonNamespaces; 058 import org.deegree.ogcwebservices.OGCWebServiceException; 059 import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata; 060 import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification; 061 import org.deegree.ogcwebservices.getcapabilities.ServiceProvider; 062 import org.deegree.ogcwebservices.sos.capabilities.CapabilitiesDocument; 063 import org.deegree.ogcwebservices.sos.capabilities.Platform; 064 import org.deegree.ogcwebservices.sos.capabilities.SOSCapabilities; 065 import org.deegree.ogcwebservices.sos.capabilities.Sensor; 066 import org.deegree.ogcwebservices.sos.describeplatform.DescribePlatformResult; 067 import org.deegree.ogcwebservices.sos.describeplatform.PlatformDescriptionDocument; 068 import org.deegree.ogcwebservices.sos.describeplatform.PlatformMetadata; 069 import org.deegree.ogcwebservices.sos.describesensor.DescribeSensorResult; 070 import org.deegree.ogcwebservices.sos.describesensor.SensorDescriptionDocument; 071 import org.deegree.ogcwebservices.sos.describesensor.SensorMetadata; 072 import org.deegree.ogcwebservices.sos.getobservation.GetObservationDocument; 073 import org.deegree.ogcwebservices.sos.getobservation.GetObservationResult; 074 import org.deegree.ogcwebservices.sos.om.Observation; 075 import org.deegree.ogcwebservices.sos.om.ObservationArray; 076 import org.deegree.ogcwebservices.sos.sensorml.BasicResponse; 077 import org.deegree.ogcwebservices.sos.sensorml.Classifier; 078 import org.deegree.ogcwebservices.sos.sensorml.CoordinateReferenceSystem; 079 import org.deegree.ogcwebservices.sos.sensorml.Discussion; 080 import org.deegree.ogcwebservices.sos.sensorml.EngineeringCRS; 081 import org.deegree.ogcwebservices.sos.sensorml.GeoLocation; 082 import org.deegree.ogcwebservices.sos.sensorml.GeoPositionModel; 083 import org.deegree.ogcwebservices.sos.sensorml.GeographicCRS; 084 import org.deegree.ogcwebservices.sos.sensorml.Identifier; 085 import org.deegree.ogcwebservices.sos.sensorml.LocationModel; 086 import org.deegree.ogcwebservices.sos.sensorml.Product; 087 import org.deegree.ogcwebservices.sos.sensorml.ProjectedCRS; 088 import org.deegree.ogcwebservices.sos.sensorml.Quantity; 089 import org.deegree.ogcwebservices.sos.sensorml.Reference; 090 import org.deegree.ogcwebservices.sos.sensorml.ResponseModel; 091 import org.w3c.dom.Document; 092 import org.w3c.dom.Element; 093 094 /** 095 * export data to XML Files 096 * 097 * @author <a href="mailto:mkulbe@lat-lon.de">Matthias Kulbe </a> 098 * @author last edited by: $Author: bezema $ 099 * 100 * @version $Revision: 6259 $, $Date: 2007-03-20 10:15:15 +0100 (Di, 20 Mär 2007) $ 101 */ 102 public class XMLFactory extends org.deegree.owscommon.XMLFactory { 103 104 private static final ILogger LOG = LoggerFactory.getLogger( XMLFactory.class ); 105 106 protected static final URI SOSNS = CommonNamespaces.SOSNS; 107 108 protected static final URI DEEGREESOS = CommonNamespaces.DEEGREESOS; 109 110 /** 111 * exports the SCS Capabilities 112 * 113 * @param scsCapabilities 114 * @return 115 * @throws OGCWebServiceException 116 */ 117 public static XMLFragment export( SOSCapabilities scsCapabilities ) 118 throws OGCWebServiceException { 119 120 try { 121 122 CapabilitiesDocument doc = new CapabilitiesDocument(); 123 124 doc.createEmptyDocument(); 125 126 Element root = doc.getRootElement(); 127 XMLTools.appendNSBinding( root, CommonNamespaces.SOS_PREFIX.toLowerCase(), 128 CommonNamespaces.SOSNS ); 129 130 // sets the version 131 root.setAttribute( "version", scsCapabilities.getVersion() ); 132 133 // sets the updateSsequence 134 root.setAttribute( "updateSequence", scsCapabilities.getUpdateSequence() ); 135 136 // appends the ServiceIdentification 137 ServiceIdentification serviceIdentification = scsCapabilities.getServiceIdentification(); 138 if ( serviceIdentification != null ) { 139 appendServiceIdentification( root, serviceIdentification ); 140 } 141 142 // appends the ServiceProvider 143 ServiceProvider serviceProvider = scsCapabilities.getServiceProvider(); 144 if ( serviceProvider != null ) { 145 appendServiceProvider( root, serviceProvider ); 146 } 147 148 // appends the OpertionsMetadata 149 OperationsMetadata operationsMetadata = scsCapabilities.getOperationsMetadata(); 150 if ( operationsMetadata != null ) { 151 appendOperationsMetadata( root, operationsMetadata ); 152 } 153 154 // appends the PlatformList 155 ArrayList platformList = scsCapabilities.getPlatformList(); 156 if ( platformList != null ) { 157 appendPlatformList( root, platformList ); 158 } 159 160 // appends the SensorList 161 ArrayList sensorList = scsCapabilities.getSensorList(); 162 if ( sensorList != null ) { 163 appendSensorList( root, sensorList ); 164 } 165 166 return doc; 167 168 } catch ( Exception e ) { 169 LOG.logError( e.getMessage(), e ); 170 throw new OGCWebServiceException( "scs webservice failure" ); 171 } 172 173 } 174 175 /** 176 * 177 * @param describePlatformResult 178 * @return 179 * @throws OGCWebServiceException 180 */ 181 public static XMLFragment export( DescribePlatformResult describePlatformResult ) 182 throws OGCWebServiceException { 183 184 PlatformDescriptionDocument scsDocument = new PlatformDescriptionDocument(); 185 186 // erstellt ein leeres Dokument wie in dem Template angegeben 187 try { 188 scsDocument.createEmptyDocument(); 189 190 Element root = scsDocument.getRootElement(); 191 XMLTools.appendNSBinding( root, CommonNamespaces.GML_PREFIX.toLowerCase(), 192 CommonNamespaces.GMLNS ); 193 Document doc = root.getOwnerDocument(); 194 195 PlatformMetadata[] platformMetadata = describePlatformResult.getPlatforms(); 196 197 for ( int i = 0; i < platformMetadata.length; i++ ) { 198 199 root.appendChild( appendPlatform( platformMetadata[i], doc ) ); 200 } 201 202 return scsDocument; 203 204 } catch ( Exception e ) { 205 LOG.logError( e.getMessage(), e ); 206 throw new OGCWebServiceException( "sos webservice failure" ); 207 } 208 } 209 210 /** 211 * 212 * @param describeSensorResult 213 * @return 214 * @throws OGCWebServiceException 215 */ 216 public static XMLFragment export( DescribeSensorResult describeSensorResult ) 217 throws OGCWebServiceException { 218 219 try { 220 221 SensorDescriptionDocument scsDocument = new SensorDescriptionDocument(); 222 223 scsDocument.createEmptyDocument(); 224 225 Element root = scsDocument.getRootElement(); 226 XMLTools.appendNSBinding( root, CommonNamespaces.GML_PREFIX.toLowerCase(), 227 CommonNamespaces.GMLNS ); 228 229 Document doc = root.getOwnerDocument(); 230 231 SensorMetadata[] sensorMetadata = describeSensorResult.getSensors(); 232 233 for ( int i = 0; i < sensorMetadata.length; i++ ) { 234 root.appendChild( appendSensor( sensorMetadata[i], doc ) ); 235 } 236 237 return scsDocument; 238 239 } catch ( Exception e ) { 240 e.printStackTrace(); 241 throw new OGCWebServiceException( "sos webservice failure" ); 242 } 243 } 244 245 /** 246 * 247 * @param getObservationResult 248 * @return 249 * @throws OGCWebServiceException 250 */ 251 public static XMLFragment export( GetObservationResult getObservationResult ) 252 throws OGCWebServiceException { 253 254 GetObservationDocument scsDocument = new GetObservationDocument(); 255 256 try { 257 scsDocument.createEmptyDocument(); 258 259 Element root = scsDocument.getRootElement(); 260 Document doc = root.getOwnerDocument(); 261 262 // TODO add boundedBy 263 Element boundedBy = doc.createElement( "gml:boundedBy" ); 264 root.appendChild( boundedBy ); 265 266 Element leer = doc.createElement( "gml:Null" ); 267 boundedBy.appendChild( leer ); 268 269 leer.appendChild( doc.createTextNode( "unknown" ) ); 270 271 Element observationMembers = doc.createElement( "om:observationMembers" ); 272 root.appendChild( observationMembers ); 273 274 // add observation 275 appendObservationArrays( getObservationResult.getObservations(), observationMembers, 276 doc ); 277 278 return scsDocument; 279 280 } catch ( Exception e ) { 281 LOG.logError( e.getMessage(), e ); 282 throw new OGCWebServiceException( "sos webservice failure" ); 283 } 284 } 285 286 /** 287 * appends ObservationArrays 288 * 289 * @param observationArrays 290 * @param element 291 * @param doc 292 */ 293 private static void appendObservationArrays( ObservationArray[] observationArrays, 294 Element element, Document doc ) { 295 if ( observationArrays == null ) { 296 return; 297 } 298 if ( element == null ) { 299 return; 300 } 301 if ( doc == null ) { 302 return; 303 } 304 305 for ( int i = 0; i < observationArrays.length; i++ ) { 306 307 Element observationArray = doc.createElement( "om:ObservationArray" ); 308 element.appendChild( observationArray ); 309 310 // TODO add boundedBy 311 Element boundedBy = doc.createElement( "gml:boundedBy" ); 312 observationArray.appendChild( boundedBy ); 313 314 Element boundingBox = doc.createElement( "gml:boundingBox" ); 315 boundedBy.appendChild( boundingBox ); 316 317 Element coordMin = doc.createElement( "gml:coord" ); 318 boundingBox.appendChild( coordMin ); 319 320 Element minX = doc.createElement( "gml:X" ); 321 coordMin.appendChild( minX ); 322 323 minX.appendChild( doc.createTextNode( "" 324 + observationArrays[i].getBoundedBy().getMin().getX() ) ); 325 326 Element minY = doc.createElement( "gml:Y" ); 327 coordMin.appendChild( minY ); 328 329 minY.appendChild( doc.createTextNode( "" 330 + observationArrays[i].getBoundedBy().getMin().getY() ) ); 331 332 Element coordMax = doc.createElement( "gml:coord" ); 333 boundingBox.appendChild( coordMax ); 334 335 Element maxX = doc.createElement( "gml:X" ); 336 coordMax.appendChild( maxX ); 337 338 maxX.appendChild( doc.createTextNode( "" 339 + observationArrays[i].getBoundedBy().getMax().getX() ) ); 340 341 Element maxY = doc.createElement( "gml:Y" ); 342 coordMax.appendChild( maxY ); 343 344 maxY.appendChild( doc.createTextNode( "" 345 + observationArrays[i].getBoundedBy().getMax().getY() ) ); 346 347 // TODO add using 348 Element using = doc.createElement( "om:using" ); 349 observationArray.appendChild( using ); 350 351 Element observationMembers = doc.createElement( "om:observationMembers" ); 352 observationArray.appendChild( observationMembers ); 353 354 appendObservations( observationArrays[i].getObservations(), observationMembers, doc ); 355 356 } 357 358 } 359 360 /** 361 * appends Observations 362 * 363 * @param observations 364 * @param element 365 * @param doc 366 */ 367 private static void appendObservations( Observation[] observations, Element element, 368 Document doc ) { 369 if ( observations == null ) { 370 return; 371 } 372 if ( element == null ) { 373 return; 374 } 375 if ( doc == null ) { 376 return; 377 } 378 379 for ( int i = 0; i < observations.length; i++ ) { 380 381 Element observation = doc.createElement( "gml:Observation" ); 382 element.appendChild( observation ); 383 384 // add timeStamp 385 Element timeStamp = doc.createElement( "gml:timeStamp" ); 386 observation.appendChild( timeStamp ); 387 388 Element timeInstant = doc.createElement( "gml:TimeInstant" ); 389 timeStamp.appendChild( timeInstant ); 390 391 Element timePosition = doc.createElement( "gml:timePosition" ); 392 timeInstant.appendChild( timePosition ); 393 394 timePosition.appendChild( doc.createTextNode( observations[i].getTimeStamp() ) ); 395 396 // add resultOf 397 Element resultOf = doc.createElement( "gml:resultOf" ); 398 observation.appendChild( resultOf ); 399 400 Element quantityList = doc.createElement( "gml:QuantityList" ); 401 resultOf.appendChild( quantityList ); 402 403 String ro = observations[i].getResultOf(); 404 if ( ro != null ) { 405 quantityList.appendChild( doc.createTextNode( ro ) ); 406 } 407 408 } 409 410 } 411 412 /** 413 * appends a PlatformList used by getCapabilities 414 * 415 * @param root 416 * @param platformList 417 * 418 */ 419 private static void appendPlatformList( Element root, ArrayList pl ) { 420 421 if ( pl == null ) { 422 return; 423 } 424 425 // XmlNode nn = new XmlNode(root); 426 // nn.appendDomChild(XmlNode.Element, SCSNS, "sos:PlatformList", null); 427 428 Element element = XMLTools.appendElement( root, SOSNS, "sos:PlatformList" ); 429 430 // XmlNode platformListNode = new XmlNode( nn ); 431 432 for ( int i = 0; i < pl.size(); i++ ) { 433 434 // XmlNode n = new XmlNode(platformListNode); 435 // n.appendDomChild(XmlNode.Element, SCSNS, "sos:Platform",null); 436 // XmlNode platformNode =new XmlNode( n ); 437 438 Element elem = XMLTools.appendElement( element, SOSNS, "sos:Platform" ); 439 elem.setAttribute( "Id", ( (Platform) pl.get( i ) ).getId() ); 440 441 // platformNode.appendDomChild( XmlNode.Attribute, null, "Id", "" 442 // + ((Platform) pl.get(i)).getId()); 443 444 // platformNode.appendDomChild( XmlNode.Attribute, null, "Description", 445 // "" + ((Platform) pl.get(i)).getDescription()); 446 447 elem.setAttribute( "Description", ( (Platform) pl.get( i ) ).getDescription() ); 448 } 449 } 450 451 /** 452 * appends a sensor list used by getCapabilities 453 * 454 * @param root 455 * @param sensorList 456 * 457 */ 458 private static void appendSensorList( Element root, ArrayList sl ) { 459 if ( sl == null ) { 460 return; 461 } 462 463 Element element = XMLTools.appendElement( root, SOSNS, "sos:SensorList" ); 464 465 for ( int i = 0; i < sl.size(); i++ ) { 466 Element elem = XMLTools.appendElement( element, SOSNS, "sos:Sensor" ); 467 elem.setAttribute( "Id", ( (Sensor) sl.get( i ) ).getId() ); 468 elem.setAttribute( "Description", ( (Sensor) sl.get( i ) ).getDescription() ); 469 470 } 471 } 472 473 /** 474 * returns a platform element 475 * 476 * @param actPlatform 477 * @param doc 478 * @return a platform element 479 */ 480 private static Element appendPlatform( PlatformMetadata actPlatform, Document doc ) { 481 482 if ( actPlatform == null ) { 483 return null; 484 } 485 486 Element platform = doc.createElement( "sml:Platform" ); 487 488 appendIdentifiedAs( actPlatform.getIdentifiedAs(), platform, doc ); 489 490 appendClassifiedAs( actPlatform.getClassifiedAs(), platform, doc ); 491 492 appendAttachedTo( actPlatform, platform, doc ); 493 494 appendHasCRS( actPlatform.getHasCRS(), platform, doc ); 495 496 appendDescribedBy( actPlatform, platform, doc ); 497 498 appendLocatedUsing( actPlatform.getLocatedUsing(), platform, doc ); 499 500 appendCarries( actPlatform.getCarries(), platform, doc ); 501 502 return platform; 503 } 504 505 /** 506 * 507 * @param actSensor 508 * @param doc 509 * @return 510 */ 511 private static Element appendSensor( SensorMetadata actSensor, Document doc ) { 512 if ( actSensor == null ) { 513 return null; 514 } 515 516 Element sensor = doc.createElement( "sml:Sensor" ); 517 518 appendIdentifiedAs( actSensor.getIdentifiedAs(), sensor, doc ); 519 520 appendClassifiedAs( actSensor.getClassifiedAs(), sensor, doc ); 521 522 appendAttachedTo( actSensor, sensor, doc ); 523 524 appendHasCRS( actSensor.getHasCRS(), sensor, doc ); 525 526 appendDescribedBy( actSensor, sensor, doc ); 527 528 appendLocatedUsing( actSensor.getLocatedUsing(), sensor, doc ); 529 530 appendMeasures( actSensor.getMeasures(), sensor, doc ); 531 532 return sensor; 533 } 534 535 /** 536 * appends a IdentifiedAs Node 537 * 538 * @param actii 539 * blah blah. Cannot be null. 540 * @param element 541 * @param doc 542 */ 543 private static void appendIdentifiedAs( Identifier[] actidentifier, Element element, 544 Document doc ) { 545 if ( actidentifier == null ) { 546 return; 547 } 548 549 for ( int i = 0; i < actidentifier.length; i++ ) { 550 int type = actidentifier[i].getIdentifierType(); 551 552 Element identifiedAs = doc.createElement( "sml:identifiedAs" ); 553 Element identifier = doc.createElement( "sml:Identifier" ); 554 555 // is required; no check 556 identifier.appendChild( doc.createTextNode( actidentifier[i].getIdentifierValue() ) ); 557 558 // is optional; but type must be checked 559 if ( type == 1 ) 560 identifier.setAttribute( "type", "shortName" ); 561 if ( type == 2 ) 562 identifier.setAttribute( "type", "longName" ); 563 if ( type == 3 ) 564 identifier.setAttribute( "type", "serialNumber" ); 565 if ( type == 4 ) 566 identifier.setAttribute( "type", "modelNumber" ); 567 if ( type == 5 ) 568 identifier.setAttribute( "type", "missionNumber" ); 569 if ( type == 6 ) 570 identifier.setAttribute( "type", "partNumber" ); 571 572 // is optional; check 573 if ( actidentifier[i].getIdentifierCodeSpace() != null ) 574 identifier.setAttribute( "codeSpace", actidentifier[i].getIdentifierCodeSpace() ); 575 576 identifiedAs.appendChild( identifier ); 577 element.appendChild( identifiedAs ); 578 } 579 580 } 581 582 /** 583 * 584 * @param object 585 * @param doc 586 * @return 587 */ 588 private static void appendAttachedTo( Object object, Element element, Document doc ) { 589 590 // optional; check 591 if ( ( (ComponentMetadata) object ).getAttachedTo() != null ) { 592 Element attachedTo = doc.createElement( "sml:attachedTo" ); 593 594 Element component = doc.createElement( "sml:Component" ); 595 attachedTo.appendChild( component ); 596 597 component.appendChild( doc.createTextNode( ( (ComponentMetadata) object ).getAttachedTo() ) ); 598 element.appendChild( attachedTo ); 599 } 600 } 601 602 /** 603 * 604 * @param object 605 * @param doc 606 * @return 607 */ 608 private static void appendClassifiedAs( Classifier[] actClassifier, Element element, 609 Document doc ) { 610 if ( actClassifier == null ) { 611 return; 612 } 613 614 for ( int i = 0; i < actClassifier.length; i++ ) { 615 616 Element classifiedAs = doc.createElement( "sml:classifiedAs" ); 617 Element classifier = doc.createElement( "sml:Classifier" ); 618 classifiedAs.appendChild( classifier ); 619 620 // required; no check 621 classifier.setAttribute( "type", actClassifier[i].getType() ); 622 623 // required; no check 624 classifier.appendChild( doc.createTextNode( actClassifier[i].getValue() ) ); 625 // optional; check 626 if ( actClassifier[i].getCodeSpace() != null ) { 627 classifier.setAttribute( "codeSpace", actClassifier[i].getCodeSpace() ); 628 } 629 630 element.appendChild( classifiedAs ); 631 } 632 633 } 634 635 private static void appendDerivedFrom( ResponseModel[] responseModels, Element element, 636 Document doc ) { 637 if ( responseModels == null ) { 638 return; 639 } 640 641 for ( int i = 0; i < responseModels.length; i++ ) { 642 643 Element derivedFrom = doc.createElement( "sml:derivedFrom" ); 644 element.appendChild( derivedFrom ); 645 646 Element responseModel = doc.createElement( "sml:ResponseModel" ); 647 derivedFrom.appendChild( responseModel ); 648 649 // appends identifiedAs 650 appendIdentifiedAs( responseModels[i].getIdentifiedAs(), responseModel, doc ); 651 652 // appends classifiedAs 653 appendClassifiedAs( responseModels[i].getClassifiedAs(), responseModel, doc ); 654 655 // appends description 656 appendDescription( responseModels[i].getDescription(), responseModel, doc ); 657 658 appendUsesParametersFromDerivedFrom( responseModels[i].getUsesParameters(), 659 responseModel, doc ); 660 661 } 662 663 } 664 665 /** 666 * appends a hasCRS node 667 * 668 * @param object 669 * @param element 670 * @param doc 671 */ 672 private static void appendHasCRS( EngineeringCRS engineeringCRS, Element element, Document doc ) { 673 if ( engineeringCRS == null ) { 674 return; 675 } 676 677 Element hasCRS = doc.createElement( "sml:hasCRS" ); 678 element.appendChild( hasCRS ); 679 appendEngineeringCRS( engineeringCRS, hasCRS, doc ); 680 681 } 682 683 private static void appendEngineeringCRS( EngineeringCRS engineeringCRS, Element element, 684 Document doc ) { 685 686 if ( engineeringCRS == null ) { 687 return; 688 } 689 690 Element engineeringCRSEle = doc.createElement( "gml:EngineeringCRS" ); 691 element.appendChild( engineeringCRSEle ); 692 Element srsName = doc.createElement( "gml:srsName" ); 693 694 srsName.appendChild( doc.createTextNode( engineeringCRS.getSrsName() ) ); 695 696 engineeringCRSEle.appendChild( srsName ); 697 698 } 699 700 private static void appendCoordinateReferenceSystem( CoordinateReferenceSystem crs, 701 Element element, Document doc ) { 702 703 if ( crs == null ) { 704 return; 705 } 706 707 if ( crs instanceof GeographicCRS ) { 708 Element geographicCRS = doc.createElement( "gml:GeographicCRS" ); 709 element.appendChild( geographicCRS ); 710 Element srsName = doc.createElement( "gml:srsName" ); 711 712 srsName.appendChild( doc.createTextNode( crs.getSrsName() ) ); 713 714 geographicCRS.appendChild( srsName ); 715 } 716 if ( crs instanceof ProjectedCRS ) { 717 Element projectedCRS = doc.createElement( "gml:ProjectedCRS" ); 718 element.appendChild( projectedCRS ); 719 Element srsName = doc.createElement( "gml:srsName" ); 720 721 srsName.appendChild( doc.createTextNode( crs.getSrsName() ) ); 722 723 projectedCRS.appendChild( srsName ); 724 } 725 726 } 727 728 /** 729 * 730 * @param object 731 * @param doc 732 * @return 733 */ 734 private static void appendDescribedBy( Object object, Element element, Document doc ) { 735 736 if ( ( (ComponentMetadata) object ).getDescribedBy() != null ) { 737 Element describedBy = doc.createElement( "sml:describedBy" ); 738 739 Element componentDescription = doc.createElement( "sml:ComponentDescription" ); 740 describedBy.appendChild( componentDescription ); 741 742 if ( ( ( (ComponentMetadata) object ).getDescribedBy() ).getId() != null ) { 743 componentDescription.setAttribute( 744 "id", 745 ( ( (ComponentMetadata) object ).getDescribedBy() ).getId() ); 746 } 747 748 // append description 749 appendDescription( 750 ( ( (ComponentMetadata) object ).getDescribedBy() ).getDescription(), 751 componentDescription, doc ); 752 753 // append operatedBy 754 CitedResponsibleParty[] operatedBy = ( ( (ComponentMetadata) object ).getDescribedBy() ).getOperatedBy(); 755 for ( int i = 0; i < operatedBy.length; i++ ) { 756 appendOperatedBy( operatedBy[i], componentDescription, doc ); 757 } 758 759 // append operatedBy 760 CitedResponsibleParty[] manufactedBy = ( ( (ComponentMetadata) object ).getDescribedBy() ).getManufacturedBy(); 761 for ( int i = 0; i < manufactedBy.length; i++ ) { 762 appendManufactedBy( manufactedBy[i], componentDescription, doc ); 763 } 764 765 // append operatedBy 766 CitedResponsibleParty[] deployedBy = ( ( (ComponentMetadata) object ).getDescribedBy() ).getDeployedBy(); 767 for ( int i = 0; i < deployedBy.length; i++ ) { 768 appendDeployedBy( deployedBy[i], componentDescription, doc ); 769 } 770 771 // append reference 772 Reference[] reference = ( ( (ComponentMetadata) object ).getDescribedBy() ).getReference(); 773 if ( ( reference != null ) && ( reference.length > 0 ) ) { 774 Element ref = doc.createElement( "sml:reference" ); 775 componentDescription.appendChild( ref ); 776 777 for ( int i = 0; i < reference.length; i++ ) { 778 if ( reference[i].isOnLineResource() ) { 779 780 appendOnlineResource( reference[i].getOnLineResource(), ref, doc ); 781 } 782 if ( reference[i].isCitation() ) { 783 784 } 785 } 786 } 787 element.appendChild( describedBy ); 788 } 789 790 } 791 792 private static void appendLocatedUsing( LocationModel[] locatedUsingList, Element element, 793 Document doc ) { 794 795 if ( locatedUsingList == null ) { 796 return; 797 } 798 799 Element locatedUsing = doc.createElement( "sml:locatedUsing" ); 800 element.appendChild( locatedUsing ); 801 802 // process all locatedUsing objects 803 for ( int i = 0; i < locatedUsingList.length; i++ ) { 804 805 // is GeoPositionModel 806 if ( locatedUsingList[i] instanceof GeoPositionModel ) { 807 Element geoPositionModel = doc.createElement( "sml:GeoPositionModel" ); 808 locatedUsing.appendChild( geoPositionModel ); 809 810 if ( ( (GeoPositionModel) locatedUsingList[i] ).getId() != null ) { 811 geoPositionModel.setAttribute( 812 "id", 813 ( (GeoPositionModel) locatedUsingList[i] ).getId() ); 814 } 815 816 appendIdentifiedAs( ( (GeoPositionModel) locatedUsingList[i] ).getIdentifiedAs(), 817 geoPositionModel, doc ); 818 819 appendClassifiedAs( ( (GeoPositionModel) locatedUsingList[i] ).getClassifiedAs(), 820 geoPositionModel, doc ); 821 822 appendDescription( ( (GeoPositionModel) locatedUsingList[i] ).getDescription(), 823 geoPositionModel, doc ); 824 825 // append sourceCRS 826 Element sourceCRS = doc.createElement( "sml:sourceCRS" ); 827 geoPositionModel.appendChild( sourceCRS ); 828 appendEngineeringCRS( ( (GeoPositionModel) locatedUsingList[i] ).getSourceCRS(), 829 sourceCRS, doc ); 830 831 // append referenceCRS 832 Element referenceCRS = doc.createElement( "sml:referenceCRS" ); 833 geoPositionModel.appendChild( referenceCRS ); 834 appendCoordinateReferenceSystem( 835 ( (GeoPositionModel) locatedUsingList[i] ).getReferenceCRS(), 836 referenceCRS, doc ); 837 838 // append usesParameters 839 appendUsesParametersFromGeoLocation( 840 ( (GeoPositionModel) locatedUsingList[i] ).getUsesParametersObjects(), 841 geoPositionModel, doc ); 842 843 } 844 } 845 846 } 847 848 private static void appendUsesParametersFromGeoLocation( Object[] objects, Element element, 849 Document doc ) { 850 851 if ( objects == null ) { 852 return; 853 } 854 855 for ( int i = 0; i < objects.length; i++ ) { 856 // is GeoLocation 857 if ( objects[i] instanceof GeoLocation ) { 858 Element usesParameters = doc.createElement( "sml:usesParameters" ); 859 element.appendChild( usesParameters ); 860 861 Element geoLocation = doc.createElement( "sml:GeoLocation" ); 862 usesParameters.appendChild( geoLocation ); 863 864 geoLocation.setAttribute( "id", ( (GeoLocation) objects[i] ).getId() ); 865 866 // appends latitude 867 Element latitude = doc.createElement( "sml:latitude" ); 868 geoLocation.appendChild( latitude ); 869 appendQuantity( ( (GeoLocation) objects[i] ).getLatitude(), latitude, doc ); 870 871 // appends longitude 872 Element longitude = doc.createElement( "sml:longitude" ); 873 geoLocation.appendChild( longitude ); 874 appendQuantity( ( (GeoLocation) objects[i] ).getLongitude(), longitude, doc ); 875 876 // appends altitude 877 if ( ( (GeoLocation) objects[i] ).getAltitude() != null ) { 878 Element altitude = doc.createElement( "sml:altitude" ); 879 geoLocation.appendChild( altitude ); 880 appendQuantity( ( (GeoLocation) objects[i] ).getAltitude(), altitude, doc ); 881 } 882 883 // appends trueHeading 884 if ( ( (GeoLocation) objects[i] ).getTrueHeading() != null ) { 885 Element trueHeading = doc.createElement( "sml:trueHeading" ); 886 geoLocation.appendChild( trueHeading ); 887 appendQuantity( ( (GeoLocation) objects[i] ).getTrueHeading(), trueHeading, doc ); 888 } 889 890 // appends speed 891 if ( ( (GeoLocation) objects[i] ).getSpeed() != null ) { 892 Element speed = doc.createElement( "sml:speed" ); 893 geoLocation.appendChild( speed ); 894 appendQuantity( ( (GeoLocation) objects[i] ).getSpeed(), speed, doc ); 895 } 896 897 } 898 899 } 900 } 901 902 private static void appendUsesParametersFromDerivedFrom( Object[] objects, Element element, 903 Document doc ) { 904 if ( objects != null ) { 905 for ( int i = 0; i < objects.length; i++ ) { 906 // is GeoLocation 907 if ( objects[i] instanceof BasicResponse ) { 908 Element usesParameters = doc.createElement( "sml:usesParameters" ); 909 element.appendChild( usesParameters ); 910 911 Element basicResponse = doc.createElement( "sml:BasicResponse" ); 912 usesParameters.appendChild( basicResponse ); 913 914 Element resolution = doc.createElement( "sml:resolution" ); 915 basicResponse.appendChild( resolution ); 916 917 Element typedQuantity = doc.createElement( "sml:TypedQuantity" ); 918 resolution.appendChild( typedQuantity ); 919 920 typedQuantity.appendChild( doc.createTextNode( "" 921 + ( (BasicResponse) objects[i] ).getResolution().getValue() ) ); 922 923 // sets required attrib type 924 typedQuantity.setAttribute( 925 "type", 926 ( (BasicResponse) objects[i] ).getResolution().getType().toString() ); 927 928 // sets optional attrib codeSpace 929 if ( ( (BasicResponse) objects[i] ).getResolution().getCodeSpace() != null ) { 930 typedQuantity.setAttribute( 931 "codeSpace", 932 ( (BasicResponse) objects[i] ).getResolution().getCodeSpace().toString() ); 933 } 934 935 // sets optional attrib fixed 936 if ( !( (BasicResponse) objects[i] ).getResolution().isFixed() ) { 937 typedQuantity.setAttribute( "fixed", "false" ); 938 } 939 940 // sets optional attrib uom 941 if ( ( (BasicResponse) objects[i] ).getResolution().getUom() != null ) { 942 typedQuantity.setAttribute( 943 "uom", 944 ( (BasicResponse) objects[i] ).getResolution().getUom().toString() ); 945 } 946 947 // sets optional attrib min 948 if ( !Double.isNaN( ( (BasicResponse) objects[i] ).getResolution().getMin() ) ) { 949 typedQuantity.setAttribute( 950 "min", 951 "" 952 + ( (BasicResponse) objects[i] ).getResolution().getMin() ); 953 } 954 955 // sets optional attrib max 956 if ( !Double.isNaN( ( (BasicResponse) objects[i] ).getResolution().getMax() ) ) { 957 typedQuantity.setAttribute( 958 "max", 959 "" 960 + ( (BasicResponse) objects[i] ).getResolution().getMax() ); 961 } 962 963 // sets optional attrib id 964 if ( ( (BasicResponse) objects[i] ).getResolution().getId() != null ) { 965 typedQuantity.setAttribute( 966 "id", 967 ( (BasicResponse) objects[i] ).getResolution().getId() ); 968 } 969 970 } 971 972 } 973 974 } 975 } 976 977 private static void appendQuantity( Quantity quantity, Element element, Document doc ) { 978 979 if ( quantity == null ) { 980 return; 981 } 982 983 Element quantityEle = doc.createElement( "sml:Quantity" ); 984 element.appendChild( quantityEle ); 985 quantityEle.appendChild( doc.createTextNode( "" + quantity.getValue() ) ); 986 987 // appends uom 988 if ( quantity.getUom() != null ) { 989 quantityEle.setAttribute( "uom", quantity.getUom().toString() ); 990 } 991 992 // appends fixed 993 if ( quantity.isFixed() ) { 994 quantityEle.setAttribute( "fixed", "true" ); 995 } 996 if ( !quantity.isFixed() ) { 997 quantityEle.setAttribute( "fixed", "false" ); 998 } 999 1000 // appends min 1001 if ( !Double.isNaN( quantity.getMin() ) ) { 1002 quantityEle.setAttribute( "min", "" + quantity.getMin() ); 1003 } 1004 1005 // appends max 1006 if ( !Double.isNaN( quantity.getMax() ) ) { 1007 quantityEle.setAttribute( "max", "" + quantity.getMax() ); 1008 } 1009 1010 } 1011 1012 /** 1013 * 1014 * @param description 1015 * @param element 1016 * @param doc 1017 */ 1018 private static void appendDescription( Discussion[] description, Element element, Document doc ) { 1019 1020 if ( description == null ) { 1021 return; 1022 } 1023 1024 for ( int i = 0; i < description.length; i++ ) { 1025 1026 Element desc = doc.createElement( "sml:description" ); 1027 1028 desc.appendChild( doc.createTextNode( description[i].getValue() ) ); 1029 1030 if ( description[i].getId() != null ) { 1031 desc.setAttribute( "id", description[i].getId() ); 1032 } 1033 if ( description[i].getTopic() != null ) { 1034 desc.setAttribute( "topic", description[i].getTopic().toString() ); 1035 } 1036 if ( description[i].getCodeSpace() != null ) { 1037 desc.setAttribute( "codeSpace", description[i].getCodeSpace().toString() ); 1038 1039 } 1040 1041 element.appendChild( desc ); 1042 } 1043 1044 } 1045 1046 /** 1047 * 1048 * @param onlineResource 1049 * @param element 1050 * @param doc 1051 */ 1052 private static void appendOnlineResource( OnlineResource onlineResource, Element element, 1053 Document doc ) { 1054 1055 if ( onlineResource == null ) { 1056 return; 1057 } 1058 1059 Element onlineRes = doc.createElement( "iso19115:CI_OnlineResource" ); 1060 1061 // append linkage 1062 Element linkage = doc.createElement( "iso19115:linkage" ); 1063 linkage.appendChild( doc.createTextNode( onlineResource.getLinkage().getHref().toString() ) ); 1064 onlineRes.appendChild( linkage ); 1065 1066 // append function 1067 if ( onlineResource.getFunctionCode().getValue() != null ) { 1068 Element function = doc.createElement( "iso19115:function" ); 1069 function.appendChild( doc.createTextNode( onlineResource.getFunctionCode().getValue() ) ); 1070 onlineRes.appendChild( function ); 1071 } 1072 1073 // append protocol 1074 if ( onlineResource.getProtocol() != null ) { 1075 Element protocol = doc.createElement( "iso19115:protocol" ); 1076 protocol.appendChild( doc.createTextNode( onlineResource.getProtocol() ) ); 1077 onlineRes.appendChild( protocol ); 1078 } 1079 1080 // append applicationProfile 1081 if ( onlineResource.getApplicationProfile() != null ) { 1082 Element applicationProfile = doc.createElement( "iso19115:applicationProfile" ); 1083 applicationProfile.appendChild( doc.createTextNode( onlineResource.getApplicationProfile() ) ); 1084 onlineRes.appendChild( applicationProfile ); 1085 } 1086 1087 // append name 1088 if ( onlineResource.getOnlineResourceName() != null ) { 1089 Element name = doc.createElement( "iso19115:name" ); 1090 name.appendChild( doc.createTextNode( onlineResource.getOnlineResourceName() ) ); 1091 onlineRes.appendChild( name ); 1092 } 1093 1094 // append description 1095 if ( onlineResource.getOnlineResourceDescription() != null ) { 1096 Element description = doc.createElement( "iso19115:description" ); 1097 description.appendChild( doc.createTextNode( onlineResource.getOnlineResourceDescription() ) ); 1098 onlineRes.appendChild( description ); 1099 } 1100 1101 element.appendChild( onlineRes ); 1102 1103 } 1104 1105 private static void appendOperatedBy( CitedResponsibleParty responsibleParty, Element element, 1106 Document doc ) { 1107 1108 if ( responsibleParty == null ) { 1109 return; 1110 } 1111 1112 Element operatedBy = doc.createElement( "sml:operatedBy" ); 1113 element.appendChild( operatedBy ); 1114 appendResponsibleParty( responsibleParty, operatedBy, doc ); 1115 1116 } 1117 1118 private static void appendManufactedBy( CitedResponsibleParty responsibleParty, 1119 Element element, Document doc ) { 1120 1121 if ( responsibleParty == null ) { 1122 return; 1123 } 1124 1125 Element manufactedBy = doc.createElement( "sml:manufactedBy" ); 1126 element.appendChild( manufactedBy ); 1127 appendResponsibleParty( responsibleParty, manufactedBy, doc ); 1128 1129 } 1130 1131 private static void appendDeployedBy( CitedResponsibleParty responsibleParty, Element element, 1132 Document doc ) { 1133 1134 if ( responsibleParty == null ) { 1135 return; 1136 } 1137 1138 Element deployedBy = doc.createElement( "sml:deployedBy" ); 1139 element.appendChild( deployedBy ); 1140 appendResponsibleParty( responsibleParty, deployedBy, doc ); 1141 1142 } 1143 1144 private static void appendContactInfo( ContactInfo contact, Element element, Document doc ) { 1145 1146 if ( contact == null ) { 1147 return; 1148 } 1149 1150 Element cont = doc.createElement( "iso19115:contactInfo" ); 1151 element.appendChild( cont ); 1152 1153 if ( contact.getPhone() != null ) { 1154 appendPhone( contact.getPhone(), cont, doc ); 1155 } 1156 1157 if ( contact.getAddress() != null ) { 1158 appendAddress( contact.getAddress(), cont, doc ); 1159 } 1160 1161 if ( contact.getOnLineResource() != null ) { 1162 appendOnlineResource( contact.getOnLineResource(), cont, doc ); 1163 } 1164 1165 if ( contact.getHoursOfService() != null ) { 1166 Element hours = doc.createElement( "iso19115:hoursOfService" ); 1167 cont.appendChild( hours ); 1168 hours.appendChild( doc.createTextNode( contact.getHoursOfService() ) ); 1169 } 1170 1171 if ( contact.getContactInstructions() != null ) { 1172 Element instr = doc.createElement( "iso19115:contactInstructions" ); 1173 cont.appendChild( instr ); 1174 instr.appendChild( doc.createTextNode( contact.getContactInstructions() ) ); 1175 } 1176 1177 } 1178 1179 private static void appendPhone( Phone phone, Element element, Document doc ) { 1180 1181 if ( phone == null ) { 1182 return; 1183 } 1184 1185 Element phoneEle = doc.createElement( "iso19115:phone" ); 1186 element.appendChild( phoneEle ); 1187 1188 String[] voice = phone.getVoice(); 1189 if ( ( voice != null ) && ( voice.length > 0 ) ) { 1190 for ( int i = 0; i < voice.length; i++ ) { 1191 Element actVoice = doc.createElement( "iso19115:voice" ); 1192 phoneEle.appendChild( actVoice ); 1193 actVoice.appendChild( doc.createTextNode( voice[i] ) ); 1194 } 1195 } 1196 1197 String[] fac = phone.getFacsimile(); 1198 if ( ( fac != null ) && ( fac.length > 0 ) ) { 1199 for ( int i = 0; i < fac.length; i++ ) { 1200 Element actFac = doc.createElement( "iso19115:facsimile" ); 1201 phoneEle.appendChild( actFac ); 1202 actFac.appendChild( doc.createTextNode( fac[i] ) ); 1203 } 1204 } 1205 1206 } 1207 1208 private static void appendAddress( Address address, Element element, Document doc ) { 1209 1210 if ( address == null ) { 1211 return; 1212 } 1213 1214 Element addr = doc.createElement( "iso19115:address" ); 1215 element.appendChild( addr ); 1216 1217 if ( address.getCity() != null ) { 1218 Element city = doc.createElement( "iso19115:city" ); 1219 addr.appendChild( city ); 1220 city.appendChild( doc.createTextNode( address.getCity() ) ); 1221 } 1222 1223 if ( address.getAdministrativeArea() != null ) { 1224 Element administrativeArea = doc.createElement( "iso19115:administrativeArea" ); 1225 addr.appendChild( administrativeArea ); 1226 administrativeArea.appendChild( doc.createTextNode( address.getAdministrativeArea() ) ); 1227 } 1228 1229 if ( address.getPostalCode() != null ) { 1230 Element postalCode = doc.createElement( "iso19115:postalCode" ); 1231 addr.appendChild( postalCode ); 1232 postalCode.appendChild( doc.createTextNode( address.getPostalCode() ) ); 1233 } 1234 1235 if ( address.getCountry() != null ) { 1236 Element country = doc.createElement( "iso19115:country" ); 1237 addr.appendChild( country ); 1238 country.appendChild( doc.createTextNode( address.getCountry() ) ); 1239 } 1240 1241 String[] deliveryPoints = address.getDeliveryPoint(); 1242 for ( int i = 0; i < deliveryPoints.length; i++ ) { 1243 Element deliveryPoint = doc.createElement( "iso19115:deliveryPoint" ); 1244 addr.appendChild( deliveryPoint ); 1245 deliveryPoint.appendChild( doc.createTextNode( deliveryPoints[i] ) ); 1246 } 1247 1248 String[] electronicMailAddresses = address.getElectronicMailAddress(); 1249 for ( int i = 0; i < electronicMailAddresses.length; i++ ) { 1250 Element electronicMailAddress = doc.createElement( "iso19115:electronicMailAddress" ); 1251 addr.appendChild( electronicMailAddress ); 1252 electronicMailAddress.appendChild( doc.createTextNode( electronicMailAddresses[i] ) ); 1253 } 1254 1255 } 1256 1257 private static void appendResponsibleParty( CitedResponsibleParty responsibleParty, 1258 Element element, Document doc ) { 1259 1260 if ( responsibleParty == null ) { 1261 return; 1262 } 1263 1264 Element respParty = doc.createElement( "iso19115:CI_ResponsibleParty" ); 1265 element.appendChild( respParty ); 1266 1267 // append IndividualName 1268 if ( responsibleParty.getIndividualName() != null ) { 1269 String[] individualNameList = responsibleParty.getIndividualName(); 1270 for ( int i = 0; i < individualNameList.length; i++ ) { 1271 Element individualName = doc.createElement( "iso19115:individualName" ); 1272 individualName.appendChild( doc.createTextNode( individualNameList[i] ) ); 1273 respParty.appendChild( individualName ); 1274 } 1275 } 1276 1277 // append OrganisationName 1278 if ( responsibleParty.getOrganisationName() != null ) { 1279 String[] organisationNameList = responsibleParty.getOrganisationName(); 1280 for ( int i = 0; i < organisationNameList.length; i++ ) { 1281 Element organisationName = doc.createElement( "iso19115:organisationName" ); 1282 organisationName.appendChild( doc.createTextNode( organisationNameList[i] ) ); 1283 respParty.appendChild( organisationName ); 1284 } 1285 } 1286 1287 // append PositionName 1288 if ( responsibleParty.getPositionName() != null ) { 1289 String[] positionNameList = responsibleParty.getPositionName(); 1290 for ( int i = 0; i < positionNameList.length; i++ ) { 1291 Element positionName = doc.createElement( "iso19115:positionName" ); 1292 positionName.appendChild( doc.createTextNode( positionNameList[i] ) ); 1293 respParty.appendChild( positionName ); 1294 } 1295 } 1296 1297 // append Role as codelist 1298 1299 RoleCode[] roleList = responsibleParty.getRoleCode(); 1300 1301 for ( int i = 0; i < roleList.length; i++ ) { 1302 if ( roleList[i].getValue() != null ) { 1303 Element role = doc.createElement( "iso19115:role" ); 1304 respParty.appendChild( role ); 1305 Element codeList = doc.createElement( "iso19115:CI_RoleCode_CodeList" ); 1306 role.appendChild( codeList ); 1307 codeList.appendChild( doc.createTextNode( roleList[i].getValue() ) ); 1308 } 1309 } 1310 1311 // append contact 1312 if ( responsibleParty.getContactInfo() != null ) { 1313 ContactInfo[] contactInfoList = responsibleParty.getContactInfo(); 1314 for ( int i = 0; i < contactInfoList.length; i++ ) { 1315 appendContactInfo( contactInfoList[i], respParty, doc ); 1316 } 1317 1318 } 1319 1320 } 1321 1322 private static void appendMeasures( Product[] products, Element element, Document doc ) { 1323 1324 if ( products == null ) { 1325 return; 1326 } 1327 1328 for ( int i = 0; i < products.length; i++ ) { 1329 1330 Element measures = doc.createElement( "sml:measures" ); 1331 Element product = doc.createElement( "sml:Product" ); 1332 if ( products[i].getId() != null ) { 1333 product.setAttribute( "id", products[i].getId() ); 1334 } 1335 measures.appendChild( product ); 1336 1337 // appends identifiedAs 1338 appendIdentifiedAs( products[i].getIdentifiedAs(), product, doc ); 1339 1340 // appends classifiedAs 1341 appendClassifiedAs( products[i].getClassifiedAs(), product, doc ); 1342 1343 // appends description 1344 appendDescription( products[i].getDescription(), product, doc ); 1345 1346 // appends observable 1347 if ( products[i].getObservable() != null ) { 1348 Element observable = doc.createElement( "sml:observable" ); 1349 product.appendChild( observable ); 1350 Element phenomenon = doc.createElement( "sml:Phenomenon" ); 1351 observable.appendChild( phenomenon ); 1352 1353 if ( products[i].getObservable().getId() != null ) { 1354 phenomenon.setAttribute( "id", products[i].getObservable().getId() ); 1355 } 1356 1357 if ( products[i].getObservable().getName() != null ) { 1358 Element name = doc.createElement( "sml:name" ); 1359 phenomenon.appendChild( name ); 1360 name.appendChild( doc.createTextNode( products[i].getObservable().getName() ) ); 1361 } 1362 1363 if ( products[i].getObservable().getDefinition() != null ) { 1364 Element description = doc.createElement( "sml:description" ); 1365 phenomenon.appendChild( description ); 1366 description.appendChild( doc.createTextNode( products[i].getObservable().getDefinition() ) ); 1367 } 1368 } 1369 1370 // appends hasCRS 1371 if ( products[i].getHasCRS() != null ) { 1372 appendHasCRS( products[i].getHasCRS(), product, doc ); 1373 } 1374 1375 // appends locatedUsing 1376 if ( products[i].getLocatedUsing() != null ) { 1377 appendLocatedUsing( products[i].getLocatedUsing(), product, doc ); 1378 } 1379 1380 appendDerivedFrom( products[i].getDerivedFrom(), product, doc ); 1381 1382 element.appendChild( measures ); 1383 } 1384 1385 } 1386 1387 private static void appendCarries( String[] asset, Element element, Document doc ) { 1388 if ( asset == null ) { 1389 return; 1390 } 1391 1392 for ( int i = 0; i < asset.length; i++ ) { 1393 Element carries = doc.createElement( "sml:carries" ); 1394 element.appendChild( carries ); 1395 Element assetEle = doc.createElement( "sml:Asset" ); 1396 carries.appendChild( assetEle ); 1397 assetEle.appendChild( doc.createTextNode( asset[i] ) ); 1398 1399 } 1400 1401 } 1402 } 1403 1404 /*************************************************************************************************** 1405 * <code> 1406 Changes to this class. What the people have been up to: 1407 1408 $Log$ 1409 Revision 1.18 2007/02/12 11:54:43 wanhoff 1410 fixed Javadoc @return tag and footer 1411 1412 Revision 1.17 2006/08/24 06:42:16 poth 1413 File header corrected 1414 1415 Revision 1.16 2006/08/07 12:12:30 poth 1416 unneccessary type cast removed / Log statements added 1417 1418 Revision 1.15 2006/07/12 16:59:32 poth 1419 required adaptions according to renaming of OnLineResource to OnlineResource 1420 1421 Revision 1.14 2006/07/12 14:46:18 poth 1422 comment footer added 1423 1424 </code> 1425 **************************************************************************************************/