This is an automated email from the ASF dual-hosted git repository.

twalthr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/flink.git


The following commit(s) were added to refs/heads/master by this push:
     new dd446c9  [FLINK-25186][table-common] Fix ServiceLoaderUtil#load to 
work with Java 11
dd446c9 is described below

commit dd446c9d56be5f33c683611102ec7026cf95e395
Author: slinkydeveloper <francescogu...@gmail.com>
AuthorDate: Mon Dec 6 12:30:05 2021 +0100

    [FLINK-25186][table-common] Fix ServiceLoaderUtil#load to work with Java 11
    
    This closes #18020.
---
 .../apache/flink/table/factories/FactoryUtil.java  |  2 +-
 .../flink/table/factories/ServiceLoaderUtil.java   | 61 ++++++++--------------
 2 files changed, 23 insertions(+), 40 deletions(-)

diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/FactoryUtil.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/FactoryUtil.java
index 5430b3a..cd828de 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/FactoryUtil.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/FactoryUtil.java
@@ -690,7 +690,7 @@ public final class FactoryUtil {
     static List<Factory> discoverFactories(ClassLoader classLoader) {
         final List<Factory> result = new LinkedList<>();
         ServiceLoaderUtil.load(Factory.class, classLoader)
-                .forEachRemaining(
+                .forEach(
                         loadResult -> {
                             if (loadResult.hasFailed()) {
                                 if (loadResult.getError() instanceof 
NoClassDefFoundError) {
diff --git 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/ServiceLoaderUtil.java
 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/ServiceLoaderUtil.java
index 313ae5c..620e9c3 100644
--- 
a/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/ServiceLoaderUtil.java
+++ 
b/flink-table/flink-table-common/src/main/java/org/apache/flink/table/factories/ServiceLoaderUtil.java
@@ -18,7 +18,9 @@
 
 package org.apache.flink.table.factories;
 
+import java.util.ArrayList;
 import java.util.Iterator;
+import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.ServiceLoader;
 
@@ -26,12 +28,27 @@ import java.util.ServiceLoader;
 class ServiceLoaderUtil {
 
     /**
-     * This method behaves similarly to {@link ServiceLoader#load(Class, 
ClassLoader)} and it also
-     * wraps the returned {@link Iterator} to iterate safely through the 
loaded services, eventually
-     * catching load failures like {@link NoClassDefFoundError}.
+     * This method behaves similarly to {@link ServiceLoader#load(Class, 
ClassLoader)}, but it
+     * returns a list with the results of the iteration, wrapping the 
iteration failures such as
+     * {@link NoClassDefFoundError}.
      */
-    static <T> Iterator<LoadResult<T>> load(Class<T> clazz, ClassLoader 
classLoader) {
-        return new SafeIterator<>(ServiceLoader.load(clazz, 
classLoader).iterator());
+    static <T> List<LoadResult<T>> load(Class<T> clazz, ClassLoader 
classLoader) {
+        List<LoadResult<T>> loadResults = new ArrayList<>();
+
+        Iterator<T> serviceLoaderIterator = ServiceLoader.load(clazz, 
classLoader).iterator();
+
+        while (true) {
+            try {
+                T next = serviceLoaderIterator.next();
+                loadResults.add(new LoadResult<>(next));
+            } catch (NoSuchElementException e) {
+                break;
+            } catch (Throwable t) {
+                loadResults.add(new LoadResult<>(t));
+            }
+        }
+
+        return loadResults;
     }
 
     static class LoadResult<T> {
@@ -63,38 +80,4 @@ class ServiceLoaderUtil {
             return service;
         }
     }
-
-    /**
-     * This iterator wraps {@link Iterator#hasNext()} and {@link 
Iterator#next()} in try-catch, and
-     * returns {@link LoadResult} to handle such failures.
-     */
-    private static class SafeIterator<T> implements Iterator<LoadResult<T>> {
-
-        private final Iterator<T> iterator;
-
-        public SafeIterator(Iterator<T> iterator) {
-            this.iterator = iterator;
-        }
-
-        @Override
-        public boolean hasNext() {
-            try {
-                return iterator.hasNext();
-            } catch (Throwable t) {
-                return true;
-            }
-        }
-
-        @Override
-        public LoadResult<T> next() {
-            try {
-                if (iterator.hasNext()) {
-                    return new LoadResult<>(iterator.next());
-                }
-            } catch (Throwable t) {
-                return new LoadResult<>(t);
-            }
-            throw new NoSuchElementException();
-        }
-    }
 }

Reply via email to