001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/graphics/sld/UserStyle.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 static org.deegree.framework.xml.XMLTools.escape;
039
040 import java.util.ArrayList;
041 import java.util.List;
042
043 import org.deegree.framework.xml.Marshallable;
044
045 /**
046 * A user-defined allows map styling to be defined externally from a system and to be passed around
047 * in an interoperable format.
048 * <p>
049 * </p>
050 * A UserStyle is at the same semantic level as a NamedStyle used in the context of a WMS. In a
051 * sense, a named style can be thought of as a reference to a hidden UserStyle that is stored inside
052 * of a map server.
053 *
054 *
055 * @author <a href="mailto:k.lupp@web.de">Katharina Lupp</a>
056 * @author last edited by: $Author: apoth $
057 * @version $Revision: 21626 $ $Date: 2009-12-22 16:44:23 +0100 (Di, 22 Dez 2009) $
058 */
059 public class UserStyle extends AbstractStyle implements Marshallable {
060 private List<FeatureTypeStyle> featureTypeStyles = null;
061
062 private String abstract_ = null;
063
064 private String title = null;
065
066 private boolean default_ = false;
067
068 /**
069 * constructor initializing the class with the <UserStyle>
070 * @param name
071 * @param title
072 * @param abstract_
073 * @param default_
074 * @param featureTypeStyles
075 */
076 UserStyle( String name, String title, String abstract_, boolean default_, FeatureTypeStyle[] featureTypeStyles ) {
077 super( name );
078
079 this.featureTypeStyles = new ArrayList<FeatureTypeStyle>();
080
081 setTitle( title );
082 setAbstract( abstract_ );
083 setDefault( default_ );
084 setFeatureTypeStyles( featureTypeStyles );
085 }
086
087 /**
088 * The Title is a human-readable short description for the style that might be displayed in a
089 * GUI pick list.
090 *
091 * @return the title of the User-AbstractStyle
092 *
093 */
094 public String getTitle() {
095 return title;
096 }
097
098 /**
099 * sets the <Title>
100 *
101 * @param title
102 * the title of the User-AbstractStyle
103 *
104 */
105 public void setTitle( String title ) {
106 this.title = title;
107 }
108
109 /**
110 * the Abstract is a more exact description that may be a few paragraphs long.
111 *
112 * @return the abstract of the User-AbstractStyle
113 */
114 public String getAbstract() {
115 return abstract_;
116 }
117
118 /**
119 * sets the <Abstract>
120 *
121 * @param abstract_
122 * the abstract of the User-AbstractStyle
123 */
124 public void setAbstract( String abstract_ ) {
125 this.abstract_ = abstract_;
126 }
127
128 /**
129 * The IsDefault element identifies whether a style is the default style of a layer, for use in
130 * SLD library mode when rendering or for storing inside of a map server. The default value is
131 * <tt>false</tt>.
132 *
133 * @return true if the style ist the default style
134 */
135 public boolean isDefault() {
136 return default_;
137 }
138
139 /**
140 * sets the <Default>
141 *
142 * @param default_
143 */
144 public void setDefault( boolean default_ ) {
145 this.default_ = default_;
146 }
147
148 /**
149 * A UserStyle can contain one or more FeatureTypeStyles which allow the rendering of features
150 * of specific types.
151 * <p>
152 * </p>
153 * The FeatureTypeStyle defines the styling that is to be applied to a single feature type of a
154 * layer.
155 * <p>
156 * </p>
157 * The FeatureTypeStyle element identifies that explicit separation in SLD between the handling
158 * of layers and the handling of features of specific feature types. The layer concept is unique
159 * to WMS and SLD, but features are used more generally, such as in WFS and GML, so this
160 * explicit separation is important.
161 *
162 * @return the FeatureTypeStyles of a User-AbstractStyle
163 *
164 */
165 public FeatureTypeStyle[] getFeatureTypeStyles() {
166
167 return featureTypeStyles.toArray( new FeatureTypeStyle[featureTypeStyles.size()] );
168 }
169
170 /**
171 * sets the <FeatureTypeStyle>
172 *
173 * @param featureTypeStyles
174 * the FeatureTypeStyles of a User-AbstractStyle
175 */
176 public void setFeatureTypeStyles( FeatureTypeStyle[] featureTypeStyles ) {
177 this.featureTypeStyles.clear();
178
179 if ( featureTypeStyles != null ) {
180 for ( int i = 0; i < featureTypeStyles.length; i++ ) {
181 addFeatureTypeStyle( featureTypeStyles[i] );
182 }
183 }
184 }
185
186 /**
187 * Adds a <FeatureTypeStyle>
188 *
189 * @param featureTypeStyle
190 * a FeatureTypeStyle to add
191 */
192 public void addFeatureTypeStyle( FeatureTypeStyle featureTypeStyle ) {
193 featureTypeStyles.add( featureTypeStyle );
194 }
195
196 /**
197 * Removes a <FeatureTypeStyle>
198 *
199 * @param featureTypeStyle
200 */
201 public void removeFeatureTypeStyle( FeatureTypeStyle featureTypeStyle ) {
202 if ( featureTypeStyles.indexOf( featureTypeStyle ) != -1 ) {
203 featureTypeStyles.remove( featureTypeStyles.indexOf( featureTypeStyle ) );
204 }
205 }
206
207 /**
208 * exports the content of the UserStyle as XML formated String
209 *
210 * @return xml representation of the UserStyle
211 */
212 public String exportAsXML() {
213
214 StringBuffer sb = new StringBuffer( 100 );
215 sb.append( "<UserStyle " );
216 sb.append( "xmlns='http://www.opengis.net/sld' " );
217 sb.append( "xmlns:gml='http://www.opengis.net/gml' " );
218 sb.append( "xmlns:ogc='http://www.opengis.net/ogc' " );
219 sb.append( "xmlns:xlink='http://www.w3.org/1999/xlink' >" );
220 if ( name != null && !name.equals( "" ) ) {
221 sb.append( "<Name>" ).append( escape( name ) ).append( "</Name>" );
222 }
223 if ( title != null && !title.equals( "" ) ) {
224 sb.append( "<Title>" ).append( escape( title ) ).append( "</Title>" );
225 }
226 if ( abstract_ != null && !abstract_.equals( "" ) ) {
227 sb.append( "<Abstract>" ).append( escape( abstract_ ) ).append( "</Abstract>" );
228 }
229 if ( default_ ) {
230 sb.append( "<IsDefault>" ).append( 1 ).append( "</IsDefault>" );
231 }
232 for ( int i = 0; i < featureTypeStyles.size(); i++ ) {
233 sb.append( ( (Marshallable) featureTypeStyles.get( i ) ).exportAsXML() );
234 }
235 sb.append( "</UserStyle>" );
236
237 return sb.toString();
238 }
239
240 }