Author: remy.maucherat(a)jboss.com
Date: 2010-05-07 08:38:52 -0400 (Fri, 07 May 2010)
New Revision: 1468
Modified:
trunk/java/org/apache/catalina/InstanceEvent.java
trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
trunk/java/org/apache/catalina/core/StandardWrapper.java
trunk/java/org/apache/catalina/core/StandardWrapperValve.java
trunk/java/org/apache/catalina/util/InstanceSupport.java
Log:
- Event cleanup using a finally block.
- Add events for HTTP events.
Modified: trunk/java/org/apache/catalina/InstanceEvent.java
===================================================================
--- trunk/java/org/apache/catalina/InstanceEvent.java 2010-05-07 11:46:42 UTC (rev 1467)
+++ trunk/java/org/apache/catalina/InstanceEvent.java 2010-05-07 12:38:52 UTC (rev 1468)
@@ -25,7 +25,9 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+import org.jboss.servlet.http.HttpEvent;
+
/**
* General event for notifying listeners of significant events related to
* a specific instance of a Servlet, or a specific instance of a Filter,
@@ -344,6 +346,100 @@
}
+ /**
+ * Construct a new InstanceEvent with the specified parameters. This
+ * constructor is used for processing servlet processing events.
+ *
+ * @param wrapper Wrapper managing this servlet instance
+ * @param servlet Servlet instance for which this event occurred
+ * @param type Event type (required)
+ * @param event Event we are processing
+ * @param exception Exception that occurred
+ */
+ public InstanceEvent(Wrapper wrapper, Servlet servlet, String type,
+ HttpEvent event,
+ Throwable exception) {
+
+ super(wrapper);
+ this.wrapper = wrapper;
+ this.filter = null;
+ this.servlet = servlet;
+ this.type = type;
+ this.event = event;
+ this.exception = exception;
+
+ }
+
+
+ /**
+ * Construct a new InstanceEvent with the specified parameters. This
+ * constructor is used for processing servlet processing events.
+ *
+ * @param wrapper Wrapper managing this servlet instance
+ * @param servlet Servlet instance for which this event occurred
+ * @param type Event type (required)
+ * @param event Event we are processing
+ * @param exception Exception that occurred
+ */
+ public InstanceEvent(Wrapper wrapper, Servlet servlet, String type,
+ HttpEvent event) {
+
+ super(wrapper);
+ this.wrapper = wrapper;
+ this.filter = null;
+ this.servlet = servlet;
+ this.type = type;
+ this.event = event;
+
+ }
+
+
+ /**
+ * Construct a new InstanceEvent with the specified parameters. This
+ * constructor is used for processing servlet processing events.
+ *
+ * @param wrapper Wrapper managing this servlet instance
+ * @param filter Filter instance for which this event occurred
+ * @param type Event type (required)
+ * @param event Event we are processing
+ * @param exception Exception that occurred
+ */
+ public InstanceEvent(Wrapper wrapper, Filter filter, String type,
+ HttpEvent event,
+ Throwable exception) {
+
+ super(wrapper);
+ this.wrapper = wrapper;
+ this.filter = filter;
+ this.type = type;
+ this.event = event;
+ this.exception = exception;
+
+ }
+
+
+ /**
+ * Construct a new InstanceEvent with the specified parameters. This
+ * constructor is used for processing servlet processing events.
+ *
+ * @param wrapper Wrapper managing this servlet instance
+ * @param servlet Servlet instance for which this event occurred
+ * @param type Event type (required)
+ * @param event Event we are processing
+ * @param exception Exception that occurred
+ */
+ public InstanceEvent(Wrapper wrapper, Filter filter, String type,
+ HttpEvent event) {
+
+ super(wrapper);
+ this.wrapper = wrapper;
+ this.filter = filter;
+ this.type = type;
+ this.event = event;
+
+ }
+
+
// ----------------------------------------------------- Instance Variables
@@ -377,6 +473,13 @@
/**
+ * The event being processed (BEFORE_FILTER_EVENT,
+ * AFTER_FILTER_EVENT, BEFORE_SERVICE_EVENT, and AFTER_SERVICE_EVENT).
+ */
+ private HttpEvent event = null;
+
+
+ /**
* The Servlet instance for which this event occurred (not present on
* BEFORE_FILTER_EVENT or AFTER_FILTER_EVENT events).
*/
@@ -440,6 +543,16 @@
/**
+ * Return the event for which this event occurred.
+ */
+ public HttpEvent getEvent() {
+
+ return (this.event);
+
+ }
+
+
+ /**
* Return the servlet instance for which this event occurred.
*/
public Servlet getServlet() {
Modified: trunk/java/org/apache/catalina/core/ApplicationDispatcher.java
===================================================================
--- trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 2010-05-07 11:46:42 UTC
(rev 1467)
+++ trunk/java/org/apache/catalina/core/ApplicationDispatcher.java 2010-05-07 12:38:52 UTC
(rev 1468)
@@ -720,8 +720,8 @@
ApplicationFilterFactory factory = ApplicationFilterFactory.getInstance();
ApplicationFilterChain filterChain = factory.createFilterChain(request,
wrapper);
// Call the service() method for the allocated servlet instance
+ String jspFile = wrapper.getJspFile();
try {
- String jspFile = wrapper.getJspFile();
if (jspFile != null) {
request.setAttribute(Globals.JSP_FILE_ATTR, jspFile);
} else {
@@ -734,33 +734,18 @@
filterChain.doFilter(request, response);
}
// Servlet Service Method is called by the FilterChain
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
- servlet, request, response);
} catch (ClientAbortException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
- servlet, request, response);
ioException = e;
} catch (IOException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
- servlet, request, response);
wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException",
wrapper.getName()), e);
ioException = e;
} catch (UnavailableException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
- servlet, request, response);
wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException",
wrapper.getName()), e);
servletException = e;
wrapper.unavailable(e);
} catch (ServletException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
- servlet, request, response);
Throwable rootCause = StandardWrapper.getRootCause(e);
if (!(rootCause instanceof ClientAbortException)) {
wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException",
@@ -768,12 +753,15 @@
}
servletException = e;
} catch (RuntimeException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
- servlet, request, response);
wrapper.getLogger().error(sm.getString("applicationDispatcher.serviceException",
wrapper.getName()), e);
runtimeException = e;
+ } finally {
+ if (jspFile != null) {
+ request.removeAttribute(Globals.JSP_FILE_ATTR);
+ }
+ support.fireInstanceEvent(InstanceEvent.AFTER_DISPATCH_EVENT,
+ servlet, request, response);
}
// Release the filter chain (if any) for this request
Modified: trunk/java/org/apache/catalina/core/ApplicationFilterChain.java
===================================================================
--- trunk/java/org/apache/catalina/core/ApplicationFilterChain.java 2010-05-07 11:46:42
UTC (rev 1467)
+++ trunk/java/org/apache/catalina/core/ApplicationFilterChain.java 2010-05-07 12:38:52
UTC (rev 1468)
@@ -248,6 +248,7 @@
throws IOException, ServletException {
InstanceSupport support = wrapper.getInstanceSupport();
+ Throwable throwable = null;
// Call the next filter if there is one
if (pos < filterCount) {
@@ -258,7 +259,6 @@
filter = filterConfig.getFilter();
support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT,
filter, request, response);
-
if( Globals.IS_SECURITY_ENABLED ) {
final ServletRequest req = request;
final ServletResponse res = response;
@@ -273,35 +273,24 @@
} else {
filter.doFilter(request, response, this);
}
-
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, request, response);
- pointer--;
} catch (IOException e) {
- pointer--;
- if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, request, response, e);
+ throwable = e;
throw e;
} catch (ServletException e) {
- pointer--;
- if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, request, response, e);
+ throwable = e;
throw e;
} catch (RuntimeException e) {
- pointer--;
- if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, request, response, e);
+ throwable = e;
throw e;
} catch (Throwable e) {
+ throwable = e;
+ throw new ServletException(sm.getString("filterChain.filter"),
e);
+ } finally {
pointer--;
- if (filter != null)
+ if (filter != null) {
support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, request, response, e);
- throw new ServletException
- (sm.getString("filterChain.filter"), e);
+ filter, request, response, throwable);
+ }
}
return;
}
@@ -310,13 +299,12 @@
Servlet servlet = wrapper.getServlet();
pointer++;
try {
+ support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
+ servlet, request, response);
if (Globals.STRICT_SERVLET_COMPLIANCE) {
lastServicedRequest.set(request);
lastServicedResponse.set(response);
}
-
- support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
- servlet, request, response);
if ((request instanceof HttpServletRequest) &&
(response instanceof HttpServletResponse)) {
@@ -339,23 +327,17 @@
} else {
servlet.service(request, response);
}
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response);
} catch (IOException e) {
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
+ throwable = e;
throw e;
} catch (ServletException e) {
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
+ throwable = e;
throw e;
} catch (RuntimeException e) {
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
+ throwable = e;
throw e;
} catch (Throwable e) {
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
+ throwable = e;
throw new ServletException
(sm.getString("filterChain.servlet"), e);
} finally {
@@ -364,6 +346,8 @@
lastServicedRequest.set(null);
lastServicedResponse.set(null);
}
+ support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
+ servlet, request, response, throwable);
}
}
@@ -437,6 +421,9 @@
private void internalDoFilterEvent(HttpEvent event)
throws IOException, ServletException {
+ InstanceSupport support = wrapper.getInstanceSupport();
+ Throwable throwable = null;
+
// Call the next filter if there is one
if (pos < filterCount) {
ApplicationFilterConfig filterConfig = filters[pos++];
@@ -444,12 +431,8 @@
HttpEventFilter filter = null;
try {
filter = (HttpEventFilter) filterConfig.getFilter();
- // FIXME: No instance listener processing for events for now
- /*
support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT,
filter, event);
- */
-
if( Globals.IS_SECURITY_ENABLED ) {
final HttpEvent ev = event;
Principal principal =
@@ -463,41 +446,25 @@
} else {
filter.doFilterEvent(event, this);
}
-
- /*support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, event);*/
- pointer--;
} catch (IOException e) {
- pointer--;
- /*
- if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, event, e);
- */
+ throwable = e;
throw e;
} catch (ServletException e) {
- pointer--;
- /*
- if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, event, e);
- */
+ throwable = e;
throw e;
} catch (RuntimeException e) {
- pointer--;
- /*
- if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, event, e);
- */
+ throwable = e;
throw e;
} catch (Throwable e) {
- pointer--;
- /*if (filter != null)
- support.fireInstanceEvent(InstanceEvent.AFTER_FILTER_EVENT,
- filter, event, e);*/
+ throwable = e;
throw new ServletException
(sm.getString("filterChain.filter"), e);
+ } finally {
+ pointer--;
+ if (filter != null) {
+ support.fireInstanceEvent
+ (InstanceEvent.AFTER_FILTER_EVENT, filter, event, throwable);
+ }
}
return;
}
@@ -506,10 +473,8 @@
Servlet servlet = wrapper.getServlet();
pointer++;
try {
- /*
support.fireInstanceEvent(InstanceEvent.BEFORE_SERVICE_EVENT,
- servlet, request, response);
- */
+ servlet, event);
if( Globals.IS_SECURITY_ENABLED ) {
final HttpEvent ev = event;
Principal principal =
@@ -524,39 +489,23 @@
} else {
((HttpEventServlet) servlet).event(event);
}
- /*
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response);*/
- pointer--;
} catch (IOException e) {
- pointer--;
- /*
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
- */
+ throwable = e;
throw e;
} catch (ServletException e) {
- pointer--;
- /*
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
- */
+ throwable = e;
throw e;
} catch (RuntimeException e) {
- pointer--;
- /*
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
- */
+ throwable = e;
throw e;
} catch (Throwable e) {
- pointer--;
- /*
- support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
- servlet, request, response, e);
- */
+ throwable = e;
throw new ServletException
(sm.getString("filterChain.servlet"), e);
+ } finally {
+ pointer--;
+ support.fireInstanceEvent(InstanceEvent.AFTER_SERVICE_EVENT,
+ servlet, event, throwable);
}
}
Modified: trunk/java/org/apache/catalina/core/StandardWrapper.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardWrapper.java 2010-05-07 11:46:42 UTC (rev
1467)
+++ trunk/java/org/apache/catalina/core/StandardWrapper.java 2010-05-07 12:38:52 UTC (rev
1468)
@@ -1121,7 +1121,7 @@
if (!singleThreadModel && (instance != null))
return instance;
- PrintStream out = System.out;
+ Throwable throwable = null;
Servlet servlet;
@@ -1227,27 +1227,25 @@
servlet.service(req, res);
}
}
- instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,
- servlet);
} catch (UnavailableException f) {
- instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,
- servlet, f);
+ throwable = f;
unavailable(f);
throw f;
} catch (ServletException f) {
- instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,
- servlet, f);
+ throwable = f;
// If the servlet wanted to be unavailable it would have
// said so, so do not call unavailable(null).
throw f;
} catch (Throwable f) {
+ throwable = f;
getServletContext().log("StandardWrapper.Throwable", f );
- instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,
- servlet, f);
// If the servlet wanted to be unavailable it would have
// said so, so do not call unavailable(null).
throw new ServletException
(sm.getString("standardWrapper.initException", getName()),
f);
+ } finally {
+ instanceSupport.fireInstanceEvent(InstanceEvent.AFTER_INIT_EVENT,
+ servlet, throwable);
}
// Register our newly initialized instance
Modified: trunk/java/org/apache/catalina/core/StandardWrapperValve.java
===================================================================
--- trunk/java/org/apache/catalina/core/StandardWrapperValve.java 2010-05-07 11:46:42 UTC
(rev 1467)
+++ trunk/java/org/apache/catalina/core/StandardWrapperValve.java 2010-05-07 12:38:52 UTC
(rev 1468)
@@ -257,12 +257,13 @@
// Call the filter chain for this request
// NOTE: This also calls the servlet's service() method
+ String jspFile = wrapper.getJspFile();
try {
- String jspFile = wrapper.getJspFile();
- if (jspFile != null)
+ if (jspFile != null) {
request.setAttribute(Globals.JSP_FILE_ATTR, jspFile);
- else
+ } else {
request.removeAttribute(Globals.JSP_FILE_ATTR);
+ }
support.fireInstanceEvent(InstanceEvent.BEFORE_REQUEST_EVENT,
servlet, request, response);
if ((servlet != null) && (filterChain != null)) {
@@ -275,27 +276,15 @@
(request.getRequest(), response.getResponse());
}
}
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
} catch (ClientAbortException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
throwable = e;
exception(request, response, e);
} catch (IOException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
container.getLogger().error(sm.getString("standardWrapper.serviceException",
wrapper.getName()), e);
throwable = e;
exception(request, response, e);
} catch (UnavailableException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
container.getLogger().error(sm.getString("standardWrapper.serviceException",
wrapper.getName()), e);
// throwable = e;
@@ -315,9 +304,6 @@
// Do not save exception in 'throwable', because we
// do not want to do exception(request, response, e) processing
} catch (ServletException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
Throwable rootCause = StandardWrapper.getRootCause(e);
if (!(rootCause instanceof ClientAbortException)) {
container.getLogger().error(sm.getString("standardWrapper.serviceException",
@@ -326,13 +312,16 @@
throwable = e;
exception(request, response, e);
} catch (Throwable e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
container.getLogger().error(sm.getString("standardWrapper.serviceException",
wrapper.getName()), e);
throwable = e;
exception(request, response, e);
+ } finally {
+ if (jspFile != null) {
+ request.removeAttribute(Globals.JSP_FILE_ATTR);
+ }
+ support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
+ servlet, request, response, throwable);
}
// Release the filter chain (if any) for this request
@@ -462,46 +451,32 @@
(ApplicationFilterChain) request.getFilterChain();
// Call the filter chain for this request
// NOTE: This also calls the servlet's event() method
+ String jspFile = wrapper.getJspFile();
try {
- String jspFile = wrapper.getJspFile();
- if (jspFile != null)
+ if (jspFile != null) {
request.setAttribute(Globals.JSP_FILE_ATTR, jspFile);
- else
+ } else {
request.removeAttribute(Globals.JSP_FILE_ATTR);
+ }
support.fireInstanceEvent(InstanceEvent.BEFORE_REQUEST_EVENT,
servlet, request, response);
if ((servlet != null) && (filterChain != null)) {
filterChain.doFilterEvent(request.getEvent());
}
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
} catch (ClientAbortException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
throwable = e;
exception(request, response, e);
} catch (IOException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
container.getLogger().error(sm.getString("standardWrapper.serviceException",
wrapper.getName()), e);
throwable = e;
exception(request, response, e);
} catch (UnavailableException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
container.getLogger().error(sm.getString("standardWrapper.serviceException",
wrapper.getName()), e);
// Do not save exception in 'throwable', because we
// do not want to do exception(request, response, e) processing
} catch (ServletException e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
Throwable rootCause = StandardWrapper.getRootCause(e);
if (!(rootCause instanceof ClientAbortException)) {
container.getLogger().error(sm.getString("standardWrapper.serviceException",
@@ -510,13 +485,16 @@
throwable = e;
exception(request, response, e);
} catch (Throwable e) {
- request.removeAttribute(Globals.JSP_FILE_ATTR);
- support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
- servlet, request, response);
container.getLogger().error(sm.getString("standardWrapper.serviceException",
wrapper.getName()), e);
throwable = e;
exception(request, response, e);
+ } finally {
+ if (jspFile != null) {
+ request.removeAttribute(Globals.JSP_FILE_ATTR);
+ }
+ support.fireInstanceEvent(InstanceEvent.AFTER_REQUEST_EVENT,
+ servlet, request, response, throwable);
}
// Release the filter chain (if any) for this request
Modified: trunk/java/org/apache/catalina/util/InstanceSupport.java
===================================================================
--- trunk/java/org/apache/catalina/util/InstanceSupport.java 2010-05-07 11:46:42 UTC (rev
1467)
+++ trunk/java/org/apache/catalina/util/InstanceSupport.java 2010-05-07 12:38:52 UTC (rev
1468)
@@ -26,6 +26,7 @@
import org.apache.catalina.InstanceEvent;
import org.apache.catalina.InstanceListener;
import org.apache.catalina.Wrapper;
+import org.jboss.servlet.http.HttpEvent;
/**
@@ -304,6 +305,106 @@
/**
+ * Notify all lifecycle event listeners that a particular event has
+ * occurred for this Container. The default implementation performs
+ * this notification synchronously using the calling thread.
+ *
+ * @param type Event type
+ * @param servlet The relevant Servlet for this event
+ * @param httpEvent The HTTP event we are processing
+ * @param exception Exception that occurred
+ */
+ public void fireInstanceEvent(String type, Servlet servlet,
+ HttpEvent httpEvent,
+ Throwable exception) {
+
+ if (listeners.length == 0)
+ return;
+
+ InstanceEvent event = new InstanceEvent(wrapper, servlet, type,
+ httpEvent, exception);
+ InstanceListener interested[] = listeners;
+ for (int i = 0; i < interested.length; i++)
+ interested[i].instanceEvent(event);
+
+ }
+
+
+ /**
+ * Notify all lifecycle event listeners that a particular event has
+ * occurred for this Container. The default implementation performs
+ * this notification synchronously using the calling thread.
+ *
+ * @param type Event type
+ * @param servlet The relevant Servlet for this event
+ * @param httpEvent The HTTP event we are processing
+ */
+ public void fireInstanceEvent(String type, Servlet servlet,
+ HttpEvent httpEvent) {
+
+ if (listeners.length == 0)
+ return;
+
+ InstanceEvent event = new InstanceEvent(wrapper, servlet, type,
+ httpEvent);
+ InstanceListener interested[] = listeners;
+ for (int i = 0; i < interested.length; i++)
+ interested[i].instanceEvent(event);
+
+ }
+
+
+ /**
+ * Notify all lifecycle event listeners that a particular event has
+ * occurred for this Container. The default implementation performs
+ * this notification synchronously using the calling thread.
+ *
+ * @param type Event type
+ * @param filter The relevant Filter for this event
+ * @param httpEvent The HTTP event we are processing
+ * @param exception Exception that occurred
+ */
+ public void fireInstanceEvent(String type, Filter filter,
+ HttpEvent httpEvent,
+ Throwable exception) {
+
+ if (listeners.length == 0)
+ return;
+
+ InstanceEvent event = new InstanceEvent(wrapper, filter, type,
+ httpEvent, exception);
+ InstanceListener interested[] = listeners;
+ for (int i = 0; i < interested.length; i++)
+ interested[i].instanceEvent(event);
+
+ }
+
+
+ /**
+ * Notify all lifecycle event listeners that a particular event has
+ * occurred for this Container. The default implementation performs
+ * this notification synchronously using the calling thread.
+ *
+ * @param type Event type
+ * @param filter The relevant Filter for this event
+ * @param httpEvent The HTTP event we are processing
+ */
+ public void fireInstanceEvent(String type, Filter filter,
+ HttpEvent httpEvent) {
+
+ if (listeners.length == 0)
+ return;
+
+ InstanceEvent event = new InstanceEvent(wrapper, filter, type,
+ httpEvent);
+ InstanceListener interested[] = listeners;
+ for (int i = 0; i < interested.length; i++)
+ interested[i].instanceEvent(event);
+
+ }
+
+
+ /**
* Remove a lifecycle event listener from this component.
*
* @param listener The listener to remove