001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/enterprise/servlet/WPVSHandler.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 037 package org.deegree.enterprise.servlet; 038 039 import java.awt.Color; 040 import java.awt.Dimension; 041 import java.awt.Graphics; 042 import java.awt.Image; 043 import java.awt.image.BufferedImage; 044 import java.io.IOException; 045 import java.io.OutputStream; 046 import java.io.PrintWriter; 047 048 import javax.servlet.http.HttpServletResponse; 049 050 import org.deegree.enterprise.ServiceException; 051 import org.deegree.framework.log.ILogger; 052 import org.deegree.framework.log.LoggerFactory; 053 import org.deegree.framework.util.CharsetUtils; 054 import org.deegree.framework.util.ImageUtils; 055 import org.deegree.framework.util.MimeTypeMapper; 056 import org.deegree.framework.util.StringTools; 057 import org.deegree.framework.xml.DOMPrinter; 058 import org.deegree.ogcwebservices.OGCWebService; 059 import org.deegree.ogcwebservices.OGCWebServiceException; 060 import org.deegree.ogcwebservices.OGCWebServiceRequest; 061 import org.deegree.ogcwebservices.wpvs.WPVService; 062 import org.deegree.ogcwebservices.wpvs.WPVServiceFactory; 063 import org.deegree.ogcwebservices.wpvs.XMLFactory; 064 import org.deegree.ogcwebservices.wpvs.capabilities.WPVSCapabilities; 065 import org.deegree.ogcwebservices.wpvs.capabilities.WPVSCapabilitiesDocument; 066 import org.deegree.ogcwebservices.wpvs.configuration.WPVSConfiguration; 067 import org.deegree.ogcwebservices.wpvs.operation.Get3DFeatureInfoResponse; 068 import org.deegree.ogcwebservices.wpvs.operation.GetView; 069 import org.deegree.ogcwebservices.wpvs.operation.GetViewResponse; 070 import org.w3c.dom.Node; 071 072 /** 073 * Handler for the Web Perspective View Service (WPVS). 074 * 075 * @author <a href="mailto:taddei@lat-lon.de">Ugo Taddei</a> 076 * @author last edited by: $Author: aschmitz $ 077 * 078 * @version 2.0, $Revision: 23585 $, $Date: 2010-04-13 14:07:18 +0200 (Di, 13 Apr 2010) $ 079 * 080 * @since 2.0 081 */ 082 public class WPVSHandler extends AbstractOWServiceHandler { 083 084 private static ILogger LOG = LoggerFactory.getLogger( WPVSHandler.class ); 085 086 /** 087 * Performs the passed OGCWebServiceRequest by accessing service from the pool and passing the request to it 088 * 089 * @param request 090 * the incoming web service request 091 * @param httpResponse 092 * the outgoing web serivce response 093 * @throws ServiceException 094 * @throws OGCWebServiceException 095 */ 096 public void perform( OGCWebServiceRequest request, HttpServletResponse httpResponse ) 097 throws ServiceException, OGCWebServiceException { 098 099 LOG.logDebug( StringTools.concat( 200, "Performing request: ", request.toString() ) ); 100 101 OGCWebService service = WPVServiceFactory.createInstance(); 102 103 try { 104 Object response = service.doService( request ); 105 if ( response instanceof WPVSCapabilities ) { 106 sendGetCapabilitiesResponse( httpResponse, (WPVSCapabilities) response ); 107 } else if ( response instanceof GetViewResponse ) { 108 sendGetViewResponse( httpResponse, (GetViewResponse) response ); 109 } else if ( response instanceof Get3DFeatureInfoResponse ) { 110 sendGet3DFeatureInfoResponse( httpResponse, (Get3DFeatureInfoResponse) response ); 111 } else { 112 String s = ( response == null ? "null response object" : response.getClass().getName() ); 113 // this is not really nice...because excepts get cought later on below 114 throw new OGCWebServiceException( getClass().getName(), 115 StringTools.concat( 200, "Unknown response class: '", s, "'." ) ); 116 } 117 } catch ( OGCWebServiceException e ) { 118 119 LOG.logError( "Error performing WPVFS request.", e ); 120 if ( request instanceof GetView 121 && ( "INIMAGE".equalsIgnoreCase( ( (GetView) request ).getExceptionFormat() ) ) ) { 122 sendExceptionImage( httpResponse, e, (GetView) request ); 123 124 } else { 125 sendException( httpResponse, e ); 126 } 127 } 128 129 } 130 131 // TODO common to WMS 132 private void sendExceptionImage( HttpServletResponse httpResponse, OGCWebServiceException e, GetView request ) { 133 134 Dimension d = request.getImageDimension(); 135 136 BufferedImage bi = new BufferedImage( d.width, d.height, BufferedImage.TYPE_INT_RGB ); 137 Graphics g = bi.getGraphics(); 138 g.setColor( Color.WHITE ); 139 g.fillRect( 0, 0, d.width, d.height ); 140 g.setColor( Color.BLUE ); 141 142 String s = e.getLocator(); 143 String location = s != null ? s : "Unknown"; 144 s = e.getMessage(); 145 String message = s != null ? s : "Unknown reason!"; 146 147 g.drawString( location, 5, 20 ); 148 g.drawString( message, 15, 50 ); 149 String mime = MimeTypeMapper.toMimeType( request.getOutputFormat() ); 150 g.dispose(); 151 writeImage( bi, mime, httpResponse ); 152 } 153 154 // TODO common to WMS 155 private void writeImage( Object output, String mime, HttpServletResponse resp ) { 156 try { 157 OutputStream os = null; 158 resp.setContentType( mime ); 159 160 if ( mime.equalsIgnoreCase( "image/gif" ) ) { 161 os = resp.getOutputStream(); 162 ImageUtils.saveImage( (BufferedImage) output, os, "gif", 1 ); 163 } else if ( mime.equalsIgnoreCase( "image/jpg" ) || mime.equalsIgnoreCase( "image/jpeg" ) ) { 164 os = resp.getOutputStream(); 165 ImageUtils.saveImage( (BufferedImage) output, os, "jpeg", 1 ); 166 } else if ( mime.equalsIgnoreCase( "image/png" ) ) { 167 os = resp.getOutputStream(); 168 ImageUtils.saveImage( (BufferedImage) output, os, "png", 1 ); 169 } else if ( mime.equalsIgnoreCase( "image/tif" ) || mime.equalsIgnoreCase( "image/tiff" ) ) { 170 os = resp.getOutputStream(); 171 ImageUtils.saveImage( (BufferedImage) output, os, "tif", 1 ); 172 } else if ( mime.equalsIgnoreCase( "image/bmp" ) ) { 173 os = resp.getOutputStream(); 174 ImageUtils.saveImage( (BufferedImage) output, os, "bmp", 1 ); 175 } else if ( mime.equalsIgnoreCase( "image/svg+xml" ) ) { 176 os = resp.getOutputStream(); 177 PrintWriter pw = new PrintWriter( os ); 178 DOMPrinter.printNode( pw, (Node) output ); 179 pw.close(); 180 } else { 181 resp.setContentType( "text/xml; charset=" + CharsetUtils.getSystemCharset() ); 182 os = resp.getOutputStream(); 183 OGCWebServiceException exce = new OGCWebServiceException( "WMS:writeImage", 184 "unsupported image format: " + mime ); 185 sendExceptionReport( resp, exce ); 186 } 187 188 os.close(); 189 } catch ( Exception e ) { 190 LOG.logError( e.getMessage(), e ); 191 } 192 } 193 194 /** 195 * Sends the result of a someWPVService.doService( request ) bacn to the client 196 * 197 * @param httpResponse 198 * the response object used to pipe the result 199 * @param getViewResponse 200 * the actua result to be sent 201 */ 202 private void sendGetViewResponse( HttpServletResponse httpResponse, GetViewResponse getViewResponse ) { 203 204 String mime = MimeTypeMapper.toMimeType( getViewResponse.getOutputFormat() ); 205 httpResponse.setContentType( mime ); 206 207 // GetView response is, for the time being, always an image 208 writeImage( getViewResponse.getOutput(), httpResponse, mime ); 209 210 System.gc(); 211 } 212 213 /** 214 * Sends the response to a GetCapabilities request to the client. 215 * 216 * @param httpResponse 217 * @param capabilities 218 * @throws OGCWebServiceException 219 * if an exception occurs which can be propagated to the client 220 */ 221 private void sendGetCapabilitiesResponse( HttpServletResponse httpResponse, WPVSCapabilities capabilities ) 222 throws OGCWebServiceException { 223 try { 224 httpResponse.setContentType( "text/xml" ); 225 WPVSCapabilitiesDocument document = XMLFactory.export( capabilities ); 226 document.write( httpResponse.getOutputStream() ); 227 } catch ( IOException e ) { 228 LOG.logError( "Error sending GetCapabilities response.", e ); 229 230 throw new OGCWebServiceException( getClass().getName(), 231 "Error exporting capabilities for GetCapabilities response." ); 232 } 233 } 234 235 /** 236 * Sends the response to a Get3DFeatureInfo request to the client. 237 * 238 * @param httpResponse 239 * @param response 240 * @throws OGCWebServiceException 241 * if an exception occurs which can be propagated to the client 242 */ 243 private void sendGet3DFeatureInfoResponse( HttpServletResponse httpResponse, Get3DFeatureInfoResponse response ) 244 throws OGCWebServiceException { 245 try { 246 httpResponse.setContentType( "text/xml" ); 247 248 PrintWriter pw = httpResponse.getWriter(); 249 String s = response.get3DFeatureInfo(); 250 pw.print( s ); 251 } catch ( IOException e ) { 252 LOG.logError( "Error sendingGet3DFeatureInfo response.", e ); 253 254 throw new OGCWebServiceException( getClass().getName(), 255 "Error exporting Info for Get3DFeatureInfo response." ); 256 } 257 } 258 259 /** 260 * Writes an output of a GetView request to the <code>httpResponse</code> using the <code>mime</code> type. 261 * 262 * @param output 263 * the image to be sent back 264 * @param httpResponse 265 * the response to pipe the image 266 * @param mime 267 * the type of image 268 */ 269 private void writeImage( Image output, HttpServletResponse httpResponse, String mime ) { 270 try { 271 272 OutputStream os = httpResponse.getOutputStream(); 273 httpResponse.setContentType( mime ); 274 275 if ( mime.equalsIgnoreCase( "image/jpg" ) || mime.equalsIgnoreCase( "image/jpeg" ) ) { 276 277 OGCWebService service = WPVServiceFactory.createInstance(); 278 WPVSConfiguration config = (WPVSConfiguration) ( (WPVService) service ).getCapabilities(); 279 float quality = config.getDeegreeParams().getViewQuality(); 280 ImageUtils.saveImage( (BufferedImage) output, os, "jpeg", quality ); 281 } else if ( mime.equalsIgnoreCase( "image/png" ) ) { 282 ImageUtils.saveImage( (BufferedImage) output, os, "png", 1 ); 283 } else if ( mime.equalsIgnoreCase( "image/tif" ) || mime.equalsIgnoreCase( "image/tiff" ) ) { 284 ImageUtils.saveImage( (BufferedImage) output, os, "tiff", 1 ); 285 } else if ( mime.equalsIgnoreCase( "image/bmp" ) ) { 286 ImageUtils.saveImage( (BufferedImage) output, os, "bmp", 1 ); 287 } else { 288 httpResponse.setContentType( "text/xml" ); 289 os = httpResponse.getOutputStream(); 290 OGCWebServiceException exce = new OGCWebServiceException( "WMS:writeImage", 291 "unsupported image format: " + mime ); 292 sendExceptionReport( httpResponse, exce ); 293 } 294 295 os.close(); 296 } catch ( Exception e ) { 297 LOG.logError( "-", e ); 298 } 299 } 300 }