001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/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: mschneider $
094     *
095     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
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, PWMS + "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, PWMS + "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, PWMS + "KeywordList" );
189                for ( int i = 0; i < kw.length; i++ ) {
190                    XMLTools.appendElement( kwl, WMSNS, PWMS + "Keyword", kw[i] );
191                }
192            }
193    
194            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "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, PWMS + "Fees", fee );
205            } else {
206                XMLTools.appendElement( root, WMSNS, PWMS + "Fees", "none" );
207            }
208    
209            if ( identification.getAccessConstraints().size() > 0 ) {
210                XMLTools.appendElement( root, WMSNS, PWMS + "AccessConstraints",
211                                        identification.getAccessConstraints().get( 0 ).getUseLimitations().get( 0 ) );
212            } else {
213                XMLTools.appendElement( root, WMSNS, PWMS + "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, PWMS + "ContactInformation" );
226            Element cppNode = XMLTools.appendElement( ciNode, WMSNS, PWMS + "ContactPersonPrimary" );
227            if ( provider.getServiceContact().getIndividualName().length > 0 ) {
228                XMLTools.appendElement( cppNode, WMSNS, PWMS + "ContactPerson",
229                                        provider.getServiceContact().getIndividualName()[0] );
230            }
231            if ( provider.getServiceContact().getOrganisationName().length > 0 ) {
232                XMLTools.appendElement( cppNode, WMSNS, PWMS + "ContactOrganization",
233                                        provider.getServiceContact().getOrganisationName()[0] );
234            }
235            if ( provider.getServiceContact().getPositionName().length > 0 ) {
236                XMLTools.appendElement( ciNode, WMSNS, PWMS + "ContactPosition",
237                                        provider.getServiceContact().getPositionName()[0] );
238            }
239            Element caNode = XMLTools.appendElement( ciNode, WMSNS, PWMS + "ContactAddress" );
240    
241            XMLTools.appendElement( caNode, WMSNS, PWMS + "AddressType", "postal" );
242    
243            if ( provider.getServiceContact().getContactInfo().length > 0 ) {
244                Address addr = provider.getServiceContact().getContactInfo()[0].getAddress();
245                String[] dp = addr.getDeliveryPoint();
246                if ( dp.length > 0 ) {
247                    XMLTools.appendElement( caNode, WMSNS, PWMS + "Address", dp[0] );
248                }
249                if ( addr.getCity() != null ) {
250                    XMLTools.appendElement( caNode, WMSNS, PWMS + "City", addr.getCity() );
251                }
252                if ( addr.getAdministrativeArea() != null ) {
253                    XMLTools.appendElement( caNode, WMSNS, PWMS + "StateOrProvince", addr.getAdministrativeArea() );
254                }
255                if ( addr.getPostalCode() != null ) {
256                    XMLTools.appendElement( caNode, WMSNS, PWMS + "PostCode", addr.getPostalCode() );
257                }
258                if ( addr.getCountry() != null ) {
259                    XMLTools.appendElement( caNode, WMSNS, PWMS + "Country", addr.getCountry() );
260                }
261    
262                Phone phone = provider.getServiceContact().getContactInfo()[0].getPhone();
263                if ( phone.getVoice().length > 0 ) {
264                    XMLTools.appendElement( ciNode, WMSNS, PWMS + "ContactVoiceTelephone", phone.getVoice()[0] );
265                }
266                if ( phone.getFacsimile().length > 0 ) {
267                    XMLTools.appendElement( ciNode, WMSNS, PWMS + "ContactFacsimileTelephone", phone.getFacsimile()[0] );
268                }
269                if ( addr.getElectronicMailAddress().length > 0 ) {
270                    XMLTools.appendElement( ciNode, WMSNS, PWMS + "ContactElectronicMailAddress",
271                                            addr.getElectronicMailAddress()[0] );
272                }
273            }
274    
275        }
276    
277        /**
278         *
279         * @param root
280         * @param operationsMetadata
281         * @throws XMLParsingException
282         */
283        protected static void appendCapabilityRequests( Element root, OperationsMetadata operationsMetadata )
284                                throws XMLParsingException {
285    
286            root = (Element) XMLTools.getRequiredNode( root, PWMS + "Capability/" + PWMS + "Request", nsContext );
287    
288            operationsMetadata.getOperations();
289    
290            // just append all operations
291            for ( Operation operation : operationsMetadata.getOperations() ) {
292                appendOperation( root, operation );
293            }
294    
295            // maybe we have to check for mandatory operations?
296    
297        }
298    
299        /**
300         *
301         * @param root
302         * @param operation
303         */
304        protected static void appendOperation( Element root, Operation operation ) {
305    
306            String name = operation.getName().getPrefixedName();
307    
308            if ( "sld:GetLegendGraphic".equals( name ) ) {
309                root = XMLTools.appendElement( root, CommonNamespaces.SLDNS, name );
310                // root.setAttribute( "xsi:type", "wms:_ExtendedOperation" );
311            } else {
312                root = XMLTools.appendElement( root, WMSNS, name );
313            }
314    
315            DomainType odt = (DomainType) operation.getParameter( new QualifiedName( "Format" ) );
316    
317            List<TypedLiteral> values = odt.getValues();
318            for ( TypedLiteral value : values )
319                XMLTools.appendElement( root, WMSNS, PWMS + "Format", value.getValue() );
320    
321            List<DCP> dcps = operation.getDCP();
322            for ( DCP dcp : dcps ) {
323                Element http = XMLTools.appendElement( root, WMSNS, PWMS + "DCPType" );
324                http = XMLTools.appendElement( http, WMSNS, PWMS + "HTTP" );
325                HTTP ht = (HTTP) dcp;
326                List<HTTP.Type> types = ht.getTypes();
327                List<OnlineResource> links = ht.getLinks();
328                for ( int i = 0; i < types.size(); ++i ) {
329                    Element elem = null;
330                    if ( types.get( i ) == HTTP.Type.Get )
331                        elem = XMLTools.appendElement( http, WMSNS, PWMS + "Get" );
332                    if ( types.get( i ) == HTTP.Type.Post )
333                        elem = XMLTools.appendElement( http, WMSNS, PWMS + "Post" );
334                    if ( elem != null ) {
335                        elem = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
336                        org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( elem, links.get( i ) );
337                    }
338                }
339            }
340    
341        }
342    
343        // /**
344        // * @param http
345        // * @param urls
346        // */
347        // protected static void appendURLs( Element http, URL[] urls, String type ) {
348        // for ( int j = 0; j < urls.length; j++ ) {
349        // Element olr = XMLTools.appendElement( http, null, type );
350        // appendOnlineResource( olr, urls[j], "Get".equalsIgnoreCase( type ) );
351        // }
352        // }
353    
354        /**
355         *
356         * @param root
357         * @param layer
358         * @throws XMLParsingException
359         */
360        protected static void appendCapabilityLayer( Element root, Layer layer )
361                                throws XMLParsingException {
362    
363            root = XMLTools.appendElement( root, WMSNS, PWMS + "Layer" );
364            root.setAttribute( "queryable", boolean2Number( layer.isQueryable() ) );
365            root.setAttribute( "cascaded", Integer.toString( layer.getCascaded() ) );
366            root.setAttribute( "opaque", boolean2Number( layer.isOpaque() ) );
367            root.setAttribute( "noSubsets", boolean2Number( layer.hasNoSubsets() ) );
368            if ( layer.getFixedWidth() > 0 ) {
369                root.setAttribute( "fixedWidth", Integer.toString( layer.getFixedWidth() ) );
370            }
371            if ( layer.getFixedHeight() > 0 ) {
372                root.setAttribute( "fixedHeight", Integer.toString( layer.getFixedHeight() ) );
373            }
374    
375            if ( layer.getName() != null ) {
376                XMLTools.appendElement( root, WMSNS, PWMS + "Name", layer.getName() );
377            }
378            XMLTools.appendElement( root, WMSNS, PWMS + "Title", layer.getTitle() );
379    
380            if ( layer.getAbstract() != null ) {
381                XMLTools.appendElement( root, WMSNS, PWMS + "Abstract", layer.getAbstract() );
382            }
383    
384            String[] keywords = layer.getKeywordList();
385            if ( keywords.length > 0 ) {
386                Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "KeywordList" );
387                for ( int i = 0; i < keywords.length; i++ ) {
388                    XMLTools.appendElement( elem, WMSNS, PWMS + "Keyword", keywords[i] );
389                }
390            }
391    
392            String[] srs = layer.getSrs();
393            for ( int i = 0; i < srs.length; i++ ) {
394                XMLTools.appendElement( root, WMSNS, PWMS + "CRS", srs[i] );
395            }
396    
397            Envelope llBox = layer.getLatLonBoundingBox();
398            appendLatLonBoundingBox( root, llBox );
399    
400            LayerBoundingBox[] lBoxes = layer.getBoundingBoxes();
401            for ( int i = 0; i < lBoxes.length; i++ ) {
402                appendLayerBoundingBox( root, lBoxes[i] );
403            }
404    
405            Dimension[] dims = layer.getDimension();
406            for ( int i = 0; i < dims.length; i++ ) {
407                appendDimension( root, dims[i] );
408            }
409    
410            Extent[] extents = layer.getExtent();
411            for ( int i = 0; i < extents.length; i++ ) {
412                appendExtent( root, extents[i] );
413            }
414    
415            Attribution attr = layer.getAttribution();
416            if ( attr != null ) {
417                appendAttribution( root, attr );
418            }
419    
420            AuthorityURL[] authorityURLs = layer.getAuthorityURL();
421            for ( int i = 0; i < authorityURLs.length; i++ ) {
422                appendAuthorityURL( root, authorityURLs[i] );
423            }
424    
425            Identifier[] identifiers = layer.getIdentifier();
426            for ( int i = 0; i < identifiers.length; i++ ) {
427                appendIdentifier( root, identifiers[i] );
428            }
429    
430            MetadataURL[] metadataURLs = layer.getMetadataURL();
431            for ( int i = 0; i < metadataURLs.length; i++ ) {
432                appendMetadataURL( root, metadataURLs[i] );
433            }
434    
435            DataURL[] dataURLs = layer.getDataURL();
436            for ( int i = 0; i < dataURLs.length; i++ ) {
437                appendDataURL( root, dataURLs[i] );
438            }
439    
440            FeatureListURL[] featureListURLs = layer.getFeatureListURL();
441            for ( int i = 0; i < featureListURLs.length; i++ ) {
442                appendFeatureListURL( root, featureListURLs[i] );
443            }
444    
445            if ( layer.getName() != null && layer.getName().length() > 0 ) {
446                Style[] styles = layer.getStyles();
447                for ( int i = 0; i < styles.length; i++ ) {
448                    appendStyle( root, styles[i] );
449                }
450            }
451    
452            ScaleHint scaleHint = layer.getScaleHint();
453            XMLTools.appendElement( root, WMSNS, PWMS + "MinScaleDenominator", "" + scaleHint.getMin() );
454            XMLTools.appendElement( root, WMSNS, PWMS + "MaxScaleDenominator", "" + scaleHint.getMax() );
455    
456            Layer[] layers = layer.getLayer();
457            for ( int i = 0; i < layers.length; i++ ) {
458                appendCapabilityLayer( root, layers[i] );
459            }
460    
461        }
462    
463        /**
464         *
465         * @param root
466         * @param style
467         */
468        protected static void appendStyle( Element root, Style style ) {
469    
470            String nm = style.getName();
471            String tlt = style.getTitle();
472            if ( nm.startsWith( "default:" ) ) {
473                nm = "default";
474                if ( tlt != null ) {
475                    tlt = StringTools.replace( tlt, "default:", "", false ) + " (default)";
476                }
477            }
478    
479            root = XMLTools.appendElement( root, WMSNS, PWMS + "Style" );
480            XMLTools.appendElement( root, WMSNS, PWMS + "Name", nm );
481            if ( style.getTitle() != null ) {
482                XMLTools.appendElement( root, WMSNS, PWMS + "Title", tlt );
483            }
484            if ( style.getAbstract() != null ) {
485                XMLTools.appendElement( root, WMSNS, PWMS + "Abstract", style.getAbstract() );
486            }
487            LegendURL[] legendURLs = style.getLegendURL();
488    
489            for ( int i = 0; i < legendURLs.length; i++ ) {
490                appendLegendURL( root, legendURLs[i] );
491            }
492    
493            StyleSheetURL styleSheetURL = style.getStyleSheetURL();
494            if ( styleSheetURL != null ) {
495                appendStyleSheetURL( root, styleSheetURL );
496            }
497    
498            StyleURL styleURL = style.getStyleURL();
499            if ( styleURL != null ) {
500                appendStyleURL( root, styleURL );
501            }
502    
503        }
504    
505        /**
506         * @param root
507         * @param styleURL
508         */
509        protected static void appendStyleURL( Element root, StyleURL styleURL ) {
510            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "StyleURL" );
511            XMLTools.appendElement( elem, WMSNS, PWMS + "Format", styleURL.getFormat() );
512            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
513            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, styleURL.getOnlineResource() );
514        }
515    
516        /**
517         * @param root
518         * @param styleSheetURL
519         */
520        protected static void appendStyleSheetURL( Element root, StyleSheetURL styleSheetURL ) {
521            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "StyleSheetURL" );
522            XMLTools.appendElement( elem, WMSNS, PWMS + "Format", styleSheetURL.getFormat() );
523            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
524            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, styleSheetURL.getOnlineResource() );
525        }
526    
527        /**
528         * @param root
529         * @param legendURL
530         */
531        protected static void appendLegendURL( Element root, LegendURL legendURL ) {
532            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "LegendURL" );
533            elem.setAttribute( "width", "" + legendURL.getWidth() );
534            elem.setAttribute( "height", "" + legendURL.getHeight() );
535            XMLTools.appendElement( elem, WMSNS, PWMS + "Format", legendURL.getFormat() );
536    
537            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
538            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, legendURL.getOnlineResource() );
539        }
540    
541        /**
542         * @param root
543         * @param featureListURL
544         */
545        protected static void appendFeatureListURL( Element root, FeatureListURL featureListURL ) {
546            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "FeatureListURL" );
547            XMLTools.appendElement( elem, WMSNS, PWMS + "Format", featureListURL.getFormat() );
548            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
549            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, featureListURL.getOnlineResource() );
550        }
551    
552        /**
553         * @param root
554         * @param dataURL
555         */
556        protected static void appendDataURL( Element root, DataURL dataURL ) {
557            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "DataURL" );
558            XMLTools.appendElement( elem, WMSNS, PWMS + "Format", dataURL.getFormat() );
559            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
560            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, dataURL.getOnlineResource() );
561        }
562    
563        /**
564         * @param root
565         * @param metadataURL
566         */
567        protected static void appendMetadataURL( Element root, MetadataURL metadataURL ) {
568            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "MetadataURL" );
569            elem.setAttribute( "type", metadataURL.getType() );
570            XMLTools.appendElement( elem, WMSNS, PWMS + "Format", metadataURL.getFormat() );
571            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
572            res.setAttributeNS( XLNNS.toASCIIString(), "xlink:type", "simple" );
573            res.setAttributeNS( XLNNS.toASCIIString(), "xlink:href", metadataURL.getOnlineResource().toExternalForm() );
574        }
575    
576        /**
577         * @param root
578         * @param identifier
579         */
580        protected static void appendIdentifier( Element root, Identifier identifier ) {
581            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "Identifier" );
582            elem.setAttribute( "authority", identifier.getAuthority() );
583            elem.setTextContent( identifier.getValue() );
584        }
585    
586        /**
587         * @param root
588         * @param authorityURL
589         */
590        protected static void appendAuthorityURL( Element root, AuthorityURL authorityURL ) {
591            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "AuthorityURL" );
592            elem.setAttribute( "name", authorityURL.getName() );
593            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
594            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, authorityURL.getOnlineResource() );
595        }
596    
597        /**
598         * @param root
599         * @param attr
600         */
601        protected static void appendAttribution( Element root, Attribution attr ) {
602            Element elem = XMLTools.appendElement( root, WMSNS, PWMS + "Attribution" );
603            XMLTools.appendElement( elem, WMSNS, PWMS + "Title", attr.getTitle() );
604            Element res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
605            org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, attr.getOnlineResource() );
606            LogoURL logoURL = attr.getLogoURL();
607            if ( logoURL != null ) {
608                elem = XMLTools.appendElement( elem, WMSNS, PWMS + "LogoURL" );
609                elem.setAttribute( "width", "" + logoURL.getWidth() );
610                elem.setAttribute( "height", "" + logoURL.getHeight() );
611                XMLTools.appendElement( elem, WMSNS, PWMS + "Format", logoURL.getFormat() );
612                res = XMLTools.appendElement( elem, WMSNS, PWMS + "OnlineResource" );
613                org.deegree.model.metadata.iso19115.XMLFactory.appendOnlineResource( res, logoURL.getOnlineResource() );
614            }
615        }
616    
617        /**
618         * @param root
619         * @param extent
620         */
621        protected static void appendExtent( Element root, Extent extent ) {
622            Element exNode = XMLTools.appendElement( root, WMSNS, PWMS + "Extent" );
623            exNode.setAttribute( "name", extent.getName() );
624            exNode.setAttribute( "default", extent.getDefault() );
625            exNode.setAttribute( "nearestValue", boolean2Number( extent.useNearestValue() ) );
626            exNode.setTextContent( extent.getValue() );
627        }
628    
629        /**
630         * @param root
631         * @param dim
632         */
633        protected static void appendDimension( Element root, Dimension dim ) {
634            Element dimNode = XMLTools.appendElement( root, WMSNS, PWMS + "Dimension", dim.getValues() );
635            dimNode.setAttribute( "name", dim.getName() );
636            dimNode.setAttribute( "units", dim.getUnits() );
637            maybeSetAttribute( dimNode, "unitSymbol", dim.getUnitSymbol() );
638            maybeSetAttribute( dimNode, "default", dim.getDefaultValue() );
639            maybeSetAttribute( dimNode, "current", dim.isCurrent() ? "1" : null );
640            maybeSetAttribute( dimNode, "nearestValue", dim.isNearestValue() ? "1" : null );
641            maybeSetAttribute( dimNode, "multipleValues", dim.isMultipleValues() ? "1" : null );
642        }
643    
644        /**
645         * @param root
646         * @param lBox
647         */
648        protected static void appendLayerBoundingBox( Element root, LayerBoundingBox lBox ) {
649            Element bbNode = XMLTools.appendElement( root, WMSNS, PWMS + "BoundingBox" );
650            if ( lBox.getSRS().startsWith( "EPSG" ) ) {
651                bbNode.setAttribute( "miny", "" + lBox.getMin().getX() );
652                bbNode.setAttribute( "minx", "" + lBox.getMin().getY() );
653                bbNode.setAttribute( "maxy", "" + lBox.getMax().getX() );
654                bbNode.setAttribute( "maxx", "" + lBox.getMax().getY() );
655                bbNode.setAttribute( "resx", "" + lBox.getResx() );
656                bbNode.setAttribute( "resy", "" + lBox.getResy() );
657                bbNode.setAttribute( "CRS", "" + lBox.getSRS() );
658            } else {
659                bbNode.setAttribute( "minx", "" + lBox.getMin().getX() );
660                bbNode.setAttribute( "miny", "" + lBox.getMin().getY() );
661                bbNode.setAttribute( "maxx", "" + lBox.getMax().getX() );
662                bbNode.setAttribute( "maxy", "" + lBox.getMax().getY() );
663                bbNode.setAttribute( "resx", "" + lBox.getResx() );
664                bbNode.setAttribute( "resy", "" + lBox.getResy() );
665                bbNode.setAttribute( "CRS", "" + lBox.getSRS() );
666            }
667        }
668    
669        /**
670         * @param root
671         * @param llBox
672         */
673        protected static void appendLatLonBoundingBox( Element root, Envelope llBox ) {
674            Element bbNode = XMLTools.appendElement( root, WMSNS, PWMS + "EX_GeographicBoundingBox" );
675            XMLTools.appendElement( bbNode, WMSNS, PWMS + "westBoundLongitude", "" + llBox.getMin().getX() );
676            XMLTools.appendElement( bbNode, WMSNS, PWMS + "eastBoundLongitude", "" + llBox.getMax().getX() );
677            XMLTools.appendElement( bbNode, WMSNS, PWMS + "southBoundLatitude", "" + llBox.getMin().getY() );
678            XMLTools.appendElement( bbNode, WMSNS, PWMS + "northBoundLatitude", "" + llBox.getMax().getY() );
679        }
680    
681    }