[573653] Provide a EventUtil.addListener(Object notifier, Class<E> eventType, Consumer<E> eventConsumer) helper method
https://bugs.eclipse.org/bugs/show_bug.cgi?id=573653
diff --git a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/event/EventUtil.java b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/event/EventUtil.java
index e8c7780..82e94cd 100644
--- a/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/event/EventUtil.java
+++ b/plugins/org.eclipse.net4j.util/src/org/eclipse/net4j/util/event/EventUtil.java
@@ -12,6 +12,8 @@
import org.eclipse.net4j.util.event.INotifier.INotifier2;
+import java.util.function.Consumer;
+
/**
* Various static helper methods for dealing with {@link IEvent events}, {@link INotifier notifiers} and
* {@link IListener listeners}.
@@ -62,6 +64,41 @@
return false;
}
+ /**
+ * @since 3.15
+ */
+ public static <E extends IEvent> AutoCloseable addListener(Object notifier, Class<E> eventType, Consumer<E> eventConsumer)
+ {
+ if (notifier instanceof INotifier)
+ {
+ INotifier n = (INotifier)notifier;
+
+ AutoCloseableListener listener = new AutoCloseableListener()
+ {
+ @Override
+ public void notifyEvent(IEvent event)
+ {
+ if (eventType.isInstance(event))
+ {
+ eventConsumer.accept(eventType.cast(event));
+ }
+ }
+
+ @Override
+ public void close() throws Exception
+ {
+ n.removeListener(this);
+ }
+ };
+
+ n.addListener(listener);
+ return listener;
+ }
+
+ return () -> {
+ };
+ }
+
public static boolean removeListener(Object notifier, IListener listener)
{
if (notifier instanceof INotifier)
@@ -107,4 +144,11 @@
return false;
}
+
+ /**
+ * @author Eike Stepper
+ */
+ private static interface AutoCloseableListener extends IListener, AutoCloseable
+ {
+ }
}