001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wms/capabilities/Style.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2008 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/deegree/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstr. 19
030 53115 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Prof. Dr. Klaus Greve
035 Department of Geography
036 University of Bonn
037 Meckenheimer Allee 166
038 53115 Bonn
039 Germany
040 E-Mail: greve@giub.uni-bonn.de
041
042
043 ---------------------------------------------------------------------------*/
044 package org.deegree.ogcwebservices.wms.capabilities;
045
046 import java.net.URL;
047 import java.util.HashMap;
048 import java.util.Map;
049
050 import org.deegree.framework.xml.XMLParsingException;
051 import org.deegree.graphics.sld.AbstractStyle;
052 import org.deegree.graphics.sld.NamedLayer;
053 import org.deegree.graphics.sld.SLDFactory;
054 import org.deegree.graphics.sld.StyledLayerDescriptor;
055 import org.deegree.graphics.sld.UserLayer;
056 import org.deegree.graphics.sld.UserStyle;
057
058
059 /**
060 * Zero or more Styles may be advertised for a Layer or collection of layers
061 * using <Style> elements, each of which shall have <Name> and <Title> elements.
062 * The style's Name is used in the Map request STYLES parameter. The Title is a
063 * human-readable string. If only a single style is available, that style is
064 * known as the "default" style and need not be advertised by the server.<p>
065 * A Style may contain several other elements in the Capabilities XML DTD. In
066 * particular, <Abstract> provides a narrative description while <LegendURL>
067 * contains the location of an image of a map legend appropriate to the enclosing
068 * Style. A <Format> element in LegendURL indicates the MIME type of the logo
069 * image, and the attributes width and height state the size of the image in pixels.
070 * </p>
071 *
072 * @author <a href="mailto:k.lupp@web.de">Katharina Lupp</a>
073 * @author <a href="mailto:mschneider@lat-lon.de">Markus Schneider</a>
074 * @version $Revision: 9345 $
075 */
076 public class Style {
077 static Map<String, UserStyle> styles = null;
078
079 static {
080 styles = new HashMap<String, UserStyle>( 100 );
081 styles.put( "default", null );
082 }
083
084 private String abstract_ = null;
085 private String name = null;
086 private String title = null;
087 private StyleSheetURL styleSheetURL = null;
088 private StyleURL styleURL = null;
089 private URL styleResource = null;
090 private LegendURL[] legendURLList = null;
091
092 /**
093 * constructor initializing the class with the <Style>
094 * @param name
095 * @param title
096 * @param abstract_
097 * @param legendURLs
098 * @param styleSheetURL
099 * @param styleURL
100 * @param styleResource
101 * @throws XMLParsingException
102 */
103 public Style( String name, String title, String abstract_, LegendURL[] legendURLs,
104 StyleSheetURL styleSheetURL, StyleURL styleURL, URL styleResource )
105 throws XMLParsingException {
106
107 this.name = name;
108 this.title = title;
109 this.abstract_ = abstract_;
110 this.styleResource = styleResource;
111 this.styleSheetURL = styleSheetURL;
112 this.legendURLList = legendURLs;
113 this.styleURL = styleURL;
114 // only cache styles that belong to the local WMS
115 // for Remote WMS, styleResource is always null
116 if (styleResource != null) {
117 synchronized ( styles ) {
118 if ( !styles.containsKey( name ) ) {
119 loadStyles( styleResource );
120 }
121 }
122 }
123 }
124
125 /**
126 * loads style definitions from the submitted URL and writes them to the
127 * styles HashMap. The styleResource must provide style definitions in a
128 * SLD conform XML document.<p>
129 * @param styleResource resource of the style defintions
130 * @exception XMLParsingException thrown if the resource doesn't hold the style
131 * definitions in a SLD conform document
132 */
133 private static synchronized void loadStyles( URL styleResource ) throws XMLParsingException {
134 try {
135 StyledLayerDescriptor sld = SLDFactory.createSLD( styleResource );
136 // get styles from named layers
137 NamedLayer[] nl = sld.getNamedLayers();
138
139 for ( int i = 0; i < nl.length; i++ ) {
140 AbstractStyle[] sldStyles = nl[i].getStyles();
141
142 for ( int j = 0; j < sldStyles.length; j++ ) {
143 if ( sldStyles[j] instanceof UserStyle ) {
144 UserStyle us = (UserStyle)sldStyles[j];
145 styles.put( us.getName(), us );
146 }
147 }
148 }
149
150 // get styles from user layers
151 UserLayer[] ul = sld.getUserLayers();
152
153 for ( int i = 0; i < ul.length; i++ ) {
154 AbstractStyle[] sldStyles = ul[i].getStyles();
155
156 for ( int j = 0; j < sldStyles.length; j++ ) {
157 if ( sldStyles[j] instanceof UserStyle ) {
158 UserStyle us = (UserStyle)sldStyles[j];
159 styles.put( us.getName(), us );
160 }
161 }
162 }
163
164 } catch ( Exception e ) {
165 e.printStackTrace();
166 throw new XMLParsingException( e.toString() );
167 }
168 }
169
170 /**
171 * @return the name - machine code - of the style
172 */
173 public String getName() {
174 return name;
175 }
176
177 /**
178 * @return the title (human readable) of the style
179 */
180 public String getTitle() {
181 return title;
182 }
183
184 /**
185 * @return a short narrative description of the style
186 */
187 public String getAbstract() {
188 return abstract_;
189 }
190
191 /**
192 * @return an array of LegendURL objects that defines the location, size
193 * and format of the legend graphics
194 */
195 public LegendURL[] getLegendURL() {
196 return legendURLList;
197 }
198
199 /**
200 * @return StyleSheeetURL that provides symbology information for each style of a layer.
201 */
202 public StyleSheetURL getStyleSheetURL() {
203 return styleSheetURL;
204 }
205
206 /**
207 * A Style element lists the name by which a style is requested and a
208 * human-readable title for pick lists, optionally (and ideally) provides a
209 * human-readable description, and optionally gives a style URL.
210 *
211 * @return the style URL data
212 */
213 public StyleURL getStyleURL() {
214 return styleURL;
215 }
216
217 /**
218 *
219 * @return the URL where to access the XML (SLD) document definingthe style
220 */
221 public URL getStyleResource() {
222 return styleResource;
223 }
224
225 /** returns the content of the style as SLD style object
226 *
227 * @return instance of org.deegree.graphics.sld.Style
228 *
229 */
230 public UserStyle getStyleContent() {
231 return styles.get( name );
232 }
233
234 @Override
235 public String toString() {
236 String ret = null;
237 ret = "name = " + name + "\n";
238 ret += ( "title = " + title + "\n" );
239 ret += ( "abstract_ = " + abstract_ + "\n" );
240 ret += ( "styleSheetURL = " + styleSheetURL + "\n" );
241 ret += ( "styleURL = " + styleURL + "\n" );
242 ret += ( "legendURLList = " + legendURLList + "\n" );
243 return ret;
244 }
245 }