1 package com.atlassian.plugin.manager;
2
3 import com.atlassian.plugin.Plugin;
4 import com.atlassian.plugin.PluginDependencies;
5 import com.atlassian.plugin.PluginException;
6 import com.atlassian.plugin.PluginState;
7 import com.atlassian.plugin.impl.StaticPlugin;
8 import com.google.common.base.Function;
9 import com.google.common.collect.ImmutableSet;
10
11 import javax.annotation.Nonnull;
12
13 public class PluginWithDeps extends StaticPlugin {
14
15 public interface StateChangeListener {
16 void enabled(Plugin plugin);
17 void disabled(Plugin plugin);
18 void uninstalled(Plugin plugin);
19
20 StateChangeListener NO_OP = new StateChangeListener() {
21 @Override
22 public void enabled(Plugin plugin) {
23 }
24
25 @Override
26 public void disabled(Plugin plugin) {
27 }
28
29 @Override
30 public void uninstalled(Plugin plugin) {
31 }
32 };
33
34 }
35
36 private final PluginDependencies dependencies;
37
38 public static final Function<Plugin, String> GET_KEY = Plugin::getKey;
39
40 private StateChangeListener stateChangeListener;
41
42 public PluginWithDeps(final String key) {
43 this(key, StateChangeListener.NO_OP, new PluginDependencies(null, null, null));
44 }
45
46 public PluginWithDeps(final String key, final String... deps) {
47 this(key, StateChangeListener.NO_OP, new PluginDependencies(ImmutableSet.copyOf(deps), null, null));
48 }
49
50 public PluginWithDeps(final String key, final PluginDependencies deps) {
51 this(key, StateChangeListener.NO_OP, deps);
52 }
53
54 public PluginWithDeps(final String key, StateChangeListener stateChangeListener, final PluginDependencies deps) {
55 setKey(key);
56 dependencies = deps;
57 setPluginState(PluginState.DISABLED);
58 this.stateChangeListener = stateChangeListener;
59 }
60
61 @Override
62 public void enable() {
63 stateChangeListener.enabled(this);
64 super.enable();
65 }
66
67 @Override
68 protected void disableInternal() throws PluginException {
69 stateChangeListener.disabled(this);
70 super.disableInternal();
71 }
72
73 @Override
74 public boolean isUninstallable() {
75 return true;
76 }
77
78 @Override
79 protected void uninstallInternal() {
80 stateChangeListener.uninstalled(this);
81 }
82
83 @Nonnull
84 @Override
85 public PluginDependencies getDependencies() {
86 return dependencies;
87 }
88 }