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(); {