33import games .negative .moss .spring .Disableable ;
44import games .negative .moss .spring .Enableable ;
55import games .negative .moss .spring .Loadable ;
6- import games . negative . moss . spring . Reloadable ;
6+ import net . md_5 . bungee . api . ProxyServer ;
77import net .md_5 .bungee .api .plugin .Plugin ;
8- import org .apache .commons .logging .Log ;
9- import org .apache .commons .logging .LogFactory ;
8+ import net .md_5 .bungee .api .scheduler .TaskScheduler ;
109import org .springframework .context .annotation .AnnotationConfigApplicationContext ;
1110
1211import java .util .Collection ;
1615
1716public abstract class MossBungee extends Plugin {
1817
18+ public static AnnotationConfigApplicationContext CONTEXT ;
19+
1920 private Logger logger ;
20- protected AnnotationConfigApplicationContext context ;
2121
2222 @ Override
2323 public void onLoad () {
2424 logger = getLogger ();
2525
26- context = new AnnotationConfigApplicationContext ();
26+ CONTEXT = new AnnotationConfigApplicationContext ();
2727
28- context .setClassLoader (getClass ().getClassLoader ());
28+ CONTEXT .setClassLoader (getClass ().getClassLoader ());
2929
30- loadInitialComponents (context );
30+ loadInitialComponents (CONTEXT );
3131
32- context .scan (basePackage ());
32+ CONTEXT .scan (basePackage ());
3333
34- context .refresh ();
34+ CONTEXT .refresh ();
35+ CONTEXT .start ();
3536
36- invokeBeans (Loadable .class , loadable -> loadable .onLoad (context ), (loadable , e ) -> {
37+ invokeBeans (Loadable .class , loadable -> loadable .onLoad (CONTEXT ), (loadable , e ) -> {
3738 logger .severe ("Failed to load " + loadable .getClass ().getSimpleName ());
3839 logger .severe (e .getMessage ());
3940 });
@@ -46,12 +47,9 @@ public void loadInitialComponents(AnnotationConfigApplicationContext context) {
4647 @ Override
4748 public void onEnable () {
4849 enableComponents ();
49-
50- // Initial reload
51- reload ();
5250 }
5351
54- private void enableComponents () {
52+ public void enableComponents () {
5553 // Register enableables
5654 invokeBeans (Enableable .class , Enableable ::onEnable , (enableable , e ) -> {
5755 logger .severe ("Failed to enable " + enableable .getClass ().getSimpleName ());
@@ -63,9 +61,9 @@ private void enableComponents() {
6361 public void onDisable () {
6462 disableComponents ();
6563
66- if (context != null ) {
67- context .close ();
68- context = null ;
64+ if (CONTEXT != null ) {
65+ CONTEXT .close ();
66+ CONTEXT = null ;
6967 }
7068 }
7169
@@ -74,14 +72,22 @@ public void disableComponents() {
7472 logger .severe ("Failed to disable " + disableable .getClass ().getSimpleName ());
7573 logger .severe (e .getMessage ());
7674 });
75+
76+ ProxyServer server = ProxyServer .getInstance ();
77+
78+ // Cancel all scheduled tasks
79+ TaskScheduler scheduler = server .getScheduler ();
80+ scheduler .cancel (this );
81+
82+ // Unregister all listeners
83+ server .getPluginManager ().unregisterListeners (this );
7784 }
7885
7986
8087 public void reload () {
81- invokeBeans (Reloadable .class , Reloadable ::onReload , (reloadable , e ) -> {
82- logger .severe ("Failed to reload " + reloadable .getClass ().getSimpleName ());
83- logger .severe (e .getMessage ());
84- });
88+ onDisable ();
89+ onLoad ();
90+ onEnable ();
8591 }
8692
8793 /**
@@ -92,7 +98,7 @@ public void reload() {
9298 * @param <T> the type of the beans
9399 */
94100 public <T > void invokeBeans (Class <T > clazz , Consumer <T > consumer , BiConsumer <T , Exception > onFailure ) {
95- Collection <T > beans = context .getBeansOfType (clazz ).values ();
101+ Collection <T > beans = CONTEXT .getBeansOfType (clazz ).values ();
96102 for (T bean : beans ) {
97103 try {
98104 consumer .accept (bean );
0 commit comments