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