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