Bug 454295 - [http] servlet EventListener types are all tracked under
the super class type EventListeners
diff --git a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
index 0b84033..accbc54 100644
--- a/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
+++ b/bundles/org.eclipse.equinox.http.servlet.tests/src/org/eclipse/equinox/http/servlet/tests/ServletTest.java
@@ -27,9 +27,14 @@
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
 import javax.servlet.Servlet;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextListener;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestListener;
 import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpSessionAttributeListener;
 
 import junit.framework.TestCase;
 
@@ -919,7 +924,7 @@
 			new BaseServletContextListener();
 
 		Dictionary<String, String> listenerProps = new Hashtable<String, String>();
-		ServiceRegistration<EventListener> registration = getBundleContext().registerService(EventListener.class, scl1, listenerProps);
+		ServiceRegistration<ServletContextListener> registration = getBundleContext().registerService(ServletContextListener.class, scl1, listenerProps);
 		registration.unregister();
 
 
@@ -943,7 +948,7 @@
 					new BaseServletContextListener();
 			Dictionary<String, String> listenerProps = new Hashtable<String, String>();
 			listenerProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
-			ServiceRegistration<EventListener> registration = getBundleContext().registerService(EventListener.class, scl1, listenerProps);
+			ServiceRegistration<ServletContextListener> registration = getBundleContext().registerService(ServletContextListener.class, scl1, listenerProps);
 			registration.unregister();
 
 			Assert.assertTrue(scl1.initialized.get());
@@ -971,7 +976,7 @@
 
 			Dictionary<String, String> listenerProps = new Hashtable<String, String>();
 			listenerProps.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_SELECT, "(" + HttpWhiteboardConstants.HTTP_WHITEBOARD_CONTEXT_NAME + "=a)");
-			registrations.add(bundleContext.registerService(EventListener.class, scl1, listenerProps));
+			registrations.add(bundleContext.registerService(ServletContextListener.class, scl1, listenerProps));
 
 			Assert.assertTrue(scl1.initialized.get());
 		}
@@ -992,7 +997,7 @@
 		Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
 		try {
 			Dictionary<String, String> listenerProps = new Hashtable<String, String>();
-			registrations.add(getBundleContext().registerService(EventListener.class, scal1, listenerProps));
+			registrations.add(getBundleContext().registerService(ServletContextAttributeListener.class, scal1, listenerProps));
 
 			Dictionary<String, String> servletProps1 = new Hashtable<String, String>();
 			servletProps1.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S1");
@@ -1034,7 +1039,7 @@
 		Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
 		try {
 			Dictionary<String, String> listenerProps = new Hashtable<String, String>();
-			registrations.add(getBundleContext().registerService(EventListener.class, srl1, listenerProps));
+			registrations.add(getBundleContext().registerService(ServletRequestListener.class, srl1, listenerProps));
 
 			Dictionary<String, String> servletProps1 = new Hashtable<String, String>();
 			servletProps1.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S1");
@@ -1062,7 +1067,7 @@
 		Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
 		try {
 			Dictionary<String, String> listenerProps = new Hashtable<String, String>();
-			registrations.add(getBundleContext().registerService(EventListener.class, sral1, listenerProps));
+			registrations.add(getBundleContext().registerService(ServletRequestAttributeListener.class, sral1, listenerProps));
 
 			Dictionary<String, String> servletProps1 = new Hashtable<String, String>();
 			servletProps1.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S1");
@@ -1092,7 +1097,7 @@
 		Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
 		try {
 			Dictionary<String, String> listenerProps = new Hashtable<String, String>();
-			registrations.add(getBundleContext().registerService(EventListener.class, hsal1, listenerProps));
+			registrations.add(getBundleContext().registerService(HttpSessionAttributeListener.class, hsal1, listenerProps));
 
 			Dictionary<String, String> servletProps1 = new Hashtable<String, String>();
 			servletProps1.put(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_NAME, "S1");
@@ -1142,7 +1147,7 @@
 		}
 	}
 
-	public void test_Listener8() throws Exception {
+	public void test_Async1() throws Exception {
 
 		Servlet s1 = new BaseAsyncServlet("test_Listener8");
 		Collection<ServiceRegistration<?>> registrations = new ArrayList<ServiceRegistration<?>>();
diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java
index 4186938..0a4f158 100644
--- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java
+++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/HttpServiceRuntimeImpl.java
@@ -50,6 +50,12 @@
 
 		this.trackingContext = trackingContext;
 		this.consumingContext = consumingContext;
+
+		this.servletServiceFilter = createServletFilter(consumingContext);
+		this.resourceServiceFilter = createResourceFilter(consumingContext);
+		this.filterServiceFilter = createFilterFilter(consumingContext);
+		this.listenerServiceFilter = createListenerFilter(consumingContext);
+
 		this.parentServletContext = parentServletContext;
 		this.attributes = Collections.unmodifiableMap(attributes);
 		this.targetFilter = "(" + Activator.UNIQUE_SERVICE_ID + "=" + attributes.get(Activator.UNIQUE_SERVICE_ID) + ")";  //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -216,27 +222,6 @@
 		return null;
 	}
 
-	public org.osgi.framework.Filter getFilterFilter() {
-		StringBuilder sb = new StringBuilder();
-
-		sb.append("(&(objectClass="); //$NON-NLS-1$
-		sb.append(Filter.class.getName());
-		sb.append(")(|("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN);
-		sb.append("=*)("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_REGEX);
-		sb.append("=*)("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_SERVLET);
-		sb.append("=*)))"); //$NON-NLS-1$
-
-		try {
-			return trackingContext.createFilter(sb.toString());
-		}
-		catch (InvalidSyntaxException ise) {
-			throw new IllegalArgumentException(ise);
-		}
-	}
-
 	public Set<Object> getRegisteredObjects() {
 		return registeredObjects;
 	}
@@ -247,23 +232,6 @@
 				HttpServiceRuntimeConstants.HTTP_SERVICE_ENDPOINT_ATTRIBUTE));
 	}
 
-	public org.osgi.framework.Filter getResourceFilter() {
-		StringBuilder sb = new StringBuilder();
-
-		sb.append("(&("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX);
-		sb.append("=*)("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PATTERN);
-		sb.append("=*))"); //$NON-NLS-1$
-
-		try {
-			return trackingContext.createFilter(sb.toString());
-		}
-		catch (InvalidSyntaxException ise) {
-			throw new IllegalArgumentException(ise);
-		}
-	}
-
 	@Override
 	public RuntimeDTO getRuntimeDTO() {
 		RuntimeDTO runtimeDTO = new RuntimeDTO();
@@ -283,27 +251,6 @@
 		return runtimeDTO;
 	}
 
-	public org.osgi.framework.Filter getServletFilter() {
-		StringBuilder sb = new StringBuilder();
-
-		sb.append("(&(objectClass="); //$NON-NLS-1$
-		sb.append(Servlet.class.getName());
-		sb.append(")(|("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ERROR_PAGE);
-		sb.append("=*)("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN);
-		sb.append("=*))(!("); //$NON-NLS-1$
-		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX);
-		sb.append("=*)))"); //$NON-NLS-1$
-
-		try {
-			return trackingContext.createFilter(sb.toString());
-		}
-		catch (InvalidSyntaxException ise) {
-			throw new IllegalArgumentException(ise);
-		}
-	}
-
 	public void log(String message, Throwable t) {
 		parentServletContext.log(message, t);
 	}
@@ -906,6 +853,101 @@
 		}
 	}
 
+	private static org.osgi.framework.Filter createResourceFilter(BundleContext context) {
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("(&("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX);
+		sb.append("=*)("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PATTERN);
+		sb.append("=*))"); //$NON-NLS-1$
+
+		try {
+			return context.createFilter(sb.toString());
+		}
+		catch (InvalidSyntaxException ise) {
+			throw new IllegalArgumentException(ise);
+		}
+	}
+
+	private static org.osgi.framework.Filter createServletFilter(BundleContext context) {
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("(&(objectClass="); //$NON-NLS-1$
+		sb.append(Servlet.class.getName());
+		sb.append(")(|("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_ERROR_PAGE);
+		sb.append("=*)("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_SERVLET_PATTERN);
+		sb.append("=*))(!("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_RESOURCE_PREFIX);
+		sb.append("=*)))"); //$NON-NLS-1$
+
+		try {
+			return context.createFilter(sb.toString());
+		}
+		catch (InvalidSyntaxException ise) {
+			throw new IllegalArgumentException(ise);
+		}
+	}
+
+	private static org.osgi.framework.Filter createFilterFilter(BundleContext context) {
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("(&(objectClass="); //$NON-NLS-1$
+		sb.append(Filter.class.getName());
+		sb.append(")(|("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_PATTERN);
+		sb.append("=*)("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_REGEX);
+		sb.append("=*)("); //$NON-NLS-1$
+		sb.append(HttpWhiteboardConstants.HTTP_WHITEBOARD_FILTER_SERVLET);
+		sb.append("=*)))"); //$NON-NLS-1$
+
+		try {
+			return context.createFilter(sb.toString());
+		}
+		catch (InvalidSyntaxException ise) {
+			throw new IllegalArgumentException(ise);
+		}
+	}
+
+	private static org.osgi.framework.Filter createListenerFilter(BundleContext context) {
+		StringBuilder sb = new StringBuilder();
+
+		sb.append("(|"); //$NON-NLS-1$
+		sb.append("(objectClass=").append(ServletContextListener.class.getName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append("(objectClass=").append(ServletContextAttributeListener.class.getName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append("(objectClass=").append(ServletRequestListener.class.getName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append("(objectClass=").append(ServletRequestAttributeListener.class.getName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append("(objectClass=").append(HttpSessionListener.class.getName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append("(objectClass=").append(HttpSessionAttributeListener.class.getName()).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
+		sb.append(")"); //$NON-NLS-1$
+
+		try {
+			return context.createFilter(sb.toString());
+		}
+		catch (InvalidSyntaxException ise) {
+			throw new IllegalArgumentException(ise);
+		}
+	}
+
+	public org.osgi.framework.Filter getListenerFilter() {
+		return listenerServiceFilter;
+	}
+
+	public org.osgi.framework.Filter getFilterFilter() {
+		return filterServiceFilter;
+	}
+
+	public org.osgi.framework.Filter getServletFilter() {
+		return servletServiceFilter;
+	}
+
+	public org.osgi.framework.Filter getResourceFilter() {
+		return resourceServiceFilter;
+	}
+
 	private Map<String, Object> attributes;
 	private final String targetFilter;
 	private final ServiceRegistration<ServletContextHelper> defaultContextReg;
@@ -914,6 +956,11 @@
 	private BundleContext trackingContext;
 	private BundleContext consumingContext;
 
+	private final org.osgi.framework.Filter servletServiceFilter;
+	private final org.osgi.framework.Filter resourceServiceFilter;
+	private final org.osgi.framework.Filter filterServiceFilter;
+	private final org.osgi.framework.Filter listenerServiceFilter;
+
 	// BEGIN of old HttpService support
 	private Map<HttpContext, HttpContextHelperFactory> httpContextHelperFactories =
 		Collections.synchronizedMap(new HashMap<HttpContext, HttpContextHelperFactory>());
@@ -993,7 +1040,9 @@
 		public void ungetService(
 			Bundle bundle, ServiceRegistration<Filter> registration,
 			Filter service) {
+			// do nothing
 		}
 		
 	}
+
 }
diff --git a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java
index 2880401..871ce6b 100644
--- a/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java
+++ b/bundles/org.eclipse.equinox.http.servlet/src/org/eclipse/equinox/http/servlet/internal/context/ContextController.java
@@ -127,7 +127,7 @@
 		
 
 		listenerServiceTracker = new ServiceTracker<EventListener, AtomicReference<ListenerRegistration>>(
-			trackingContext, EventListener.class,
+			trackingContext, httpServiceRuntime.getListenerFilter(),
 			new ContextListenerTrackerCustomizer(
 				trackingContext, httpServiceRuntime, this));