Skip to content

Commit 96cfe06

Browse files
Merge branch 'develop' into release/1.1.0
2 parents 266a4b6 + 984a038 commit 96cfe06

File tree

4 files changed

+48
-2
lines changed

4 files changed

+48
-2
lines changed

pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,24 @@
3838
</licenses>
3939

4040
<dependencies>
41+
<dependency>
42+
<groupId>org.slf4j</groupId>
43+
<artifactId>slf4j-api</artifactId>
44+
<version>1.7.36</version>
45+
</dependency>
46+
4147
<dependency>
4248
<groupId>org.jetbrains</groupId>
4349
<artifactId>annotations</artifactId>
4450
<version>23.0.0</version>
4551
<scope>provided</scope>
4652
</dependency>
53+
<dependency>
54+
<groupId>org.slf4j</groupId>
55+
<artifactId>slf4j-simple</artifactId>
56+
<version>1.7.36</version>
57+
<scope>test</scope>
58+
</dependency>
4759
<dependency>
4860
<groupId>org.junit.jupiter</groupId>
4961
<artifactId>junit-jupiter</artifactId>

src/main/java/module-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
module org.cryptomator.integrations.api {
99
requires static org.jetbrains.annotations;
10+
requires org.slf4j;
1011

1112
exports org.cryptomator.integrations.autostart;
1213
exports org.cryptomator.integrations.common;

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.jetbrains.annotations.Contract;
44
import org.jetbrains.annotations.VisibleForTesting;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
57

68
import java.io.IOException;
79
import java.io.UncheckedIOException;
@@ -10,9 +12,12 @@
1012
import java.net.URLClassLoader;
1113
import java.nio.file.Files;
1214
import java.nio.file.Path;
15+
import java.util.Arrays;
16+
import java.util.stream.Collectors;
1317

1418
class ClassLoaderFactory {
1519

20+
private static final Logger LOG = LoggerFactory.getLogger(ClassLoaderFactory.class);
1621
private static final String USER_HOME = System.getProperty("user.home");
1722
private static final String PLUGIN_DIR_KEY = "cryptomator.pluginDir";
1823
private static final String JAR_SUFFIX = ".jar";
@@ -38,7 +43,12 @@ public static URLClassLoader forPluginDir() {
3843
@VisibleForTesting
3944
@Contract(value = "_ -> new", pure = true)
4045
static URLClassLoader forPluginDirWithPath(Path path) throws UncheckedIOException {
41-
return URLClassLoader.newInstance(findJars(path));
46+
var jars = findJars(path);
47+
if (LOG.isDebugEnabled()) {
48+
String jarList = Arrays.stream(jars).map(URL::getPath).collect(Collectors.joining(", "));
49+
LOG.debug("Found jars in cryptomator.pluginDir: {}", jarList);
50+
}
51+
return URLClassLoader.newInstance(jars);
4252
}
4353

4454
@VisibleForTesting

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

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.jetbrains.annotations.Nullable;
44
import org.jetbrains.annotations.VisibleForTesting;
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
57

68
import java.lang.reflect.Method;
79
import java.lang.reflect.Modifier;
@@ -13,6 +15,8 @@
1315

1416
public class IntegrationsLoader {
1517

18+
private static final Logger LOG = LoggerFactory.getLogger(IntegrationsLoader.class);
19+
1620
private IntegrationsLoader() {
1721
}
1822

@@ -39,11 +43,19 @@ public static <T> Optional<T> load(Class<T> clazz) {
3943
public static <T> Stream<T> loadAll(Class<T> clazz) {
4044
return ServiceLoader.load(clazz, ClassLoaderFactory.forPluginDir())
4145
.stream()
46+
.peek(service -> logFoundService(clazz, service.type()))
4247
.filter(IntegrationsLoader::isSupportedOperatingSystem)
4348
.filter(IntegrationsLoader::passesStaticAvailabilityCheck)
4449
.sorted(Comparator.comparingInt(IntegrationsLoader::getPriority).reversed())
4550
.map(ServiceLoader.Provider::get)
46-
.filter(IntegrationsLoader::passesInstanceAvailabilityCheck);
51+
.filter(IntegrationsLoader::passesInstanceAvailabilityCheck)
52+
.peek(impl -> logServiceIsAvailable(clazz, impl.getClass()));
53+
}
54+
55+
private static void logFoundService(Class<?> apiType, Class<?> implType) {
56+
if (LOG.isDebugEnabled()) {
57+
LOG.debug("{}: Found implementation: {} in jar {}", apiType.getSimpleName(), implType.getName(), implType.getProtectionDomain().getCodeSource().getLocation().getPath());
58+
}
4759
}
4860

4961
private static int getPriority(ServiceLoader.Provider<?> provider) {
@@ -70,10 +82,20 @@ static boolean passesInstanceAvailabilityCheck(Object instance) {
7082
return passesAvailabilityCheck(instance.getClass(), instance);
7183
}
7284

85+
private static void logServiceIsAvailable(Class<?> apiType, Class<?> implType) {
86+
if (LOG.isDebugEnabled()) {
87+
LOG.debug("{}: Implementation is available: {}", apiType.getSimpleName(), implType.getName());
88+
}
89+
}
90+
7391
private static <T> boolean passesAvailabilityCheck(Class<? extends T> type, @Nullable T instance) {
7492
if (!type.isAnnotationPresent(CheckAvailability.class)) {
7593
return true; // if type is not annotated, skip tests
7694
}
95+
if (!type.getModule().isExported(type.getPackageName(), IntegrationsLoader.class.getModule())) {
96+
LOG.error("Can't run @CheckAvailability tests for class {}. Make sure to export {} to {}!", type.getName(), type.getPackageName(), IntegrationsLoader.class.getPackageName());
97+
return false;
98+
}
7799
return Arrays.stream(type.getMethods())
78100
.filter(m -> isAvailabilityCheck(m, instance == null))
79101
.allMatch(m -> passesAvailabilityCheck(m, instance));
@@ -84,6 +106,7 @@ private static boolean passesAvailabilityCheck(Method m, @Nullable Object instan
84106
try {
85107
return (boolean) m.invoke(instance);
86108
} catch (ReflectiveOperationException e) {
109+
LOG.warn("Failed to invoke @CheckAvailability test {}#{}", m.getDeclaringClass(), m.getName(), e);
87110
return false;
88111
}
89112
}

0 commit comments

Comments
 (0)