From 1139f832b63566bf0c3eb151f217d1597c9310bb Mon Sep 17 00:00:00 2001 From: NorbiPeti Date: Sat, 27 Jun 2020 02:51:38 +0200 Subject: [PATCH] Component disable on error --- .../lib/architecture/Component.java | 25 ++++-- Chroma-Core/src/main/resources/plugin.yml | 3 +- .../buttondevteam/core/PlayerDataTest.java | 82 ------------------- .../buttondevteam/core/TestPlayerClass.java | 25 ------ 4 files changed, 21 insertions(+), 114 deletions(-) delete mode 100755 Chroma-Core/src/test/java/buttondevteam/core/PlayerDataTest.java delete mode 100755 Chroma-Core/src/test/java/buttondevteam/core/TestPlayerClass.java diff --git a/Chroma-Core/src/main/java/buttondevteam/lib/architecture/Component.java b/Chroma-Core/src/main/java/buttondevteam/lib/architecture/Component.java index ccc0d3e..545a174 100644 --- a/Chroma-Core/src/main/java/buttondevteam/lib/architecture/Component.java +++ b/Chroma-Core/src/main/java/buttondevteam/lib/architecture/Component.java @@ -119,20 +119,33 @@ public abstract class Component { } /** - * Registers a component checking it's dependencies and calling {@link #register(JavaPlugin)}.
- * Make sure to register the dependencies first. + * Enables or disables the given component. If the component fails to enable, it will be disabled. * * @param component The component to register + * @param enabled Whether it's enabled or not */ public static void setComponentEnabled(Component component, boolean enabled) throws UnregisteredComponentException { if (!components.containsKey(component.getClass())) throw new UnregisteredComponentException(component); if (component.enabled == enabled) return; //Don't do anything if (component.enabled = enabled) { - updateConfig(component.getPlugin(), component); - component.enable(); - if (ButtonPlugin.configGenAllowed(component)) { - IHaveConfig.pregenConfig(component, null); + try { + updateConfig(component.getPlugin(), component); + component.enable(); + if (ButtonPlugin.configGenAllowed(component)) { + IHaveConfig.pregenConfig(component, null); + } + } catch (Exception e) { + try { //Automatically disable components that fail to enable properly + setComponentEnabled(component, false); + throw e; + } catch (Exception ex) { + Throwable t = ex; + for (var th = t; th != null; th = th.getCause()) + t = th; //Set if not null + t.initCause(e); + throw ex; + } } } else { component.disable(); diff --git a/Chroma-Core/src/main/resources/plugin.yml b/Chroma-Core/src/main/resources/plugin.yml index c277429..3298819 100755 --- a/Chroma-Core/src/main/resources/plugin.yml +++ b/Chroma-Core/src/main/resources/plugin.yml @@ -22,4 +22,5 @@ softdepend: - Towny - Votifier - Multiverse-Core - - Essentials \ No newline at end of file + - Essentials +api-version: '1.13' diff --git a/Chroma-Core/src/test/java/buttondevteam/core/PlayerDataTest.java b/Chroma-Core/src/test/java/buttondevteam/core/PlayerDataTest.java deleted file mode 100755 index 1b9c808..0000000 --- a/Chroma-Core/src/test/java/buttondevteam/core/PlayerDataTest.java +++ /dev/null @@ -1,82 +0,0 @@ -package buttondevteam.core; - -import buttondevteam.core.TestPlayerClass.TestEnum; -import buttondevteam.lib.player.ChromaGamerBase; -import buttondevteam.lib.player.TBMCPlayerBase; -import junit.framework.Test; -import junit.framework.TestCase; -import junit.framework.TestSuite; - -import java.io.File; -import java.io.IOException; -import java.nio.file.FileVisitResult; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.UUID; - -public class PlayerDataTest extends TestCase { - public PlayerDataTest() { - super("Player data test"); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() { - return new TestSuite(PlayerDataTest.class); - } - - public void testConfig() throws Exception { - TestPrepare.PrepareServer(); - //FileUtils.deleteDirectory(new File(ChromaGamerBase.TBMC_PLAYERS_DIR)); - File file = new File(ChromaGamerBase.TBMC_PLAYERS_DIR); - if (file.exists()) { - Files.walkFileTree(file.toPath(), new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) - throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException e) - throws IOException { - if (e == null) { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } else { - // directory iteration failed - throw e; - } - } - }); - } - UUID uuid = new UUID(0L, 0L); - try (TestPlayerClass p = TBMCPlayerBase.getPlayer(uuid, TestPlayerClass.class)) { - p.PlayerName().set("Test"); - assertEquals("Test", p.PlayerName().get()); - assertEquals(TestEnum.A, p.testenum().get()); - assertEquals((short) 0, (short) p.TestShort().get()); - assertFalse(p.TestBool().get()); - p.testenum().set(TestEnum.B); - assertEquals(TestEnum.B, p.testenum().get()); - p.TestShort().set((short) 5); - assertEquals((short) 5, (short) p.TestShort().get()); - p.TestBool().set(true); - assertTrue(p.TestBool().get()); - } catch (Exception e) { - throw e; - } - try (TestPlayerClass p = TBMCPlayerBase.getPlayer(uuid, TestPlayerClass.class)) { - assertEquals("Test", p.PlayerName().get()); - assertEquals(TestEnum.B, p.testenum().get()); - assertEquals((short) 5, (short) p.TestShort().get()); - assertTrue(p.TestBool().get()); - } catch (Exception e) { - throw e; - } - } -} diff --git a/Chroma-Core/src/test/java/buttondevteam/core/TestPlayerClass.java b/Chroma-Core/src/test/java/buttondevteam/core/TestPlayerClass.java deleted file mode 100755 index 3e1790b..0000000 --- a/Chroma-Core/src/test/java/buttondevteam/core/TestPlayerClass.java +++ /dev/null @@ -1,25 +0,0 @@ -package buttondevteam.core; - -import buttondevteam.lib.player.EnumPlayerData; -import buttondevteam.lib.player.PlayerClass; -import buttondevteam.lib.player.PlayerData; -import buttondevteam.lib.player.TBMCPlayerBase; - -@PlayerClass(pluginname = "TestPlugin") -public class TestPlayerClass extends TBMCPlayerBase { - public EnumPlayerData testenum() { - return dataEnum(TestEnum.class, TestEnum.A); - } - - public enum TestEnum { - A, B - } - - public PlayerData TestShort() { - return data((short) 0); - } - - public PlayerData TestBool() { - return data(false); - } -}