]> source.dussan.org Git - gitblit.git/commitdiff
Add plugin (un)install lifecycle methods
authorJames Moger <james.moger@gitblit.com>
Thu, 17 Apr 2014 22:00:58 +0000 (18:00 -0400)
committerJames Moger <james.moger@gitblit.com>
Thu, 17 Apr 2014 22:08:12 +0000 (18:08 -0400)
src/main/java/com/gitblit/extensions/GitblitPlugin.java
src/main/java/com/gitblit/manager/GitblitManager.java
src/main/java/com/gitblit/manager/IPluginManager.java
src/main/java/com/gitblit/manager/PluginManager.java
src/main/java/com/gitblit/transport/ssh/commands/PluginDispatcher.java
src/site/plugins_extensions.mkd

index 129f584c6f383357a47e5fece4980716082b7cf5..d0603ebef79a61053cc57ef898a92fced2904940 100644 (file)
@@ -17,11 +17,45 @@ package com.gitblit.extensions;
 
 import ro.fortsoft.pf4j.Plugin;
 import ro.fortsoft.pf4j.PluginWrapper;
+import ro.fortsoft.pf4j.Version;
 
+/**
+ * Parent class of Gitblit plugins.
+ *
+ * @author James Moger
+ * @since 1.5.0
+ */
 public abstract class GitblitPlugin extends Plugin {
 
        public GitblitPlugin(PluginWrapper wrapper) {
                super(wrapper);
        }
 
+       /**
+        * Called after a plugin as been loaded but before it is started for the
+        * first time.  This allows the plugin to install settings or perform any
+        * other required first-time initialization.
+        *
+        * @since 1.5.0
+        */
+       public abstract void onInstall();
+
+       /**
+        * Called after an updated plugin has been installed but before the updated
+        * plugin is started.  The oldVersion is passed as a parameter in the event
+        * that special processing needs to be executed.
+        *
+        * @param oldVersion
+        * @since 1.5.0
+        */
+       public abstract void onUpgrade(Version oldVersion);
+
+       /**
+        * Called before a plugin has been unloaded and deleted from the system.
+        * This allows a plugin to remove any settings it may have created or
+        * perform and other necessary cleanup.
+        *
+        * @since 1.5.0
+        */
+       public abstract void onUninstall();
 }
index 4ecb9c6d080e81b2ef648ce9776e7704e41fbd5f..61a09491038d5ec7211d53ff287298cb12e7de49 100644 (file)
@@ -1251,8 +1251,8 @@ public class GitblitManager implements IGitblit {
        }
 
        @Override
-       public boolean deletePlugin(String pluginId) {
-               return pluginManager.deletePlugin(pluginId);
+       public boolean uninstallPlugin(String pluginId) {
+               return pluginManager.uninstallPlugin(pluginId);
        }
 
        @Override
index bf04619ccd2623e89b50adaa7af0ab57fd2d85ee..528bbed4a0c26a1589a565623db195b442249dd1 100644 (file)
@@ -122,7 +122,7 @@ public interface IPluginManager extends IManager {
      * @param pluginId
      * @return true if successful
      */
-    boolean deletePlugin(String pluginId);
+    boolean uninstallPlugin(String pluginId);
 
     /**
      * Refresh the plugin registry.
index 405dc510ca09d85e72cc11107a5d698b13ea578c..40d302ddd80ae860ca4b85ec353ec228b7fc73ca 100644 (file)
@@ -47,6 +47,7 @@ import ro.fortsoft.pf4j.Version;
 
 import com.gitblit.Constants;
 import com.gitblit.Keys;
+import com.gitblit.extensions.GitblitPlugin;
 import com.gitblit.models.PluginRegistry;
 import com.gitblit.models.PluginRegistry.InstallState;
 import com.gitblit.models.PluginRegistry.PluginRegistration;
@@ -141,6 +142,12 @@ public class PluginManager implements IPluginManager, PluginStateListener {
                        return false;
                }
 
+               // allow the plugin to prepare for operation after installation
+               PluginWrapper pluginWrapper = pf4j.getPlugin(pluginId);
+               if (pluginWrapper.getPlugin() instanceof GitblitPlugin) {
+                       ((GitblitPlugin) pluginWrapper.getPlugin()).onInstall();
+               }
+
                PluginState state = pf4j.startPlugin(pluginId);
                return PluginState.STARTED.equals(state);
        }
@@ -154,13 +161,20 @@ public class PluginManager implements IPluginManager, PluginStateListener {
                        return false;
                }
 
-               if (deletePlugin(pluginId)) {
+               Version oldVersion = pf4j.getPlugin(pluginId).getDescriptor().getVersion();
+               if (removePlugin(pluginId, false)) {
                        String newPluginId = pf4j.loadPlugin(file);
                        if (StringUtils.isEmpty(newPluginId)) {
                                logger.error("Failed to load plugin {}", file);
                                return false;
                        }
 
+                       // the plugin to handle an upgrade
+                       PluginWrapper pluginWrapper = pf4j.getPlugin(newPluginId);
+                       if (pluginWrapper.getPlugin() instanceof GitblitPlugin) {
+                               ((GitblitPlugin) pluginWrapper.getPlugin()).onUpgrade(oldVersion);
+                       }
+
                        PluginState state = pf4j.startPlugin(newPluginId);
                        return PluginState.STARTED.equals(state);
                } else {
@@ -183,9 +197,21 @@ public class PluginManager implements IPluginManager, PluginStateListener {
        }
 
        @Override
-       public synchronized boolean deletePlugin(String pluginId) {
+       public synchronized boolean uninstallPlugin(String pluginId) {
+               return removePlugin(pluginId, true);
+       }
+
+       protected boolean removePlugin(String pluginId, boolean isUninstall) {
                PluginWrapper pluginWrapper = getPlugin(pluginId);
                final String name = pluginWrapper.getPluginPath().substring(1);
+
+               if (isUninstall) {
+                       // allow the plugin to prepare for uninstallation
+                       if (pluginWrapper.getPlugin() instanceof GitblitPlugin) {
+                               ((GitblitPlugin) pluginWrapper.getPlugin()).onUninstall();
+                       }
+               }
+
                if (pf4j.deletePlugin(pluginId)) {
 
                        // delete the checksums
index 37649eada44027e4f35589061e8d80fad17719b8..62b135763194f8624db29c13a975e7f06722a60e 100644 (file)
@@ -614,7 +614,7 @@ public class PluginDispatcher extends DispatchCommand {
                                throw new UnloggedFailure(String.format("Plugin %s is not installed!", id));
                        }
 
-                       if (gitblit.deletePlugin(pluginWrapper.getPluginId())) {
+                       if (gitblit.uninstallPlugin(pluginWrapper.getPluginId())) {
                                stdout.println(String.format("Uninstalled %s", pluginWrapper.getPluginId()));
                        } else {
                                throw new UnloggedFailure(1, String.format("Failed to uninstall %s", pluginWrapper.getPluginId()));
index 6e0e52e61f6ca82f67c02245dc29ec49ee73873c..86d072915d1b58dcf0387e81a3e70443c4303d64 100644 (file)
@@ -19,6 +19,7 @@ import com.gitblit.manager.IProjectManager;
 import com.gitblit.manager.IFederationManager;
 import com.gitblit.manager.IPluginManager;
 import com.gitblit.manager.IGitblit;
+import ro.fortsoft.pf4j.Version;
 
 public class ExamplePlugin extends GitblitPlugin {
 
@@ -34,6 +35,22 @@ public class ExamplePlugin extends GitblitPlugin {
         IPluginManager plugins = GitblitContext.getManager(IPluginManager.class);
         IGitblit gitblit = GitblitContext.getManager(IGitblit.class);
     }
+
+    @Override
+    public void stop() {
+    }
+
+    @Override
+    public void onInstall() {
+    }
+
+    @Override
+    public void onUpgrade(Version oldVersion) {
+    }
+
+    @Override
+    public void onUninstall() {
+    }
 }
 ```