]> source.dussan.org Git - pf4j.git/commitdiff
Add method to unload a plugin and it's dependencies 3/head
authorJames Moger <james.moger@gitblit.com>
Thu, 3 Apr 2014 00:10:26 +0000 (20:10 -0400)
committerJames Moger <james.moger@gitblit.com>
Thu, 3 Apr 2014 00:14:56 +0000 (20:14 -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/CompoundClassLoader.java

index 1680a5a98a8ab0fa2719ef35e038781791bf826f..1bca676bea401d305fec7b28237a69d5c39b6828 100644 (file)
@@ -294,6 +294,45 @@ public class DefaultPluginManager implements PluginManager {
                }\r
     }\r
 \r
+    @Override\r
+    public boolean unloadPlugin(String pluginId) {\r
+       try {\r
+               PluginState state = stopPlugin(pluginId);\r
+               if (!PluginState.STOPPED.equals(state)) {\r
+                       return false;\r
+               }\r
+\r
+               PluginWrapper pluginWrapper = plugins.get(pluginId);\r
+               PluginDescriptor descriptor = pluginWrapper.getDescriptor();\r
+               List<PluginDependency> dependencies = descriptor.getDependencies();\r
+               for (PluginDependency dependency : dependencies) {\r
+                       if (!unloadPlugin(dependency.getPluginId())) {\r
+                               return false;\r
+                       }\r
+               }\r
+\r
+               // remove the plugin\r
+               plugins.remove(pluginId);\r
+               resolvedPlugins.remove(pluginWrapper);\r
+               pathToIdMap.remove(pluginWrapper.getPluginPath());\r
+\r
+               // remove the classloader\r
+               if (pluginClassLoaders.containsKey(pluginId)) {\r
+                       PluginClassLoader classLoader = pluginClassLoaders.remove(pluginId);\r
+                       compoundClassLoader.removeLoader(classLoader);\r
+                       try {\r
+                               classLoader.close();\r
+                       } catch (IOException e) {\r
+                               log.error(e.getMessage(), e);\r
+                       }\r
+               }\r
+               return true;\r
+       } catch (IllegalArgumentException e) {\r
+               // ignore not found exceptions because this method is recursive\r
+       }\r
+       return false;\r
+    }\r
+\r
     /**\r
      * Get plugin class loader for this path.\r
      */\r
index e183a959e0812b061464b5c486043a29504adb6b..6ffe4cf3c29376aa8aaecd47b797e79194657a3b 100644 (file)
@@ -71,6 +71,14 @@ public interface PluginManager {
      */
     public PluginState stopPlugin(String pluginId);
 
+    /**
+     * Unload a plugin.
+     *
+     * @param pluginId
+     * @return true if the plugin was unloaded
+     */
+    public boolean unloadPlugin(String pluginId);
+
        public PluginClassLoader getPluginClassLoader(String pluginId);
 
        public <T> List<T> getExtensions(Class<T> type);
index f5c5df48427e29dfb31b633ecf2a71bbdee52992..426b2a360986cb8683f78489bc5cbe99d70651ad 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.
@@ -23,7 +23,7 @@ import java.util.Set;
 
 /**
  * A class loader that has multiple loaders and uses them for loading classes and resources.
- * 
+ *
  * @author Decebal Suiu
  */
 public class CompoundClassLoader extends ClassLoader {
@@ -34,6 +34,10 @@ public class CompoundClassLoader extends ClassLoader {
                loaders.add(loader);
        }
 
+       public void removeLoader(ClassLoader loader) {
+               loaders.remove(loader);
+       }
+
        @Override
        public Class<?> findClass(String name) throws ClassNotFoundException {
                for (ClassLoader loader : loaders) {
@@ -43,7 +47,7 @@ public class CompoundClassLoader extends ClassLoader {
                                // try next
                        }
                }
-               
+
                throw new ClassNotFoundException(name);
        }
 
@@ -55,7 +59,7 @@ public class CompoundClassLoader extends ClassLoader {
                                return url;
                        }
                }
-               
+
                return null;
        }
 
@@ -65,8 +69,8 @@ public class CompoundClassLoader extends ClassLoader {
                for (ClassLoader loader : loaders) {
                        resources.addAll(Collections.list(loader.getResources(name)));
                }
-               
+
                return Collections.enumeration(resources);
        }
-       
+
 }