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 <[email protected]>
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();
- }
- }
}