001 // $HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wcs/XMLFactory.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.wcs;
037
038 import java.io.IOException;
039 import java.net.URI;
040 import java.net.URL;
041
042 import org.deegree.datatypes.CodeList;
043 import org.deegree.datatypes.values.Interval;
044 import org.deegree.datatypes.values.TypedLiteral;
045 import org.deegree.datatypes.values.ValueEnum;
046 import org.deegree.framework.log.ILogger;
047 import org.deegree.framework.log.LoggerFactory;
048 import org.deegree.framework.util.StringTools;
049 import org.deegree.framework.xml.XMLFragment;
050 import org.deegree.framework.xml.XMLParsingException;
051 import org.deegree.framework.xml.XMLTools;
052 import org.deegree.model.metadata.iso19115.Address;
053 import org.deegree.model.metadata.iso19115.CitedResponsibleParty;
054 import org.deegree.model.metadata.iso19115.ContactInfo;
055 import org.deegree.model.metadata.iso19115.Linkage;
056 import org.deegree.model.metadata.iso19115.OnlineResource;
057 import org.deegree.model.metadata.iso19115.Phone;
058 import org.deegree.model.spatialschema.Envelope;
059 import org.deegree.ogcbase.CommonNamespaces;
060 import org.deegree.ogcwebservices.ExceptionFormat;
061 import org.deegree.ogcwebservices.MetadataLink;
062 import org.deegree.ogcwebservices.SupportedFormats;
063 import org.deegree.ogcwebservices.SupportedSRSs;
064 import org.deegree.ogcwebservices.getcapabilities.Capability;
065 import org.deegree.ogcwebservices.getcapabilities.HTTP;
066 import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
067 import org.deegree.ogcwebservices.getcapabilities.Operation;
068 import org.deegree.ogcwebservices.getcapabilities.Service;
069 import org.deegree.ogcwebservices.wcs.configuration.InvalidConfigurationException;
070 import org.deegree.ogcwebservices.wcs.configuration.WCSConfiguration;
071 import org.deegree.ogcwebservices.wcs.configuration.WCSConfigurationDocument;
072 import org.deegree.ogcwebservices.wcs.configuration.WCSDeegreeParams;
073 import org.deegree.ogcwebservices.wcs.describecoverage.AxisDescription;
074 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageDescription;
075 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageDescriptionDocument;
076 import org.deegree.ogcwebservices.wcs.describecoverage.CoverageOffering;
077 import org.deegree.ogcwebservices.wcs.describecoverage.DomainSet;
078 import org.deegree.ogcwebservices.wcs.describecoverage.RangeSet;
079 import org.deegree.ogcwebservices.wcs.describecoverage.SpatialDomain;
080 import org.deegree.ogcwebservices.wcs.getcapabilities.ContentMetadata;
081 import org.deegree.ogcwebservices.wcs.getcapabilities.WCSCapabilities;
082 import org.deegree.ogcwebservices.wcs.getcapabilities.WCSCapabilitiesDocument;
083 import org.deegree.ogcwebservices.wcs.getcapabilities.WCSCapabilityOperations;
084 import org.w3c.dom.Document;
085 import org.w3c.dom.Element;
086 import org.xml.sax.SAXException;
087
088 /**
089 *
090 *
091 * @version $Revision: 18195 $
092 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
093 * @author last edited by: $Author: mschneider $
094 *
095 * @version 1.0. $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
096 *
097 * @since 1.1
098 */
099 public class XMLFactory extends org.deegree.ogcbase.XMLFactory {
100
101 private static final ILogger LOG = LoggerFactory.getLogger( XMLFactory.class );
102
103 protected static final URI WCSNS = CommonNamespaces.WCSNS;
104
105 protected static final URI DGRNS = CommonNamespaces.DEEGREEWCS;
106
107 /**
108 * ... notice:
109 * </p>
110 * at the moment just HTTP is supported as DCPType. It is assumed that just one HTTP element is
111 * assigned within an operation
112 * </p>
113 * vendor specific capabilities are not supported yet and won't be appended to the document if
114 * present.
115 *
116 * @param capabilities
117 * @return the xml representation of the given bean.
118 * @throws InvalidCapabilitiesException
119 * @throws IOException
120 */
121 public static WCSCapabilitiesDocument export( WCSCapabilities capabilities )
122 throws InvalidCapabilitiesException, IOException {
123 WCSCapabilitiesDocument wcsCapaDoc = new WCSCapabilitiesDocument();
124 try {
125 wcsCapaDoc.createEmptyDocument();
126 Element root = wcsCapaDoc.getRootElement();
127
128 Service service = capabilities.getService();
129 appendService( root, service );
130 Capability capability = capabilities.getCapabilitiy();
131 appendCapability( root, capability );
132 ContentMetadata contentMetadata = capabilities.getContentMetadata();
133 appendContentMetadata( root, contentMetadata );
134 } catch ( XMLParsingException e ) {
135 LOG.logError( "could not parse the WCSCapabilitiesTemplate.xml", e );
136 String s = "could not parse the WCSCapabilitiesTemplate.xml" + "\n" + e.getMessage();
137 throw new InvalidCapabilitiesException( s );
138 } catch ( SAXException e ) {
139 LOG.logError( "couldn't create XML Document for CoverageDescription ", e );
140 throw new IOException( "couldn't create XML Document for CoverageDescription" + e.getMessage() );
141 }
142 return wcsCapaDoc;
143 }
144
145 /**
146 * @param configuration to be exported
147 * @return the configuration represented as an xml dom object.
148 * @throws InvalidConfigurationException
149 * @throws IOException
150 */
151 public static XMLFragment export( WCSConfiguration configuration )
152 throws InvalidConfigurationException, IOException {
153 WCSConfigurationDocument wcsConfigDoc = new WCSConfigurationDocument();
154 try {
155 wcsConfigDoc.createEmptyDocument();
156 Element root = wcsConfigDoc.getRootElement();
157 WCSDeegreeParams deegreeParams = configuration.getDeegreeParams();
158 appendDeegreeParams( root, deegreeParams );
159 Service service = configuration.getService();
160 appendService( root, service );
161 Capability capability = configuration.getCapabilitiy();
162 appendCapability( root, capability );
163 ContentMetadata contentMetadata = configuration.getContentMetadata();
164 appendContentMetadata( root, contentMetadata );
165 } catch ( XMLParsingException e ) {
166 String s = "could not parse the WCSCapabilitiesTemplate.xml" + "\n" + e.getMessage() + "\n"
167 + StringTools.stackTraceToString( e );
168 throw new InvalidConfigurationException( s );
169 } catch ( SAXException e ) {
170 throw new IOException( "couldn't create XML Document for CoverageDescription " + e.getMessage() + "\n"
171 + StringTools.stackTraceToString( e ) );
172 }
173 return wcsConfigDoc;
174 }
175
176 /**
177 * exprots a WCS <tt>CoverageDescription</tt> object to its XML represetation encapsulated
178 * within a <tt>XmlDocument</tt>
179 *
180 * @param coverageDescription
181 * @return the coverage description as an xml dom object.
182 * @throws IOException
183 */
184 public static XMLFragment export( CoverageDescription coverageDescription )
185 throws IOException {
186 CoverageDescriptionDocument covDescDoc = new CoverageDescriptionDocument();
187 try {
188 covDescDoc.createEmptyDocument();
189 Element root = covDescDoc.getRootElement();
190 root.setAttribute( "version", coverageDescription.getVersion() );
191 CoverageOffering[] cos = coverageDescription.getCoverageOfferings();
192 for ( int i = 0; i < cos.length; i++ ) {
193 appendCoverageOffering( root, cos[i] );
194 }
195 } catch ( SAXException e ) {
196 throw new IOException( "couldn't create XML Document for CoverageDescription " + e.getMessage() + "\n"
197 + StringTools.stackTraceToString( e ) );
198 }
199 return covDescDoc;
200 }
201
202 /**
203 * appends the XML representation of the deegreeParams section to the passed <tt>Element</tt>
204 *
205 * @param root
206 * @param deegreeParam
207 * @throws XMLParsingException
208 */
209 protected static void appendDeegreeParams( Element root, WCSDeegreeParams deegreeParam )
210 throws XMLParsingException {
211
212 Element element = XMLTools.getRequiredChildElement( "deegreeParam", DGRNS, root );
213 Element node = XMLTools.appendElement( element, DGRNS, "deegree:DefaultOnlineResource" );
214 node.setAttribute( "xmlns:xlink", "http://www.w3.org/1999/xlink" );
215 node.setAttribute( "xlink:type", "simple" );
216 node.setAttribute( "xlink:href", deegreeParam.getDefaultOnlineResource().toString() );
217 XMLTools.appendElement( element, DGRNS, "deegree:CacheSize", "" + deegreeParam.getCacheSize() );
218 XMLTools.appendElement( element, DGRNS, "deegree:RequestTimeLimit", "" + deegreeParam.getRequestTimeLimit() );
219 appendDirectoryList( element, deegreeParam.getDirectoryList() );
220
221 }
222
223 /**
224 * appends the XML representation of a list of data directory names to the passed
225 * <tt>XmlNode</tt>
226 *
227 * @param dgrParam
228 * @param directoryList
229 */
230 protected static void appendDirectoryList( Element dgrParam, String[] directoryList ) {
231 if ( directoryList == null || directoryList.length == 0 )
232 return;
233 Element node = XMLTools.appendElement( dgrParam, DGRNS, "deegree:DataDirectoryList", null );
234 for ( int i = 0; i < directoryList.length; i++ ) {
235 XMLTools.appendElement( node, DGRNS, "deegree:DataDirectory", directoryList[i] );
236 }
237 }
238
239 protected static void appendCoverageOffering( Element parent, CoverageOffering coverageOffering ) {
240
241 // Document doc = XMLTools.create();
242 Document doc = parent.getOwnerDocument();
243 Element xmlNode = doc.createElementNS( WCSNS.toString(), "CoverageOffering" );
244 /*
245 * Element node = doc.createElementNS(WCSNS, "CoverageDescription" ); doc.appendChild(node);
246 * Element xmlNode = doc.getDocumentElement();
247 */
248
249 appendMetadataLink( xmlNode, coverageOffering.getMetadataLink() );
250 if ( coverageOffering.getDescription() != null ) {
251 XMLTools.appendElement( xmlNode, WCSNS, "description", coverageOffering.getDescription() );
252 }
253 XMLTools.appendElement( xmlNode, WCSNS, "name", coverageOffering.getName() );
254 XMLTools.appendElement( xmlNode, WCSNS, "label", coverageOffering.getLabel() );
255 org.deegree.ogcbase.XMLFactory.appendLonLatEnvelope( xmlNode, coverageOffering.getLonLatEnvelope(), WCSNS );
256 appendKeywords( xmlNode, coverageOffering.getKeywords(), WCSNS );
257 appendDomainSet( xmlNode, coverageOffering.getDomainSet() );
258 appendRangeSet( xmlNode, coverageOffering.getRangeSet() );
259 appendSupportedCRSs( xmlNode, coverageOffering.getSupportedCRSs() );
260 appendSupportedFormats( xmlNode, coverageOffering.getSupportedFormats() );
261 appendSupportedInterpolations( xmlNode, coverageOffering.getSupportedInterpolations() );
262 // TODO appendExtension
263 // XmlNode coveDesc = new XmlNode( parent );
264 // coveDesc.appendDomElement( WCSNS, "CoverageOffering", xmlNode);
265 parent.appendChild( xmlNode );
266 }
267
268 /**
269 * appends the XML representation of the passed <tt>MetadataLink</tt> to the passed
270 * <tt>XmlNode</tt> including all attributes
271 *
272 * @param xmlNode
273 * @param mLink
274 */
275 protected static void appendMetadataLink( Element xmlNode, MetadataLink mLink ) {
276 if ( mLink != null ) {
277 Element element = XMLTools.appendElement( xmlNode, WCSNS, "metadataLink" );
278 element.setAttribute( "xlink:type", "simple" );
279 element.setAttribute( "xlink:href", mLink.getReference().toString() );
280 element.setAttribute( "about", mLink.getAbout().toString() );
281 element.setAttribute( "metadataType", mLink.getMetadataType().value );
282 element.setAttribute( "xlink:title", mLink.getTitle() );
283 }
284 }
285
286 /**
287 * appends a XML representation of the passed <tt>DomainSet</tt> to the passed
288 * <tt>XmlNode</tt>
289 *
290 * @param xmlNode
291 * @param domainSet
292 */
293 protected static void appendDomainSet( Element xmlNode, DomainSet domainSet ) {
294 Element node = XMLTools.appendElement( xmlNode, WCSNS, "domainSet" );
295 appendSpatialDomain( node, domainSet.getSpatialDomain() );
296 appendTemporalDomain( node, domainSet.getTimeSequence(), WCSNS );
297 }
298
299 /**
300 * append the XML representation of a <tt>SpatialDomain</tt> object to the passed
301 * <tt>XmlNode</tt>. At the moment deegree just considers enclosed gml:Envelope elements
302 * gml:Grid and gml:Polygon are not supported yet
303 *
304 * @param xmlNode
305 * @param spatialDomain
306 */
307 protected static void appendSpatialDomain( Element xmlNode, SpatialDomain spatialDomain ) {
308 Element node = XMLTools.appendElement( xmlNode, WCSNS, "spatialDomain" );
309 Envelope[] envelops = spatialDomain.getEnvelops();
310 for ( int i = 0; i < envelops.length; i++ ) {
311 appendEnvelope( node, envelops[i] );
312 }
313 }
314
315 /**
316 * appends a XML representation of the passed <tt>RangeSet</tt> to the passed <tt>XmlNode</tt>
317 *
318 * @param xmlNode
319 * @param rangeSet
320 */
321 protected static void appendRangeSet( Element xmlNode, RangeSet rangeSet ) {
322 Element node = XMLTools.appendElement( xmlNode, WCSNS, "rangeSet" );
323 Element tmp = node;
324 node = XMLTools.appendElement( tmp, WCSNS, "RangeSet", null );
325 Element rs = node;
326 appendMetadataLink( rs, rangeSet.getMetadataLink() );
327 if ( rangeSet.getDescription() != null ) {
328 XMLTools.appendElement( rs, WCSNS, "description", rangeSet.getDescription() );
329 }
330 XMLTools.appendElement( rs, WCSNS, "name", rangeSet.getName() );
331 XMLTools.appendElement( rs, WCSNS, "label", rangeSet.getLabel() );
332 AxisDescription[] axisDesc = rangeSet.getAxisDescription();
333 if ( axisDesc != null ) {
334 for ( int i = 0; i < axisDesc.length; i++ ) {
335 appendAxisDescription( rs, axisDesc[i] );
336 }
337 }
338 appendNullValues( rs, rangeSet.getNullValues() );
339 }
340
341 /**
342 * appends a XML representation of the passed <tt>AxisDescription</tt> to the passed
343 * <tt>XmlNode</tt>
344 *
345 * @param xmlNode
346 * @param axisDesc
347 */
348 protected static void appendAxisDescription( Element xmlNode, AxisDescription axisDesc ) {
349 Element node = XMLTools.appendElement( xmlNode, WCSNS, "axisDescription", null );
350 Element ad = node;
351 node = XMLTools.appendElement( ad, WCSNS, "AxisDescription", null );
352 Element aD = node;
353 appendMetadataLink( aD, axisDesc.getMetadataLink() );
354 if ( axisDesc.getDescription() != null ) {
355 XMLTools.appendElement( aD, WCSNS, "description", axisDesc.getDescription() );
356 }
357 XMLTools.appendElement( aD, WCSNS, "name", axisDesc.getName() );
358 XMLTools.appendElement( aD, WCSNS, "label", axisDesc.getLabel() );
359 appendValues( aD, axisDesc.getValues(), WCSNS );
360
361 }
362
363 /**
364 * appends a XML representation of the passed <tt>ValueEnum</tt> to the passed
365 * <tt>XmlNode</tt>
366 *
367 * @param xmlNode
368 * @param values
369 */
370 protected static void appendNullValues( Element xmlNode, ValueEnum values ) {
371 Element node = XMLTools.appendElement( xmlNode, WCSNS, "nullValues" );
372 Element val = node;
373 if ( values.getType() != null ) {
374 node.setAttribute( "xmlns:wcs", WCSNS.toString() );
375 node.setAttributeNS( WCSNS.toString(), "wcs:type", values.getType().toString() );
376 }
377 if ( values.getSemantic() != null ) {
378 node.setAttribute( "xmlns:wcs", WCSNS.toString() );
379 node.setAttributeNS( WCSNS.toString(), "wcs:semantic", values.getSemantic().toString() );
380 }
381 Interval[] intervals = values.getInterval();
382 if ( intervals != null ) {
383 for ( int i = 0; i < intervals.length; i++ ) {
384 appendInterval( val, intervals[i], WCSNS );
385 }
386 }
387 TypedLiteral[] sVal = values.getSingleValue();
388 if ( sVal != null ) {
389 for ( int i = 0; i < sVal.length; i++ ) {
390 appendTypedLiteral( val, sVal[i], "singleValue", WCSNS );
391 }
392 }
393 }
394
395 /**
396 * appends a XML representation of the passed <tt>SupportedSRSs</tt> to the passed
397 * <tt>XmlNode</tt>
398 *
399 * @param xmlNode
400 * @param supportedCRSs
401 */
402 protected static void appendSupportedCRSs( Element xmlNode, SupportedSRSs supportedCRSs ) {
403 Element node = XMLTools.appendElement( xmlNode, WCSNS, "supportedCRSs" );
404 Element supCRS = node;
405 CodeList[] rrCRS = supportedCRSs.getRequestResponseSRSs();
406 for ( int i = 0; i < rrCRS.length; i++ ) {
407 appendCodeList( supCRS, rrCRS[i], WCSNS );
408 }
409 CodeList[] reqCRS = supportedCRSs.getRequestSRSs();
410 for ( int i = 0; i < reqCRS.length; i++ ) {
411 appendCodeList( supCRS, reqCRS[i], WCSNS );
412 }
413 CodeList[] resCRS = supportedCRSs.getResponseSRSs();
414 for ( int i = 0; i < resCRS.length; i++ ) {
415 appendCodeList( supCRS, resCRS[i], WCSNS );
416 }
417 CodeList[] natCRS = supportedCRSs.getNativeSRSs();
418 for ( int i = 0; i < natCRS.length; i++ ) {
419 appendCodeList( supCRS, natCRS[i], WCSNS );
420 }
421 }
422
423 /**
424 * appends a XML representation of the passed <tt>SupportedFormats</tt> to the passed
425 * <tt>XmlNode</tt>
426 *
427 * @param xmlNode
428 * @param supportedFormats
429 */
430 protected static void appendSupportedFormats( Element xmlNode, SupportedFormats supportedFormats ) {
431 Element node = XMLTools.appendElement( xmlNode, WCSNS, "supportedFormats" );
432 CodeList[] formats = supportedFormats.getFormats();
433 for ( int i = 0; i < formats.length; i++ ) {
434 appendCodeList( node, formats[i], WCSNS );
435 }
436 }
437
438 /**
439 * appends a XML representation of the passed <tt>SupportedInterpolations</tt> to the passed
440 * <tt>XmlNode</tt>
441 *
442 * @param xmlNode
443 * @param supportedInterpolations
444 */
445 protected static void appendSupportedInterpolations( Element xmlNode,
446 SupportedInterpolations supportedInterpolations ) {
447 Element node = XMLTools.appendElement( xmlNode, WCSNS, "supportedInterpolations" );
448 if ( supportedInterpolations.getDefault() != null ) {
449 String s = supportedInterpolations.getDefault().value;
450 node.setAttribute( "default", s );
451 }
452 Element supInter = node;
453 InterpolationMethod[] ims = supportedInterpolations.getInterpolationMethod();
454 for ( int i = 0; i < ims.length; i++ ) {
455 XMLTools.appendElement( supInter, WCSNS, "interpolationMethod", ims[i].value );
456 }
457 }
458
459 /**
460 * appends a XML representation of the passed <tt>CapabilitiesService</tt> to the passed
461 * <tt>XmlNode</tt>
462 *
463 * @param element
464 * @param service
465 */
466 protected static void appendService( Element element, Service service ) {
467 Element elem = XMLTools.getChildElement( "Service", WCSNS, element );
468 elem.setAttribute( "version", service.getVersion() );
469 elem.setAttribute( "updateSequence", service.getUpdateSequence() );
470 Element servNode = elem;
471 appendMetadataLink( servNode, service.getMetadataLink() );
472 if ( service.getDescription() != null ) {
473 XMLTools.appendElement( servNode, WCSNS, "description", service.getDescription() );
474 }
475 XMLTools.appendElement( servNode, WCSNS, "name", service.getName() );
476 XMLTools.appendElement( servNode, WCSNS, "label", service.getLabel() );
477
478 appendResponsibleParty( servNode, service.getCitedResponsibleParty() );
479 appendCodeList( servNode, service.getFees(), WCSNS );
480 CodeList[] ac = service.getAccessConstraints();
481 if ( ac != null ) {
482 for ( int i = 0; i < ac.length; i++ ) {
483 appendCodeList( servNode, ac[i], WCSNS );
484 }
485 }
486 }
487
488 /**
489 * appends a XML representation of the passed <tt>CitedResponsibleParty</tt> to the passed
490 * <tt>XmlNode</tt>
491 *
492 * @param servNode
493 * @param responsibleParty
494 */
495 protected static void appendResponsibleParty( Element servNode, CitedResponsibleParty responsibleParty ) {
496
497 Element element = XMLTools.appendElement( servNode, WCSNS, "responsibleParty" );
498 Element respNode = element;
499 String[] in = responsibleParty.getIndividualName();
500 if ( in != null ) {
501 for ( int i = 0; i < in.length; i++ ) {
502 XMLTools.appendElement( respNode, WCSNS, "individualName", in[i] );
503 }
504 }
505 String[] on = responsibleParty.getOrganisationName();
506 if ( on != null ) {
507 for ( int i = 0; i < on.length; i++ ) {
508 XMLTools.appendElement( respNode, WCSNS, "organisationName", on[i] );
509 }
510 }
511 String[] pn = responsibleParty.getPositionName();
512 if ( pn != null ) {
513 for ( int i = 0; i < pn.length; i++ ) {
514 XMLTools.appendElement( respNode, WCSNS, "positionName", pn[i] );
515 }
516 }
517 appendContactInfo( element, responsibleParty.getContactInfo()[0] );
518 }
519
520 /**
521 * appends a XML representation of the passed <tt>ContactInfo</tt> to the passed
522 * <tt>XmlNode</tt>
523 *
524 * @param contactNode
525 * @param contactInfo
526 */
527 protected static void appendContactInfo( Element contactNode, ContactInfo contactInfo ) {
528 Element element = XMLTools.appendElement( contactNode, WCSNS, "contactInfo" );
529 Element ciNode = element;
530 Phone phone = contactInfo.getPhone();
531 if ( phone != null ) {
532 appendPhone( ciNode, phone );
533 }
534 Address address = contactInfo.getAddress();
535 if ( address != null ) {
536 appendAddress( ciNode, address );
537 }
538 OnlineResource olr = contactInfo.getOnLineResource();
539 appendOnlineResource( ciNode, olr );
540 }
541
542 /**
543 * appends a XML representation of the passed <tt>Phone</tt> to the passed <tt>XmlNode</tt>
544 *
545 * @param ciNode
546 * @param phone
547 */
548 protected static void appendPhone( Element ciNode, Phone phone ) {
549 Element node = XMLTools.appendElement( ciNode, WCSNS, "phone" );
550 Element pnNode = node;
551 String[] voice = phone.getVoice();
552 if ( voice != null ) {
553 for ( int i = 0; i < voice.length; i++ ) {
554 XMLTools.appendElement( pnNode, WCSNS, "voice", voice[i] );
555 }
556 }
557 String[] facsimile = phone.getFacsimile();
558 if ( facsimile != null ) {
559 for ( int i = 0; i < facsimile.length; i++ ) {
560 XMLTools.appendElement( pnNode, WCSNS, "facsimile", facsimile[i] );
561 }
562 }
563 }
564
565 /**
566 * appends a XML representation of the passed <tt>Phone</tt> to the passed <tt>XmlNode</tt>
567 *
568 * @param ciNode
569 * @param address
570 */
571 protected static void appendAddress( Element ciNode, Address address ) {
572 Element node = XMLTools.appendElement( ciNode, WCSNS, "address" );
573 Element adNode = node;
574 String[] delPoint = address.getDeliveryPoint();
575 if ( delPoint != null ) {
576 for ( int i = 0; i < delPoint.length; i++ ) {
577 XMLTools.appendElement( adNode, WCSNS, "deliveryPoint", delPoint[i] );
578 }
579 }
580 XMLTools.appendElement( adNode, WCSNS, "city", address.getCity() );
581 XMLTools.appendElement( adNode, WCSNS, "administrativeArea", address.getAdministrativeArea() );
582 XMLTools.appendElement( adNode, WCSNS, "postalCode", address.getPostalCode() );
583 XMLTools.appendElement( adNode, WCSNS, "country", address.getCountry() );
584 String[] eMail = address.getElectronicMailAddress();
585 if ( eMail != null ) {
586 for ( int i = 0; i < eMail.length; i++ ) {
587 XMLTools.appendElement( adNode, WCSNS, "electronicMailAddress", eMail[i] );
588 }
589 }
590 }
591
592 /**
593 * appends a XML representation of the passed <tt>OnLineResource</tt> to the passed
594 * <tt>XmlNode</tt>
595 *
596 * @param ciNode
597 * @param olr
598 */
599 protected static void appendOnlineResource( Element ciNode, OnlineResource olr ) {
600 Element node = XMLTools.appendElement( ciNode, WCSNS, "onlineResource" );
601 node.setAttribute( "xlink:type", "simple" );
602 Linkage linkage = olr.getLinkage();
603 node.setAttribute( "xlink:href", linkage.getHref().toString() );
604 }
605
606 /**
607 * appends a XML representation of the passed <tt>OnLineResource</tt> to the passed
608 * <tt>Element</tt>. Notice: vendor specific capabilities are not supported yet and, if
609 * present, won't be appended to the root element
610 *
611 * @param root
612 * @param capability
613 * @throws XMLParsingException
614 */
615 protected static void appendCapability( Element root, Capability capability )
616 throws XMLParsingException {
617
618 Element capab = XMLTools.getRequiredChildElement( "Capability", WCSNS, root );
619 capab.setAttribute( "version", capability.getVersion() );
620 capab.setAttribute( "updateSequence", capability.getUpdateSequence() );
621 Element request = XMLTools.getRequiredChildElement( "Request", WCSNS, capab );
622 WCSCapabilityOperations req = (WCSCapabilityOperations) capability.getOperations();
623 Operation operation = req.getGetCapabilitiesOperation();
624 appendOperation( "GetCapabilities", request, operation );
625 operation = req.getDescribeCoverageOperation();
626 appendOperation( "DescribeCoverage", request, operation );
627 operation = req.getGetCoverageOperation();
628 appendOperation( "GetCoverage", request, operation );
629
630 ExceptionFormat excepForm = capability.getException();
631 appendExceptionFormat( capab, excepForm );
632
633 }
634
635 /**
636 * appends a XML representation of the passed <tt>OnLineResource</tt> to the passed
637 * <tt>Element</tt>. at the moment just the first DCPType is considered because other types
638 * than HTTP are not supported yet.
639 *
640 * @param name
641 * @param root
642 * @param operation
643 * @throws XMLParsingException
644 */
645 protected static void appendOperation( String name, Element root, Operation operation )
646 throws XMLParsingException {
647 Element getCapa = XMLTools.getRequiredChildElement( name, WCSNS, root );
648 Element dcp = XMLTools.getRequiredChildElement( "DCPType", WCSNS, getCapa );
649 Element http = XMLTools.getRequiredChildElement( "HTTP", WCSNS, dcp );
650 Element get = XMLTools.getRequiredChildElement( "Get", WCSNS, http );
651 Element getNode = get;
652 URL[] urls = ( (HTTP) operation.getDCPs()[0].getProtocol() ).getGetOnlineResources();
653 for ( int i = 0; i < urls.length; i++ ) {
654 Element node = XMLTools.appendElement( getNode, WCSNS, "OnlineResource" );
655 node.setAttribute( "xlink:type", "simple" );
656 node.setAttribute( "xlink:href", urls[i].toString() );
657 }
658 urls = ( (HTTP) operation.getDCPs()[0].getProtocol() ).getPostOnlineResources();
659 if ( urls != null && urls.length > 0 ) {
660 Element httpNode = http;
661 Element node = XMLTools.appendElement( httpNode, WCSNS, "Post" );
662 Element postNode = node;
663 for ( int i = 0; i < urls.length; i++ ) {
664 node = XMLTools.appendElement( postNode, WCSNS, "OnlineResource" );
665 node.setAttribute( "xlink:type", "simple" );
666 node.setAttribute( "xlink:href", urls[i].toString() );
667 }
668 }
669
670 }
671
672 /**
673 * appends a XML representation of the passed <tt>OnLineResource</tt> to the passed
674 * <tt>Element</tt>.
675 *
676 * @param root
677 * @param excepForm
678 */
679 protected static void appendExceptionFormat( Element root, ExceptionFormat excepForm ) {
680 Element node = XMLTools.appendElement( root, WCSNS, "Exception" );
681 String[] formats = excepForm.getFormat();
682 for ( int i = 0; i < formats.length; i++ ) {
683 XMLTools.appendElement( node, WCSNS, "Format", formats[i] );
684 }
685 }
686
687 /**
688 * appends a XML representation of the passed <tt>ContentMetadata</tt> to the passed
689 * <tt>Element</tt>
690 *
691 * @param root
692 * @param contentMetadata
693 * @throws XMLParsingException
694 */
695 protected static void appendContentMetadata( Element root, ContentMetadata contentMetadata )
696 throws XMLParsingException {
697 Element content = XMLTools.getRequiredChildElement( "ContentMetadata", WCSNS, root );
698 content.setAttribute( "version", contentMetadata.getVersion() );
699 content.setAttribute( "updateSequence", contentMetadata.getUpdateSequence() );
700 Element contentNode = content;
701 CoverageOfferingBrief[] cob = contentMetadata.getCoverageOfferingBrief();
702 for ( int i = 0; i < cob.length; i++ ) {
703 appendCoverageOfferingBrief( contentNode, cob[i] );
704 }
705 }
706
707 /**
708 * appends a XML representation of the passed <tt>CoverageOfferingBrief</tt> to the passed
709 * <tt>XmlNode</tt>
710 *
711 * @param contentNode
712 * @param cob
713 */
714 protected static void appendCoverageOfferingBrief( Element contentNode, CoverageOfferingBrief cob ) {
715 Element node = XMLTools.appendElement( contentNode, WCSNS, "CoverageOfferingBrief" );
716 Element xmlNode = node;
717 appendMetadataLink( xmlNode, cob.getMetadataLink() );
718 if ( cob.getDescription() != null ) {
719 XMLTools.appendElement( xmlNode, WCSNS, "description", cob.getDescription() );
720 }
721 XMLTools.appendElement( xmlNode, WCSNS, "name", cob.getName() );
722 XMLTools.appendElement( xmlNode, WCSNS, "label", cob.getLabel() );
723 org.deegree.ogcbase.XMLFactory.appendLonLatEnvelope( xmlNode, cob.getLonLatEnvelope(), WCSNS );
724 appendKeywords( xmlNode, cob.getKeywords(), WCSNS );
725 }
726 }