]> source.dussan.org Git - pf4j.git/commitdiff
Implement delete plugin
authorJames Moger <james.moger@gitblit.com>
Thu, 3 Apr 2014 14:23:51 +0000 (10:23 -0400)
committerJames Moger <james.moger@gitblit.com>
Thu, 3 Apr 2014 14:23:51 +0000 (10:23 -0400)
pf4j/src/main/java/ro/fortsoft/pf4j/DefaultPluginManager.java
pf4j/src/main/java/ro/fortsoft/pf4j/PluginManager.java
pf4j/src/main/java/ro/fortsoft/pf4j/util/FileUtils.java

index 1bca676bea401d305fec7b28237a69d5c39b6828..1e33d2f24c9b58a29a3f67d3517928eb419b9902 100644 (file)
@@ -257,12 +257,14 @@ public class DefaultPluginManager implements PluginManager {
         // expand all plugin archives\r
         FileFilter zipFilter = new ZipFileFilter();\r
         File[] zipFiles = pluginsDirectory.listFiles(zipFilter);\r
-        for (File zipFile : zipFiles) {\r
-               try {\r
-                               expandPluginArchive(zipFile);\r
-                       } catch (IOException e) {\r
-                               log.error(e.getMessage(), e);\r
-                       }\r
+        if (zipFiles != null) {\r
+               for (File zipFile : zipFiles) {\r
+                       try {\r
+                               expandPluginArchive(zipFile);\r
+                       } catch (IOException e) {\r
+                               log.error(e.getMessage(), e);\r
+                       }\r
+               }\r
         }\r
 \r
         // check for no plugins\r
@@ -271,20 +273,24 @@ public class DefaultPluginManager implements PluginManager {
         filterList.add(new NotFileFilter(createHiddenPluginFilter()));\r
         FileFilter pluginsFilter = new AndFileFilter(filterList);\r
         File[] directories = pluginsDirectory.listFiles(pluginsFilter);\r
-        log.debug("Found possible {} plugins: {}", directories.length, Arrays.asList(directories));\r
-        if (directories.length == 0) {\r
+        List<File> dirArray = new ArrayList<File>();\r
+        if (directories != null) {\r
+               dirArray.addAll(Arrays.asList(directories));\r
+        }\r
+        log.debug("Found possible {} plugins: {}", dirArray.size(), dirArray);\r
+        if (dirArray.size() == 0) {\r
                log.info("No plugins");\r
                return;\r
         }\r
 \r
         // load any plugin from plugins directory\r
-        for (File directory : directories) {\r
-            try {\r
-                loadPlugin(directory);\r
-            } catch (PluginException e) {\r
-                               log.error(e.getMessage(), e);\r
-            }\r
-        }\r
+               for (File directory : dirArray) {\r
+                       try {\r
+                               loadPlugin(directory);\r
+                       } catch (PluginException e) {\r
+                               log.error(e.getMessage(), e);\r
+                       }\r
+               }\r
 \r
         // resolve 'unresolvedPlugins'\r
         try {\r
@@ -333,6 +339,51 @@ public class DefaultPluginManager implements PluginManager {
        return false;\r
     }\r
 \r
+    @Override\r
+       public boolean deletePlugin(String pluginId) {\r
+       if (!plugins.containsKey(pluginId)) {\r
+               throw new IllegalArgumentException(String.format("Unknown pluginId %s", pluginId));\r
+       }\r
+               PluginWrapper pw = getPlugin(pluginId);\r
+               PluginState state = stopPlugin(pluginId);\r
+\r
+               if (PluginState.STOPPED != state) {\r
+                       log.error(String.format("Failed to stop plugin %s on delete", pluginId));\r
+                       return false;\r
+               }\r
+\r
+               if (!unloadPlugin(pluginId)) {\r
+                       log.error(String.format("Failed to unload plugin %s on delete", pluginId));\r
+                       return false;\r
+               }\r
+\r
+               File pluginFolder = new File(pluginsDirectory, pw.getPluginPath());\r
+               File pluginZip = null;\r
+\r
+               FileFilter zipFilter = new ZipFileFilter();\r
+        File[] zipFiles = pluginsDirectory.listFiles(zipFilter);\r
+        if (zipFiles != null) {\r
+               // strip prepended / from the plugin path\r
+               String dirName = pw.getPluginPath().substring(1);\r
+               // find the zip file that matches the plugin path\r
+               for (File zipFile : zipFiles) {\r
+                       String name = zipFile.getName().substring(0, zipFile.getName().lastIndexOf('.'));\r
+                       if (name.equals(dirName)) {\r
+                               pluginZip = zipFile;\r
+                               break;\r
+                       }\r
+               }\r
+        }\r
+\r
+               if (pluginFolder.exists()) {\r
+                       FileUtils.delete(pluginFolder);\r
+               }\r
+               if (pluginZip != null && pluginZip.exists()) {\r
+                       FileUtils.delete(pluginZip);\r
+               }\r
+               return true;\r
+       }\r
+\r
     /**\r
      * Get plugin class loader for this path.\r
      */\r
index 6ffe4cf3c29376aa8aaecd47b797e79194657a3b..57fb890f2e8dbe8809ad163bfd8cf01679a77995 100644 (file)
@@ -79,6 +79,14 @@ public interface PluginManager {
      */
     public boolean unloadPlugin(String pluginId);
 
+    /**
+     * Deletes a plugin.
+     *
+     * @param pluginId
+     * @return true if the plugin was deleted
+     */
+    public boolean deletePlugin(String pluginId);
+
        public PluginClassLoader getPluginClassLoader(String pluginId);
 
        public <T> List<T> getExtensions(Class<T> type);
index 0b8c38a93be4eddac5c10145cbd09545bd204a0c..68cc2b3c4a792273f743254d77eb1fbb02827f9b 100644 (file)
@@ -1,11 +1,11 @@
 /*
  * Copyright 2012 Decebal Suiu
- * 
+ *
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this work except in compliance with
  * the License. You may obtain a copy of the License in the LICENSE file, or at:
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
@@ -25,11 +25,11 @@ import java.util.List;
  */
 public class FileUtils {
 
-       public static List<String> readLines(File file, boolean ignoreComments) throws IOException {            
+       public static List<String> readLines(File file, boolean ignoreComments) throws IOException {
                if (!file.exists() || !file.isFile()) {
                        return Collections.emptyList();
                }
-               
+
                List<String> lines = new ArrayList<String>();
 
                BufferedReader reader = null;
@@ -46,8 +46,31 @@ public class FileUtils {
                                reader.close();
                        }
                }
-               
+
                return lines;
        }
-       
+
+       /**
+        * Delete a file or recursively delete a folder.
+        *
+        * @param fileOrFolder
+        * @return true, if successful
+        */
+       public static boolean delete(File fileOrFolder) {
+               boolean success = false;
+               if (fileOrFolder.isDirectory()) {
+                       File [] files = fileOrFolder.listFiles();
+                       if (files != null) {
+                               for (File file : files) {
+                                       if (file.isDirectory()) {
+                                               success |= delete(file);
+                                       } else {
+                                               success |= file.delete();
+                                       }
+                               }
+                       }
+               }
+               success |= fileOrFolder.delete();
+               return success;
+       }
 }