001 //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wms/operation/GetLegendGraphic.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.operation;
037
038 import java.net.URL;
039 import java.net.URLEncoder;
040 import java.util.Map;
041
042 import org.deegree.framework.util.CharsetUtils;
043 import org.deegree.framework.util.MimeTypeMapper;
044 import org.deegree.framework.util.NetWorker;
045 import org.deegree.ogcwebservices.InconsistentRequestException;
046 import org.deegree.ogcwebservices.OGCWebServiceException;
047 import org.deegree.ogcwebservices.wms.InvalidFormatException;
048
049 /**
050 *
051 * @author Katharina Lupp <a href="mailto:k.lupp@web.de">Katharina Lupp</a>
052 * @version $Revision: 18195 $ $Date: 2009-06-18 17:55:39 +0200 (Do, 18. Jun 2009) $
053 */
054 public class GetLegendGraphic extends WMSRequestBase {
055
056 private static final long serialVersionUID = -3632596487434212256L;
057
058 private String rule = null;
059
060 private String sLD_Body = null;
061
062 private String featureType = null;
063
064 private String format = null;
065
066 private String layer = null;
067
068 private URL sLD = null;
069
070 private String style = null;
071
072 private double scale = 0;
073
074 private int width = 0;
075
076 private int height = 0;
077
078 private String exceptions = null;
079
080 /**
081 * @param model
082 * key-value-pair representation of the request
083 * @return an instance
084 * @throws InconsistentRequestException
085 */
086 public static GetLegendGraphic create( Map<String, String> model )
087 throws InconsistentRequestException {
088 // version
089 String version = model.remove( "VERSION" );
090
091 if ( version == null ) {
092 throw new InconsistentRequestException( "Parameter VERSION must be set." );
093 }
094 if ( version.compareTo( "1.1.1" ) < 0 ) {
095 throw new InconsistentRequestException( "Version must be >= 1.1.1." );
096 }
097
098 // format
099 String format = model.remove( "FORMAT" );
100 if ( format == null ) {
101 throw new InconsistentRequestException( "Parameter FORMAT must be set." );
102 }
103 if ( !MimeTypeMapper.isKnownImageType( format ) ) {
104 throw new InvalidFormatException( format + " is not a valid image/result format" );
105 }
106
107 // layer
108 String layer = model.remove( "LAYER" );
109 if ( layer == null ) {
110 throw new InconsistentRequestException( "Parameter LAYER must be set." );
111 }
112
113 // style
114 String style = model.remove( "STYLE" );
115 if ( style == null || style.equals( "" ) || "DEFAULT".equalsIgnoreCase( style ) ) {
116 style = "default:" + layer;
117 }
118
119 // featureType
120 String featureType = model.remove( "FEATURETYPE" );
121
122 // rule
123 String rule = model.remove( "RULE" );
124
125 // scale
126 String tmp = model.remove( "SCALE" );
127 if ( tmp != null && rule != null ) {
128 throw new InconsistentRequestException(
129 "SCALE or RULE can be set in a request but not both" );
130 }
131 double scale = -1;
132 if ( tmp != null ) {
133 try {
134 scale = Double.parseDouble( tmp );
135 } catch ( Exception e ) {
136 throw new InconsistentRequestException( "Scale, if set, must be a valid number" );
137 }
138 }
139
140 // SLD
141 tmp = model.remove( "SLD" );
142 URL sld = null;
143 if ( tmp != null ) {
144 try {
145 sld = new URL( tmp );
146 } catch ( Exception e ) {
147 throw new InconsistentRequestException(
148 "If SLD parameter is set it must be a valid URL" );
149 }
150 }
151
152 // SLD_BODY
153 String sld_body = model.remove( "SLD_BODY" );
154 if ( sld_body != null && sld != null ) {
155 throw new InconsistentRequestException(
156 "SLD or SLD_BODY can be set in a request but not both" );
157 }
158
159 // width
160 tmp = model.remove( "WIDTH" );
161 if ( tmp == null ) {
162 tmp = "20";
163 }
164
165 int width = 0;
166 try {
167 width = Integer.parseInt( tmp );
168 } catch ( Exception e ) {
169 throw new InconsistentRequestException( "WIDTH must be a valid integer number" );
170 }
171
172 // height
173 tmp = model.remove( "HEIGHT" );
174 if ( tmp == null ) {
175 tmp = "20";
176 }
177
178 int height = 0;
179 try {
180 height = Integer.parseInt( tmp );
181 } catch ( Exception e ) {
182 throw new InconsistentRequestException( "HEIGHT must be a valid integer number" );
183 }
184
185 // exceptions
186 String exceptions = model.remove( "EXCEPTIONS" );
187 if ( exceptions == null ) {
188 exceptions = "application/vnd.ogc.se_xml";
189 }
190
191 String id = model.remove( "ID" );
192 Map<String, String> vendorSpecificParameter = model;
193
194 return create( id, version, layer, style, featureType, rule, scale, sld, sld_body, format,
195 width, height, exceptions, vendorSpecificParameter );
196 }
197
198 /**
199 * @param id
200 * unique id of the request
201 * @param version
202 * version of the target WMS
203 * @param layer
204 * name of the layer the style is assigned to
205 * @param style
206 * name of the style (optional; if not present -> 'default')
207 * @param featureType
208 * name of the feature type a legend element shall be created for --> SLD
209 * @param rule
210 * name of the rule a legend element shall be created for --> SLD
211 * @param scale
212 * scale for which a rule must be valid --> SLD
213 * @param sld
214 * refernce to a SLD document
215 * @param sld_body
216 * SLD document
217 * @param format
218 * image format of the returned legend element
219 * @param width
220 * @param height
221 * @param exceptions
222 * format of the excpetion if something went wrong
223 * @param vendorSpecificParameter
224 * @return instance of <tt>GetLegendGraphic</tt>
225 */
226 public static GetLegendGraphic create( String id, String version, String layer, String style,
227 String featureType, String rule, double scale, URL sld,
228 String sld_body, String format, int width, int height,
229 String exceptions,
230 Map<String, String> vendorSpecificParameter ) {
231 return new GetLegendGraphic( id, version, layer, style, featureType, rule, scale, sld,
232 sld_body, format, width, height, exceptions,
233 vendorSpecificParameter );
234 }
235
236 /**
237 * Creates a new GetLegendGraphic object.
238 *
239 * @param layer
240 * @param style
241 * @param featureType
242 * @param rule
243 * @param scale
244 * @param sLD
245 * @param sLD_Body
246 * @param format
247 * @param version
248 * @param id
249 * @param vendorSpecificParameter
250 */
251 private GetLegendGraphic( String id, String version, String layer, String style,
252 String featureType, String rule, double scale, URL sLD,
253 String sLD_Body, String format, int width, int height,
254 String exceptions, Map<String, String> vendorSpecificParameter ) {
255 super( version, id, vendorSpecificParameter );
256 setLayer( layer );
257 setStyle( style );
258 setFeatureType( featureType );
259 setRule( rule );
260 setScale( scale );
261 setSLD( sLD );
262 setSLD_Body( sLD_Body );
263 setFormat( format );
264 this.width = width;
265 this.height = height;
266 this.exceptions = exceptions;
267 }
268
269 /**
270 * @return the <Layer>. A Map Server MUST include at least one <Layer> element for each
271 * map layer offered. If desired, data layers MAY be repeated in different categories
272 * when relevant. A Layer element MAY state the Name by which a map of the layer is
273 * requested, MUST give a Title to be used in human-readable menus, and MAY include: a
274 * human-readable Abstract containing further description, available Spatial Reference
275 * Systems (SRS), bounding boxes in Lat/Lon and SRS-specific coordinates indicating the
276 * available geographic coverage, styles in which the layer is available, a URL for more
277 * information about the data, and a hint concerning appropriate map scales for
278 * displaying this layer. Use of the nesting hierarchy is optional.
279 */
280 public String getLayer() {
281 return layer;
282 }
283
284 /**
285 * sets the
286 *
287 * @param layer
288 * <Layer>
289 */
290 public void setLayer( String layer ) {
291 this.layer = layer;
292 }
293
294 /**
295 * @return the <Style>. Named style that can be used for rendering the layer.
296 */
297 public String getStyle() {
298 return style;
299 }
300
301 /**
302 * sets the
303 *
304 * @param style
305 * <Style>
306 */
307 public void setStyle( String style ) {
308 this.style = style;
309 }
310
311 /**
312 * @return the <FeatureType>
313 */
314 public String getFeatureType() {
315 return featureType;
316 }
317
318 /**
319 * sets the
320 *
321 * @param featureType
322 * <FeatureType>
323 */
324 public void setFeatureType( String featureType ) {
325 this.featureType = featureType;
326 }
327
328 /**
329 * @return the <Rule>
330 */
331 public String getRule() {
332 return rule;
333 }
334
335 /**
336 * sets the
337 *
338 * @param rule
339 * <Rule>
340 */
341 public void setRule( String rule ) {
342 this.rule = rule;
343 }
344
345 /**
346 * @return the <Scale>. Comma-seperated min and max scale values of a layer.
347 */
348 public double getScale() {
349 return scale;
350 }
351
352 /**
353 * Comma-seperated min and max scale values of a layer. sets the
354 *
355 * @param scale
356 * <Scale>.
357 */
358 public void setScale( double scale ) {
359 this.scale = scale;
360 }
361
362 /**
363 * @return a reference (URL) to a SLD document
364 */
365 public URL getSLD() {
366 return sLD;
367 }
368
369 /**
370 * sets a reference (URL) to a SLD document
371 *
372 * @param sLD
373 * the URL
374 */
375 public void setSLD( URL sLD ) {
376 this.sLD = sLD;
377 }
378
379 /**
380 * @return the body of a SLD document. If SLD_BODY parameter is set, the SLD parameter isn't set
381 * and vice versa
382 */
383 public String getSLD_Body() {
384 return sLD_Body;
385 }
386
387 /**
388 * sets the body of a SLD document. If SLD_BODY parameter is set, the SLD parameter isn't set
389 * and vice versa
390 *
391 * @param sLD_Body
392 * the body
393 */
394 public void setSLD_Body( String sLD_Body ) {
395 this.sLD_Body = sLD_Body;
396 }
397
398 /**
399 * @return the name of the image format the legend graphics shall have
400 */
401 public String getFormat() {
402 return format;
403 }
404
405 /**
406 * sets the name of the image format the legend graphics shall have
407 *
408 * @param format
409 * the format string
410 */
411 public void setFormat( String format ) {
412 this.format = format;
413 }
414
415 /**
416 * This gives a hint for the height of the returned graphic in pixels. Vector-graphics can use
417 * this value as a hint for the level of detail to include.
418 *
419 * @return the height
420 */
421 public int getHeight() {
422 return height;
423 }
424
425 /**
426 * @see GetLegendGraphic#getHeight()
427 * @param height
428 */
429 public void setHeight( int height ) {
430 this.height = height;
431 }
432
433 /**
434 * This gives a hint for the width of the returned graphic in pixels. Vector-graphics can use
435 * this value as a hint for the level of detail to include.
436 *
437 * @return the width
438 */
439 public int getWidth() {
440 return width;
441 }
442
443 /**
444 * @see GetLegendGraphic#getWidth()
445 * @param width
446 */
447 public void setWidth( int width ) {
448 this.width = width;
449 }
450
451 /**
452 * This gives the MIME type of the format in which to return exceptions. Allowed values are the
453 * same as for the EXCEPTIONS= parameter of the WMS GetMap request.
454 *
455 * @return the exception format
456 */
457 public String getExceptions() {
458 return exceptions;
459 }
460
461 /**
462 * @see GetLegendGraphic#getExceptions()
463 * @param exceptions
464 */
465 public void setExceptions( String exceptions ) {
466 this.exceptions = exceptions;
467 }
468
469 /**
470 * method for creating a OGC WMS 1.1.1 conform legend graphic request
471 */
472 @Override
473 public String getRequestParameter()
474 throws OGCWebServiceException {
475
476 StringBuffer url = new StringBuffer( "SERVICE=WMS&VERSION=" + getVersion() );
477 url.append( "&REQUEST=GetLegendGraphic");
478 url.append( "&LAYER=" ).append( getLayer() );
479
480 if ( getStyle() != null && getStyle().length() > 0 ) {
481 url.append( "&STYLE=" + getStyle() );
482 }
483
484 if ( getFeatureType() != null && getFeatureType().length() > 0 ) {
485 url.append( "&FEATURETYPE=" + getFeatureType() );
486 }
487
488 if ( getSLD() != null ) {
489 url.append( "&SLD=" + NetWorker.url2String( getSLD() ) );
490 } else if ( getSLD_Body() != null ) {
491 String tmp = null;
492 try {
493 tmp = URLEncoder.encode( getSLD_Body(), CharsetUtils.getSystemCharset() );
494 } catch ( Exception e ) {
495 throw new OGCWebServiceException( e.toString() );
496 }
497 url.append( "&SLD_BODY=" + tmp );
498 }
499
500 url.append( "&FORMAT=" + getFormat() );
501 url.append( "&WIDTH=" + getWidth() );
502 url.append( "&HEIGHT=" + getHeight() );
503
504 if ( ( getExceptions() != null ) && ( getExceptions().length() > 0 ) ) {
505 url.append( "&EXCEPTIONS=" + getExceptions() );
506 }
507
508 return url.toString();
509 }
510
511 }