2
1
0

Hi,

Was wondering how to catch the uninstall event so that the plugin could clean up after itself (like remove plugin specific properties etc...)

Had a brief look around but didn't find anything, so appologies if this has already been dealt with elsewhere.

Cheers

  1. Jamie Echlin

    Not an answer because of course this is not authoritative, but I don't think this is possible. You can catch enabled and disabled events but that's it. I don't think it's possible to reliably know when a plugin is installed, eg it could be removed from installed-plugins and .osgi-plugins and then jira restarted.

CommentAdd your comment...

2 answers

  1.  
    3
    2
    1

    Here's a utility class we use for this purpose:

    public final class StopListener {
      private final PluginEventManager myPluginEventManager;
      private final String myModuleKey;
      private final Runnable myStop;
     
      private StopListener(PluginEventManager pluginEventManager, String moduleKey, Runnable stop) {
        myPluginEventManager = pluginEventManager;
        myModuleKey = moduleKey;
        myStop = stop;
      }
     
      public static void install(PluginEventManager pluginEventManager, String moduleKey, Runnable stop) {
        pluginEventManager.register(new StopListener(pluginEventManager, moduleKey, stop));
      }
     
      public void stop() {
        myPluginEventManager.unregister(this);
        if (myStop != null) myStop.run();
      }
     
      @PluginEventListener
      public void onShutdown(PluginFrameworkShutdownEvent event) {
        stop();
      }
     
      @PluginEventListener
      public void onPluginDisabled(PluginDisabledEvent event) {
        if (event == null) return;
        stopIfMe(event.getPlugin());
      }
     
      @PluginEventListener
      public void onFrameworkRestarting(PluginFrameworkWarmRestartingEvent event) {
        stop();
      }
     
      @PluginEventListener
      public void onModuleDisabled(PluginModuleDisabledEvent event) {
        if (event == null) return;
        ModuleDescriptor module = event.getModule();
        if (module == null) return;
        Plugin plugin = module.getPlugin();
        if (plugin == null) return;
        if (Util.STRUCTURE_PLUGIN_KEY.equals(plugin.getKey()) && myModuleKey.equals(module.getKey())) {
          stop();
        }
      }
     
      @PluginEventListener
      public void onPluginUninstalledEvent(PluginUninstalledEvent event) {
        if (event == null) return;
        stopIfMe(event.getPlugin());
      }
     
      @PluginEventListener
      public void onPluginRefreshedEvent(PluginRefreshedEvent event) {
        if (event == null) return;
        stopIfMe(event.getPlugin());
      }
     
      protected void stopIfMe(Plugin plugin) {
        if (plugin == null) return;
        if (Util.STRUCTURE_PLUGIN_KEY.equals(plugin.getKey())) {
          stop();
        }
      }
    }
     
    1. Igor Sereda

      Replace Util.STRUCTURE_PLUGIN_KEY with your own plugin key.

      Typical use of the class:

      public MyComponent(PluginEventManager pluginEventManager, ....) {

      initStuff();

      StopListener.install(pluginEventManager, "my-module-key", new Runnable() {

      public void run() {

      cleanupStuff();

      }

      });

      }

    2. marc.raiser

      Thank you Igor, I'll give that a try.

    CommentAdd your comment...
  2.  
    1
    0
    -1

    You can define a compoent in your plugin which implements DisposableBean interface.

    method destroy() from this interface gets called when plugin is disabled or removed.

    hope this helps,

    Raju

      CommentAdd your comment...