001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wms/capabilities/WMSCapabilities.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.capabilities;
037    
038    import java.util.Collections;
039    import java.util.HashSet;
040    import java.util.LinkedList;
041    import java.util.List;
042    import java.util.Set;
043    
044    import org.deegree.framework.log.ILogger;
045    import org.deegree.framework.log.LoggerFactory;
046    import org.deegree.i18n.Messages;
047    import org.deegree.ogcwebservices.getcapabilities.OGCCapabilities;
048    import org.deegree.owscommon_new.OperationsMetadata;
049    import org.deegree.owscommon_new.ServiceIdentification;
050    import org.deegree.owscommon_new.ServiceProvider;
051    
052    /**
053     * <code>WMSCapabilities</code> is the data class for the WMS version of capabilities. Since WMS is not yet using the
054     * OWS commons implementation, it is more or less just a copy of the old version.
055     *
056     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
057     * @version $Revision: 18195 $
058     */
059    public class WMSCapabilities extends OGCCapabilities {
060    
061        private static final long serialVersionUID = -6040994669604563061L;
062    
063        private static final ILogger LOG = LoggerFactory.getLogger( WMSCapabilities.class );
064    
065        private ServiceIdentification serviceIdentification = null;
066    
067        private ServiceProvider serviceProvider = null;
068    
069        private UserDefinedSymbolization userDefinedSymbolization = null;
070    
071        private OperationsMetadata operationMetadata = null;
072    
073        private Layer layer = null;
074    
075        protected List<String> exceptions;
076    
077        /**
078         * constructor initializing the class with the <code>WMSCapabilities</code>
079         *
080         * @param version
081         * @param updateSequence
082         * @param serviceIdentification
083         * @param serviceProvider
084         * @param userDefinedSymbolization
085         * @param metadata
086         * @param layer
087         */
088        protected WMSCapabilities( String version, String updateSequence, ServiceIdentification serviceIdentification,
089                                   ServiceProvider serviceProvider, UserDefinedSymbolization userDefinedSymbolization,
090                                   OperationsMetadata metadata, Layer layer ) {
091            super( version, updateSequence );
092    
093            setServiceProvider( serviceProvider );
094            setServiceIdentification( serviceIdentification );
095            setUserDefinedSymbolization( userDefinedSymbolization );
096            setOperationMetadata( metadata );
097            setLayer( layer );
098            exceptions = new LinkedList<String>();
099            if ( version.equals( "1.3.0" ) ) {
100                exceptions.add( "XML" );
101            } else {
102                exceptions.add( "application/vnd.ogc.se_xml" );
103            }
104        }
105    
106        /**
107         * @param version
108         * @param updateSequence
109         * @param serviceIdentification
110         * @param serviceProvider
111         * @param userDefinedSymbolization
112         * @param metadata
113         * @param layer
114         * @param exceptions
115         */
116        protected WMSCapabilities( String version, String updateSequence, ServiceIdentification serviceIdentification,
117                                   ServiceProvider serviceProvider, UserDefinedSymbolization userDefinedSymbolization,
118                                   OperationsMetadata metadata, Layer layer, List<String> exceptions ) {
119            this( version, updateSequence, serviceIdentification, serviceProvider, userDefinedSymbolization, metadata,
120                  layer );
121            this.exceptions = exceptions;
122        }
123    
124        /**
125         *
126         * @return the service description section
127         */
128        public ServiceIdentification getServiceIdentification() {
129            return serviceIdentification;
130        }
131    
132        /**
133         * sets the service description section
134         *
135         * @param serviceIdentification
136         */
137        public void setServiceIdentification( ServiceIdentification serviceIdentification ) {
138            this.serviceIdentification = serviceIdentification;
139        }
140    
141        /**
142         *
143         * @return the root layer provided by a WMS
144         */
145        public Layer getLayer() {
146            return layer;
147        }
148    
149        /**
150         *
151         * @param name
152         *            the layer name
153         * @return the layer provided by a WMS, or null, if there is no such layer
154         */
155        public Layer getLayer( String name ) {
156            Layer lay = null;
157            if ( layer.getName() != null && name.equals( layer.getName() ) ) {
158                lay = layer;
159            } else {
160                lay = getLayer( name, layer.getLayer() );
161            }
162            return lay;
163        }
164    
165        /**
166         * recursion over all layers to find the layer that matches the submitted name. If no layer can be found that
167         * fullfills the condition <tt>null</tt> will be returned.
168         *
169         * @param name
170         *            name of the layer to be found
171         * @param layers
172         *            list of searchable layers
173         *
174         * @return a layer object or <tt>null</tt>
175         */
176        private Layer getLayer( String name, Layer[] layers ) {
177            Layer lay = null;
178    
179            if ( layers != null ) {
180                for ( int i = 0; i < layers.length; i++ ) {
181                    if ( name.equals( layers[i].getName() ) ) {
182                        lay = layers[i];
183                        break;
184                    }
185                    lay = getLayer( name, layers[i].getLayer() );
186                    if ( lay != null )
187                        break;
188                }
189            }
190    
191            return lay;
192        }
193    
194        /**
195         * returns the
196         *
197         * @see Layer identified by its title. If no layer matching the passed title can be found <code>null</code> will
198         *      be returned.
199         *
200         * @param title
201         * @return the layer
202         */
203        public Layer getLayerByTitle( String title ) {
204            Layer lay = null;
205            if ( title.equals( layer.getTitle() ) ) {
206                lay = layer;
207            } else {
208                lay = getLayerByTitle( title, layer.getLayer() );
209            }
210            return lay;
211        }
212    
213        /**
214         * recursion over all layers to find the layer that matches the passed title. If no layer can be found that
215         * fullfills the condition <tt>null</tt> will be returned.
216         *
217         * @param title
218         *            of the layer to be found
219         * @param layers
220         *            list of searchable layers
221         *
222         * @return a layer object or <tt>null</tt>
223         */
224        private Layer getLayerByTitle( String title, Layer[] layers ) {
225            Layer lay = null;
226    
227            if ( layers != null ) {
228                for ( int i = 0; i < layers.length; i++ ) {
229                    if ( title.equals( layers[i].getTitle() ) ) {
230                        lay = layers[i];
231                        break;
232                    }
233                    lay = getLayer( title, layers[i].getLayer() );
234                    if ( lay != null )
235                        break;
236                }
237            }
238    
239            return lay;
240        }
241    
242        /**
243         * @param layer
244         * @param layers
245         * @return a layer name, if a layer has been defined two times with the same name, null otherwise
246         */
247        public static String hasDoubleLayers( Layer layer, Set<String> layers ) {
248    
249            if ( layers.contains( layer.getName() ) ) {
250                return layer.getName();
251            }
252    
253            layers.add( layer.getName() );
254    
255            for ( Layer lay : layer.getLayer() ) {
256                String dl = hasDoubleLayers( lay, layers );
257                if ( dl != null ) {
258                    return dl;
259                }
260            }
261            return null;
262    
263        }
264    
265        /**
266         * sets the root layer provided by a WMS
267         *
268         * @param layer
269         */
270        public void setLayer( Layer layer ) {
271            String dl = hasDoubleLayers( layer, new HashSet<String>() );
272            if ( dl != null ) {
273                LOG.logWarning( Messages.getMessage( "WMS_REDEFINED_LAYER", dl ) );
274                // throw new IllegalArgumentException( Messages.getMessage( "WMS_REDEFINED_LAYER", dl )
275                // );
276            }
277            this.layer = layer;
278        }
279    
280        /**
281         *
282         * @return metadata about the offered access methods like GetMap or GetCapabilities
283         */
284        public OperationsMetadata getOperationMetadata() {
285            return operationMetadata;
286        }
287    
288        /**
289         * sets metadata for the offered access methods like GetMap or GetCapabiliites
290         *
291         * @param operationMetadata
292         */
293        public void setOperationMetadata( OperationsMetadata operationMetadata ) {
294            this.operationMetadata = operationMetadata;
295        }
296    
297        /**
298         * @return the list of exceptions
299         */
300        public List<String> getExceptions() {
301            return Collections.unmodifiableList( exceptions );
302        }
303    
304        /**
305         *
306         * @return informations about the provider of a WMS
307         */
308        public ServiceProvider getServiceProvider() {
309            return serviceProvider;
310        }
311    
312        /**
313         * sets informations about the provider of a WMS
314         *
315         * @param serviceProvider
316         */
317        public void setServiceProvider( ServiceProvider serviceProvider ) {
318            this.serviceProvider = serviceProvider;
319        }
320    
321        /**
322         * @return the user defined symbolization
323         */
324        public UserDefinedSymbolization getUserDefinedSymbolization() {
325            return userDefinedSymbolization;
326        }
327    
328        /**
329         * @param userDefinedSymbolization
330         */
331        public void setUserDefinedSymbolization( UserDefinedSymbolization userDefinedSymbolization ) {
332            this.userDefinedSymbolization = userDefinedSymbolization;
333        }
334    }