From 3ee9abe6855684d0a002e53089ec227b6a6d0655 Mon Sep 17 00:00:00 2001 From: Michele Rastelli Date: Wed, 20 Mar 2024 10:58:04 +0100 Subject: [PATCH] tolerate SPI ServiceConfigurationError --- core/src/main/java/com/arangodb/ArangoDB.java | 15 ++++++++++----- .../arangodb/internal/config/ArangoConfig.java | 10 +++++++++- .../internal/serde/InternalMapperProvider.java | 12 +++++++++++- .../serde/jackson/JacksonMapperProvider.java | 12 +++++++++++- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/com/arangodb/ArangoDB.java b/core/src/main/java/com/arangodb/ArangoDB.java index 466df4653..48ee8b287 100644 --- a/core/src/main/java/com/arangodb/ArangoDB.java +++ b/core/src/main/java/com/arangodb/ArangoDB.java @@ -36,9 +36,7 @@ import javax.annotation.concurrent.ThreadSafe; import javax.net.ssl.SSLContext; -import java.util.ArrayList; -import java.util.Collection; -import java.util.ServiceLoader; +import java.util.*; import java.util.concurrent.Executor; /** @@ -618,7 +616,6 @@ public Builder serde(final ArangoSerde serde) { * * @param executor async downstream executor * @return {@link ArangoDB.Builder} - * * @deprecated for removal. To consume the responses in a custom executor use async CompletableFuture methods. */ @Deprecated @@ -630,7 +627,15 @@ public Builder asyncExecutor(final Executor executor) { @UnstableApi protected ProtocolProvider protocolProvider(Protocol protocol) { ServiceLoader loader = ServiceLoader.load(ProtocolProvider.class); - for (ProtocolProvider p : loader) { + Iterator iterator = loader.iterator(); + while (iterator.hasNext()) { + ProtocolProvider p; + try { + p = iterator.next(); + } catch (ServiceConfigurationError e) { + LOG.warn("ServiceLoader failed to load ProtocolProvider", e); + continue; + } if (p.supportsProtocol(protocol)) { return p; } diff --git a/core/src/main/java/com/arangodb/internal/config/ArangoConfig.java b/core/src/main/java/com/arangodb/internal/config/ArangoConfig.java index 814d40d25..0aa67812f 100644 --- a/core/src/main/java/com/arangodb/internal/config/ArangoConfig.java +++ b/core/src/main/java/com/arangodb/internal/config/ArangoConfig.java @@ -51,7 +51,15 @@ public class ArangoConfig { private static ArangoSerdeProvider serdeProvider(ContentType contentType) { ServiceLoader loader = ServiceLoader.load(ArangoSerdeProvider.class); ArangoSerdeProvider serdeProvider = null; - for (ArangoSerdeProvider p : loader) { + Iterator iterator = loader.iterator(); + while (iterator.hasNext()) { + ArangoSerdeProvider p; + try { + p = iterator.next(); + } catch (ServiceConfigurationError e) { + LOG.warn("ServiceLoader failed to load ArangoSerdeProvider", e); + continue; + } if (contentType.equals(p.getContentType())) { if (serdeProvider != null) { throw new ArangoDBException("Found multiple serde providers! Please set explicitly the one to use."); diff --git a/core/src/main/java/com/arangodb/internal/serde/InternalMapperProvider.java b/core/src/main/java/com/arangodb/internal/serde/InternalMapperProvider.java index 51c381611..e7b0fbda9 100644 --- a/core/src/main/java/com/arangodb/internal/serde/InternalMapperProvider.java +++ b/core/src/main/java/com/arangodb/internal/serde/InternalMapperProvider.java @@ -7,6 +7,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Iterator; +import java.util.ServiceConfigurationError; import java.util.ServiceLoader; class InternalMapperProvider { @@ -23,7 +25,15 @@ static ObjectMapper of(final ContentType contentType) { } ServiceLoader sl = ServiceLoader.load(JsonFactory.class); - for (JsonFactory jf : sl) { + Iterator iterator = sl.iterator(); + while (iterator.hasNext()) { + JsonFactory jf; + try { + jf = iterator.next(); + } catch (ServiceConfigurationError e) { + LOG.warn("ServiceLoader failed to load JsonFactory", e); + continue; + } if (formatName.equals(jf.getFormatName())) { if (contentType == ContentType.JSON) { JacksonUtils.tryConfigureJsonFactory(jf); diff --git a/jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonMapperProvider.java b/jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonMapperProvider.java index 978cfe4b0..39c6065a0 100644 --- a/jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonMapperProvider.java +++ b/jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonMapperProvider.java @@ -8,6 +8,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Iterator; +import java.util.ServiceConfigurationError; import java.util.ServiceLoader; /** @@ -27,7 +29,15 @@ public static ObjectMapper of(final ContentType contentType) { } ServiceLoader sl = ServiceLoader.load(JsonFactory.class); - for (JsonFactory jf : sl) { + Iterator iterator = sl.iterator(); + while (iterator.hasNext()) { + JsonFactory jf; + try { + jf = iterator.next(); + } catch (ServiceConfigurationError e) { + LOG.warn("ServiceLoader failed to load JsonFactory", e); + continue; + } if (formatName.equals(jf.getFormatName())) { if (contentType == ContentType.JSON) { JacksonUtils.tryConfigureJsonFactory(jf);