001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/enterprise/servlet/OGCServletController.java $ 002 // $Id: OGCServletController.java 26622 2010-09-07 14:43:21Z aschmitz $ 003 /*---------------------------------------------------------------------------- 004 This file is part of deegree, http://deegree.org/ 005 Copyright (C) 2001-2009 by: 006 Department of Geography, University of Bonn 007 and 008 lat/lon GmbH 009 010 This library is free software; you can redistribute it and/or modify it under 011 the terms of the GNU Lesser General Public License as published by the Free 012 Software Foundation; either version 2.1 of the License, or (at your option) 013 any later version. 014 This library is distributed in the hope that it will be useful, but WITHOUT 015 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 016 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 017 details. 018 You should have received a copy of the GNU Lesser General Public License 019 along with this library; if not, write to the Free Software Foundation, Inc., 020 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 021 022 Contact information: 023 024 lat/lon GmbH 025 Aennchenstr. 19, 53177 Bonn 026 Germany 027 http://lat-lon.de/ 028 029 Department of Geography, University of Bonn 030 Prof. Dr. Klaus Greve 031 Postfach 1147, 53001 Bonn 032 Germany 033 http://www.geographie.uni-bonn.de/deegree/ 034 035 e-mail: info@deegree.org 036 ----------------------------------------------------------------------------*/ 037 038 package org.deegree.enterprise.servlet; 039 040 import static java.lang.Character.isDigit; 041 import static java.lang.System.getProperty; 042 import static java.lang.System.setProperty; 043 import static org.deegree.enterprise.servlet.ServiceLookup.getInstance; 044 import static org.deegree.framework.log.LoggerFactory.getLogger; 045 import static org.deegree.framework.util.StringTools.arrayToString; 046 047 import java.beans.Introspector; 048 import java.io.IOException; 049 import java.io.OutputStream; 050 import java.io.PrintWriter; 051 import java.lang.reflect.InvocationTargetException; 052 import java.lang.reflect.Method; 053 import java.net.InetAddress; 054 import java.net.URL; 055 import java.nio.charset.Charset; 056 import java.sql.Driver; 057 import java.sql.DriverManager; 058 import java.sql.SQLException; 059 import java.text.MessageFormat; 060 import java.util.Enumeration; 061 import java.util.HashMap; 062 import java.util.Iterator; 063 import java.util.Map; 064 065 import javax.imageio.spi.IIORegistry; 066 import javax.servlet.ServletContext; 067 import javax.servlet.ServletException; 068 import javax.servlet.http.HttpServletRequest; 069 import javax.servlet.http.HttpServletResponse; 070 import javax.xml.parsers.DocumentBuilderFactory; 071 import javax.xml.transform.TransformerFactory; 072 073 import org.apache.commons.logging.LogFactory; 074 import org.apache.log4j.LogManager; 075 import org.deegree.crs.configuration.CRSConfiguration; 076 import org.deegree.enterprise.AbstractOGCServlet; 077 import org.deegree.enterprise.ServiceException; 078 import org.deegree.framework.log.ILogger; 079 import org.deegree.framework.util.CharsetUtils; 080 import org.deegree.framework.util.KVP2Map; 081 import org.deegree.framework.util.StringTools; 082 import org.deegree.framework.util.WebappResourceResolver; 083 import org.deegree.framework.version.Version; 084 import org.deegree.framework.xml.XMLFragment; 085 import org.deegree.ogcwebservices.ExceptionReport; 086 import org.deegree.ogcwebservices.OGCRequestFactory; 087 import org.deegree.ogcwebservices.OGCWebServiceException; 088 import org.deegree.ogcwebservices.OGCWebServiceRequest; 089 import org.deegree.ogcwebservices.wmps.configuration.WMPSConfigurationDocument; 090 import org.deegree.ogcwebservices.wms.configuration.WMSConfigurationDocument; 091 import org.deegree.ogcwebservices.wms.configuration.WMSConfigurationDocument_1_3_0; 092 import org.deegree.owscommon.XMLFactory; 093 import org.xml.sax.SAXException; 094 095 /** 096 * An <code>OGCServletController</code> handles all incoming requests. The controller for all OGC service requests. 097 * Dispatcher to specific handler for WMS, WFS and other. 098 * 099 * @author <a href="mailto:tfr@users.sourceforge.net">Torsten Friebe </a> 100 * @author last edited by: $Author: aschmitz $ 101 * 102 * @version $Revision: 26622 $, $Date: 22.04.2008 16:23:34$ 103 * @see <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html">Front controller </a> 104 */ 105 public class OGCServletController extends AbstractOGCServlet { 106 107 /** 108 * address is the url of the client which requests. 109 */ 110 public static String address = null; 111 112 private static final long serialVersionUID = -4461759017823581221L; 113 114 private static ILogger LOG; 115 116 private static final String SERVICE = "services"; 117 118 private static final String HANDLER_CLASS = ".handler"; 119 120 private static final String HANDLER_CONF = ".config"; 121 122 private static final Map<Class<?>, String> SERVICE_FACTORIES_MAPPINGS = new HashMap<Class<?>, String>(); 123 124 private static final String ERR_MSG = "Can't set configuration for {0}"; 125 126 /** 127 * 128 * 129 * @param request 130 * @param response 131 * @TODO refactor and optimize code for initializing handler 132 */ 133 public void doService( HttpServletRequest request, HttpServletResponse response ) { 134 if ( response.isCommitted() ) { 135 LOG.logWarning( "The response object is already committed!" ); 136 } 137 138 long startTime = System.currentTimeMillis(); 139 address = request.getRequestURL().toString(); 140 141 String service = null; 142 try { 143 OGCWebServiceRequest ogcRequest = OGCRequestFactory.create( request ); 144 145 LOG.logInfo( StringTools.concat( 500, "Handling request '", ogcRequest.getId(), "' from '", 146 request.getRemoteAddr(), "' to service: '", ogcRequest.getServiceName(), 147 "'" ) ); 148 149 // get service from request 150 service = ogcRequest.getServiceName().toUpperCase(); 151 152 // get handler instance 153 ServiceDispatcher handler = ServiceLookup.getInstance().getHandler( service, request.getRemoteAddr() ); 154 // dispatch request to specific handler 155 handler.perform( ogcRequest, response ); 156 } catch ( OGCWebServiceException e ) { 157 LOG.logError( e.getMessage(), e ); 158 sendException( response, e, request, service ); 159 } catch ( ServiceException e ) { 160 if ( e.getNestedException() instanceof OGCWebServiceException ) { 161 sendException( response, (OGCWebServiceException) e.getNestedException(), request, service ); 162 } else { 163 sendException( response, new OGCWebServiceException( this.getClass().getName(), e.getMessage() ), 164 request, service ); 165 } 166 LOG.logError( e.getMessage(), e ); 167 } catch ( Exception e ) { 168 sendException( response, new OGCWebServiceException( this.getClass().getName(), e.getMessage() ), request, 169 service ); 170 LOG.logError( e.getMessage(), e ); 171 } 172 if ( LOG.isDebug() ) { 173 LOG.logDebug( "OGCServletController: request performed in " 174 + Long.toString( System.currentTimeMillis() - startTime ) + " milliseconds." ); 175 } 176 } 177 178 /** 179 * Sends the passed <code>OGCWebServiceException</code> to the calling client. 180 * 181 * @param response 182 * @param e 183 * @param request 184 * @param service 185 * the service name, if known 186 */ 187 private static void sendException( HttpServletResponse response, OGCWebServiceException e, 188 HttpServletRequest request, String service ) { 189 LOG.logInfo( "Sending OGCWebServiceException to client." ); 190 191 Map<?, ?> pmap = request.getParameterMap(); 192 Map<String, String> map = new HashMap<String, String>( pmap.size() ); 193 for ( Object o : pmap.keySet() ) { 194 String[] tmp = (String[]) pmap.get( o ); 195 for ( int i = 0; i < tmp.length; i++ ) { 196 tmp[i] = tmp[i].trim(); 197 } 198 map.put( ( (String) o ).toLowerCase(), arrayToString( tmp, ',' ) ); 199 } 200 201 boolean isWMS130 = false, isCSW = false, isWCTS = false, isWFS = false, isWFS100 = false; 202 203 if ( service == null ) { 204 service = map.get( "service" ); 205 } 206 207 String version = map.get( "version" ); 208 209 if ( service != null ) { 210 if ( "wms".equalsIgnoreCase( service ) ) { 211 isWMS130 = version != null && version.equals( "1.3.0" ); 212 } 213 if ( "wfs".equalsIgnoreCase( service ) ) { 214 isWFS = true; 215 isWFS100 = version != null && version.equals( "1.0.0" ); 216 } 217 218 isCSW = "csw".equalsIgnoreCase( service ); 219 isWCTS = "wcts".equalsIgnoreCase( service ); 220 isWFS = "wfs".equalsIgnoreCase( service ); 221 } else { 222 try { 223 XMLFragment doc = new XMLFragment( request.getReader(), XMLFragment.DEFAULT_URL ); 224 service = OGCRequestFactory.getTargetService( "", "", doc.getRootElement().getOwnerDocument() ); 225 isCSW = "csw".equalsIgnoreCase( service ); 226 isWCTS = "wcts".equalsIgnoreCase( service ); 227 isWFS = "wfs".equalsIgnoreCase( service ); 228 isWFS100 = isWFS && doc.getRootElement().getAttribute( "version" ) != null 229 && doc.getRootElement().getAttribute( "version" ).equals( "1.0.0" ); 230 } catch ( SAXException e1 ) { 231 // ignore 232 } catch ( IOException e1 ) { 233 // ignore 234 } catch ( IllegalStateException e1 ) { 235 // ignore, that happens in some tomcats 236 } 237 } 238 239 try { 240 XMLFragment doc; 241 String contentType = "text/xml"; 242 243 if ( !( isWMS130 || isCSW || isWCTS || isWFS ) ) { 244 // apply the simplest of heuristics... 245 String req = request.getRequestURI().toLowerCase(); 246 if ( req.indexOf( "csw" ) != -1 ) { 247 isCSW = true; 248 } else if ( req.indexOf( "wcts" ) != -1 ) { 249 isWCTS = true; 250 } else if ( req.indexOf( "wfs" ) != -1 ) { 251 isWFS = true; 252 } 253 254 if ( isWFS ) { 255 isWFS100 = req.indexOf( "1.0.0" ) != -1; 256 } 257 258 if ( !( isWMS130 || isCSW || isWCTS || isWFS || isWFS100 ) ) { 259 isWMS130 = version != null && version.equals( "1.3.0" ); 260 } 261 } 262 263 // send exception format INIMAGE etc. for WMS 264 if ( service != null && service.equalsIgnoreCase( "wms" ) ) { 265 ServiceDispatcher handler = getInstance().getHandler( service, request.getRemoteAddr() ); 266 if ( handler instanceof WMSHandler ) { 267 WMSHandler h = (WMSHandler) handler; 268 String format = map.get( "format" ); 269 String eFormat = map.get( "exceptions" ); 270 try { 271 h.determineExceptionFormat( eFormat, format, version, response ); 272 h.writeServiceExceptionReport( e ); 273 return; 274 } catch ( Exception ex ) { 275 LOG.logDebug( "Error while sending the exception in special format." 276 + " Continuing in default mode.", ex ); 277 } 278 } 279 } 280 281 if ( isWMS130 || "wcs".equalsIgnoreCase( e.getLocator() ) ) { 282 doc = XMLFactory.exportNS( new ExceptionReport( new OGCWebServiceException[] { e } ) ); 283 } else if ( isCSW ) { 284 doc = XMLFactory.exportExceptionReport( new ExceptionReport( new OGCWebServiceException[] { e } ) ); 285 } else if ( isWCTS ) { 286 doc = org.deegree.owscommon_1_1_0.XMLFactory.exportException( e ); 287 } else if ( isWFS100 ) { 288 doc = XMLFactory.exportExceptionReportWFS100( e ); 289 } else if ( isWFS ) { 290 doc = XMLFactory.exportExceptionReportWFS( e ); 291 } else { 292 contentType = "application/vnd.ogc.se_xml"; 293 doc = XMLFactory.export( new ExceptionReport( new OGCWebServiceException[] { e } ) ); 294 } 295 296 response.setContentType( contentType ); 297 OutputStream os = response.getOutputStream(); 298 doc.write( os ); 299 os.close(); 300 } catch ( Exception ex ) { 301 LOG.logError( "ERROR: " + ex.getMessage(), ex ); 302 } 303 } 304 305 /** 306 * 307 * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, 308 * javax.servlet.http.HttpServletResponse) 309 */ 310 @Override 311 protected void doGet( HttpServletRequest request, HttpServletResponse response ) 312 throws ServletException, IOException { 313 314 LOG.logDebug( "query string ", request.getQueryString() ); 315 if ( request.getParameter( "RELOADDEEGREE" ) != null ) { 316 reloadServices( request, response ); 317 } else { 318 this.doService( request, response ); 319 } 320 } 321 322 /** 323 * 324 * @param request 325 * @param response 326 * @throws ServletException 327 * @throws IOException 328 */ 329 private void reloadServices( HttpServletRequest request, HttpServletResponse response ) 330 throws ServletException, IOException { 331 Map<?, ?> map = KVP2Map.toMap( request ); 332 String user = (String) map.get( "USER" ); 333 String password = (String) map.get( "PASSWORD" ); 334 String message = null; 335 if ( getInitParameter( "USER" ) != null && getInitParameter( "PASSWORD" ) != null 336 && getInitParameter( "USER" ).equals( user ) && getInitParameter( "PASSWORD" ).equals( password ) ) { 337 initServices( getServletContext() ); 338 ctDestroyed(); 339 message = Messages.getString( "OGCServletController.reloadsuccess" ); 340 } else { 341 message = Messages.getString( "OGCServletController.reloadfailed" ); 342 } 343 PrintWriter pw = response.getWriter(); 344 pw.print( message ); 345 pw.flush(); 346 pw.close(); 347 } 348 349 /* 350 * (non-Javadoc) 351 * 352 * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest, 353 * javax.servlet.http.HttpServletResponse) 354 */ 355 @Override 356 protected void doPost( HttpServletRequest request, HttpServletResponse response ) 357 throws ServletException, IOException { 358 this.doService( request, response ); 359 } 360 361 private static String spaces( int i ) { 362 if ( i <= 0 ) { 363 return ""; 364 } 365 366 StringBuffer sb = new StringBuffer( i ); 367 for ( int j = 0; j < i; ++j ) { 368 sb.append( " " ); 369 } 370 return sb.toString(); 371 } 372 373 private static void logIfThere( String param ) { 374 String val = getProperty( param ); 375 if ( val != null ) { 376 LOG.logInfo( "- " + param + spaces( 15 - param.length() ) + ": " + val ); 377 } 378 } 379 380 /** 381 * @see javax.servlet.GenericServlet#init() 382 */ 383 @Override 384 public void init() 385 throws ServletException { 386 387 synchronized ( OGCServletController.class ) { 388 if ( LOG == null ) { 389 // hack to figure out and set the context path name 390 // for a laugh, see http://marc.info/?l=tomcat-user&m=109215904113904&w=2 and the related thread 391 // http://marc.info/?t=109215871400004&r=1&w=2 392 String path = getServletContext().getRealPath( "" ); 393 String[] ps = path.split( "[/\\\\]" ); 394 path = ps[ps.length - 1]; 395 // heuristics are always a charm (and work best for tomcat in this case) 396 if ( isDigit( path.charAt( 0 ) ) && path.indexOf( "-" ) != -1 ) { 397 path = path.split( "-", 2 )[1]; 398 } 399 // note that setting this changes it on a JVM GLOBAL BASIS, so it WILL GET OVERWRITTEN in subsequent 400 // deegree startups! (However, since the log4j.properties will only be read on startup, this hack is 401 // useful anyway) 402 setProperty( "context.name", path ); 403 404 LOG = getLogger( OGCServletController.class ); 405 } 406 } 407 408 super.init(); 409 LOG.logDebug( "Logger for " + this.getClass().getName() + " initialized." ); 410 411 SERVICE_FACTORIES_MAPPINGS.put( CSWHandler.class, "org.deegree.ogcwebservices.csw.CSWFactory" ); 412 SERVICE_FACTORIES_MAPPINGS.put( WFSHandler.class, "org.deegree.ogcwebservices.wfs.WFServiceFactory" ); 413 SERVICE_FACTORIES_MAPPINGS.put( WCSHandler.class, "org.deegree.ogcwebservices.wcs.WCServiceFactory" ); 414 SERVICE_FACTORIES_MAPPINGS.put( WMSHandler.class, "org.deegree.ogcwebservices.wms.WMServiceFactory" ); 415 SERVICE_FACTORIES_MAPPINGS.put( SOSHandler.class, "org.deegree.ogcwebservices.sos.SOServiceFactory" ); 416 SERVICE_FACTORIES_MAPPINGS.put( WPVSHandler.class, "org.deegree.ogcwebservices.wpvs.WPVServiceFactory" ); 417 SERVICE_FACTORIES_MAPPINGS.put( WMPSHandler.class, "org.deegree.ogcwebservices.wmps.WMPServiceFactory" ); 418 SERVICE_FACTORIES_MAPPINGS.put( WPSHandler.class, "org.deegree.ogcwebservices.wps.WPServiceFactory" ); 419 SERVICE_FACTORIES_MAPPINGS.put( WASSHandler.class, "org.deegree.ogcwebservices.wass.common.WASServiceFactory" ); 420 SERVICE_FACTORIES_MAPPINGS.put( WCTSHandler.class, "org.deegree.ogcwebservices.wcts.WCTServiceFactory" ); 421 422 LOG.logInfo( "-------------------------------------------------------------------------------" ); 423 LOG.logInfo( "Starting deegree version " + Version.getVersion() ); 424 LOG.logInfo( "- context : " + this.getServletContext().getServletContextName() ); 425 LOG.logInfo( "- real path : " + this.getServletContext().getRealPath( "/" ) ); 426 LOG.logInfo( "- java version : " + System.getProperty( "java.version" ) + "" ); 427 LOG.logInfo( "- dom builder : " + DocumentBuilderFactory.newInstance().getClass().getName() + "" ); 428 LOG.logInfo( "- xslt builder : " + TransformerFactory.newInstance().getClass().getName() + "" ); 429 LOG.logInfo( "- system charset : " + CharsetUtils.getSystemCharset() ); 430 LOG.logInfo( "- default charset: " + Charset.defaultCharset() ); 431 LOG.logInfo( "- server info : " + this.getServletContext().getServerInfo() ); 432 logIfThere( "proxyHost" ); 433 logIfThere( "proxyPort" ); 434 logIfThere( "noProxyHosts" ); 435 logIfThere( "nonProxyHosts" ); 436 logIfThere( "http.proxyHost" ); 437 logIfThere( "http.proxyPort" ); 438 logIfThere( "http.noProxyHosts" ); 439 logIfThere( "http.nonProxyHosts" ); 440 logIfThere( "ftp.proxyHost" ); 441 logIfThere( "ftp.proxyPort" ); 442 logIfThere( "ftp.noProxyHosts" ); 443 logIfThere( "ftp.nonProxyHosts" ); 444 logIfThere( "https.proxyHost" ); 445 logIfThere( "https.proxyPort" ); 446 logIfThere( "https.noProxyHosts" ); 447 logIfThere( "https.nonProxyHosts" ); 448 try { 449 LOG.logInfo( "- ip : " + InetAddress.getLocalHost().getHostAddress() ); 450 LOG.logInfo( "- host name : " + InetAddress.getLocalHost().getHostName() ); 451 LOG.logInfo( "- domain name : " + InetAddress.getLocalHost().getCanonicalHostName() ); 452 } catch ( Exception e ) { 453 LOG.logError( e.getMessage(), e ); 454 } 455 LOG.logInfo( "-------------------------------------------------------------------------------" ); 456 this.initServices( getServletContext() ); 457 checkServerCompatibility(); 458 LOG.logInfo( "-------------------------------------------------------------------------------" ); 459 String tmpServiceList = this.getServiceList(); 460 if ( tmpServiceList != null && !( "".equals( tmpServiceList.trim() ) ) ) { 461 LOG.logInfo( "Initialized successfully (context '" + this.getServletContext().getServletContextName() 462 + "'):" ); 463 String[] tmpServices = tmpServiceList.split( "," ); 464 for ( String service : tmpServices ) { 465 // Added a check for the alternative service name, because it should not be outputed twice for the csw. 466 if ( !OGCRequestFactory.CSW_SERVICE_NAME_EBRIM.toUpperCase().equals( service ) ) { 467 LOG.logInfo( "- " + service ); 468 } 469 } 470 } else { 471 LOG.logError( "An Error occured while initializing context '" 472 + this.getServletContext().getServletContextName() + "', no services are available." ); 473 } 474 475 LOG.logInfo( "-------------------------------------------------------------------------------" ); 476 // Sets the attributes for tomcat -> application.getAttribute(); in jsp sites 477 this.getServletContext().setAttribute( "deegree_ogc_services", this.getServiceList() ); 478 } 479 480 private void checkServerCompatibility() { 481 String serverInfo = getServletContext().getServerInfo(); 482 if ( "Apache Tomcat/5.5.26".equals( serverInfo ) || "Apache Tomcat/6.0.16".equals( serverInfo ) ) { 483 LOG.logWarning( "*******************************************************************************" ); 484 LOG.logWarning( "YOU ARE RUNNING DEEGREE ON A TOMCAT RELEASE (" + serverInfo 485 + ") THAT IS KNOWN TO HAVE A SERIOUS ISSUE WITH LARGE POST REQUESTS." ); 486 LOG.logWarning( "PLEASE CONSIDER THE CORRESPONDING DEEGREE WIKI PAGE AT https://wiki.deegree.org/deegreeWiki/ApacheTomcat " 487 + "FOR DETAILS AND SWITCH TO A DIFFERENT TOMCAT VERSION." ); 488 LOG.logWarning( "*******************************************************************************" ); 489 } 490 } 491 492 private void initServices( ServletContext context ) 493 throws ServletException { 494 495 // get list of OGC services 496 String serviceList = this.getRequiredInitParameter( SERVICE ); 497 498 String[] serviceNames = StringTools.toArray( serviceList, ",", false ); 499 500 ServiceLookup lookup = ServiceLookup.getInstance(); 501 for ( int i = 0; i < serviceNames.length; i++ ) { 502 LOG.logInfo( StringTools.concat( 100, "---- Initializing ", serviceNames[i].toUpperCase(), " ----" ) ); 503 try { 504 String className = this.getRequiredInitParameter( serviceNames[i] + HANDLER_CLASS ); 505 Class<?> handlerClzz = Class.forName( className ); 506 507 // initialize each service factory 508 String s = this.getRequiredInitParameter( serviceNames[i] + HANDLER_CONF ); 509 URL serviceConfigurationURL = WebappResourceResolver.resolveFileLocation( s, context, LOG ); 510 511 // set configuration 512 LOG.logInfo( StringTools.concat( 300, "Reading configuration for ", serviceNames[i].toUpperCase(), 513 " from URL: '", serviceConfigurationURL, "'." ) ); 514 515 String factoryClassName = SERVICE_FACTORIES_MAPPINGS.get( handlerClzz ); 516 517 Class<?> factory = Class.forName( factoryClassName ); 518 Method method = factory.getMethod( "setConfiguration", new Class[] { URL.class } ); 519 method.invoke( factory, new Object[] { serviceConfigurationURL } ); 520 521 // The csw-ebrim profile adds an alternative service name, it too is registred with the CSW handler. 522 if ( "CSW".equals( serviceNames[i].toUpperCase() ) ) { 523 lookup.addService( OGCRequestFactory.CSW_SERVICE_NAME_EBRIM.toUpperCase(), handlerClzz ); 524 } 525 // put handler to available service list 526 lookup.addService( serviceNames[i].toUpperCase(), handlerClzz ); 527 528 LOG.logInfo( StringTools.concat( 300, serviceNames[i].toUpperCase(), " successfully initialized." ) ); 529 } catch ( ServletException e ) { 530 LOG.logError( e.getMessage(), e ); 531 } catch ( InvocationTargetException e ) { 532 e.getTargetException().printStackTrace(); 533 LOG.logError( this.produceMessage( ERR_MSG, new Object[] { serviceNames[i] } ), e ); 534 } catch ( Exception e ) { 535 LOG.logError( "Can't initialize OGC service:" + serviceNames[i], e ); 536 } 537 } 538 } 539 540 private String getRequiredInitParameter( String name ) 541 throws ServletException { 542 String paramValue = getInitParameter( name ); 543 if ( paramValue == null ) { 544 545 String msg = "Required init parameter '" + name + "' missing in web.xml"; 546 LOG.logError( msg ); 547 throw new ServletException( msg ); 548 } 549 return paramValue; 550 } 551 552 /** 553 * @return the services, separated by "," 554 */ 555 private String getServiceList() { 556 557 StringBuffer buf = new StringBuffer(); 558 ServiceLookup lookup = ServiceLookup.getInstance(); 559 for ( Iterator<?> iter = lookup.getIterator(); iter.hasNext(); ) { 560 String serviceName = (String) iter.next(); 561 buf.append( serviceName ); 562 if ( iter.hasNext() ) { 563 buf.append( ',' ); 564 } 565 } 566 return buf.toString(); 567 } 568 569 /** 570 * Formats the provided string and the args array into a String using MessageFormat. 571 * 572 * @param pattern 573 * @param args 574 * @return the message to present the client. 575 */ 576 private String produceMessage( String pattern, Object[] args ) { 577 return new MessageFormat( pattern ).format( args ); 578 } 579 580 /** 581 * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent) 582 */ 583 public void ctDestroyed() { 584 LOG.logInfo( "Stopping context: " ); 585 586 WMSConfigurationDocument.resetCapabilitiesCache(); 587 WMSConfigurationDocument_1_3_0.resetCapabilitiesCache(); 588 WMPSConfigurationDocument.resetCapabilitiesCache(); 589 590 ServiceLookup lookup = ServiceLookup.getInstance(); 591 for ( Iterator<?> iter = lookup.getIterator(); iter.hasNext(); ) { 592 String serviceName = (String) iter.next(); 593 LOG.logInfo( "Stopping service " + serviceName ); 594 595 try { 596 String s = SERVICE_FACTORIES_MAPPINGS.get( lookup.getService( serviceName ) ); 597 Class<?> clzz = Class.forName( s ); 598 // TODO stop and reset all service instances 599 Method[] methods = clzz.getMethods(); 600 for ( int j = 0; j < methods.length; j++ ) { 601 if ( methods[j].getName().equals( "reset" ) ) { 602 Object[] args = new Object[0]; 603 methods[j].invoke( clzz.newInstance(), args ); 604 } 605 } 606 } catch ( Exception e ) { 607 LOG.logError( e.getMessage(), e ); 608 } 609 } 610 } 611 612 @Override 613 public void destroy() { 614 super.destroy(); 615 Enumeration<Driver> e = DriverManager.getDrivers(); 616 while ( e.hasMoreElements() ) { 617 Driver driver = e.nextElement(); 618 try { 619 if ( driver.getClass().getClassLoader() == getClass().getClassLoader() ) 620 DriverManager.deregisterDriver( driver ); 621 } catch ( SQLException e1 ) { 622 LOG.logError( "Cannot unload driver: " + driver ); 623 } 624 } 625 LogFactory.releaseAll(); 626 LogManager.shutdown(); 627 // SLF4JLogFactory.releaseAll(); // should be the same as the LogFactory.releaseAll call 628 Iterator<Class<?>> i = IIORegistry.getDefaultInstance().getCategories(); 629 while ( i.hasNext() ) { 630 Class<?> c = i.next(); 631 Iterator<?> k = IIORegistry.getDefaultInstance().getServiceProviders( c, false ); 632 while ( k.hasNext() ) { 633 Object o = k.next(); 634 if ( o.getClass().getClassLoader() == getClass().getClassLoader() ) { 635 IIORegistry.getDefaultInstance().deregisterServiceProvider( o ); 636 LOG.logDebug( "Deregistering JAI driver ", o.getClass() ); 637 } 638 } 639 } 640 Introspector.flushCaches(); 641 // just clear the configurations for now, it does not hurt 642 CRSConfiguration.DEFINED_CONFIGURATIONS.clear(); 643 } 644 645 }