It's not the same without you

Join the community to find out what other Atlassian users are discussing, debating and creating.

Atlassian Community Hero Image Collage

How to handle the uninstall event from within a plugin?

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

3 answers

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

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

}

});

}

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

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.

0 votes
Raju Kadam Community Leader Nov 02, 2011

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

Suggest an answer

Log in or Sign up to answer
Community showcase
Posted in United States

Welcome new members!

Wow, I got swamped and now that I've finally gotten my head back above water, I find we have several new members! Welcome @Darren Keith lowman , @Amanda Babb , @Luis Zapata , @Joli Holmes , and @bh...

26 views 0 2
View post

Community Events

Connect with like-minded Atlassian users at free events near you!

Find an event

Connect with like-minded Atlassian users at free events near you!

Unfortunately there are no Community Events near you at the moment.

Host an event

You're one step closer to meeting fellow Atlassian users at your local event. Learn more about Community Events

Events near you