]> source.dussan.org Git - pf4j.git/commitdiff
Unload broken plugins fix (#545)
authorfinn0s <90374296+finn0s@users.noreply.github.com>
Fri, 15 Sep 2023 07:40:45 +0000 (09:40 +0200)
committerGitHub <noreply@github.com>
Fri, 15 Sep 2023 07:40:45 +0000 (10:40 +0300)
pf4j/src/main/java/org/pf4j/AbstractPluginManager.java
pf4j/src/test/java/org/pf4j/JarPluginManagerTest.java

index f56a94f1146bbb802c918b166c27ceffa56be769..a23fc6a7b741a1d7e1f8ba12ae81737251129357 100644 (file)
@@ -280,15 +280,22 @@ public abstract class AbstractPluginManager implements PluginManager {
                     dependents.addAll(0, dependencyResolver.getDependents(dependent));
                 }
             }
+            PluginWrapper pluginWrapper = getPlugin(pluginId);
+            PluginState pluginState;
+            try {
+                pluginState = stopPlugin(pluginId, false);
+                if (PluginState.STARTED == pluginState) {
+                    return false;
+                }
 
-            PluginState pluginState = stopPlugin(pluginId, false);
-            if (PluginState.STARTED == pluginState) {
-                return false;
+                log.info("Unload plugin '{}'", getPluginLabel(pluginWrapper.getDescriptor()));
+            } catch (Exception e) {
+                if (pluginWrapper == null) {
+                    return false;
+                }
+                pluginState = PluginState.FAILED;
             }
 
-            PluginWrapper pluginWrapper = getPlugin(pluginId);
-            log.info("Unload plugin '{}'", getPluginLabel(pluginWrapper.getDescriptor()));
-
             // remove the plugin
             plugins.remove(pluginId);
             getResolvedPlugins().remove(pluginWrapper);
index 0e16f752e3e929cd5e283c47b438f8f13e08a45c..8cbb42bb008f193566fb5424fc223e4287992514 100644 (file)
 package org.pf4j;
 
 import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledOnOs;
+import org.junit.jupiter.api.condition.OS;
 import org.junit.jupiter.api.io.TempDir;
 import org.pf4j.test.PluginJar;
 import org.pf4j.test.TestExtension;
@@ -25,8 +28,11 @@ import org.pf4j.test.TestExtensionPoint;
 import org.pf4j.test.TestPlugin;
 
 import java.io.IOException;
+import java.nio.file.FileSystemException;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -95,4 +101,28 @@ public class JarPluginManagerTest {
         assertFalse(pluginJar.file().exists());
     }
 
+    @Test
+    @EnabledOnOs(OS.WINDOWS)
+    public void releaseBrokenJarOnWindows() throws IOException {
+        PluginJar pluginZip = new PluginJar.Builder(pluginsPath.resolve("test.jar"), "test")
+            .pluginVersion("1.2.3")
+            .pluginClass("invalidClass")
+            .build();
+
+        pluginManager.loadPlugins();
+        Path pluginPath = pluginManager.getPlugin(pluginZip.pluginId()).getPluginPath();
+
+        try {
+            pluginManager.startPlugin(pluginZip.pluginId());
+        } catch (Exception exceptionStartPlugin) {
+            Assertions.assertThrows(FileSystemException.class, () -> Files.delete(pluginPath));
+
+            // Try to remove the plugin if it cannot be started
+            try {
+                pluginManager.unloadPlugin(pluginZip.pluginId());
+            } catch (Exception ignored2) {
+            }
+            Assertions.assertDoesNotThrow(() -> Files.delete(pluginPath));
+        }
+    }
 }