Skip to content

Commit 928c9a1

Browse files
committed
closes #26
1 parent 261b915 commit 928c9a1

1 file changed

Lines changed: 25 additions & 3 deletions

File tree

src/main/java/org/cryptomator/integrations/common/IntegrationsLoader.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@
99
import java.lang.reflect.Modifier;
1010
import java.util.Arrays;
1111
import java.util.Comparator;
12+
import java.util.Objects;
1213
import java.util.Optional;
14+
import java.util.ServiceConfigurationError;
1315
import java.util.ServiceLoader;
1416
import java.util.stream.Stream;
1517

@@ -47,7 +49,8 @@ public static <T> Stream<T> loadAll(Class<T> clazz) {
4749
.filter(IntegrationsLoader::isSupportedOperatingSystem)
4850
.filter(IntegrationsLoader::passesStaticAvailabilityCheck)
4951
.sorted(Comparator.comparingInt(IntegrationsLoader::getPriority).reversed())
50-
.map(ServiceLoader.Provider::get)
52+
.map(IntegrationsLoader::instantiateServiceProvider)
53+
.filter(Objects::nonNull)
5154
.filter(IntegrationsLoader::passesInstanceAvailabilityCheck)
5255
.peek(impl -> logServiceIsAvailable(clazz, impl.getClass()));
5356
}
@@ -68,18 +71,37 @@ private static boolean isSupportedOperatingSystem(ServiceLoader.Provider<?> prov
6871
return annotations.length == 0 || Arrays.stream(annotations).anyMatch(OperatingSystem.Value::isCurrent);
6972
}
7073

74+
private static <T> T instantiateServiceProvider(ServiceLoader.Provider<T> provider) {
75+
try {
76+
return provider.get();
77+
} catch (ServiceConfigurationError err) {
78+
LOG.warn("Unable to load service provider {}.", provider.type().getName(), err);
79+
return null;
80+
}
81+
}
82+
7183
private static boolean passesStaticAvailabilityCheck(ServiceLoader.Provider<?> provider) {
7284
return passesStaticAvailabilityCheck(provider.type());
7385
}
7486

7587
@VisibleForTesting
7688
static boolean passesStaticAvailabilityCheck(Class<?> type) {
77-
return passesAvailabilityCheck(type, null);
89+
try {
90+
return passesAvailabilityCheck(type, null);
91+
} catch (ExceptionInInitializerError | NoClassDefFoundError | RuntimeException t) {
92+
LOG.warn("Unable to load service provider {}.", type.getName(), t);
93+
return false;
94+
}
7895
}
7996

8097
@VisibleForTesting
8198
static boolean passesInstanceAvailabilityCheck(Object instance) {
82-
return passesAvailabilityCheck(instance.getClass(), instance);
99+
try {
100+
return passesAvailabilityCheck(instance.getClass(), instance);
101+
} catch (RuntimeException rte) {
102+
LOG.warn("Unable to load service provider {}.", instance.getClass().getName(), rte);
103+
return false;
104+
}
83105
}
84106

85107
private static void logServiceIsAvailable(Class<?> apiType, Class<?> implType) {

0 commit comments

Comments
 (0)