Bug 319022 - [DI] [UI]EventObjectSupplier doesn't work with wildcards in topic names
diff --git a/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/EventObjectSupplier.java b/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/EventObjectSupplier.java
index 50704b6..ebd0e0b 100644
--- a/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/EventObjectSupplier.java
+++ b/bundles/org.eclipse.e4.core.di.extensions/src/org/eclipse/e4/core/di/internal/extensions/EventObjectSupplier.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     ARTAL Technologies <simon.chemouil@artal.fr> - Allow wildcards in topic names
  *******************************************************************************/
 package org.eclipse.e4.core.di.internal.extensions;
 
@@ -62,8 +63,10 @@
 	class DIEventHandler implements EventHandler {
 
 		final private IRequestor requestor;
+		final private String topic;
 
-		public DIEventHandler(IRequestor requestor) {
+		public DIEventHandler(String topic, IRequestor requestor) {
+			this.topic = topic;
 			this.requestor = requestor;
 		}
 
@@ -73,10 +76,9 @@
 				return;
 			}
 
-			String key = event.getTopic();
-			addCurrentEvent(key, event);
+			addCurrentEvent(topic, event);
 			requestor.resolveArguments();
-			removeCurrentEvent(key);
+			removeCurrentEvent(topic);
 
 			requestor.execute();
 		}
@@ -179,7 +181,7 @@
 		String[] topics = new String[] {topic};
 		Dictionary<String, Object> d = new Hashtable<String, Object>();
 		d.put(EventConstants.EVENT_TOPIC, topics);
-		EventHandler wrappedHandler = makeHandler(requestor);
+		EventHandler wrappedHandler = makeHandler(topic, requestor);
 		ServiceRegistration registration = bundleContext.registerService(EventHandler.class.getName(), wrappedHandler, d);
 		// due to the way requestors are constructed this limited synch should be OK
 		synchronized (registrations) {
@@ -187,8 +189,8 @@
 		}
 	}
 
-	protected EventHandler makeHandler(IRequestor requestor) {
-		return new DIEventHandler(requestor);
+	protected EventHandler makeHandler(String topic, IRequestor requestor) {
+		return new DIEventHandler(topic, requestor);
 	}
 
 	protected String getTopic(IObjectDescriptor descriptor) {
diff --git a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/extensions/InjectionEventTest.java b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/extensions/InjectionEventTest.java
index 8847615..27d75f7 100644
--- a/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/extensions/InjectionEventTest.java
+++ b/tests/org.eclipse.e4.core.tests/src/org/eclipse/e4/core/internal/tests/di/extensions/InjectionEventTest.java
@@ -87,6 +87,18 @@
 		
 	}
 	
+	// Class used to test receiving events using wildcard
+	static class InjectStarEvent {
+		public int counter1 = 0;
+		public Event event;
+		
+		@Inject @Optional
+		public void receivedEvent1(@EventTopic("e4/test/*") Event event) {
+			counter1++;
+			this.event = event;
+		}
+	}
+
 	// This tests and demos sending events
 	static public class EventAdminHelper {
 		@Inject
@@ -208,6 +220,29 @@
 		assertFalse(testFailed); // target would have asserted if it is still subscribed
 	}
 	
+	public void testInjectWildCard() {
+		IEclipseContext context = EclipseContextFactory.create();
+		InjectStarEvent target = ContextInjectionFactory.make(InjectStarEvent.class, context);
+		
+		// initial state
+		assertEquals(0, target.counter1);
+		assertNull(target.event);
+		
+		// send event
+		String eventTopic = "e4/test/eventInjection";
+		Dictionary<String, Object> d = new Hashtable<String, Object>();
+		d.put(EventConstants.EVENT_TOPIC, eventTopic);
+		d.put("data1", new Integer(5));
+		d.put("data2", "sample");
+		Event event = new Event(eventTopic, d);
+		helper.sendEvent(event);
+		
+		assertEquals(1, target.counter1);
+		assertEquals(event, target.event);
+		assertEquals(new Integer(5), target.event.getProperty("data1"));
+		assertEquals("sample", target.event.getProperty("data2"));
+	}
+	
 	private void wrapSetup() throws InvocationTargetException, InstantiationException {
 		IEclipseContext context = EclipseContextFactory.create();
 		{