[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
+  {
+  }
 }