]> source.dussan.org Git - pf4j.git/commitdiff
Resolve #335
authorDecebal Suiu <decebal.suiu@gmail.com>
Mon, 5 Aug 2019 19:28:14 +0000 (22:28 +0300)
committerDecebal Suiu <decebal.suiu@gmail.com>
Mon, 5 Aug 2019 19:28:14 +0000 (22:28 +0300)
pf4j/src/main/java/org/pf4j/DefaultPluginStatusProvider.java
pf4j/src/main/java/org/pf4j/util/FileUtils.java
pf4j/src/test/java/org/pf4j/DefaultPluginStatusProviderTest.java

index 0b88fe8f0241706667dff9987effc0135301aa24..37e84b9e6d85941f2cca50705b677ba3105aa692 100644 (file)
@@ -20,6 +20,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.List;
 
@@ -45,11 +46,11 @@ public class DefaultPluginStatusProvider implements PluginStatusProvider {
 
         try {
             // create a list with plugin identifiers that should be only accepted by this manager (whitelist from plugins/enabled.txt file)
-            enabledPlugins = FileUtils.readLines(pluginsRoot.resolve("enabled.txt"), true);
+            enabledPlugins = FileUtils.readLines(getEnabledFilePath(), true);
             log.info("Enabled plugins: {}", enabledPlugins);
 
             // create a list with plugin identifiers that should not be accepted by this manager (blacklist from plugins/disabled.txt file)
-            disabledPlugins = FileUtils.readLines(pluginsRoot.resolve("disabled.txt"), true);
+            disabledPlugins = FileUtils.readLines(getDisabledFilePath(), true);
             log.info("Disabled plugins: {}", disabledPlugins);
         } catch (IOException e) {
             log.error(e.getMessage(), e);
@@ -67,22 +68,70 @@ public class DefaultPluginStatusProvider implements PluginStatusProvider {
 
     @Override
     public void disablePlugin(String pluginId) {
-        disabledPlugins.add(pluginId);
-        try {
-            FileUtils.writeLines(disabledPlugins, pluginsRoot.resolve("disabled.txt").toFile());
-        } catch (IOException e) {
-            throw new PluginRuntimeException(e);
+        if (isPluginDisabled(pluginId)) {
+            // do nothing
+            return;
+        }
+
+        if (Files.exists(getEnabledFilePath())) {
+            enabledPlugins.remove(pluginId);
+
+            try {
+                FileUtils.writeLines(enabledPlugins, getEnabledFilePath());
+            } catch (IOException e) {
+                throw new PluginRuntimeException(e);
+            }
+        } else {
+            disabledPlugins.add(pluginId);
+
+            try {
+                FileUtils.writeLines(disabledPlugins, getDisabledFilePath());
+            } catch (IOException e) {
+                throw new PluginRuntimeException(e);
+            }
         }
     }
 
     @Override
     public void enablePlugin(String pluginId) {
-        disabledPlugins.remove(pluginId);
-        try {
-            FileUtils.writeLines(disabledPlugins, pluginsRoot.resolve("disabled.txt").toFile());
-        } catch (IOException e) {
-            throw new PluginRuntimeException(e);
+        if (!isPluginDisabled(pluginId)) {
+            // do nothing
+            return;
+        }
+
+        if (Files.exists(getEnabledFilePath())) {
+            enabledPlugins.add(pluginId);
+
+            try {
+                FileUtils.writeLines(enabledPlugins, getEnabledFilePath());
+            } catch (IOException e) {
+                throw new PluginRuntimeException(e);
+            }
+        } else {
+            disabledPlugins.remove(pluginId);
+
+            try {
+                FileUtils.writeLines(disabledPlugins, getDisabledFilePath());
+            } catch (IOException e) {
+                throw new PluginRuntimeException(e);
+            }
         }
     }
 
+    public Path getEnabledFilePath() {
+        return getEnabledFilePath(pluginsRoot);
+    }
+
+    public Path getDisabledFilePath() {
+        return getDisabledFilePath(pluginsRoot);
+    }
+
+    public static Path getEnabledFilePath(Path pluginsRoot) {
+        return pluginsRoot.resolve("enabled.txt");
+    }
+
+    public static Path getDisabledFilePath(Path pluginsRoot) {
+        return pluginsRoot.resolve("disabled.txt");
+    }
+
 }
index 0cb8784ba9a90c31ef46e0eccd3045853968118e..ba9dba15e043d2e5e13d40d7117207226a96325d 100644 (file)
@@ -66,8 +66,16 @@ public class FileUtils {
         return lines;
     }
 
+    /**
+     * Use {@link #writeLines(Collection, Path)} instead.
+     */
+    @Deprecated
     public static void writeLines(Collection<String> lines, File file) throws IOException {
-        Files.write(file.toPath(), lines, StandardCharsets.UTF_8);
+        writeLines(lines, file.toPath());
+    }
+
+    public static void writeLines(Collection<String> lines, Path path) throws IOException {
+        Files.write(path, lines, StandardCharsets.UTF_8);
     }
 
     /**
index ca5b091cc386b1c968d97ddde8c7a78dd5caace1..b0a0e8e03c23edf70db29ded5fc0d5e2841fc4e2 100644 (file)
@@ -20,6 +20,7 @@ import org.junit.jupiter.api.io.TempDir;
 import org.pf4j.util.FileUtils;
 
 import java.io.IOException;
+import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
@@ -74,31 +75,67 @@ public class DefaultPluginStatusProviderTest {
 
     @Test
     public void testDisablePluginWithEnableEmpty() throws Exception {
+        // scenario with "disabled.txt"
         createDisabledFile();
 
-        PluginStatusProvider statusProvider = new DefaultPluginStatusProvider(pluginsPath);
+        DefaultPluginStatusProvider statusProvider = new DefaultPluginStatusProvider(pluginsPath);
         statusProvider.disablePlugin("plugin-1");
 
         assertTrue(statusProvider.isPluginDisabled("plugin-1"));
         assertTrue(statusProvider.isPluginDisabled("plugin-2"));
         assertFalse(statusProvider.isPluginDisabled("plugin-3"));
 
-        List<String> disabledPlugins = FileUtils.readLines(pluginsPath.resolve("disabled.txt"), true);
+        List<String> disabledPlugins = FileUtils.readLines(statusProvider.getDisabledFilePath(), true);
         assertTrue(disabledPlugins.contains("plugin-1"));
+
+        assertTrue(Files.notExists(statusProvider.getEnabledFilePath()));
+
+        // scenario with "enabled.txt"
+        Files.delete(statusProvider.getDisabledFilePath());
+        assertTrue(Files.notExists(statusProvider.getDisabledFilePath()));
+
+        createEnabledFile();
+
+        statusProvider = new DefaultPluginStatusProvider(pluginsPath);
+        statusProvider.disablePlugin("plugin-1");
+
+        assertTrue(statusProvider.isPluginDisabled("plugin-1"));
+        assertFalse(statusProvider.isPluginDisabled("plugin-2"));
+
+        List<String> enabledPlugins = FileUtils.readLines(statusProvider.getEnabledFilePath(), true);
+        assertFalse(enabledPlugins.contains("plugin-1"));
     }
 
     @Test
     public void testEnablePlugin() throws Exception {
+        // scenario with "enabled.txt"
         createEnabledFile();
 
-        PluginStatusProvider statusProvider = new DefaultPluginStatusProvider(pluginsPath);
+        DefaultPluginStatusProvider statusProvider = new DefaultPluginStatusProvider(pluginsPath);
         statusProvider.enablePlugin("plugin-2");
 
         assertFalse(statusProvider.isPluginDisabled("plugin-1"));
         assertFalse(statusProvider.isPluginDisabled("plugin-2"));
         assertTrue(statusProvider.isPluginDisabled("plugin-3"));
 
-        List<String> disabledPlugins = FileUtils.readLines(pluginsPath.resolve("disabled.txt"), true);
+        List<String> enabledPlugins = FileUtils.readLines(statusProvider.getEnabledFilePath(), true);
+        assertTrue(enabledPlugins.contains("plugin-2"));
+
+        assertTrue(Files.notExists(statusProvider.getDisabledFilePath()));
+
+        // scenario with "disabled.txt"
+        Files.delete(statusProvider.getEnabledFilePath());
+        assertTrue(Files.notExists(statusProvider.getEnabledFilePath()));
+
+        createDisabledFile();
+
+        statusProvider = new DefaultPluginStatusProvider(pluginsPath);
+        statusProvider.enablePlugin("plugin-2");
+
+        assertFalse(statusProvider.isPluginDisabled("plugin-1"));
+        assertFalse(statusProvider.isPluginDisabled("plugin-2"));
+
+        List<String> disabledPlugins = FileUtils.readLines(statusProvider.getDisabledFilePath(), true);
         assertFalse(disabledPlugins.contains("plugin-2"));
     }
 
@@ -126,7 +163,7 @@ public class DefaultPluginStatusProviderTest {
         List<String> disabledPlugins = new ArrayList<>();
         disabledPlugins.add("plugin-2");
 
-        FileUtils.writeLines(disabledPlugins, pluginsPath.resolve("disabled.txt").toFile());
+        FileUtils.writeLines(disabledPlugins, DefaultPluginStatusProvider.getDisabledFilePath(pluginsPath));
     }
 
     private void createEnabledFile() throws IOException {
@@ -134,7 +171,7 @@ public class DefaultPluginStatusProviderTest {
         enabledPlugins.add("plugin-1");
         enabledPlugins.add("plugin-2");
 
-        FileUtils.writeLines(enabledPlugins, pluginsPath.resolve("enabled.txt").toFile());
+        FileUtils.writeLines(enabledPlugins, DefaultPluginStatusProvider.getEnabledFilePath(pluginsPath));
     }
 
 }