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