001    // $HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wfs/capabilities/WFSFeatureType.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    
037    package org.deegree.ogcwebservices.wfs.capabilities;
038    
039    import static org.deegree.framework.log.LoggerFactory.getLogger;
040    import static org.deegree.model.crs.CRSFactory.create;
041    
042    import java.net.URI;
043    
044    import org.deegree.datatypes.QualifiedName;
045    import org.deegree.framework.log.ILogger;
046    import org.deegree.model.crs.CoordinateSystem;
047    import org.deegree.model.crs.UnknownCRSException;
048    import org.deegree.model.metadata.iso19115.Keywords;
049    import org.deegree.model.spatialschema.Envelope;
050    import org.deegree.ogcwebservices.getcapabilities.MetadataURL;
051    
052    /**
053     * Represents a feature type in the context of an OGC-WFS 1.1.0 capabilities document.
054     *
055     * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider </a>
056     * @author last edited by: $Author: mschneider $
057     *
058     * @version $Revision: 18195 $, $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
059     */
060    public class WFSFeatureType {
061    
062        private static final ILogger LOG = getLogger( WFSFeatureType.class );
063    
064        private QualifiedName name;
065    
066        private String title;
067    
068        private String abstract_;
069    
070        private Keywords[] keywords;
071    
072        // null -> noSRS in document
073        private URI defaultSrs;
074    
075        private URI[] otherSrs;
076    
077        private Operation[] operations;
078    
079        private FormatType[] outputFormats;
080    
081        private Envelope[] wgs84BoundingBoxes;
082    
083        private MetadataURL[] metadataUrls;
084    
085        /**
086         * Creates a new instance of <code>WFSFeatureType</code> from the given parameters.
087         *
088         * @param name
089         * @param title
090         * @param abstract_
091         * @param keywords
092         * @param defaultSrs
093         * @param otherSrs
094         * @param operations
095         * @param outputFormats
096         * @param wgs84BoundingBoxes
097         * @param metadataUrls
098         */
099        public WFSFeatureType( QualifiedName name, String title, String abstract_, Keywords[] keywords, URI defaultSrs,
100                               URI[] otherSrs, Operation[] operations, FormatType[] outputFormats,
101                               Envelope[] wgs84BoundingBoxes, MetadataURL[] metadataUrls ) {
102            this.name = name;
103            this.title = title;
104            if (title == null || title.length() == 0) {
105                this.title = name.getLocalName();
106            }
107            this.abstract_ = abstract_;
108            this.keywords = keywords;
109            this.defaultSrs = defaultSrs;
110            this.otherSrs = otherSrs;
111            this.operations = operations;
112            this.outputFormats = outputFormats;
113            this.wgs84BoundingBoxes = wgs84BoundingBoxes;
114            this.metadataUrls = metadataUrls;
115        }
116    
117        /**
118         * @return Returns the abstract.
119         */
120        public String getAbstract() {
121            return abstract_;
122        }
123    
124        /**
125         * @param abstract_
126         *            The abstract to set.
127         */
128        public void setAbstract( String abstract_ ) {
129            this.abstract_ = abstract_;
130        }
131    
132        /**
133         * @return Returns the name.
134         */
135        public QualifiedName getName() {
136            return name;
137        }
138    
139        /**
140         * @param name
141         *            The name to set.
142         */
143        public void setName( QualifiedName name ) {
144            this.name = name;
145        }
146    
147        /**
148         * @return Returns the title.
149         */
150        public String getTitle() {
151            return title;
152        }
153    
154        /**
155         * @param title
156         *            The title to set.
157         */
158        public void setTitle( String title ) {
159            this.title = title;
160        }
161    
162        /**
163         * @return Returns the keywords.
164         */
165        public Keywords[] getKeywords() {
166            return keywords;
167        }
168    
169        /**
170         * @param keywords
171         *            The keywords to set.
172         */
173        public void setKeywords( Keywords[] keywords ) {
174            this.keywords = keywords;
175        }
176    
177        /**
178         * @return Returns the defaultSrs.
179         */
180        public URI getDefaultSRS() {
181            return defaultSrs;
182        }
183    
184        /**
185         * @param defaultSrs
186         *            The defaultSrs to set.
187         */
188        public void setDefaultSrs( URI defaultSrs ) {
189            this.defaultSrs = defaultSrs;
190        }
191    
192        /**
193         * @return Returns the otherSrs.
194         */
195        public URI[] getOtherSrs() {
196            return otherSrs;
197        }
198    
199        /**
200         * @param otherSrs
201         *            The otherSrs to set.
202         */
203        public void setOtherSrs( URI[] otherSrs ) {
204            this.otherSrs = otherSrs;
205        }
206    
207        /**
208         * @return Returns the operations.
209         */
210        public Operation[] getOperations() {
211            return operations;
212        }
213    
214        /**
215         * @param operations
216         *            The operations to set.
217         */
218        public void setOperations( Operation[] operations ) {
219            this.operations = operations;
220        }
221    
222        /**
223         * @return Returns the outputFormats.
224         */
225        public FormatType[] getOutputFormats() {
226            return outputFormats;
227        }
228    
229        /**
230         * Returns the outputFormat with the given name.
231         *
232         * @param name
233         *            name of requested format
234         * @return the outputFormat with the given name if it exists, null otherwise
235         */
236        public FormatType getOutputFormat( String name ) {
237            FormatType formatType = null;
238            for ( FormatType outputFormat : this.outputFormats ) {
239                if ( outputFormat.getValue().equals( name ) ) {
240                    formatType = outputFormat;
241                }
242            }
243            return formatType;
244        }
245    
246        /**
247         * @param outputFormats
248         *            The outputFormats to set.
249         */
250        public void setOutputFormats( FormatType[] outputFormats ) {
251            this.outputFormats = outputFormats;
252        }
253    
254        /**
255         * @return Returns the wgs84BoundingBoxes.
256         */
257        public Envelope[] getWgs84BoundingBoxes() {
258            return wgs84BoundingBoxes;
259        }
260    
261        /**
262         * @param wgs84BoundingBoxes
263         *            The wgs84BoundingBoxes to set.
264         */
265        public void setWgs84BoundingBoxes( Envelope[] wgs84BoundingBoxes ) {
266            this.wgs84BoundingBoxes = wgs84BoundingBoxes;
267        }
268    
269        /**
270         * @return Returns the metadataUrls.
271         */
272        public MetadataURL[] getMetadataUrls() {
273            return metadataUrls;
274        }
275    
276        /**
277         * @param metadataUrls
278         *            The metadataUrls to set.
279         */
280        public void setMetadataUrls( MetadataURL[] metadataUrls ) {
281            this.metadataUrls = metadataUrls;
282        }
283    
284        /**
285         * Returns whether the feature type definition is virtual, i.e. all of it's output formats are processed using an
286         * (input) XSLT-script.
287         *
288         * @return true, if all formats are processed using an XSL input script
289         */
290        public boolean isVirtual() {
291    
292            boolean isVirtual = true;
293            FormatType[] outputFormats = getOutputFormats();
294    
295            for ( int i = 0; i < outputFormats.length; i++ ) {
296                if ( !outputFormats[i].isVirtual() ) {
297                    isVirtual = false;
298                    break;
299                }
300            }
301            return isVirtual;
302        }
303    
304        /**
305         * Returns whether the feature type supports the given spatial reference system.
306         *
307         * @param srsName
308         *            name of the srs, usually <code>EPSG:xyz</code>
309         * @return true, if srs is supported, false otherwise
310         */
311        public boolean supportsSrs( String srsName ) {
312            try {
313                CoordinateSystem other = create( srsName );
314    
315                if ( this.defaultSrs != null ) {
316                    CoordinateSystem crs = create( defaultSrs.toString() );
317                    if ( other.equals( crs ) ) {
318                        return true;
319                    }
320                    if ( this.otherSrs != null ) {
321                        for ( URI srs : this.otherSrs ) {
322                            CoordinateSystem crs2 = create( srs.toString() );
323                            if ( crs2.equals( other ) ) {
324                                return true;
325                            }
326                        }
327                    }
328                }
329            } catch ( UnknownCRSException e ) {
330                LOG.logError( "Unknown error", e ); // they really should exist
331            }
332            return false;
333        }
334    }