diff --git a/src/main/java/net/minestom/server/extensions/ExtensionManager.java b/src/main/java/net/minestom/server/extensions/ExtensionManager.java index 65a8dc338..dbe90838f 100644 --- a/src/main/java/net/minestom/server/extensions/ExtensionManager.java +++ b/src/main/java/net/minestom/server/extensions/ExtensionManager.java @@ -16,7 +16,6 @@ import java.io.*; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import java.util.*; @@ -553,7 +552,7 @@ public class ExtensionManager { loadExtensionList(extensionsToReload); } - public void loadDynamicExtension(File jarFile) throws FileNotFoundException { + public boolean loadDynamicExtension(File jarFile) throws FileNotFoundException { if(!jarFile.exists()) { throw new FileNotFoundException("File '"+jarFile.getAbsolutePath()+"' does not exists. Cannot load extension."); } @@ -561,10 +560,10 @@ public class ExtensionManager { log.info("Discover dynamic extension from jar {}", jarFile.getAbsolutePath()); DiscoveredExtension discoveredExtension = discoverFromJar(jarFile); List extensionsToLoad = Collections.singletonList(discoveredExtension); - loadExtensionList(extensionsToLoad); + return loadExtensionList(extensionsToLoad); } - private void loadExtensionList(List extensionsToLoad) { + private boolean loadExtensionList(List extensionsToLoad) { // ensure correct order of dependencies log.debug("Reorder extensions to ensure proper load order"); extensionsToLoad = generateLoadOrder(extensionsToLoad); @@ -585,7 +584,14 @@ public class ExtensionManager { // reload extensions log.info("Actually load extension {}", toReload.getName()); Extension loadedExtension = attemptSingleLoad(toReload); - newExtensions.add(loadedExtension); + if(loadedExtension != null) { + newExtensions.add(loadedExtension); + } + } + + if(newExtensions.isEmpty()) { + log.error("No extensions to load, skipping callbacks"); + return false; } log.info("Load complete, firing preinit, init and then postinit callbacks"); @@ -593,6 +599,7 @@ public class ExtensionManager { newExtensions.forEach(Extension::preInitialize); newExtensions.forEach(Extension::initialize); newExtensions.forEach(Extension::postInitialize); + return true; } public void unloadExtension(String extensionName) { diff --git a/src/test/java/demo/commands/LoadExtensionCommand.java b/src/test/java/demo/commands/LoadExtensionCommand.java index d5750e6be..dcb0399a8 100644 --- a/src/test/java/demo/commands/LoadExtensionCommand.java +++ b/src/test/java/demo/commands/LoadExtensionCommand.java @@ -38,14 +38,24 @@ public class LoadExtensionCommand extends Command { ExtensionManager extensionManager = MinecraftServer.getExtensionManager(); Path extensionFolder = extensionManager.getExtensionFolder().toPath().toAbsolutePath(); Path extensionJar = extensionFolder.resolve(name); - if(!extensionJar.toAbsolutePath().startsWith(extensionFolder)) { - sender.sendMessage("File name '"+name+"' does not represent a file inside the extensions folder. Will not load"); + try { + if(!extensionJar.toFile().getCanonicalPath().startsWith(extensionFolder.toFile().getCanonicalPath())) { + sender.sendMessage("File name '"+name+"' does not represent a file inside the extensions folder. Will not load"); + return; + } + } catch (IOException e) { + e.printStackTrace(); + sender.sendMessage("Failed to load extension: "+e.getMessage()); return; } try { - extensionManager.loadDynamicExtension(extensionJar.toFile()); - sender.sendMessage("Extension loaded!"); + boolean managed = extensionManager.loadDynamicExtension(extensionJar.toFile()); + if(managed) { + sender.sendMessage("Extension loaded!"); + } else { + sender.sendMessage("Failed to load extension, check your logs."); + } } catch (Exception e) { e.printStackTrace(); sender.sendMessage("Failed to load extension: "+e.getMessage());