001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wms/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.wms;
037
038 import java.io.IOException;
039 import java.net.URL;
040 import java.util.List;
041
042 import org.deegree.datatypes.QualifiedName;
043 import org.deegree.datatypes.values.TypedLiteral;
044 import org.deegree.framework.log.ILogger;
045 import org.deegree.framework.log.LoggerFactory;
046 import org.deegree.framework.util.StringTools;
047 import org.deegree.framework.xml.NamespaceContext;
048 import org.deegree.framework.xml.XMLParsingException;
049 import org.deegree.framework.xml.XMLTools;
050 import org.deegree.model.metadata.iso19115.Address;
051 import org.deegree.model.metadata.iso19115.Keywords;
052 import org.deegree.model.metadata.iso19115.OnlineResource;
053 import org.deegree.model.metadata.iso19115.Phone;
054 import org.deegree.model.spatialschema.Envelope;
055 import org.deegree.ogcbase.CommonNamespaces;
056 import org.deegree.ogcwebservices.OWSUtils;
057 import org.deegree.ogcwebservices.getcapabilities.MetadataURL;
058 import org.deegree.ogcwebservices.wms.capabilities.Attribution;
059 import org.deegree.ogcwebservices.wms.capabilities.AuthorityURL;
060 import org.deegree.ogcwebservices.wms.capabilities.DataURL;
061 import org.deegree.ogcwebservices.wms.capabilities.Dimension;
062 import org.deegree.ogcwebservices.wms.capabilities.Extent;
063 import org.deegree.ogcwebservices.wms.capabilities.FeatureListURL;
064 import org.deegree.ogcwebservices.wms.capabilities.Identifier;
065 import org.deegree.ogcwebservices.wms.capabilities.Layer;
066 import org.deegree.ogcwebservices.wms.capabilities.LayerBoundingBox;
067 import org.deegree.ogcwebservices.wms.capabilities.LegendURL;
068 import org.deegree.ogcwebservices.wms.capabilities.LogoURL;
069 import org.deegree.ogcwebservices.wms.capabilities.ScaleHint;
070 import org.deegree.ogcwebservices.wms.capabilities.Style;
071 import org.deegree.ogcwebservices.wms.capabilities.StyleSheetURL;
072 import org.deegree.ogcwebservices.wms.capabilities.StyleURL;
073 import org.deegree.ogcwebservices.wms.capabilities.UserDefinedSymbolization;
074 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilities;
075 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilitiesDocument;
076 import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilities_1_3_0;
077 import org.deegree.owscommon_new.DCP;
078 import org.deegree.owscommon_new.DomainType;
079 import org.deegree.owscommon_new.HTTP;
080 import org.deegree.owscommon_new.Operation;
081 import org.deegree.owscommon_new.OperationsMetadata;
082 import org.deegree.owscommon_new.ServiceIdentification;
083 import org.deegree.owscommon_new.ServiceProvider;
084 import org.w3c.dom.Element;
085 import org.xml.sax.SAXException;
086
087 /**
088 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
089 * @author last edited by: $Author: mschneider $
090 *
091 * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18 Jun 2009) $
092 */
093 public class XMLFactory extends org.deegree.owscommon.XMLFactory {
094
095 private static final ILogger LOG = LoggerFactory.getLogger( XMLFactory.class );
096
097 private static NamespaceContext nsContext = CommonNamespaces.getNamespaceContext();
098
099 /**
100 * Exports a <code>WMSCapabilities</code> instance to a <code>WMSCapabilitiesDocument</code>.
101 *
102 * @param capabilities
103 * @return DOM representation of the <code>WMSCapabilities</code>
104 * @throws IOException
105 * if XML template could not be loaded
106 */
107 public static WMSCapabilitiesDocument export( WMSCapabilities capabilities )
108 throws IOException {
109
110 // in case of a 1.3.0 capabilities, switch the method
111 if ( capabilities instanceof WMSCapabilities_1_3_0 ) {
112 return XMLFactory_1_3_0.export( (WMSCapabilities_1_3_0) capabilities );
113 }
114
115 WMSCapabilitiesDocument capabilitiesDocument = new WMSCapabilitiesDocument();
116 try {
117 capabilitiesDocument.createEmptyDocument();
118 Element root = capabilitiesDocument.getRootElement();
119
120 root.setAttribute( "version", "1.1.1" );
121 root.setAttribute( "updateSequence", capabilities.getUpdateSequence() );
122
123 appendService( root, capabilities.getServiceIdentification(), capabilities.getServiceProvider() );
124
125 appendCapabilityRequests( root, capabilities.getOperationMetadata() );
126
127 appendUserDefinedSymbolization( (Element) XMLTools.getNode( root, "./Capability", nsContext ),
128 capabilities.getUserDefinedSymbolization() );
129
130 appendCapabilityLayer( (Element) XMLTools.getNode( root, "./Capability", nsContext ),
131 capabilities.getLayer() );
132
133 Element exc = XMLTools.getRequiredElement( root, "Capability/Exception", nsContext );
134 for ( String f : capabilities.getExceptions() ) {
135 XMLTools.appendElement( exc, null, "Format", f );
136 }
137
138 } catch ( SAXException e ) {
139 LOG.logError( e.getMessage(), e );
140 } catch ( XMLParsingException e ) {
141 LOG.logError( e.getMessage(), e );
142 }
143
144 return capabilitiesDocument;
145 }
146
147 /**
148 * This method exports a 1.3.0 capabilities document as 1.1.1, providing backward compatibility.
149 *
150 * @param capabilities
151 * @return the 1.1.1 document
152 * @throws IOException
153 */
154 public static WMSCapabilitiesDocument exportAs_1_1_1( WMSCapabilities_1_3_0 capabilities )
155 throws IOException {
156 WMSCapabilitiesDocument doc = new WMSCapabilitiesDocument();
157
158 try {
159 doc.createEmptyDocument();
160
161 Element root = doc.getRootElement();
162
163 root.setAttribute( "version", "1.1.1" );
164 root.setAttribute( "updateSequence", capabilities.getUpdateSequence() );
165
166 appendService( root, capabilities.getServiceIdentification(), capabilities.getServiceProvider() );
167
168 appendCapabilityRequests( root, capabilities.getOperationMetadata() );
169
170 Element cap = (Element) XMLTools.getNode( root, "Capability", nsContext );
171 // we don't have that one in 1.3.0 data, so just make it up since it is generally
172 // enabled in deegree WMS
173 UserDefinedSymbolization uds = new UserDefinedSymbolization( true, true, false, true );
174 appendUserDefinedSymbolization( cap, uds );
175
176 appendCapabilityLayer( cap, capabilities.getLayer() );
177
178 Element exc = XMLTools.getRequiredElement( root, "Capability/Exception", nsContext );
179 for ( String f : capabilities.getExceptions() ) {
180 if ( f.equalsIgnoreCase( "XML" ) ) {
181 f = "application/vnd.ogc.se_xml";
182 }
183 if ( f.equalsIgnoreCase( "INIMAGE" ) ) {
184 f = "application/vnd.ogc.se_inimage";
185 }
186 if ( f.equalsIgnoreCase( "BLANK" ) ) {
187 f = "application/vnd.ogc.se_blank";
188 }
189 XMLTools.appendElement( exc, null, "Format", f );
190 }
191
192 } catch ( XMLParsingException e ) {
193 LOG.logError( e.getMessage(), e );
194 } catch ( SAXException e ) {
195 LOG.logError( e.getMessage(), e );
196 }
197
198 return doc;
199 }
200
201 /**
202 *
203 * @param root
204 * @param uds
205 */
206 protected static void appendUserDefinedSymbolization( Element root, UserDefinedSymbolization uds ) {
207
208 Element elem = XMLTools.appendElement( root, null, "UserDefinedSymbolization" );
209 elem.setAttribute( "SupportSLD", boolean2Number( uds.isSldSupported() ) );
210 elem.setAttribute( "UserLayer", boolean2Number( uds.isUserLayerSupported() ) );
211 elem.setAttribute( "UserStyle", boolean2Number( uds.isUserStyleSupported() ) );
212 elem.setAttribute( "RemoteWFS", boolean2Number( uds.isRemoteWFSSupported() ) );
213
214 }
215
216 private static String boolean2Number( boolean bool ) {
217 if ( bool ) {
218 return "1";
219 }
220 return "0";
221 }
222
223 /**
224 *
225 * @param root
226 * @param identification
227 * @param provider
228 * @throws XMLParsingException
229 */
230 protected static void appendService( Element root, ServiceIdentification identification, ServiceProvider provider )
231 throws XMLParsingException {
232
233 root = (Element) XMLTools.getRequiredNode( root, "./Service", nsContext );
234
235 Element node = (Element) XMLTools.getRequiredNode( root, "./Name", nsContext );
236 // is this actually desired?
237 node.setTextContent( "OGC:WMS" );
238
239 node = (Element) XMLTools.getRequiredNode( root, "./Title", nsContext );
240 node.setTextContent( identification.getTitle() );
241
242 String serviceAbstract = identification.getAbstractString();
243 if ( serviceAbstract != null ) {
244 XMLTools.appendElement( root, null, "Abstract", serviceAbstract );
245 }
246
247 List<Keywords> keywords = identification.getKeywords();
248 if ( keywords.size() > 0 ) {
249 String[] kw = keywords.get( 0 ).getKeywords();
250 Element kwl = XMLTools.appendElement( root, null, "KeywordList" );
251 for ( int i = 0; i < kw.length; i++ ) {
252 XMLTools.appendElement( kwl, null, "Keyword", kw[i] );
253 }
254 }
255
256 node = root.getOwnerDocument().createElement( "OnlineResource" );
257
258 OnlineResource sLink = provider.getProviderSite();
259 org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( node, sLink );
260
261 root.appendChild( node );
262
263 appendContactInformation( root, provider );
264
265 String fee = null;
266 if ( identification.getAccessConstraints().size() > 0 )
267 fee = identification.getAccessConstraints().get( 0 ).getFees();
268 if ( fee != null ) {
269 XMLTools.appendElement( root, null, "Fees", fee );
270 } else {
271 XMLTools.appendElement( root, null, "Fees", "none" );
272 }
273
274 if ( identification.getAccessConstraints().size() > 0 ) {
275 XMLTools.appendElement( root, null, "AccessConstraints",
276 identification.getAccessConstraints().get( 0 ).getUseLimitations().get( 0 ) );
277 } else {
278 XMLTools.appendElement( root, null, "AccessConstraints", "none" );
279 }
280
281 }
282
283 /**
284 *
285 * @param root
286 * @param provider
287 */
288 protected static void appendContactInformation( Element root, ServiceProvider provider ) {
289
290 Element ciNode = XMLTools.appendElement( root, null, "ContactInformation" );
291 Element cppNode = XMLTools.appendElement( ciNode, null, "ContactPersonPrimary" );
292 if ( provider.getServiceContact().getIndividualName().length > 0 ) {
293 XMLTools.appendElement( cppNode, null, "ContactPerson", provider.getServiceContact().getIndividualName()[0] );
294 }
295 if ( provider.getServiceContact().getOrganisationName().length > 0 ) {
296 XMLTools.appendElement( cppNode, null, "ContactOrganization",
297 provider.getServiceContact().getOrganisationName()[0] );
298 }
299 if ( provider.getServiceContact().getPositionName().length > 0 ) {
300 XMLTools.appendElement( ciNode, null, "ContactPosition", provider.getServiceContact().getPositionName()[0] );
301 }
302 Element caNode = XMLTools.appendElement( ciNode, null, "ContactAddress" );
303
304 XMLTools.appendElement( caNode, null, "AddressType", "postal" );
305
306 if ( provider.getServiceContact().getContactInfo().length > 0 ) {
307 Address addr = provider.getServiceContact().getContactInfo()[0].getAddress();
308 String[] dp = addr.getDeliveryPoint();
309 if ( dp.length > 0 ) {
310 XMLTools.appendElement( caNode, null, "Address", dp[0] );
311 }
312 if ( addr.getCity() != null ) {
313 XMLTools.appendElement( caNode, null, "City", addr.getCity() );
314 }
315 if ( addr.getAdministrativeArea() != null ) {
316 XMLTools.appendElement( caNode, null, "StateOrProvince", addr.getAdministrativeArea() );
317 }
318 if ( addr.getPostalCode() != null ) {
319 XMLTools.appendElement( caNode, null, "PostCode", addr.getPostalCode() );
320 }
321 if ( addr.getCountry() != null ) {
322 XMLTools.appendElement( caNode, null, "Country", addr.getCountry() );
323 }
324
325 Phone phone = provider.getServiceContact().getContactInfo()[0].getPhone();
326 if ( phone.getVoice().length > 0 ) {
327 XMLTools.appendElement( ciNode, null, "ContactVoiceTelephone", phone.getVoice()[0] );
328 }
329 if ( phone.getFacsimile().length > 0 ) {
330 XMLTools.appendElement( ciNode, null, "ContactFacsimileTelephone", phone.getFacsimile()[0] );
331 }
332 if ( addr.getElectronicMailAddress().length > 0 ) {
333 XMLTools.appendElement( ciNode, null, "ContactElectronicMailAddress",
334 addr.getElectronicMailAddress()[0] );
335 }
336 }
337
338 }
339
340 /**
341 *
342 * @param root
343 * @param operationsMetadata
344 * @throws XMLParsingException
345 */
346 protected static void appendCapabilityRequests( Element root, OperationsMetadata operationsMetadata )
347 throws XMLParsingException {
348
349 root = (Element) XMLTools.getRequiredNode( root, "./Capability/Request", nsContext );
350
351 operationsMetadata.getOperations();
352
353 // just append all operations
354 for ( Operation operation : operationsMetadata.getOperations() ) {
355 appendOperation( root, operation );
356 }
357
358 }
359
360 /**
361 *
362 * @param root
363 * @param operation
364 */
365 protected static void appendOperation( Element root, Operation operation ) {
366
367 String name = operation.getName().getLocalName();
368
369 root = XMLTools.appendElement( root, null, name );
370
371 DomainType odt = (DomainType) operation.getParameter( new QualifiedName( "Format" ) );
372
373 List<TypedLiteral> values = odt.getValues();
374 for ( TypedLiteral value : values )
375 XMLTools.appendElement( root, null, "Format", value.getValue() );
376
377 List<DCP> dcps = operation.getDCP();
378 for ( DCP dcp : dcps ) {
379 Element http = XMLTools.appendElement( root, null, "DCPType" );
380 http = XMLTools.appendElement( http, null, "HTTP" );
381 HTTP ht = (HTTP) dcp;
382 List<HTTP.Type> types = ht.getTypes();
383 List<OnlineResource> links = ht.getLinks();
384 for ( int i = 0; i < types.size(); ++i ) {
385 Element elem = null;
386 if ( types.get( i ) == HTTP.Type.Get )
387 elem = XMLTools.appendElement( http, null, "Get" );
388 if ( types.get( i ) == HTTP.Type.Post )
389 elem = XMLTools.appendElement( http, null, "Post" );
390 if ( elem != null ) {
391 elem = XMLTools.appendElement( elem, null, "OnlineResource" );
392 org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( elem, links.get( i ) );
393 }
394 }
395 }
396
397 }
398
399 /**
400 *
401 * @param root
402 * @param layer
403 * @throws XMLParsingException
404 */
405 protected static void appendCapabilityLayer( Element root, Layer layer )
406 throws XMLParsingException {
407
408 root = XMLTools.appendElement( root, null, "Layer" );
409 root.setAttribute( "queryable", boolean2Number( layer.isQueryable() ) );
410 root.setAttribute( "cascaded", Integer.toString( layer.getCascaded() ) );
411 root.setAttribute( "opaque", boolean2Number( layer.isOpaque() ) );
412 root.setAttribute( "noSubsets", boolean2Number( layer.hasNoSubsets() ) );
413 if ( layer.getFixedWidth() > 0 ) {
414 root.setAttribute( "fixedWidth", Integer.toString( layer.getFixedWidth() ) );
415 }
416 if ( layer.getFixedHeight() > 0 ) {
417 root.setAttribute( "fixedHeight", Integer.toString( layer.getFixedHeight() ) );
418 }
419
420 if ( layer.getName() != null ) {
421 XMLTools.appendElement( root, null, "Name", layer.getName() );
422 }
423 XMLTools.appendElement( root, null, "Title", layer.getTitle() );
424
425 if ( layer.getAbstract() != null ) {
426 XMLTools.appendElement( root, null, "Abstract", layer.getAbstract() );
427 }
428
429 String[] keywords = layer.getKeywordList();
430 if ( keywords.length > 0 ) {
431 Element elem = XMLTools.appendElement( root, null, "KeywordList" );
432 for ( int i = 0; i < keywords.length; i++ ) {
433 XMLTools.appendElement( elem, null, "Keyword", keywords[i] );
434 }
435 }
436
437 String[] srs = layer.getSrs();
438 for ( int i = 0; i < srs.length; i++ ) {
439 XMLTools.appendElement( root, null, "SRS", srs[i] );
440 }
441
442 Envelope llBox = layer.getLatLonBoundingBox();
443 appendLatLonBoundingBox( root, llBox );
444
445 LayerBoundingBox[] lBoxes = layer.getBoundingBoxes();
446 for ( int i = 0; i < lBoxes.length; i++ ) {
447 appendLayerBoundingBox( root, lBoxes[i] );
448 }
449
450 Dimension[] dims = layer.getDimension();
451 for ( int i = 0; i < dims.length; i++ ) {
452 appendDimension( root, dims[i] );
453 }
454
455 Extent[] extents = layer.getExtent();
456 for ( int i = 0; i < extents.length; i++ ) {
457 appendExtent( root, extents[i] );
458 }
459
460 Attribution attr = layer.getAttribution();
461 if ( attr != null ) {
462 appendAttribution( root, attr );
463 }
464
465 AuthorityURL[] authorityURLs = layer.getAuthorityURL();
466 for ( int i = 0; i < authorityURLs.length; i++ ) {
467 appendAuthorityURL( root, authorityURLs[i] );
468 }
469
470 Identifier[] identifiers = layer.getIdentifier();
471 for ( int i = 0; i < identifiers.length; i++ ) {
472 appendIdentifier( root, identifiers[i] );
473 }
474
475 MetadataURL[] metadataURLs = layer.getMetadataURL();
476 for ( int i = 0; i < metadataURLs.length; i++ ) {
477 appendMetadataURL( root, metadataURLs[i] );
478 }
479
480 DataURL[] dataURLs = layer.getDataURL();
481 for ( int i = 0; i < dataURLs.length; i++ ) {
482 appendDataURL( root, dataURLs[i] );
483 }
484
485 FeatureListURL[] featureListURLs = layer.getFeatureListURL();
486 for ( int i = 0; i < featureListURLs.length; i++ ) {
487 appendFeatureListURL( root, featureListURLs[i] );
488 }
489
490 if ( layer.getName() != null && layer.getName().length() > 0 ) {
491 Style[] styles = layer.getStyles();
492 for ( int i = 0; i < styles.length; i++ ) {
493 appendStyle( root, styles[i] );
494 }
495 }
496
497 ScaleHint scaleHint = layer.getScaleHint();
498 Element elem = XMLTools.appendElement( root, null, "ScaleHint" );
499 elem.setAttribute( "min", "" + scaleHint.getMin() );
500 elem.setAttribute( "max", "" + scaleHint.getMax() );
501
502 Layer[] layers = layer.getLayer();
503 for ( int i = 0; i < layers.length; i++ ) {
504 appendCapabilityLayer( root, layers[i] );
505 }
506
507 }
508
509 /**
510 *
511 * @param root
512 * @param style
513 */
514 protected static void appendStyle( Element root, Style style ) {
515
516 String nm = style.getName();
517 String tlt = style.getTitle();
518 if ( nm.startsWith( "default:" ) ) {
519 nm = "default";
520 if ( tlt != null ) {
521 tlt = StringTools.replace( tlt, "default:", "", false ) + " (default)";
522 }
523 }
524
525 root = XMLTools.appendElement( root, null, "Style" );
526 XMLTools.appendElement( root, null, "Name", nm );
527 if ( style.getTitle() != null ) {
528 XMLTools.appendElement( root, null, "Title", tlt );
529 }
530 if ( style.getAbstract() != null ) {
531 XMLTools.appendElement( root, null, "Abstract", style.getAbstract() );
532 }
533 LegendURL[] legendURLs = style.getLegendURL();
534 for ( int i = 0; i < legendURLs.length; i++ ) {
535 appendLegendURL( root, legendURLs[i] );
536 }
537
538 StyleSheetURL styleSheetURL = style.getStyleSheetURL();
539 if ( styleSheetURL != null ) {
540 appendStyleSheetURL( root, styleSheetURL );
541 }
542
543 StyleURL styleURL = style.getStyleURL();
544 if ( styleURL != null ) {
545 appendStyleURL( root, styleURL );
546 }
547
548 }
549
550 /**
551 * @param root
552 * @param styleURL
553 */
554 protected static void appendStyleURL( Element root, StyleURL styleURL ) {
555 Element elem = XMLTools.appendElement( root, null, "StyleURL" );
556 XMLTools.appendElement( elem, null, "Format", styleURL.getFormat() );
557 appendOnlineResource( elem, styleURL.getOnlineResource(), false );
558 }
559
560 /**
561 * @param root
562 * @param styleSheetURL
563 */
564 protected static void appendStyleSheetURL( Element root, StyleSheetURL styleSheetURL ) {
565 Element elem = XMLTools.appendElement( root, null, "StyleSheetURL" );
566 XMLTools.appendElement( elem, null, "Format", styleSheetURL.getFormat() );
567 appendOnlineResource( elem, styleSheetURL.getOnlineResource(), false );
568 }
569
570 /**
571 * @param root
572 * @param legendURL
573 */
574 protected static void appendLegendURL( Element root, LegendURL legendURL ) {
575 Element elem = XMLTools.appendElement( root, null, "LegendURL" );
576 elem.setAttribute( "width", "" + legendURL.getWidth() );
577 elem.setAttribute( "height", "" + legendURL.getHeight() );
578 XMLTools.appendElement( elem, null, "Format", legendURL.getFormat() );
579
580 appendOnlineResource( elem, legendURL.getOnlineResource(), false );
581 }
582
583 /**
584 * @param root
585 * @param featureListURL
586 */
587 protected static void appendFeatureListURL( Element root, FeatureListURL featureListURL ) {
588 Element elem = XMLTools.appendElement( root, null, "FeatureListURL" );
589 XMLTools.appendElement( elem, null, "Format", featureListURL.getFormat() );
590 appendOnlineResource( elem, featureListURL.getOnlineResource(), false );
591 }
592
593 /**
594 * @param root
595 * @param dataURL
596 */
597 protected static void appendDataURL( Element root, DataURL dataURL ) {
598 Element elem = XMLTools.appendElement( root, null, "DataURL" );
599 XMLTools.appendElement( elem, null, "Format", dataURL.getFormat() );
600 appendOnlineResource( elem, dataURL.getOnlineResource(), false );
601 }
602
603 /**
604 * @param root
605 * @param metadataURL
606 */
607 protected static void appendMetadataURL( Element root, MetadataURL metadataURL ) {
608 Element elem = XMLTools.appendElement( root, null, "MetadataURL" );
609 elem.setAttribute( "type", metadataURL.getType() );
610 XMLTools.appendElement( elem, null, "Format", metadataURL.getFormat() );
611 appendOnlineResource( elem, metadataURL.getOnlineResource(), false );
612 }
613
614 /**
615 * @param root
616 * @param identifier
617 */
618 protected static void appendIdentifier( Element root, Identifier identifier ) {
619 Element elem = XMLTools.appendElement( root, null, "Identifier" );
620 elem.setAttribute( "authority", identifier.getAuthority() );
621 elem.setTextContent( identifier.getValue() );
622 }
623
624 /**
625 * @param root
626 * @param authorityURL
627 */
628 protected static void appendAuthorityURL( Element root, AuthorityURL authorityURL ) {
629 Element elem = XMLTools.appendElement( root, null, "AuthorityURL" );
630 elem.setAttribute( "name", authorityURL.getName() );
631 appendOnlineResource( elem, authorityURL.getOnlineResource(), false );
632 }
633
634 /**
635 * @param root
636 * @param attr
637 */
638 protected static void appendAttribution( Element root, Attribution attr ) {
639 Element elem = XMLTools.appendElement( root, null, "Attribution" );
640 XMLTools.appendElement( elem, null, "Title", attr.getTitle() );
641 appendOnlineResource( elem, attr.getOnlineResource(), false );
642 LogoURL logoURL = attr.getLogoURL();
643 if ( logoURL != null ) {
644 elem = XMLTools.appendElement( elem, null, "LogoURL" );
645 elem.setAttribute( "width", "" + logoURL.getWidth() );
646 elem.setAttribute( "height", "" + logoURL.getHeight() );
647 XMLTools.appendElement( elem, null, "Format", logoURL.getFormat() );
648 appendOnlineResource( elem, logoURL.getOnlineResource(), false );
649 }
650 }
651
652 /**
653 * @param root
654 * @param url
655 * @param appendFineChar
656 */
657 protected static void appendOnlineResource( Element root, URL url, boolean appendFineChar ) {
658
659 Element olr = XMLTools.appendElement( root, null, "OnlineResource" );
660 olr.setAttributeNS( "http://www.w3.org/1999/xlink", "xlink:type", "simple" );
661 if ( appendFineChar ) {
662 // according to OGC WMS 1.1.1 & 1.3 Testsuite a URL to a service operation
663 // via HTTPGet must end with '?' or '&'
664 String href = OWSUtils.validateHTTPGetBaseURL( url.toExternalForm() );
665 olr.setAttributeNS( "http://www.w3.org/1999/xlink", "xlink:href", href );
666 } else {
667 olr.setAttributeNS( "http://www.w3.org/1999/xlink", "xlink:href", url.toExternalForm() );
668 }
669 }
670
671 /**
672 * @param root
673 * @param extent
674 */
675 protected static void appendExtent( Element root, Extent extent ) {
676 Element exNode = XMLTools.appendElement( root, null, "Extent" );
677 exNode.setAttribute( "name", extent.getName() );
678 exNode.setAttribute( "default", extent.getDefault() );
679 exNode.setAttribute( "nearestValue", boolean2Number( extent.useNearestValue() ) );
680 exNode.setTextContent( extent.getValue() );
681 }
682
683 /**
684 * @param root
685 * @param dim
686 */
687 protected static void appendDimension( Element root, Dimension dim ) {
688 Element dimNode = XMLTools.appendElement( root, null, "Dimension" );
689 dimNode.setAttribute( "name", dim.getName() );
690 dimNode.setAttribute( "units", dim.getUnits() );
691 dimNode.setAttribute( "unitSymbol", dim.getUnitSymbol() );
692 }
693
694 /**
695 * @param root
696 * @param lBox
697 */
698 protected static void appendLayerBoundingBox( Element root, LayerBoundingBox lBox ) {
699 Element bbNode = XMLTools.appendElement( root, null, "BoundingBox" );
700 bbNode.setAttribute( "minx", "" + lBox.getMin().getX() );
701 bbNode.setAttribute( "miny", "" + lBox.getMin().getY() );
702 bbNode.setAttribute( "maxx", "" + lBox.getMax().getX() );
703 bbNode.setAttribute( "maxy", "" + lBox.getMax().getY() );
704 bbNode.setAttribute( "resx", "" + lBox.getResx() );
705 bbNode.setAttribute( "resy", "" + lBox.getResy() );
706 bbNode.setAttribute( "SRS", "" + lBox.getSRS() );
707 }
708
709 /**
710 * @param root
711 * @param llBox
712 */
713 protected static void appendLatLonBoundingBox( Element root, Envelope llBox ) {
714 Element bbNode = XMLTools.appendElement( root, null, "LatLonBoundingBox" );
715 bbNode.setAttribute( "minx", "" + llBox.getMin().getX() );
716 bbNode.setAttribute( "miny", "" + llBox.getMin().getY() );
717 bbNode.setAttribute( "maxx", "" + llBox.getMax().getX() );
718 bbNode.setAttribute( "maxy", "" + llBox.getMax().getY() );
719 }
720
721 }