diff --git a/src/main/java/world/bentobox/bentobox/api/flags/Flag.java b/src/main/java/world/bentobox/bentobox/api/flags/Flag.java index edcf7aae8..3344744cd 100644 --- a/src/main/java/world/bentobox/bentobox/api/flags/Flag.java +++ b/src/main/java/world/bentobox/bentobox/api/flags/Flag.java @@ -25,6 +25,8 @@ import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.managers.RanksManager; +import world.bentobox.bentobox.util.ItemParser; + public class Flag implements Comparable { @@ -315,6 +317,13 @@ public class Flag implements Comparable { return PROTECTION_FLAGS + this.id + ".name"; } + /** + * @return a locale reference for the icon of this protection flag + */ + public String getIconReference() { + return PROTECTION_FLAGS + this.id + ".icon"; + } + /** * @return a locale reference for the description of this protection flag */ @@ -377,7 +386,7 @@ public class Flag implements Comparable { } // Start the flag conversion PanelItemBuilder pib = new PanelItemBuilder() - .icon(new ItemStack(icon)) + .icon(ItemParser.parse(user.getTranslation(this.getIconReference()), new ItemStack(icon))) .name(user.getTranslation("protection.panel.flag-item.name-layout", TextVariables.NAME, user.getTranslation(getNameReference()))) .clickHandler(clickHandler) .invisible(invisible); diff --git a/src/main/java/world/bentobox/bentobox/util/ItemParser.java b/src/main/java/world/bentobox/bentobox/util/ItemParser.java index 90a3e8faf..92e7d68ff 100644 --- a/src/main/java/world/bentobox/bentobox/util/ItemParser.java +++ b/src/main/java/world/bentobox/bentobox/util/ItemParser.java @@ -14,6 +14,7 @@ import org.bukkit.potion.PotionType; import org.eclipse.jdt.annotation.Nullable; import java.lang.reflect.Field; +import java.util.MissingFormatArgumentException; import java.util.UUID; import world.bentobox.bentobox.BentoBox; @@ -26,16 +27,28 @@ import world.bentobox.bentobox.BentoBox; * @author tastybento, Poslovitch */ public class ItemParser { + /** * Parse given string to ItemStack. * @param text String value of item stack. * @return ItemStack of parsed item or null. */ - @Nullable public static ItemStack parse(String text) { + return ItemParser.parse(text, null); + } + + + /** + * Parse given string to ItemStack. + * @param text String value of item stack. + * @param defaultItemStack Material that should be returned if parsing failed. + * @return ItemStack of parsed item or defaultItemStack. + */ + @Nullable + public static ItemStack parse(@Nullable String text, @Nullable ItemStack defaultItemStack) { if (text == null || text.isBlank()) { // Text does not exist or is empty. - return null; + return defaultItemStack; } String[] part = text.split(":"); @@ -69,7 +82,7 @@ public class ItemParser { BentoBox.getInstance().logError("Could not parse item " + text); } - return null; + return defaultItemStack; } @@ -86,7 +99,7 @@ public class ItemParser { Material reqItem = Material.getMaterial(part[0].toUpperCase(java.util.Locale.ENGLISH)); if (reqItem == null) { - return null; + throw new IllegalArgumentException(part[0] + " is not a valid Material."); } return new ItemStack(reqItem, reqAmount); @@ -107,13 +120,11 @@ public class ItemParser { String[] parsable = {part[0], part[2]}; ItemStack durability = parseItemQuantity(parsable); - if (durability != null) { - ItemMeta meta = durability.getItemMeta(); + ItemMeta meta = durability.getItemMeta(); - if (meta instanceof Damageable) { - ((Damageable) meta).setDamage(Integer.parseInt(part[1])); - durability.setItemMeta(meta); - } + if (meta instanceof Damageable) { + ((Damageable) meta).setDamage(Integer.parseInt(part[1])); + durability.setItemMeta(meta); } return durability; @@ -131,7 +142,7 @@ public class ItemParser { */ private static ItemStack parsePotion(String[] part) { if (part.length != 6) { - return null; + throw new MissingFormatArgumentException("Potion parsing requires 6 parts."); } /* @@ -172,29 +183,25 @@ public class ItemParser { * @return Banner as item stack. */ private static ItemStack parseBanner(String[] part) { - try { - if (part.length >= 2) { - Material bannerMat = Material.getMaterial(part[0]); - if (bannerMat == null) { - BentoBox.getInstance().logError("Could not parse banner item " + part[0] + " so using a white banner."); - bannerMat = Material.WHITE_BANNER; - } - ItemStack result = new ItemStack(bannerMat, Integer.parseInt(part[1])); - - BannerMeta meta = (BannerMeta) result.getItemMeta(); - if (meta != null) { - for (int i = 2; i < part.length; i += 2) { - meta.addPattern(new Pattern(DyeColor.valueOf(part[i + 1]), PatternType.valueOf(part[i]))); - } - result.setItemMeta(meta); - } - - return result; - } else { - return null; + if (part.length >= 2) { + Material bannerMat = Material.getMaterial(part[0]); + if (bannerMat == null) { + BentoBox.getInstance().logError("Could not parse banner item " + part[0] + " so using a white banner."); + bannerMat = Material.WHITE_BANNER; } - } catch (Exception e) { - return null; + ItemStack result = new ItemStack(bannerMat, Integer.parseInt(part[1])); + + BannerMeta meta = (BannerMeta) result.getItemMeta(); + if (meta != null) { + for (int i = 2; i < part.length; i += 2) { + meta.addPattern(new Pattern(DyeColor.valueOf(part[i + 1]), PatternType.valueOf(part[i]))); + } + result.setItemMeta(meta); + } + + return result; + } else { + throw new MissingFormatArgumentException("Banner parsing requires at least 2 parts."); } } @@ -228,11 +235,6 @@ public class ItemParser { playerHead = new ItemStack(Material.PLAYER_HEAD); } - if (playerHead == null) { - // just a null-pointer check. - return null; - } - // Set correct Skull texture try { SkullMeta meta = (SkullMeta) playerHead.getItemMeta(); diff --git a/src/test/java/world/bentobox/bentobox/util/ItemParserTest.java b/src/test/java/world/bentobox/bentobox/util/ItemParserTest.java index adf70afbe..7ebecd6cd 100644 --- a/src/test/java/world/bentobox/bentobox/util/ItemParserTest.java +++ b/src/test/java/world/bentobox/bentobox/util/ItemParserTest.java @@ -36,6 +36,7 @@ public class ItemParserTest { private PotionMeta potionMeta; private BannerMeta bannerMeta; + private ItemStack defaultItem; @Before public void setUp() throws Exception { @@ -67,6 +68,7 @@ public class ItemParserTest { } }); + defaultItem = new ItemStack(Material.STONE); } @After @@ -77,16 +79,19 @@ public class ItemParserTest { @Test public void testParseNull() { assertNull(ItemParser.parse(null)); + assertEquals(defaultItem, ItemParser.parse(null, defaultItem)); } @Test public void testParseBlank() { assertNull(ItemParser.parse("")); + assertEquals(defaultItem, ItemParser.parse("", defaultItem)); } @Test public void testParseNoColons() { assertNull(ItemParser.parse("NOCOLONS")); + assertEquals(defaultItem, ItemParser.parse("NOCOLONS", defaultItem)); } /* @@ -258,6 +263,8 @@ public class ItemParserTest { @Test public void testParseBadTwoItem() { assertNull(ItemParser.parse("STNE:5")); + assertEquals(defaultItem, ItemParser.parse("STNE:3", defaultItem)); + assertEquals(defaultItem, ItemParser.parse("STNE:Z", defaultItem)); } @Test @@ -270,5 +277,8 @@ public class ItemParserTest { @Test public void testParseBadThreeItem() { assertNull(ItemParser.parse("STNE:5:5")); + assertEquals(defaultItem, ItemParser.parse("STNE:5:5", defaultItem)); + assertEquals(defaultItem, ItemParser.parse("STNE:AA:5", defaultItem)); + assertEquals(defaultItem, ItemParser.parse("WOODEN_SWORD:4:AA", defaultItem)); } }