Find Questions…

Close ×
First time here? Check out the FAQ!

How to handle the uninstall event from within a plugin?

pivnicek asked this question · 16 karma ·

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

482 views

Jamie Echlin · 49,049 karma ·

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.

2 Answers:

Igor Sereda · 4,397 karma ·

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();
    }
  }
}
 

Igor Sereda · 4,397 karma ·

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();

}

});

}

pivnicek · 16 karma ·

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

Raju · 441 karma ·

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

Looking for something else?

Find Questions…

or Browse other questions tagged:

or Ask a Question