From e255bd195e929884d261e7fa7cb5ba2cb3bae3de Mon Sep 17 00:00:00 2001 From: Gary Tierney Date: Sun, 19 Aug 2018 20:32:42 +0100 Subject: [PATCH] Replace fast-classpath-scanner with classgraph --- game/build.gradle | 2 +- .../game/plugin/KotlinPluginEnvironment.java | 38 ++++++++++++------- gradle/properties.gradle | 2 +- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/game/build.gradle b/game/build.gradle index f82e7502..378fa03f 100644 --- a/game/build.gradle +++ b/game/build.gradle @@ -15,7 +15,7 @@ dependencies { compile group: 'org.jetbrains.kotlinx', name: 'kotlinx-coroutines-core', version: kotlinxCoroutinesVersion implementation group: 'com.google.guava', name: 'guava', version: guavaVersion - implementation group: 'io.github.lukehutch', name: 'fast-classpath-scanner', version: classpathScannerVersion + implementation group: 'io.github.classgraph', name: 'classgraph', version: classGraphVersion implementation group: 'com.lambdaworks', name: 'scrypt', version: scryptVersion testImplementation group: 'junit', name: 'junit', version: junitVersion diff --git a/game/src/main/java/org/apollo/game/plugin/KotlinPluginEnvironment.java b/game/src/main/java/org/apollo/game/plugin/KotlinPluginEnvironment.java index cc187cb1..d86cd0ed 100644 --- a/game/src/main/java/org/apollo/game/plugin/KotlinPluginEnvironment.java +++ b/game/src/main/java/org/apollo/game/plugin/KotlinPluginEnvironment.java @@ -1,6 +1,9 @@ package org.apollo.game.plugin; -import io.github.lukehutch.fastclasspathscanner.FastClasspathScanner; +import io.github.classgraph.ClassGraph; +import io.github.classgraph.ClassInfo; +import io.github.classgraph.ClassInfoList; +import io.github.classgraph.ScanResult; import org.apollo.game.model.World; import org.apollo.game.plugin.kotlin.KotlinPluginScript; @@ -13,6 +16,7 @@ import java.util.logging.Logger; public class KotlinPluginEnvironment implements PluginEnvironment { private static final Logger logger = Logger.getLogger(KotlinPluginEnvironment.class.getName()); + private static final String PLUGIN_SUFFIX = "_plugin"; private final World world; private PluginContext context; @@ -26,25 +30,26 @@ public class KotlinPluginEnvironment implements PluginEnvironment { List pluginScripts = new ArrayList<>(); List> pluginClasses = new ArrayList<>(); - new FastClasspathScanner() - .matchSubclassesOf(KotlinPluginScript.class, pluginClasses::add) - .scan(); + ClassGraph classGraph = new ClassGraph().enableAllInfo(); - try { - for (Class pluginClass : pluginClasses) { - Constructor pluginConstructor = - pluginClass.getConstructor(World.class, PluginContext.class); + try (ScanResult scanResult = classGraph.scan()) { + ClassInfoList pluginClassList = scanResult + .getSubclasses(KotlinPluginScript.class.getName()) + .directOnly(); - pluginScripts.add(pluginConstructor.newInstance(world, context)); + for (ClassInfo pluginClassInfo : pluginClassList) { + Class scriptClass = pluginClassInfo.loadClass(KotlinPluginScript.class); + Constructor scriptConstructor = scriptClass.getConstructor(World.class, + PluginContext.class); + + pluginScripts.add(scriptConstructor.newInstance(world, context)); + logger.info(String.format("Loaded plugin: %s", pluginDescriptor(scriptClass))); } } catch (Exception e) { throw new RuntimeException(e); } - pluginScripts.forEach(script -> { - logger.info("Starting script: " + script.getClass().getName()); - script.doStart(world); - }); + pluginScripts.forEach(script -> script.doStart(world)); } @Override @@ -52,4 +57,11 @@ public class KotlinPluginEnvironment implements PluginEnvironment { this.context = context; } + private static String pluginDescriptor(Class clazz) { + String className = clazz.getSimpleName(); + String name = className.substring(0, className.length() - PLUGIN_SUFFIX.length()); + Package pkg = clazz.getPackage(); + + return pkg == null ? name : name + " from " + pkg.getName(); + } } diff --git a/gradle/properties.gradle b/gradle/properties.gradle index 1eb5cd9a..a5b882c5 100644 --- a/gradle/properties.gradle +++ b/gradle/properties.gradle @@ -10,5 +10,5 @@ ext { guavaVersion = '19.0' commonsCompressVersion = '1.10' assertjVersion = '3.8.0' - classpathScannerVersion = '2.0.21' + classGraphVersion = '4.0.6' } \ No newline at end of file