001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/graphics/sld/StyledLayerDescriptor.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.graphics.sld;
037    
038    import java.util.ArrayList;
039    import java.util.List;
040    
041    import org.deegree.framework.xml.Marshallable;
042    
043    /**
044     * StyledLayerDescriptor: This is a sequence of styled layers, represented at the first level by
045     * Layer and UserLayer elements. A "version" attribute has been added to allow the formatting of
046     * static-file
047     *
048     * @author <a href="mailto:k.lupp@web.de">Katharina Lupp</a>
049     * @author last edited by: $Author: mschneider $
050     * @version $Revision: 18195 $ $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
051     */
052    public class StyledLayerDescriptor implements Marshallable {
053        private List<AbstractLayer> layers = null;
054    
055        private String version = null;
056    
057        private String abstract_ = null;
058    
059        private String name = null;
060    
061        private String title = null;
062    
063        /**
064         * @param name
065         * @param title
066         * @param version
067         * @param abstract_
068         * @param layers
069         */
070        StyledLayerDescriptor( String name, String title, String version, String abstract_, AbstractLayer[] layers ) {
071            this.layers = new ArrayList<AbstractLayer>( layers.length );
072            setLayers( layers );
073            setVersion( version );
074            setAbstract( abstract_ );
075            setName( name );
076            setTitle( title );
077        }
078    
079        /**
080         * constructor initializing the class with the <StyledLayerDescriptor>
081         * @param layers
082         * @param version
083         */
084        public StyledLayerDescriptor( AbstractLayer[] layers, String version ) {
085            this.layers = new ArrayList<AbstractLayer>( layers.length );
086            setLayers( layers );
087            setVersion( version );
088        }
089    
090        /**
091         * @return the Layers as Array
092         */
093        public AbstractLayer[] getLayers() {
094            return layers.toArray( new AbstractLayer[layers.size()] );
095        }
096    
097        /**
098         * Sets Layers
099         *
100         * @param layers
101         *            the Layers as Array
102         */
103        public void setLayers( AbstractLayer[] layers ) {
104            this.layers.clear();
105    
106            if ( layers != null ) {
107                for ( int i = 0; i < layers.length; i++ ) {
108                    this.layers.add( layers[i] );
109                }
110            }
111        }
112    
113        /**
114         * adds the <Layer>
115         *
116         * @param layer
117         *            a Layer to add
118         */
119        public void addLayer( AbstractLayer layer ) {
120            layers.add( layer );
121        }
122    
123        /**
124         * removes the <Layer>
125         *
126         * @param layer
127         *            a Layer to remove
128         */
129        public void removeLayer( AbstractLayer layer ) {
130            if ( layers.indexOf( layer ) != -1 ) {
131                layers.remove( layers.indexOf( layer ) );
132            }
133        }
134    
135        /**
136         * A UserLayer can contain one or more UserStyles. A UserLayer may direct the WMS to a specified
137         * WFS source of feature data. Multiple feature types can be included in a UserLayer, since this
138         * is semantically equivalent to a Layer. All feature types of a UserLayer come from the same
139         * WFS. The WFS can be named explicitly with the "wfs" attribute or it can be implied by
140         * context.
141         *
142         * @return the UserLayers as Array
143         */
144        public UserLayer[] getUserLayers() {
145            List<UserLayer> list = new ArrayList<UserLayer>( layers.size() );
146            for ( int i = 0; i < layers.size(); i++ ) {
147                if ( layers.get( i ) instanceof UserLayer ) {
148                    list.add( (UserLayer) layers.get( i ) );
149                }
150            }
151            return list.toArray( new UserLayer[list.size()] );
152        }
153    
154        /**
155         * A NamedLayer uses the "name" attribute to identify a layer known to the WMS and can contain
156         * zero or more styles, either NamedStyles or UserStyles. In the absence of any styles the
157         * default style for the layer is used.
158         *
159         * @return the NamedLayers as Array
160         */
161        public NamedLayer[] getNamedLayers() {
162            List<NamedLayer> list = new ArrayList<NamedLayer>( layers.size() );
163            for ( int i = 0; i < layers.size(); i++ ) {
164                if ( layers.get( i ) instanceof NamedLayer ) {
165                    list.add( (NamedLayer) layers.get( i ) );
166                }
167            }
168            return list.toArray( new NamedLayer[list.size()] );
169        }
170    
171        /**
172         * The version attribute gives the SLD version of an SLD document, to facilitate backward
173         * compatibility with static documents stored in various different versions of the SLD spec. The
174         * string has the format x.y.z, the same as in other OpenGIS Web Server specs. For example, an
175         * SLD document stored according to this spec would have the version string 0.7.2.
176         *
177         * @return the version of the SLD as String
178         *
179         */
180        public String getVersion() {
181            return version;
182        }
183    
184        /**
185         * sets the <Version>
186         *
187         * @param version
188         *            the version of the SLD
189         *
190         */
191        public void setVersion( String version ) {
192            this.version = version;
193        }
194    
195        /**
196         * @return Returns the abstract_.
197         */
198        public String getAbstract() {
199            return abstract_;
200        }
201    
202        /**
203         * @param abstract_
204         *            The abstract_ to set.
205         */
206        public void setAbstract( String abstract_ ) {
207            this.abstract_ = abstract_;
208        }
209    
210        /**
211         * @return Returns the name.
212         *
213         */
214        public String getName() {
215            return name;
216        }
217    
218        /**
219         * @param name
220         *            The name to set.
221         *
222         */
223        public void setName( String name ) {
224            this.name = name;
225        }
226    
227        /**
228         * @return Returns the title.
229         *
230         */
231        public String getTitle() {
232            return title;
233        }
234    
235        /**
236         * @param title
237         *            The title to set.
238         *
239         */
240        public void setTitle( String title ) {
241            this.title = title;
242        }
243    
244        /**
245         * exports the content of the Font as XML formated String
246         *
247         * @return xml representation of the Font
248         */
249        public String exportAsXML() {
250    
251            StringBuffer sb = new StringBuffer( 50000 );
252            sb.append( "<?xml version='1.0' encoding='UTF-8'?>" );
253            sb.append( "<StyledLayerDescriptor version='" + version + "' " );
254            sb.append( "xmlns='http://www.opengis.net/sld' " );
255            sb.append( "xmlns:gml='http://www.opengis.net/gml' " );
256            sb.append( "xmlns:ogc='http://www.opengis.net/ogc' " );
257            sb.append( "xmlns:xlink='http://www.w3.org/1999/xlink' " );
258            sb.append( "xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>" );
259    
260            for ( int i = 0; i < layers.size(); i++ ) {
261                sb.append( ( (Marshallable) layers.get( i ) ).exportAsXML() );
262            }
263    
264            sb.append( "</StyledLayerDescriptor>" );
265    
266            return sb.toString();
267        }
268    
269    }