From: David ‘Bombe’ Roden Date: Thu, 12 Dec 2019 19:24:48 +0000 (+0100) Subject: ✨ Send shutdown event on termination X-Git-Tag: v81^2~5^2~29 X-Git-Url: https://git.pterodactylus.net/?a=commitdiff_plain;h=1ce940852c7e96a83233bcb706d0f87a1c655c54;p=Sone.git ✨ Send shutdown event on termination --- diff --git a/src/main/java/net/pterodactylus/sone/main/SonePlugin.java b/src/main/java/net/pterodactylus/sone/main/SonePlugin.java index 91f21eb..ef9f05a 100644 --- a/src/main/java/net/pterodactylus/sone/main/SonePlugin.java +++ b/src/main/java/net/pterodactylus/sone/main/SonePlugin.java @@ -110,6 +110,9 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr /** The core. */ private Core core; + /** The event bus. */ + private EventBus eventBus; + /** The web interface. */ private WebInterface webInterface; @@ -212,7 +215,7 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr webInterface.start(); /* send some events on startup */ - EventBus eventBus = injector.getInstance(EventBus.class); + eventBus = injector.getInstance(EventBus.class); /* first start? */ if (injector.getInstance(Key.get(Boolean.class, Names.named("FirstStart")))) { @@ -247,6 +250,9 @@ public class SonePlugin implements FredPlugin, FredPluginFCP, FredPluginL10n, Fr */ @Override public void terminate() { + /* send shutdown event. */ + eventBus.post(new Shutdown()); + try { /* stop the web interface. */ webInterface.stop(); diff --git a/src/main/kotlin/net/pterodactylus/sone/core/event/Shutdown.kt b/src/main/kotlin/net/pterodactylus/sone/core/event/Shutdown.kt new file mode 100644 index 0000000..4bc2f61 --- /dev/null +++ b/src/main/kotlin/net/pterodactylus/sone/core/event/Shutdown.kt @@ -0,0 +1,23 @@ +/** + * Sone - Shutdown.kt - Copyright © 2019 David ‘Bombe’ Roden + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.pterodactylus.sone.core.event + +/** + * Event that signals the shutdown of Sone. + */ +class Shutdown diff --git a/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt b/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt index c3f1cd7..b846522 100644 --- a/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt +++ b/src/test/kotlin/net/pterodactylus/sone/main/SonePluginTest.kt @@ -26,7 +26,7 @@ import kotlin.test.* @Dirty class SonePluginTest { - private val sonePlugin by lazy { SonePlugin { injector } } + private var sonePlugin = SonePlugin { injector } private val pluginRespirator = deepMock() private val node = deepMock() private val clientCore = deepMock() @@ -76,7 +76,7 @@ class SonePluginTest { private fun runSonePluginWithRealInjector(injectorConsumer: (Injector) -> Unit = {}): Injector { lateinit var injector: Injector - val sonePlugin = SonePlugin { + sonePlugin = SonePlugin { Guice.createInjector(*it).also { injector = it injectorConsumer(it) @@ -192,6 +192,24 @@ class SonePluginTest { assertThat(startupReceived.get(), equalTo(true)) } + private class ShutdownListener(private val shutdownReceived: () -> Unit) { + @Subscribe + fun shutdown(shutdown: Shutdown) { + shutdownReceived() + } + } + + @Test + fun `shutdown event is sent to event bus on terminate`() { + val shutdownReceived = AtomicBoolean() + runSonePluginWithRealInjector { + val eventBus = it.getInstance(EventBus::class.java) + eventBus.register(ShutdownListener { shutdownReceived.set(true) }) + } + sonePlugin.terminate() + assertThat(shutdownReceived.get(), equalTo(true)) + } + private fun getInjected(clazz: Class, annotation: Annotation? = null): T? = injected[TypeLiteral.get(clazz) to annotation] as? T