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