From 6dbf3ee3fa6cadae5abedf441655d07568353d20 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Fri, 2 Feb 2018 13:12:12 +0200 Subject: [PATCH] APF 3.1.0 (Fixes #485 & #459 as well as other small annoyances) --- Plan/pom.xml | 2 +- .../djrapitops/plan/system/BukkitSystem.java | 4 + .../djrapitops/plan/system/BungeeSystem.java | 4 + .../system/settings/PlanErrorManager.java | 52 ++++++++ .../plan/system/BukkitSystemTest.java | 2 + .../system/BungeeBukkitConnectionTest.java | 119 ++++++++++++++++++ .../plan/system/BungeeSystemTest.java | 6 +- Plan/src/test/java/utilities/Teardown.java | 21 ++++ .../java/utilities/mocks/BukkitMockUtil.java | 2 + .../java/utilities/mocks/BungeeMockUtil.java | 2 + 10 files changed, 211 insertions(+), 3 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/system/settings/PlanErrorManager.java create mode 100644 Plan/src/test/java/com/djrapitops/plan/system/BungeeBukkitConnectionTest.java create mode 100644 Plan/src/test/java/utilities/Teardown.java diff --git a/Plan/pom.xml b/Plan/pom.xml index 8ede53de8..99d975a23 100644 --- a/Plan/pom.xml +++ b/Plan/pom.xml @@ -25,7 +25,7 @@ com.djrapitops AbstractPluginFramework - 3.0.1 + 3.1.0 diff --git a/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java index 74d84a31f..ad217d8aa 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/BukkitSystem.java @@ -13,10 +13,12 @@ import com.djrapitops.plan.system.file.FileSystem; import com.djrapitops.plan.system.info.BukkitInfoSystem; import com.djrapitops.plan.system.info.server.BukkitServerInfo; import com.djrapitops.plan.system.listeners.BukkitListenerSystem; +import com.djrapitops.plan.system.settings.PlanErrorManager; import com.djrapitops.plan.system.settings.config.BukkitConfigSystem; import com.djrapitops.plan.system.tasks.BukkitTaskSystem; import com.djrapitops.plan.system.update.VersionCheckSystem; import com.djrapitops.plugin.StaticHolder; +import com.djrapitops.plugin.api.utility.log.Log; /** * Represents PlanSystem for Plan. @@ -28,6 +30,8 @@ public class BukkitSystem extends PlanSystem { public BukkitSystem(Plan plugin) { testSystem = this; + Log.setErrorManager(new PlanErrorManager()); + versionCheckSystem = new VersionCheckSystem(plugin.getVersion()); fileSystem = new FileSystem(plugin); configSystem = new BukkitConfigSystem(); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java index b779d0c81..ab5a9db14 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/BungeeSystem.java @@ -13,9 +13,11 @@ import com.djrapitops.plan.system.file.FileSystem; import com.djrapitops.plan.system.info.BungeeInfoSystem; import com.djrapitops.plan.system.info.server.BungeeServerInfo; import com.djrapitops.plan.system.listeners.BungeeListenerSystem; +import com.djrapitops.plan.system.settings.PlanErrorManager; import com.djrapitops.plan.system.settings.config.BungeeConfigSystem; import com.djrapitops.plan.system.tasks.BungeeTaskSystem; import com.djrapitops.plan.system.update.VersionCheckSystem; +import com.djrapitops.plugin.api.utility.log.Log; /** * Represents PlanSystem for PlanBungee. @@ -27,6 +29,8 @@ public class BungeeSystem extends PlanSystem { public BungeeSystem(PlanBungee plugin) { testSystem = this; + Log.setErrorManager(new PlanErrorManager()); + versionCheckSystem = new VersionCheckSystem(plugin.getVersion()); fileSystem = new FileSystem(plugin); configSystem = new BungeeConfigSystem(); diff --git a/Plan/src/main/java/com/djrapitops/plan/system/settings/PlanErrorManager.java b/Plan/src/main/java/com/djrapitops/plan/system/settings/PlanErrorManager.java new file mode 100644 index 000000000..a7db9b8c8 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/system/settings/PlanErrorManager.java @@ -0,0 +1,52 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package com.djrapitops.plan.system.settings; + +import com.djrapitops.plan.system.webserver.WebServer; +import com.djrapitops.plan.system.webserver.WebServerSystem; +import com.djrapitops.plugin.api.Check; +import com.djrapitops.plugin.api.utility.log.ErrorLogger; +import com.djrapitops.plugin.api.utility.log.Log; +import com.djrapitops.plugin.api.utility.log.errormanager.ErrorManager; + +import java.io.File; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Abstract Plugin Framework ErrorManager for logging Errors properly instead of a vague message. + * + * @author Rsl1122 + */ +public class PlanErrorManager extends ErrorManager { + + @Override + public void toLog(String source, Throwable e, Class callingPlugin) { + try { + File logsFolder = Log.getLogsFolder(callingPlugin); + Log.warn(source + " Caught: " + e, callingPlugin); + if (WebServerSystem.isWebServerEnabled()) { + Log.warn("Exception can be viewed at " + WebServer.getInstance().getAccessAddress() + "/debug"); + } else { + Log.warn("It has been logged to ErrorLog.txt"); + } + try { + if ((Check.isBukkitAvailable() && Check.isBungeeAvailable()) || Settings.DEV_MODE.isTrue()) { + Logger.getGlobal().log(Level.WARNING, source, e); + } + } catch (IllegalStateException ignored) { + /* Config system not initialized */ + } + ErrorLogger.logThrowable(e, logsFolder); + } catch (Exception exception) { + System.out.println("Failed to log error to file because of " + exception); + System.out.println("Error:"); + // Fallback + Logger.getGlobal().log(Level.WARNING, source, e); + System.out.println("Fail Reason:"); + exception.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/Plan/src/test/java/com/djrapitops/plan/system/BukkitSystemTest.java b/Plan/src/test/java/com/djrapitops/plan/system/BukkitSystemTest.java index b23db4562..509bf6f25 100644 --- a/Plan/src/test/java/com/djrapitops/plan/system/BukkitSystemTest.java +++ b/Plan/src/test/java/com/djrapitops/plan/system/BukkitSystemTest.java @@ -14,6 +14,7 @@ import org.junit.Test; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; +import utilities.Teardown; import utilities.mocks.BukkitMockUtil; /** @@ -45,6 +46,7 @@ public class BukkitSystemTest { if (bukkitSystem != null) { bukkitSystem.disable(); } + Teardown.resetSettingsTempValues(); } @Test diff --git a/Plan/src/test/java/com/djrapitops/plan/system/BungeeBukkitConnectionTest.java b/Plan/src/test/java/com/djrapitops/plan/system/BungeeBukkitConnectionTest.java new file mode 100644 index 000000000..1d95a57ec --- /dev/null +++ b/Plan/src/test/java/com/djrapitops/plan/system/BungeeBukkitConnectionTest.java @@ -0,0 +1,119 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package com.djrapitops.plan.system; + +import com.djrapitops.plan.Plan; +import com.djrapitops.plan.PlanBungee; +import com.djrapitops.plan.api.exceptions.EnableException; +import com.djrapitops.plan.api.exceptions.connection.WebException; +import com.djrapitops.plan.system.database.BukkitDBSystem; +import com.djrapitops.plan.system.info.request.GenerateInspectPageRequest; +import com.djrapitops.plan.system.info.server.ServerInfo; +import com.djrapitops.plan.system.settings.Settings; +import org.junit.*; +import org.junit.rules.ExpectedException; +import org.junit.rules.TemporaryFolder; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; +import utilities.Teardown; +import utilities.TestConstants; +import utilities.mocks.BukkitMockUtil; +import utilities.mocks.BungeeMockUtil; + +import java.util.UUID; + +/** + * @author Rsl1122 + */ +@RunWith(MockitoJUnitRunner.class) +public class BungeeBukkitConnectionTest { + + @ClassRule + public static TemporaryFolder temporaryFolder = new TemporaryFolder(); + private static Plan bukkitMock; + private static PlanBungee bungeeMock; + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + private BukkitSystem bukkitSystem; + private BungeeSystem bungeeSystem; + + private UUID bukkitUUID; + private UUID bungeeUUID; + + @BeforeClass + public static void setUpClass() throws Exception { + BukkitMockUtil bukkitMockUtil = BukkitMockUtil.setUp() + .withDataFolder(temporaryFolder.getRoot()) + .withLogging() + .withPluginDescription() + .withResourceFetchingFromJar() + .withServer(); + bukkitMock = bukkitMockUtil.getPlanMock(); + + BungeeMockUtil bungeeMockUtil = BungeeMockUtil.setUp() + .withDataFolder(temporaryFolder.getRoot()) + .withLogging() + .withPluginDescription() + .withResourceFetchingFromJar() + .withProxy(); + bungeeMock = bungeeMockUtil.getPlanMock(); + } + + @Before + public void setUp() { + Settings.DEBUG.setTemporaryValue("console"); + Settings.DEV_MODE.setTemporaryValue(true); + } + + @After + public void tearDown() { + System.out.println("------------------------------"); + System.out.println("Disable"); + System.out.println("------------------------------"); + if (bukkitSystem != null) { + bukkitSystem.disable(); + } + if (bungeeSystem != null) { + bungeeSystem.disable(); + } + Teardown.resetSettingsTempValues(); + } + + public void enable() throws EnableException { + Settings.WEBSERVER_PORT.setTemporaryValue(9000); + + bukkitSystem = new BukkitSystem(bukkitMock); + bukkitSystem.enable(); + + bukkitUUID = ServerInfo.getServerUUID(); + + bungeeSystem = new BungeeSystem(bungeeMock); + + Settings.WEBSERVER_PORT.setTemporaryValue(9250); + Settings.BUNGEE_IP.setTemporaryValue("localhost"); + Settings.DB_TYPE.setTemporaryValue("sqlite"); + bungeeSystem.setDatabaseSystem(new BukkitDBSystem()); + + bungeeSystem.enable(); + + bungeeUUID = ServerInfo.getServerUUID(); + + System.out.println("------------------------------"); + System.out.println("Enable Complete"); + System.out.println("Bukkit: " + bukkitUUID); + System.out.println("Bungee: " + bungeeUUID); + System.out.println("------------------------------"); + } + + @Test + public void testRequest() throws EnableException, WebException { + enable(); + + System.out.println("Sending request"); + bungeeSystem.getInfoSystem().getConnectionSystem().sendWideInfoRequest(new GenerateInspectPageRequest(TestConstants.PLAYER_ONE_UUID)); + } +} \ No newline at end of file diff --git a/Plan/src/test/java/com/djrapitops/plan/system/BungeeSystemTest.java b/Plan/src/test/java/com/djrapitops/plan/system/BungeeSystemTest.java index 13bcdfbff..a7e1916dd 100644 --- a/Plan/src/test/java/com/djrapitops/plan/system/BungeeSystemTest.java +++ b/Plan/src/test/java/com/djrapitops/plan/system/BungeeSystemTest.java @@ -13,6 +13,7 @@ import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; +import utilities.Teardown; import utilities.mocks.BungeeMockUtil; /** @@ -30,8 +31,8 @@ public class BungeeSystemTest { public ExpectedException thrown = ExpectedException.none(); private BungeeSystem bungeeSystem; - @Before - public void setUp() throws Exception { + @BeforeClass + public static void setUpClass() throws Exception { BungeeMockUtil mockUtil = BungeeMockUtil.setUp() .withDataFolder(temporaryFolder.getRoot()) .withLogging() @@ -46,6 +47,7 @@ public class BungeeSystemTest { if (bungeeSystem != null) { bungeeSystem.disable(); } + Teardown.resetSettingsTempValues(); } @Test diff --git a/Plan/src/test/java/utilities/Teardown.java b/Plan/src/test/java/utilities/Teardown.java new file mode 100644 index 000000000..4e301e5d4 --- /dev/null +++ b/Plan/src/test/java/utilities/Teardown.java @@ -0,0 +1,21 @@ +/* + * Licence is provided in the jar as license.yml also here: + * https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml + */ +package utilities; + +import com.djrapitops.plan.system.settings.Settings; + +/** + * Test utility for {@code @Teardown} tags. + * + * @author Rsl1122 + */ +public class Teardown { + + public static void resetSettingsTempValues() { + for (Settings settings : Settings.values()) { + settings.setTemporaryValue(null); + } + } +} \ No newline at end of file diff --git a/Plan/src/test/java/utilities/mocks/BukkitMockUtil.java b/Plan/src/test/java/utilities/mocks/BukkitMockUtil.java index 739fa05f1..394b65509 100644 --- a/Plan/src/test/java/utilities/mocks/BukkitMockUtil.java +++ b/Plan/src/test/java/utilities/mocks/BukkitMockUtil.java @@ -7,6 +7,7 @@ package utilities.mocks; import com.djrapitops.plan.Plan; import com.djrapitops.plugin.StaticHolder; import com.djrapitops.plugin.task.RunnableFactory; +import com.djrapitops.plugin.task.ThreadRunnable; import org.bukkit.Server; import org.bukkit.plugin.InvalidDescriptionException; import org.bukkit.plugin.PluginDescriptionFile; @@ -47,6 +48,7 @@ public class BukkitMockUtil extends MockUtil { StaticHolder.register(planMock); StaticHolder.saveInstance(MockitoJUnitRunner.class, Plan.class); + StaticHolder.saveInstance(ThreadRunnable.class, Plan.class); doCallRealMethod().when(planMock).getVersion(); doCallRealMethod().when(planMock).getColorScheme(); diff --git a/Plan/src/test/java/utilities/mocks/BungeeMockUtil.java b/Plan/src/test/java/utilities/mocks/BungeeMockUtil.java index cf3d64b87..85fe2c752 100644 --- a/Plan/src/test/java/utilities/mocks/BungeeMockUtil.java +++ b/Plan/src/test/java/utilities/mocks/BungeeMockUtil.java @@ -7,6 +7,7 @@ package utilities.mocks; import com.djrapitops.plan.PlanBungee; import com.djrapitops.plugin.StaticHolder; import com.djrapitops.plugin.task.RunnableFactory; +import com.djrapitops.plugin.task.ThreadRunnable; import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.ProxyConfig; import net.md_5.bungee.api.ProxyServer; @@ -48,6 +49,7 @@ public class BungeeMockUtil extends MockUtil { StaticHolder.register(planMock); StaticHolder.saveInstance(MockitoJUnitRunner.class, PlanBungee.class); + StaticHolder.saveInstance(ThreadRunnable.class, PlanBungee.class); doCallRealMethod().when(planMock).getVersion(); doCallRealMethod().when(planMock).getColorScheme();