Skip to content

Commit acee357

Browse files
authored
tolerate SPI ServiceConfigurationError (#552)
1 parent d386914 commit acee357

File tree

4 files changed

+41
-8
lines changed

4 files changed

+41
-8
lines changed

Diff for: core/src/main/java/com/arangodb/ArangoDB.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@
3636

3737
import javax.annotation.concurrent.ThreadSafe;
3838
import javax.net.ssl.SSLContext;
39-
import java.util.ArrayList;
40-
import java.util.Collection;
41-
import java.util.ServiceLoader;
39+
import java.util.*;
4240
import java.util.concurrent.Executor;
4341

4442
/**
@@ -618,7 +616,6 @@ public Builder serde(final ArangoSerde serde) {
618616
*
619617
* @param executor async downstream executor
620618
* @return {@link ArangoDB.Builder}
621-
*
622619
* @deprecated for removal. To consume the responses in a custom executor use async CompletableFuture methods.
623620
*/
624621
@Deprecated
@@ -630,7 +627,15 @@ public Builder asyncExecutor(final Executor executor) {
630627
@UnstableApi
631628
protected ProtocolProvider protocolProvider(Protocol protocol) {
632629
ServiceLoader<ProtocolProvider> loader = ServiceLoader.load(ProtocolProvider.class);
633-
for (ProtocolProvider p : loader) {
630+
Iterator<ProtocolProvider> iterator = loader.iterator();
631+
while (iterator.hasNext()) {
632+
ProtocolProvider p;
633+
try {
634+
p = iterator.next();
635+
} catch (ServiceConfigurationError e) {
636+
LOG.warn("ServiceLoader failed to load ProtocolProvider", e);
637+
continue;
638+
}
634639
if (p.supportsProtocol(protocol)) {
635640
return p;
636641
}

Diff for: core/src/main/java/com/arangodb/internal/config/ArangoConfig.java

+9-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,15 @@ public class ArangoConfig {
5151
private static ArangoSerdeProvider serdeProvider(ContentType contentType) {
5252
ServiceLoader<ArangoSerdeProvider> loader = ServiceLoader.load(ArangoSerdeProvider.class);
5353
ArangoSerdeProvider serdeProvider = null;
54-
for (ArangoSerdeProvider p : loader) {
54+
Iterator<ArangoSerdeProvider> iterator = loader.iterator();
55+
while (iterator.hasNext()) {
56+
ArangoSerdeProvider p;
57+
try {
58+
p = iterator.next();
59+
} catch (ServiceConfigurationError e) {
60+
LOG.warn("ServiceLoader failed to load ArangoSerdeProvider", e);
61+
continue;
62+
}
5563
if (contentType.equals(p.getContentType())) {
5664
if (serdeProvider != null) {
5765
throw new ArangoDBException("Found multiple serde providers! Please set explicitly the one to use.");

Diff for: core/src/main/java/com/arangodb/internal/serde/InternalMapperProvider.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.slf4j.Logger;
88
import org.slf4j.LoggerFactory;
99

10+
import java.util.Iterator;
11+
import java.util.ServiceConfigurationError;
1012
import java.util.ServiceLoader;
1113

1214
class InternalMapperProvider {
@@ -23,7 +25,15 @@ static ObjectMapper of(final ContentType contentType) {
2325
}
2426

2527
ServiceLoader<JsonFactory> sl = ServiceLoader.load(JsonFactory.class);
26-
for (JsonFactory jf : sl) {
28+
Iterator<JsonFactory> iterator = sl.iterator();
29+
while (iterator.hasNext()) {
30+
JsonFactory jf;
31+
try {
32+
jf = iterator.next();
33+
} catch (ServiceConfigurationError e) {
34+
LOG.warn("ServiceLoader failed to load JsonFactory", e);
35+
continue;
36+
}
2737
if (formatName.equals(jf.getFormatName())) {
2838
if (contentType == ContentType.JSON) {
2939
JacksonUtils.tryConfigureJsonFactory(jf);

Diff for: jackson-serde-json/src/main/java/com/arangodb/serde/jackson/JacksonMapperProvider.java

+11-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
import org.slf4j.Logger;
99
import org.slf4j.LoggerFactory;
1010

11+
import java.util.Iterator;
12+
import java.util.ServiceConfigurationError;
1113
import java.util.ServiceLoader;
1214

1315
/**
@@ -27,7 +29,15 @@ public static ObjectMapper of(final ContentType contentType) {
2729
}
2830

2931
ServiceLoader<JsonFactory> sl = ServiceLoader.load(JsonFactory.class);
30-
for (JsonFactory jf : sl) {
32+
Iterator<JsonFactory> iterator = sl.iterator();
33+
while (iterator.hasNext()) {
34+
JsonFactory jf;
35+
try {
36+
jf = iterator.next();
37+
} catch (ServiceConfigurationError e) {
38+
LOG.warn("ServiceLoader failed to load JsonFactory", e);
39+
continue;
40+
}
3141
if (formatName.equals(jf.getFormatName())) {
3242
if (contentType == ContentType.JSON) {
3343
JacksonUtils.tryConfigureJsonFactory(jf);

0 commit comments

Comments
 (0)