From 7d8e95f4c1895cb60d14909c0f24e62bc8ae59ea Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 12 Jul 2021 13:03:14 +0200 Subject: [PATCH 01/24] Initial work on the new inventory system --- .../dough/inventory/CustomInventory.java | 26 +++++++ .../dough/inventory/InventoryLayout.java | 37 ++++++++++ .../dough/inventory/SlotGroup.java | 67 +++++++++++++++++++ .../inventory/implementation/Inventories.java | 33 +++++++++ .../InventoryLayoutBuilder.java | 28 ++++++++ 5 files changed, 191 insertions(+) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java new file mode 100644 index 00000000..8bf7f758 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java @@ -0,0 +1,26 @@ +package io.github.thebusybiscuit.dough.inventory; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.inventory.ItemStack; + +// TODO: Rename this class +public interface CustomInventory { + + /** + * This returns the {@link InventoryLayout} which was used to create + * this {@link CustomInventory}. + * + * @return The {@link InventoryLayout} + */ + @Nonnull + InventoryLayout getLayout(); + + @ParametersAreNonnullByDefault + void setAll(SlotGroup group, ItemStack item); + + @ParametersAreNonnullByDefault + boolean addItem(SlotGroup group, ItemStack item); + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java new file mode 100644 index 00000000..2c6c0198 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java @@ -0,0 +1,37 @@ +package io.github.thebusybiscuit.dough.inventory; + +import java.util.Set; + +import javax.annotation.Nonnull; + +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryHolder; + +import io.github.thebusybiscuit.dough.inventory.implementation.Inventories; + +public interface InventoryLayout extends InventoryHolder { + + @Nonnull + Set getSlotGroups(); + + /** + * This returns the size of the resulting {@link Inventory}. + * + * @return The {@link Inventory} size + */ + int getSize(); + + @Nonnull + SlotGroup getGroup(char identifier); + + @Nonnull + SlotGroup getGroup(int slot); + + @Nonnull + SlotGroup getGroup(@Nonnull String name); + + default @Nonnull CustomInventory createInventory() { + return Inventories.createInventory(this); + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java new file mode 100644 index 00000000..c9990f16 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java @@ -0,0 +1,67 @@ +package io.github.thebusybiscuit.dough.inventory; + +import javax.annotation.Nonnull; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +/** + * A {@link SlotGroup} groups slots together and divides an {@link Inventory} + * into distinct regions which can be used for easy access. + * + * @author TheBusyBiscuit + * + */ +public interface SlotGroup { + + /** + * This returns the unique identifier for this {@link SlotGroup}, + * we use a {@link Character} for this. + * + * @return The unique identifier of this {@link SlotGroup} + */ + @Nonnull + char getCharIdentifier(); + + /** + * This method returns whether this {@link SlotGroup} is interactable. + * An interactable {@link SlotGroup} allows the {@link Player} to take + * and store items from/in slots of this group. + *

+ * If {@link #isInteractable()} returns false, the click event will + * be cancelled. + * + * @return Whether this {@link SlotGroup} is interactable + */ + boolean isInteractable(); + + /** + * This returns the name or label of this {@link SlotGroup}, names help + * to make a {@link SlotGroup} easier to identify instead of relying on the + * {@link Character} identifier all the time. + * + * @return The name of this {@link SlotGroup} + */ + @Nonnull + String getName(); + + /** + * This method returns an array containing all the individual slots of + * this {@link SlotGroup}. + * + * @return An array with all slots of this {@link SlotGroup}. + */ + @Nonnull + int[] getSlots(); + + /** + * This returns the default {@link ItemStack} for this {@link SlotGroup}. + * The item will be Material.AIR by default and never null. + * + * @return The default {@link ItemStack} + */ + @Nonnull + ItemStack getDefaultItemStack(); + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java new file mode 100644 index 00000000..b7e4ac22 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java @@ -0,0 +1,33 @@ +package io.github.thebusybiscuit.dough.inventory.implementation; + +import java.io.InputStream; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; + +// TODO: Perhaps rename this too +public final class Inventories { + + private Inventories() {} + + @ParametersAreNonnullByDefault + public static @Nonnull InventoryLayout getLayoutFromStream(InputStream stream) { + // TODO: Load an InventoryLayout from an InputStream + return null; + } + + public static @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { + Inventory inv = Bukkit.createInventory(layout, layout.getSize()); + + // TODO Wrap Inventory using CustomInventory + + return null; + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java new file mode 100644 index 00000000..66c6a126 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java @@ -0,0 +1,28 @@ +package io.github.thebusybiscuit.dough.inventory.implementation; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; + +public class InventoryLayoutBuilder { + + private final int size; + + public InventoryLayoutBuilder(int size) { + // TODO: Validate size input + this.size = size; + } + + @ParametersAreNonnullByDefault + public @Nonnull InventoryLayoutBuilder newSlotGroup(char key, String name, int... slots) { + // TODO: Create slot group + return this; + } + + public @Nonnull InventoryLayout build() { + // TODO: Implement builder + return null; + } + +} From 6665a1adf3488020b471ac0e9422b5065a10217e Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 12 Jul 2021 14:29:04 +0200 Subject: [PATCH 02/24] Some more progress --- .../dough/inventory/CustomInventory.java | 6 +++ .../{implementation => }/Inventories.java | 7 +-- .../dough/inventory/InventoryLayout.java | 2 - .../InventoryLayoutBuilder.java | 9 ++-- .../inventory/builders/SlotGroupBuilder.java | 48 +++++++++++++++++++ .../handlers/CustomInventoryClickHandler.java | 12 +++++ .../payloads/AbstractInventoryPayload.java | 19 ++++++++ .../payloads/InventoryClickPayload.java | 41 ++++++++++++++++ 8 files changed, 133 insertions(+), 11 deletions(-) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/{implementation => }/Inventories.java (69%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/{implementation => builders}/InventoryLayoutBuilder.java (73%) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java index 8bf7f758..7e6d1847 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java @@ -23,4 +23,10 @@ public interface CustomInventory { @ParametersAreNonnullByDefault boolean addItem(SlotGroup group, ItemStack item); + @ParametersAreNonnullByDefault + void setItem(int slot, ItemStack item); + + @Nonnull + ItemStack getItem(int slot); + } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java similarity index 69% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java index b7e4ac22..3716c15e 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/Inventories.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.implementation; +package io.github.thebusybiscuit.dough.inventory; import java.io.InputStream; @@ -8,9 +8,6 @@ import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; - // TODO: Perhaps rename this too public final class Inventories { @@ -22,7 +19,7 @@ private Inventories() {} return null; } - public static @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { + static @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { Inventory inv = Bukkit.createInventory(layout, layout.getSize()); // TODO Wrap Inventory using CustomInventory diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java index 2c6c0198..6d38d3c8 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java @@ -7,8 +7,6 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -import io.github.thebusybiscuit.dough.inventory.implementation.Inventories; - public interface InventoryLayout extends InventoryHolder { @Nonnull diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java similarity index 73% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java index 66c6a126..bf74eb9a 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/implementation/InventoryLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java @@ -1,21 +1,22 @@ -package io.github.thebusybiscuit.dough.inventory.implementation; +package io.github.thebusybiscuit.dough.inventory.builders; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; public class InventoryLayoutBuilder { - + private final int size; - + public InventoryLayoutBuilder(int size) { // TODO: Validate size input this.size = size; } @ParametersAreNonnullByDefault - public @Nonnull InventoryLayoutBuilder newSlotGroup(char key, String name, int... slots) { + public @Nonnull InventoryLayoutBuilder addSlotGroup(SlotGroup group) { // TODO: Create slot group return this; } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java new file mode 100644 index 00000000..d8d45123 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java @@ -0,0 +1,48 @@ +package io.github.thebusybiscuit.dough.inventory.builders; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.dough.inventory.SlotGroup; + +public class SlotGroupBuilder { + + private final char identifier; + private final String name; + + private boolean interactable = false; + + @ParametersAreNonnullByDefault + public SlotGroupBuilder(char identifier, String name) { + this.identifier = identifier; + this.name = name; + } + + public @Nonnull SlotGroupBuilder interactable(boolean interactable) { + this.interactable = interactable; + return this; + } + + public @Nonnull SlotGroupBuilder withSlot(int slot) { + // TODO: add slot + return this; + } + + public @Nonnull SlotGroupBuilder withSlots(int... slots) { + // TODO: add slots + return this; + } + + public @Nonnull SlotGroupBuilder withDefaultItem(@Nonnull ItemStack item) { + // TODO: Set default item + return this; + } + + public @Nonnull SlotGroup build() { + // TODO: Implement builder + return null; + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java new file mode 100644 index 00000000..0cca49b2 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java @@ -0,0 +1,12 @@ +package io.github.thebusybiscuit.dough.inventory.handlers; + +import javax.annotation.Nonnull; + +import io.github.thebusybiscuit.dough.inventory.payloads.InventoryClickPayload; + +@FunctionalInterface +public interface CustomInventoryClickHandler { + + void onClick(@Nonnull InventoryClickPayload e); + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java new file mode 100644 index 00000000..3e20915f --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java @@ -0,0 +1,19 @@ +package io.github.thebusybiscuit.dough.inventory.payloads; + +import javax.annotation.Nonnull; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; + +abstract class AbstractInventoryPayload { + + private final CustomInventory inventory; + + AbstractInventoryPayload(@Nonnull CustomInventory inventory) { + this.inventory = inventory; + } + + public @Nonnull CustomInventory getInventory() { + return inventory; + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java new file mode 100644 index 00000000..1ec2d77b --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java @@ -0,0 +1,41 @@ +package io.github.thebusybiscuit.dough.inventory.payloads; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; + +public class InventoryClickPayload extends AbstractInventoryPayload { + + private final Player player; + private final int slot; + + @ParametersAreNonnullByDefault + InventoryClickPayload(CustomInventory inventory, Player player, int slot) { + super(inventory); + + this.player = player; + this.slot = slot; + } + + public @Nonnull Player getPlayer() { + return player; + } + + public int getClickedSlot() { + return slot; + } + + public @Nonnull ItemStack getClickedItemStack() { + return getInventory().getItem(getClickedSlot()); + } + + public @Nonnull SlotGroup getClickedSlotGroup() { + return getInventory().getLayout().getGroup(getClickedSlot()); + } + +} From 1fa5b43a63fb87042a1deece541041434abeec4e Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 12 Jul 2021 19:12:42 +0200 Subject: [PATCH 03/24] Added some unit tests and more progress --- .../dough/inventory/Inventories.java | 2 +- .../dough/inventory/InventoryLayout.java | 2 +- .../dough/inventory/SlotGroup.java | 11 ++- .../builders/InventoryLayoutBuilder.java | 18 ++-- .../InventoryLayoutBuilderResult.java | 86 +++++++++++++++++++ .../inventory/builders/SlotGroupBuilder.java | 30 +++++-- .../builders/SlotGroupBuilderResult.java | 61 +++++++++++++ .../inventory/TestInventoryLayoutBuilder.java | 83 ++++++++++++++++++ 8 files changed, 277 insertions(+), 16 deletions(-) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java index 3716c15e..08faa333 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java @@ -20,7 +20,7 @@ private Inventories() {} } static @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { - Inventory inv = Bukkit.createInventory(layout, layout.getSize()); +// Inventory inv = Bukkit.createInventory(layout, layout.getSize()); // TODO Wrap Inventory using CustomInventory diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java index 6d38d3c8..063c1a58 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -public interface InventoryLayout extends InventoryHolder { +public interface InventoryLayout { @Nonnull Set getSlotGroups(); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java index c9990f16..2282a144 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java @@ -50,11 +50,20 @@ public interface SlotGroup { * This method returns an array containing all the individual slots of * this {@link SlotGroup}. * - * @return An array with all slots of this {@link SlotGroup}. + * @return An array with all slots of this {@link SlotGroup} */ @Nonnull int[] getSlots(); + /** + * This returns the size of this {@link SlotGroup}. + * + * @return The size of this {@link SlotGroup} + */ + default int size() { + return getSlots().length; + } + /** * This returns the default {@link ItemStack} for this {@link SlotGroup}. * The item will be Material.AIR by default and never null. diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java index bf74eb9a..5c3f4429 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java @@ -1,29 +1,37 @@ package io.github.thebusybiscuit.dough.inventory.builders; +import java.util.HashSet; +import java.util.Set; + import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; +import org.apache.commons.lang.Validate; + import io.github.thebusybiscuit.dough.inventory.InventoryLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; public class InventoryLayoutBuilder { - private final int size; + protected final int size; + protected final Set groups = new HashSet<>(); public InventoryLayoutBuilder(int size) { - // TODO: Validate size input + Validate.isTrue(size > 0, "The size must be greater than 0."); + Validate.isTrue(size % 9 == 0, "The size must be a multiple of 9."); + Validate.isTrue(size <= 54, "The size must not be greater than 54."); + this.size = size; } @ParametersAreNonnullByDefault public @Nonnull InventoryLayoutBuilder addSlotGroup(SlotGroup group) { - // TODO: Create slot group + groups.add(group); return this; } public @Nonnull InventoryLayout build() { - // TODO: Implement builder - return null; + return new InventoryLayoutBuilderResult(this); } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java new file mode 100644 index 00000000..7aa6d89a --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java @@ -0,0 +1,86 @@ +package io.github.thebusybiscuit.dough.inventory.builders; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Predicate; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; + +class InventoryLayoutBuilderResult implements InventoryLayout { + + private final int size; + private final Set groups = new HashSet<>(); + + InventoryLayoutBuilderResult(@Nonnull InventoryLayoutBuilder builder) { + this.size = builder.size; + this.groups.addAll(builder.groups); + } + + @Override + public @Nonnull Set getSlotGroups() { + return groups; + } + + @Override + public int getSize() { + return size; + } + + @Override + public @Nonnull SlotGroup getGroup(char identifier) { + SlotGroup result = findGroup(group -> group.getCharIdentifier() == identifier); + + if (result != null) { + return result; + } else { + throw new IllegalArgumentException("Could not find a SlotGroup with the identifier '" + identifier + "'"); + } + } + + @Override + public @Nonnull SlotGroup getGroup(int slot) { + SlotGroup result = findGroup(group -> { + for (int groupSlot : group.getSlots()) { + if (groupSlot == slot) { + return true; + } + } + + return false; + }); + + if (result != null) { + return result; + } else { + throw new IllegalArgumentException("Could not find a SlotGroup at slot: '" + slot + "'"); + } + } + + @Override + public @Nonnull SlotGroup getGroup(@Nonnull String name) { + SlotGroup result = findGroup(group -> group.getName().equals(name)); + + if (result != null) { + return result; + } else { + throw new IllegalArgumentException("Could not find a SlotGroup with the name '" + name + "'"); + } + } + + @ParametersAreNonnullByDefault + private @Nullable SlotGroup findGroup(Predicate predicate) { + for (SlotGroup group : getSlotGroups()) { + if (predicate.test(group)) { + return group; + } + } + + return null; + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java index d8d45123..d74f96e2 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java @@ -1,18 +1,25 @@ package io.github.thebusybiscuit.dough.inventory.builders; +import java.util.HashSet; +import java.util.Set; + import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; +import org.apache.commons.lang.Validate; +import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.dough.inventory.SlotGroup; public class SlotGroupBuilder { - private final char identifier; - private final String name; + protected final char identifier; + protected final String name; + protected final Set slots = new HashSet<>(); - private boolean interactable = false; + protected ItemStack defaultItem = new ItemStack(Material.AIR); + protected boolean interactable = false; @ParametersAreNonnullByDefault public SlotGroupBuilder(char identifier, String name) { @@ -26,23 +33,30 @@ public SlotGroupBuilder(char identifier, String name) { } public @Nonnull SlotGroupBuilder withSlot(int slot) { - // TODO: add slot + this.slots.add(slot); return this; } public @Nonnull SlotGroupBuilder withSlots(int... slots) { - // TODO: add slots + for (int slot : slots) { + this.slots.add(slot); + } return this; } public @Nonnull SlotGroupBuilder withDefaultItem(@Nonnull ItemStack item) { - // TODO: Set default item + Validate.notNull(item, "The item cannot be null."); + this.defaultItem = item; return this; } public @Nonnull SlotGroup build() { - // TODO: Implement builder - return null; + Validate.notNull(identifier, "The char identifier may not be null."); + Validate.notNull(name, "The name may not be null."); + Validate.notNull(defaultItem, "The default item may not be null."); + Validate.notEmpty(slots, "A SlotGroup must have at least one slot."); + + return new SlotGroupBuilderResult(this); } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java new file mode 100644 index 00000000..c8813dc0 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java @@ -0,0 +1,61 @@ +package io.github.thebusybiscuit.dough.inventory.builders; + +import java.util.Set; + +import javax.annotation.Nonnull; + +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.dough.inventory.SlotGroup; + +class SlotGroupBuilderResult implements SlotGroup { + + private final char identifier; + private final String name; + private final boolean interactable; + private final ItemStack defaultItem; + private final int[] slots; + + SlotGroupBuilderResult(@Nonnull SlotGroupBuilder builder) { + this.identifier = builder.identifier; + this.name = builder.name; + this.interactable = builder.interactable; + this.defaultItem = builder.defaultItem; + this.slots = convertSlots(builder.slots); + } + + private @Nonnull int[] convertSlots(@Nonnull Set slots) { + // @formatter:off + return slots.stream() + .mapToInt(Integer::intValue) + .sorted() + .toArray(); + // @formatter:on + } + + @Override + public char getCharIdentifier() { + return identifier; + } + + @Override + public boolean isInteractable() { + return interactable; + } + + @Override + public String getName() { + return name; + } + + @Override + public int[] getSlots() { + return slots; + } + + @Override + public ItemStack getDefaultItemStack() { + return defaultItem; + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java new file mode 100644 index 00000000..bde27dde --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java @@ -0,0 +1,83 @@ +package io.github.thebusybiscuit.dough.inventory; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import javax.annotation.Nonnull; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; + +class TestInventoryLayoutBuilder { + + @Test + void testSlotGroups() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .interactable(false) + .withSlots(1, 2, 3) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test2") + .interactable(true) + .withSlots(0, 4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + assertNotNull(layout); + + SlotGroup group = layout.getGroup('x'); + + assertNotNull(group); + assertEquals(3, group.size()); + assertSame(group, layout.getGroup("test")); + assertSame(group, layout.getGroup(1)); + assertSame(group, layout.getGroup(2)); + assertSame(group, layout.getGroup(3)); + assertFalse(group.isInteractable()); + + SlotGroup group2 = layout.getGroup("test2"); + + assertNotNull(group2); + assertSame(group2, layout.getGroup('y')); + assertNotEquals(group, group2); + assertEquals(6, group2.size()); + assertSame(group2, layout.getGroup(0)); + } + + @ParameterizedTest(name = "{0} is not a valid inventory size.") + @MethodSource("getIllegalInventorySizes") + void testIllegalInventorySizes(int size) { + assertThrows(IllegalArgumentException.class, () -> new InventoryLayoutBuilder(size)); + } + + private static @Nonnull Stream getIllegalInventorySizes() { + List validArguments = Arrays.asList(9, 18, 27, 36, 45, 54); + + // @formatter:off + return IntStream.range(-10, 60) + .filter(arg -> !validArguments.contains(arg)) + .mapToObj(Arguments::of); + // @formatter:on + } + +} From 84621cb62e91296f04a38ffe95aeee39d0be06f0 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 12 Jul 2021 19:42:06 +0200 Subject: [PATCH 04/24] Over 90% coverage :cool: --- .../dough/inventory/InventoryLayout.java | 1 - .../builders/InventoryLayoutBuilder.java | 2 + .../InventoryLayoutBuilderResult.java | 25 ++++- .../inventory/TestInventoryLayoutBuilder.java | 98 ++++++++++++++++++- 4 files changed, 122 insertions(+), 4 deletions(-) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java index 063c1a58..9f53ae9c 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java @@ -5,7 +5,6 @@ import javax.annotation.Nonnull; import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.InventoryHolder; public interface InventoryLayout { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java index 5c3f4429..4903c346 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java @@ -31,6 +31,8 @@ public InventoryLayoutBuilder(int size) { } public @Nonnull InventoryLayout build() { + Validate.notEmpty(groups, "There are no SlotGroups defined."); + return new InventoryLayoutBuilderResult(this); } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java index 7aa6d89a..e9027930 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java @@ -1,5 +1,6 @@ package io.github.thebusybiscuit.dough.inventory.builders; +import java.util.Collections; import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; @@ -8,6 +9,8 @@ import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import org.apache.commons.lang.Validate; + import io.github.thebusybiscuit.dough.inventory.InventoryLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; @@ -19,11 +22,29 @@ class InventoryLayoutBuilderResult implements InventoryLayout { InventoryLayoutBuilderResult(@Nonnull InventoryLayoutBuilder builder) { this.size = builder.size; this.groups.addAll(builder.groups); + + Set slots = new HashSet<>(); + + for (SlotGroup group : groups) { + Validate.notNull(group, "SlotGroups cannot be null."); + + for (int slot : group.getSlots()) { + Validate.isTrue(slot >= 0 && slot < size, "Slot " + slot + " is outside the bounds of this inventory (0 - " + size + ')'); + + if (!slots.add(slot)) { + throw new IllegalStateException("Slot " + slot + " is defined by multiple slot groups."); + } + } + } + + if (slots.size() != size) { + throw new IllegalStateException("Only " + slots.size() + " / " + size + " slots are covered by slot groups."); + } } @Override public @Nonnull Set getSlotGroups() { - return groups; + return Collections.unmodifiableSet(groups); } @Override @@ -74,7 +95,7 @@ public int getSize() { @ParametersAreNonnullByDefault private @Nullable SlotGroup findGroup(Predicate predicate) { - for (SlotGroup group : getSlotGroups()) { + for (SlotGroup group : groups) { if (predicate.test(group)) { return group; } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java index bde27dde..d0e62d54 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java @@ -6,24 +6,43 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.IntStream; import java.util.stream.Stream; import javax.annotation.Nonnull; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import be.seeseemelk.mockbukkit.MockBukkit; + class TestInventoryLayoutBuilder { + @BeforeAll + static void setup() { + MockBukkit.mock(); + } + + @AfterAll + static void teardown() { + MockBukkit.unmock(); + } + @Test void testSlotGroups() { // @formatter:off @@ -31,19 +50,23 @@ void testSlotGroups() { .addSlotGroup( new SlotGroupBuilder('x', "test") .interactable(false) - .withSlots(1, 2, 3) + .withSlot(1) + .withSlot(2) + .withSlot(3) .build() ) .addSlotGroup( new SlotGroupBuilder('y', "test2") .interactable(true) .withSlots(0, 4, 5, 6, 7, 8) + .withDefaultItem(new ItemStack(Material.DIAMOND)) .build() ) .build(); // @formatter:on assertNotNull(layout); + assertEquals(9, layout.getSize()); SlotGroup group = layout.getGroup('x'); @@ -62,6 +85,79 @@ void testSlotGroups() { assertNotEquals(group, group2); assertEquals(6, group2.size()); assertSame(group2, layout.getGroup(0)); + assertEquals(new ItemStack(Material.DIAMOND), group2.getDefaultItemStack()); + + Set groups = layout.getSlotGroups(); + assertEquals(2, groups.size()); + assertTrue(groups.contains(group)); + assertTrue(groups.contains(group2)); + } + + @Test + void testSlotGroupOverlapping() { + // @formatter:off + InventoryLayoutBuilder builder = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlot(1) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test2") + .withSlot(1) + .build() + ); + // @formatter:on + + assertThrows(IllegalStateException.class, builder::build); + } + + @ParameterizedTest + @ValueSource(ints = { -1, 10 }) + void testOutsideSlotGroups(int slot) { + // @formatter:off + InventoryLayoutBuilder builder = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlot(slot) + .build() + ); + // @formatter:on + + assertThrows(IllegalArgumentException.class, builder::build); + } + + @Test + void testUnknownSlotGroups() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + assertThrows(IllegalArgumentException.class, () -> layout.getGroup(-1)); + assertThrows(IllegalArgumentException.class, () -> layout.getGroup(10)); + assertThrows(IllegalArgumentException.class, () -> layout.getGroup('a')); + assertThrows(IllegalArgumentException.class, () -> layout.getGroup("Walshy")); + assertThrows(IllegalArgumentException.class, () -> layout.getGroup(null)); + } + + @Test + void testIncompleteSlotGroups() { + // @formatter:off + InventoryLayoutBuilder builder = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(1, 2, 3, 4, 5, 6, 7, 8) + .build() + ); + // @formatter:on + + assertThrows(IllegalStateException.class, builder::build); } @ParameterizedTest(name = "{0} is not a valid inventory size.") From 54f23ac21481aea0c7386969e8a89aa1eb6b6aff Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 12 Jul 2021 21:43:44 +0200 Subject: [PATCH 05/24] A lot more unit tests and stuff --- .../dough/inventory/CustomInventory.java | 19 +- .../dough/inventory/CustomInventoryImpl.java | 104 +++++++++++ .../dough/inventory/Inventories.java | 30 --- .../dough/inventory/InventoryLayout.java | 23 ++- .../dough/inventory/SlotGroup.java | 12 +- .../dough/inventory/SlotGroupIterator.java | 38 ++++ .../builders/InventoryLayoutBuilder.java | 7 + .../InventoryLayoutBuilderResult.java | 11 +- .../inventory/builders/SlotGroupBuilder.java | 8 +- .../inventory/TestInventoryCreation.java | 172 ++++++++++++++++++ .../inventory/TestSlotGroupIterator.java | 41 +++++ 11 files changed, 419 insertions(+), 46 deletions(-) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java delete mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java index 7e6d1847..6939a9ee 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java @@ -1,12 +1,14 @@ package io.github.thebusybiscuit.dough.inventory; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; // TODO: Rename this class -public interface CustomInventory { +public interface CustomInventory extends InventoryHolder { /** * This returns the {@link InventoryLayout} which was used to create @@ -17,16 +19,21 @@ public interface CustomInventory { @Nonnull InventoryLayout getLayout(); - @ParametersAreNonnullByDefault - void setAll(SlotGroup group, ItemStack item); + @Nullable + String getTitle(); + + void setAll(@Nonnull SlotGroup group, @Nullable ItemStack item); @ParametersAreNonnullByDefault boolean addItem(SlotGroup group, ItemStack item); - @ParametersAreNonnullByDefault - void setItem(int slot, ItemStack item); + void setItem(int slot, @Nullable ItemStack item); - @Nonnull + @Nullable ItemStack getItem(int slot); + default int getSize() { + return getInventory().getSize(); + } + } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java new file mode 100644 index 00000000..da78b041 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java @@ -0,0 +1,104 @@ +package io.github.thebusybiscuit.dough.inventory; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang.Validate; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +class CustomInventoryImpl implements CustomInventory { + + private final InventoryLayout layout; + private final String title; + private Inventory inventory; + + @ParametersAreNonnullByDefault + CustomInventoryImpl(InventoryLayout layout) { + Validate.notNull(layout, "The layout cannot be null."); + + this.layout = layout; + this.title = layout.getTitle(); + } + + void setInventory(@Nonnull Inventory inventory) { + Validate.notNull(inventory, "The Inventory must not be null."); + Validate.isTrue(inventory.getSize() == layout.getSize(), "The inventory has a different size."); + Validate.isTrue(inventory.getHolder() == this, "The Inventory does not seem to belong here. Holder: " + inventory.getHolder()); + + this.inventory = inventory; + } + + private void validate() { + if (inventory == null) { + throw new UnsupportedOperationException("No inventory has been set yet."); + } + } + + @Override + public @Nonnull Inventory getInventory() { + validate(); + + return inventory; + } + + @Override + public @Nonnull InventoryLayout getLayout() { + validate(); + + return layout; + } + + @Override + public String getTitle() { + validate(); + + return title; + } + + @Override + public void setAll(SlotGroup group, ItemStack item) { + validate(); + + for (int slot : group) { + setItem(slot, item); + } + } + + @Override + @ParametersAreNonnullByDefault + public boolean addItem(SlotGroup group, ItemStack item) { + Validate.notNull(group, "The Slot group cannot be null!"); + Validate.notNull(item, "The Item cannot be null!"); + validate(); + + for (int slot : group) { + ItemStack stack = getItem(slot); + + if (stack == null || stack.getType().isAir()) { + setItem(slot, item); + return true; + } else { + // TODO: Implement partial stack matching and stack overflowing + } + } + + return false; + } + + @Override + public void setItem(int slot, @Nullable ItemStack item) { + validate(); + + inventory.setItem(slot, item); + } + + @Override + public @Nullable ItemStack getItem(int slot) { + validate(); + + return inventory.getItem(slot); + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java deleted file mode 100644 index 08faa333..00000000 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Inventories.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.github.thebusybiscuit.dough.inventory; - -import java.io.InputStream; - -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; - -import org.bukkit.Bukkit; -import org.bukkit.inventory.Inventory; - -// TODO: Perhaps rename this too -public final class Inventories { - - private Inventories() {} - - @ParametersAreNonnullByDefault - public static @Nonnull InventoryLayout getLayoutFromStream(InputStream stream) { - // TODO: Load an InventoryLayout from an InputStream - return null; - } - - static @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { -// Inventory inv = Bukkit.createInventory(layout, layout.getSize()); - - // TODO Wrap Inventory using CustomInventory - - return null; - } - -} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java index 9f53ae9c..902a745b 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java @@ -3,7 +3,9 @@ import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; public interface InventoryLayout { @@ -18,6 +20,9 @@ public interface InventoryLayout { */ int getSize(); + @Nullable + String getTitle(); + @Nonnull SlotGroup getGroup(char identifier); @@ -28,7 +33,23 @@ public interface InventoryLayout { SlotGroup getGroup(@Nonnull String name); default @Nonnull CustomInventory createInventory() { - return Inventories.createInventory(this); + CustomInventoryImpl impl = new CustomInventoryImpl(this); + String title = getTitle(); + Inventory inv; + + if (title == null) { + inv = Bukkit.createInventory(impl, getSize()); + } else { + inv = Bukkit.createInventory(impl, getSize(), title); + } + + impl.setInventory(inv); + + for (SlotGroup group : getSlotGroups()) { + impl.setAll(group, group.getDefaultItemStack()); + } + + return impl; } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java index 2282a144..c654ff15 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java @@ -1,6 +1,9 @@ package io.github.thebusybiscuit.dough.inventory; +import java.util.Iterator; + import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -13,7 +16,7 @@ * @author TheBusyBiscuit * */ -public interface SlotGroup { +public interface SlotGroup extends Iterable { /** * This returns the unique identifier for this {@link SlotGroup}, @@ -70,7 +73,12 @@ default int size() { * * @return The default {@link ItemStack} */ - @Nonnull + @Nullable ItemStack getDefaultItemStack(); + @Override + default @Nonnull Iterator iterator() { + return new SlotGroupIterator(this); + } + } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java new file mode 100644 index 00000000..f063d21e --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java @@ -0,0 +1,38 @@ +package io.github.thebusybiscuit.dough.inventory; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import javax.annotation.Nonnull; + +class SlotGroupIterator implements Iterator { + + private final int[] slots; + private int index = 0; + + SlotGroupIterator(@Nonnull SlotGroup slotGroup) { + this.slots = slotGroup.getSlots(); + } + + @Override + public boolean hasNext() { + return index < slots.length; + } + + @Override + public Integer next() { + if (index < slots.length) { + int slot = slots[index]; + index++; + return slot; + } else { + throw new NoSuchElementException("No more slots available."); + } + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Iterator#remove() is not supported!"); + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java index 4903c346..0a87c6b3 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java @@ -4,6 +4,7 @@ import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import org.apache.commons.lang.Validate; @@ -15,6 +16,7 @@ public class InventoryLayoutBuilder { protected final int size; protected final Set groups = new HashSet<>(); + protected String title; public InventoryLayoutBuilder(int size) { Validate.isTrue(size > 0, "The size must be greater than 0."); @@ -24,6 +26,11 @@ public InventoryLayoutBuilder(int size) { this.size = size; } + public @Nonnull InventoryLayoutBuilder title(@Nullable String title) { + this.title = title; + return this; + } + @ParametersAreNonnullByDefault public @Nonnull InventoryLayoutBuilder addSlotGroup(SlotGroup group) { groups.add(group); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java index e9027930..563b8588 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java @@ -17,10 +17,12 @@ class InventoryLayoutBuilderResult implements InventoryLayout { private final int size; + private final String title; private final Set groups = new HashSet<>(); InventoryLayoutBuilderResult(@Nonnull InventoryLayoutBuilder builder) { this.size = builder.size; + this.title = builder.title; this.groups.addAll(builder.groups); Set slots = new HashSet<>(); @@ -28,7 +30,7 @@ class InventoryLayoutBuilderResult implements InventoryLayout { for (SlotGroup group : groups) { Validate.notNull(group, "SlotGroups cannot be null."); - for (int slot : group.getSlots()) { + for (int slot : group) { Validate.isTrue(slot >= 0 && slot < size, "Slot " + slot + " is outside the bounds of this inventory (0 - " + size + ')'); if (!slots.add(slot)) { @@ -52,6 +54,11 @@ public int getSize() { return size; } + @Override + public @Nullable String getTitle() { + return title; + } + @Override public @Nonnull SlotGroup getGroup(char identifier) { SlotGroup result = findGroup(group -> group.getCharIdentifier() == identifier); @@ -66,7 +73,7 @@ public int getSize() { @Override public @Nonnull SlotGroup getGroup(int slot) { SlotGroup result = findGroup(group -> { - for (int groupSlot : group.getSlots()) { + for (int groupSlot : group) { if (groupSlot == slot) { return true; } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java index d74f96e2..d7fc20f7 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java @@ -4,10 +4,10 @@ import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import org.apache.commons.lang.Validate; -import org.bukkit.Material; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.dough.inventory.SlotGroup; @@ -18,7 +18,7 @@ public class SlotGroupBuilder { protected final String name; protected final Set slots = new HashSet<>(); - protected ItemStack defaultItem = new ItemStack(Material.AIR); + protected ItemStack defaultItem = null; protected boolean interactable = false; @ParametersAreNonnullByDefault @@ -44,8 +44,7 @@ public SlotGroupBuilder(char identifier, String name) { return this; } - public @Nonnull SlotGroupBuilder withDefaultItem(@Nonnull ItemStack item) { - Validate.notNull(item, "The item cannot be null."); + public @Nonnull SlotGroupBuilder withDefaultItem(@Nullable ItemStack item) { this.defaultItem = item; return this; } @@ -53,7 +52,6 @@ public SlotGroupBuilder(char identifier, String name) { public @Nonnull SlotGroup build() { Validate.notNull(identifier, "The char identifier may not be null."); Validate.notNull(name, "The name may not be null."); - Validate.notNull(defaultItem, "The default item may not be null."); Validate.notEmpty(slots, "A SlotGroup must have at least one slot."); return new SlotGroupBuilderResult(this); diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java new file mode 100644 index 00000000..7d8fb033 --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java @@ -0,0 +1,172 @@ +package io.github.thebusybiscuit.dough.inventory; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.stream.IntStream; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; + +import be.seeseemelk.mockbukkit.MockBukkit; + +class TestInventoryCreation { + + @BeforeAll + static void setup() { + MockBukkit.mock(); + } + + @AfterAll + static void teardown() { + MockBukkit.unmock(); + } + + @ParameterizedTest + @ValueSource(ints = { 9, 18, 27, 36, 45, 54 }) + void testInventorySize(int size) { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(size) + .title("Awesome Inventory!") + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(IntStream.range(0, size).toArray()) + .build() + ) + .build(); + // @formatter:on + + CustomInventory inv = layout.createInventory(); + + assertNotNull(inv); + assertEquals(layout, inv.getLayout()); + assertEquals(layout.getTitle(), inv.getTitle()); + assertEquals(layout.getSize(), inv.getSize()); + + assertNotNull(inv.getInventory()); + assertSame(inv, inv.getInventory().getHolder()); + } + + @Test + void testInventoryValidation() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(IntStream.range(0, 9).toArray()) + .build() + ) + .build(); + // @formatter:on + + CustomInventory inv = new CustomInventoryImpl(layout); + + assertThrows(UnsupportedOperationException.class, () -> inv.getInventory()); + } + + @Test + void testInventoryHolderValidation() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(IntStream.range(0, 9).toArray()) + .build() + ) + .build(); + // @formatter:on + + CustomInventoryImpl inv = new CustomInventoryImpl(layout); + + // InventoryHolder == null + Inventory inventory = Bukkit.createInventory(null, 9); + + assertThrows(IllegalArgumentException.class, () -> inv.setInventory(inventory)); + + // Different inventory size + Inventory inventory2 = Bukkit.createInventory(inv, 18); + + assertThrows(IllegalArgumentException.class, () -> inv.setInventory(inventory2)); + } + + @Test + void testDefaultItem() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1) + .withDefaultItem(new ItemStack(Material.APPLE)) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test2") + .withSlots(2, 3, 4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + CustomInventory inv = layout.createInventory(); + + assertEquals(new ItemStack(Material.APPLE), inv.getItem(0)); + assertEquals(new ItemStack(Material.APPLE), inv.getItem(1)); + assertNull(inv.getItem(2)); + assertNull(inv.getItem(3)); + assertNull(inv.getItem(4)); + assertNull(inv.getItem(5)); + assertNull(inv.getItem(6)); + assertNull(inv.getItem(7)); + assertNull(inv.getItem(8)); + } + + @Test + @Disabled("Not yet implemented") + void testAddItem() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test2") + .withSlots(4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + CustomInventory inv = layout.createInventory(); + SlotGroup group = layout.getGroup('y'); + + ItemStack item = new ItemStack(Material.EMERALD); + inv.addItem(group, item); + + assertNull(inv.getItem(0)); + assertEquals(item, inv.getItem(4)); + + inv.addItem(group, item); + assertEquals(2, inv.getItem(4).getAmount()); + + inv.addItem(group, new ItemStack(Material.EMERALD, 63)); + assertEquals(64, inv.getItem(4).getAmount()); + assertEquals(item, inv.getItem(5)); + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java new file mode 100644 index 00000000..3522e9c4 --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java @@ -0,0 +1,41 @@ +package io.github.thebusybiscuit.dough.inventory; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.util.Iterator; +import java.util.NoSuchElementException; + +import org.junit.jupiter.api.Test; + +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; + +class TestSlotGroupIterator { + + @Test + void testIteratorEnd() { + SlotGroup group = new SlotGroupBuilder('x', "test").withSlots(0, 1, 2).build(); + + assertNotNull(group); + + Iterator iterator = group.iterator(); + + while (iterator.hasNext()) { + iterator.next(); + } + + assertThrows(NoSuchElementException.class, iterator::next); + } + + @Test + void testIteratorRemove() { + SlotGroup group = new SlotGroupBuilder('x', "test").withSlots(0, 1, 2).build(); + + assertNotNull(group); + + Iterator iterator = group.iterator(); + + assertThrows(UnsupportedOperationException.class, iterator::remove); + } + +} From 127af54900af50972190cf651e42dcd5d639ef1e Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Mon, 12 Jul 2021 23:11:20 +0200 Subject: [PATCH 06/24] Finished this part of the module --- .../dough/inventory/CustomInventory.java | 3 ++- .../dough/inventory/CustomInventoryImpl.java | 25 ++++++++++++++----- .../inventory/TestInventoryCreation.java | 25 +++++++++++++------ 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java index 6939a9ee..c711f2e8 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java @@ -25,7 +25,8 @@ public interface CustomInventory extends InventoryHolder { void setAll(@Nonnull SlotGroup group, @Nullable ItemStack item); @ParametersAreNonnullByDefault - boolean addItem(SlotGroup group, ItemStack item); + @Nullable + ItemStack addItem(SlotGroup group, ItemStack item); void setItem(int slot, @Nullable ItemStack item); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java index da78b041..5f8a9604 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java @@ -68,23 +68,36 @@ public void setAll(SlotGroup group, ItemStack item) { @Override @ParametersAreNonnullByDefault - public boolean addItem(SlotGroup group, ItemStack item) { + public @Nullable ItemStack addItem(SlotGroup group, ItemStack item) { Validate.notNull(group, "The Slot group cannot be null!"); Validate.notNull(item, "The Item cannot be null!"); validate(); for (int slot : group) { - ItemStack stack = getItem(slot); + ItemStack itemInSlot = getItem(slot); - if (stack == null || stack.getType().isAir()) { + if (itemInSlot == null || itemInSlot.getType().isAir()) { setItem(slot, item); - return true; + return null; } else { - // TODO: Implement partial stack matching and stack overflowing + int currentAmount = itemInSlot.getAmount(); + int maxStackSize = itemInSlot.getType().getMaxStackSize(); + + if (currentAmount < maxStackSize && itemInSlot.isSimilar(item)) { + int amount = currentAmount + item.getAmount(); + + if (amount > maxStackSize) { + item.setAmount(amount - maxStackSize); + itemInSlot.setAmount(maxStackSize); + } else { + itemInSlot.setAmount(Math.min(amount, maxStackSize)); + return null; + } + } } } - return false; + return item; } @Override diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java index 7d8fb033..4349d8ef 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java @@ -14,7 +14,6 @@ import org.bukkit.inventory.ItemStack; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -135,18 +134,17 @@ void testDefaultItem() { } @Test - @Disabled("Not yet implemented") void testAddItem() { // @formatter:off InventoryLayout layout = new InventoryLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3) + .withSlots(0, 1, 2, 3, 4, 5) .build() ) .addSlotGroup( new SlotGroupBuilder('y', "test2") - .withSlots(4, 5, 6, 7, 8) + .withSlots(6, 7, 8) .build() ) .build(); @@ -155,18 +153,29 @@ void testAddItem() { CustomInventory inv = layout.createInventory(); SlotGroup group = layout.getGroup('y'); + inv.setItem(6, new ItemStack(Material.AIR)); + ItemStack item = new ItemStack(Material.EMERALD); inv.addItem(group, item); assertNull(inv.getItem(0)); - assertEquals(item, inv.getItem(4)); + assertEquals(item, inv.getItem(6)); inv.addItem(group, item); - assertEquals(2, inv.getItem(4).getAmount()); + assertEquals(2, inv.getItem(6).getAmount()); inv.addItem(group, new ItemStack(Material.EMERALD, 63)); - assertEquals(64, inv.getItem(4).getAmount()); - assertEquals(item, inv.getItem(5)); + assertEquals(64, inv.getItem(6).getAmount()); + assertEquals(item, inv.getItem(7)); + + inv.addItem(group, item); + assertEquals(2, inv.getItem(7).getAmount()); + + inv.addItem(group, new ItemStack(Material.DIAMOND)); + assertEquals(new ItemStack(Material.DIAMOND), inv.getItem(8)); + + ItemStack cantFit = new ItemStack(Material.GOLDEN_APPLE); + assertEquals(cantFit, inv.addItem(group, cantFit)); } } From 1093e8381e82c42e34303c1fb66810f3655f1739 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 13 Jul 2021 20:52:09 +0200 Subject: [PATCH 07/24] Implemented click events and factories --- .../dough/inventory/CustomInventory.java | 26 +++ .../dough/inventory/InventoryLayout.java | 21 --- .../dough/inventory/SlotGroup.java | 5 + .../InventoryLayoutBuilderResult.java | 31 ++-- .../inventory/builders/SlotGroupBuilder.java | 7 + .../builders/SlotGroupBuilderResult.java | 15 +- .../factory/CustomInventoryFactory.java | 55 ++++++ .../{ => factory}/CustomInventoryImpl.java | 17 +- .../factory/CustomInventoryListener.java | 49 +++++ .../dough/inventory/payloads/Payloads.java | 23 +++ .../factory/MockInventoryFactory.java | 34 ++++ .../inventory/factory/TestClickEvents.java | 168 ++++++++++++++++++ .../factory/TestInventoryClosing.java | 65 +++++++ .../{ => factory}/TestInventoryCreation.java | 21 ++- 14 files changed, 488 insertions(+), 49 deletions(-) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/{ => factory}/CustomInventoryImpl.java (85%) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/{ => factory}/TestInventoryCreation.java (87%) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java index c711f2e8..7ecdba1d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java @@ -1,15 +1,27 @@ package io.github.thebusybiscuit.dough.inventory; +import java.util.Iterator; + import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; +import org.apache.commons.lang.Validate; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; +import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.dough.inventory.factory.CustomInventoryFactory; + // TODO: Rename this class public interface CustomInventory extends InventoryHolder { + @Nonnull + CustomInventoryFactory getFactory(); + /** * This returns the {@link InventoryLayout} which was used to create * this {@link CustomInventory}. @@ -33,6 +45,20 @@ public interface CustomInventory extends InventoryHolder { @Nullable ItemStack getItem(int slot); + default @Nonnull InventoryView open(@Nonnull Player player) { + Validate.notNull(player, "The Player must not be null"); + return player.openInventory(getInventory()); + } + + default void closeAllViews() { + Inventory inv = getInventory(); + Iterator iterator = inv.getViewers().iterator(); + + while (iterator.hasNext()) { + iterator.next().closeInventory(); + } + } + default int getSize() { return getInventory().getSize(); } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java index 902a745b..4d64187d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java @@ -5,7 +5,6 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; public interface InventoryLayout { @@ -32,24 +31,4 @@ public interface InventoryLayout { @Nonnull SlotGroup getGroup(@Nonnull String name); - default @Nonnull CustomInventory createInventory() { - CustomInventoryImpl impl = new CustomInventoryImpl(this); - String title = getTitle(); - Inventory inv; - - if (title == null) { - inv = Bukkit.createInventory(impl, getSize()); - } else { - inv = Bukkit.createInventory(impl, getSize(), title); - } - - impl.setInventory(inv); - - for (SlotGroup group : getSlotGroups()) { - impl.setAll(group, group.getDefaultItemStack()); - } - - return impl; - } - } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java index c654ff15..5ee47301 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java @@ -9,6 +9,8 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.dough.inventory.handlers.CustomInventoryClickHandler; + /** * A {@link SlotGroup} groups slots together and divides an {@link Inventory} * into distinct regions which can be used for easy access. @@ -76,6 +78,9 @@ default int size() { @Nullable ItemStack getDefaultItemStack(); + @Nullable + CustomInventoryClickHandler getClickHandler(); + @Override default @Nonnull Iterator iterator() { return new SlotGroupIterator(this); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java index 563b8588..b08ee5f1 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java @@ -18,12 +18,15 @@ class InventoryLayoutBuilderResult implements InventoryLayout { private final int size; private final String title; + private final Set groups = new HashSet<>(); + private final SlotGroup[] groupsBySlot; InventoryLayoutBuilderResult(@Nonnull InventoryLayoutBuilder builder) { this.size = builder.size; this.title = builder.title; this.groups.addAll(builder.groups); + this.groupsBySlot = new SlotGroup[size]; Set slots = new HashSet<>(); @@ -36,6 +39,8 @@ class InventoryLayoutBuilderResult implements InventoryLayout { if (!slots.add(slot)) { throw new IllegalStateException("Slot " + slot + " is defined by multiple slot groups."); } + + groupsBySlot[slot] = group; } } @@ -58,7 +63,7 @@ public int getSize() { public @Nullable String getTitle() { return title; } - + @Override public @Nonnull SlotGroup getGroup(char identifier) { SlotGroup result = findGroup(group -> group.getCharIdentifier() == identifier); @@ -72,21 +77,15 @@ public int getSize() { @Override public @Nonnull SlotGroup getGroup(int slot) { - SlotGroup result = findGroup(group -> { - for (int groupSlot : group) { - if (groupSlot == slot) { - return true; - } - } - - return false; - }); - - if (result != null) { - return result; - } else { - throw new IllegalArgumentException("Could not find a SlotGroup at slot: '" + slot + "'"); - } + Validate.isTrue(slot >= 0, "Slot cannot be a negative number: " + slot); + Validate.isTrue(slot < size, "Slot " + slot + " is not within the inventory size of " + size); + + /* + * Using an Array makes this much faster. + * And since this method will be used for the click events, some + * optimization here will be good to have. + */ + return groupsBySlot[slot]; } @Override diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java index d7fc20f7..c8f430e6 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java @@ -11,6 +11,7 @@ import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.thebusybiscuit.dough.inventory.handlers.CustomInventoryClickHandler; public class SlotGroupBuilder { @@ -18,6 +19,7 @@ public class SlotGroupBuilder { protected final String name; protected final Set slots = new HashSet<>(); + protected CustomInventoryClickHandler clickHandler = null; protected ItemStack defaultItem = null; protected boolean interactable = false; @@ -49,6 +51,11 @@ public SlotGroupBuilder(char identifier, String name) { return this; } + public @Nonnull SlotGroupBuilder onClick(@Nullable CustomInventoryClickHandler clickHandler) { + this.clickHandler = clickHandler; + return this; + } + public @Nonnull SlotGroup build() { Validate.notNull(identifier, "The char identifier may not be null."); Validate.notNull(name, "The name may not be null."); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java index c8813dc0..90ad0d67 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java @@ -3,10 +3,12 @@ import java.util.Set; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.thebusybiscuit.dough.inventory.handlers.CustomInventoryClickHandler; class SlotGroupBuilderResult implements SlotGroup { @@ -14,6 +16,7 @@ class SlotGroupBuilderResult implements SlotGroup { private final String name; private final boolean interactable; private final ItemStack defaultItem; + private final CustomInventoryClickHandler clickHandler; private final int[] slots; SlotGroupBuilderResult(@Nonnull SlotGroupBuilder builder) { @@ -22,6 +25,7 @@ class SlotGroupBuilderResult implements SlotGroup { this.interactable = builder.interactable; this.defaultItem = builder.defaultItem; this.slots = convertSlots(builder.slots); + this.clickHandler = builder.clickHandler; } private @Nonnull int[] convertSlots(@Nonnull Set slots) { @@ -44,18 +48,23 @@ public boolean isInteractable() { } @Override - public String getName() { + public @Nonnull String getName() { return name; } @Override - public int[] getSlots() { + public @Nonnull int[] getSlots() { return slots; } @Override - public ItemStack getDefaultItemStack() { + public @Nullable ItemStack getDefaultItemStack() { return defaultItem; } + @Override + public @Nonnull CustomInventoryClickHandler getClickHandler() { + return clickHandler; + } + } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java new file mode 100644 index 00000000..447d20fe --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java @@ -0,0 +1,55 @@ +package io.github.thebusybiscuit.dough.inventory.factory; + +import javax.annotation.Nonnull; +import javax.annotation.OverridingMethodsMustInvokeSuper; + +import org.bukkit.Bukkit; +import org.bukkit.inventory.Inventory; +import org.bukkit.plugin.Plugin; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; + +public class CustomInventoryFactory { + + private final Plugin plugin; + + public CustomInventoryFactory(@Nonnull Plugin plugin) { + this.plugin = plugin; + registerListener(plugin); + } + + private @Nonnull CustomInventoryListener registerListener(@Nonnull Plugin plugin) { + CustomInventoryListener listener = new CustomInventoryListener(this); + plugin.getServer().getPluginManager().registerEvents(listener, plugin); + return listener; + } + + public final @Nonnull Plugin getPlugin() { + return plugin; + } + + @OverridingMethodsMustInvokeSuper + public @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { + CustomInventoryImpl impl = new CustomInventoryImpl(this, layout); + String title = layout.getTitle(); + Inventory inv; + + if (title == null) { + inv = Bukkit.createInventory(impl, layout.getSize()); + } else { + inv = Bukkit.createInventory(impl, layout.getSize(), title); + } + + impl.setInventory(inv); + + // Set all default items + for (SlotGroup group : layout.getSlotGroups()) { + impl.setAll(group, group.getDefaultItemStack()); + } + + return impl; + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryImpl.java similarity index 85% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryImpl.java index 5f8a9604..746e486a 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventoryImpl.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryImpl.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.thebusybiscuit.dough.inventory.factory; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -8,16 +8,22 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; + class CustomInventoryImpl implements CustomInventory { + private final CustomInventoryFactory factory; private final InventoryLayout layout; private final String title; private Inventory inventory; @ParametersAreNonnullByDefault - CustomInventoryImpl(InventoryLayout layout) { + CustomInventoryImpl(CustomInventoryFactory factory, InventoryLayout layout) { Validate.notNull(layout, "The layout cannot be null."); + this.factory = factory; this.layout = layout; this.title = layout.getTitle(); } @@ -36,6 +42,13 @@ private void validate() { } } + @Override + public @Nonnull CustomInventoryFactory getFactory() { + validate(); + + return factory; + } + @Override public @Nonnull Inventory getInventory() { validate(); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java new file mode 100644 index 00000000..f98ab254 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java @@ -0,0 +1,49 @@ +package io.github.thebusybiscuit.dough.inventory.factory; + +import javax.annotation.Nonnull; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.InventoryHolder; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.thebusybiscuit.dough.inventory.payloads.Payloads; + +class CustomInventoryListener implements Listener { + + private final CustomInventoryFactory factory; + + CustomInventoryListener(@Nonnull CustomInventoryFactory factory) { + this.factory = factory; + } + + public @Nonnull CustomInventoryFactory getInventoryFactory() { + return factory; + } + + @EventHandler + public void onClick(InventoryClickEvent e) { + InventoryHolder holder = e.getInventory().getHolder(); + + if (holder instanceof CustomInventory) { + CustomInventory inv = (CustomInventory) holder; + + if (!inv.getFactory().equals(factory)) { + // Not one of our inventories - abort + return; + } + + // TODO: Check if the clicked slot is within that inventory + SlotGroup slotGroup = inv.getLayout().getGroup(e.getSlot()); + + if (!slotGroup.isInteractable()) { + e.setCancelled(true); + } + + slotGroup.getClickHandler().onClick(Payloads.create(inv, e)); + } + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java new file mode 100644 index 00000000..c014bb80 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java @@ -0,0 +1,23 @@ +package io.github.thebusybiscuit.dough.inventory.payloads; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; + +public class Payloads { + + private Payloads() {} + + @ParametersAreNonnullByDefault + public static @Nonnull InventoryClickPayload create(CustomInventory inv, InventoryClickEvent e) { + Player player = (Player) e.getWhoClicked(); + int slot = e.getSlot(); + + return new InventoryClickPayload(inv, player, slot); + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java new file mode 100644 index 00000000..e13ccd6b --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java @@ -0,0 +1,34 @@ +package io.github.thebusybiscuit.dough.inventory.factory; + +import java.io.File; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.plugin.PluginDescriptionFile; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.plugin.java.JavaPluginLoader; + +import be.seeseemelk.mockbukkit.MockBukkit; + +class MockInventoryFactory extends CustomInventoryFactory { + + MockInventoryFactory() { + // @formatter:off + super(MockBukkit.loadWith(MockJavaPlugin.class, new PluginDescriptionFile( + "MockPlugin", + "1.0.0", + "io.github.thebusybiscuit.dough.inventory.MockInventoryFactory.MockJavaPlugin") + )); + // @formatter:on + } + + public static class MockJavaPlugin extends JavaPlugin { + + @ParametersAreNonnullByDefault + public MockJavaPlugin(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file) { + super(loader, description, dataFolder, file); + } + + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java new file mode 100644 index 00000000..32bf82b5 --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java @@ -0,0 +1,168 @@ +package io.github.thebusybiscuit.dough.inventory.factory; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.Server; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType.SlotType; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.thebusybiscuit.dough.inventory.payloads.InventoryClickPayload; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; + +class TestClickEvents { + + private static ServerMock server; + private static CustomInventoryFactory factory; + private static CustomInventoryFactory factory2; + + @BeforeAll + static void setup() { + server = MockBukkit.mock(); + factory = new MockInventoryFactory(); + factory2 = new MockInventoryFactory(); + } + + @AfterAll + static void teardown() { + MockBukkit.unmock(); + } + + @ParameterizedTest + @ValueSource(booleans = { true, false }) + void testClickItemInSlot(boolean interactable) { + AtomicReference payloadRef = new AtomicReference<>(); + + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1) + .interactable(interactable) + .withDefaultItem(new ItemStack(Material.APPLE)) + .onClick(payloadRef::set) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test2") + .withSlots(2, 3, 4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + assertListenerRegistered(); + + CustomInventory inv = factory.createInventory(layout); + Player player = server.addPlayer(); + int slot = 1; + + InventoryView view = inv.open(player); + InventoryClickEvent event = new InventoryClickEvent(view, SlotType.CONTAINER, slot, ClickType.LEFT, InventoryAction.PICKUP_ONE); + + Bukkit.getPluginManager().callEvent(event); + InventoryClickPayload payload = payloadRef.get(); + + assertNotNull(payload); + assertSame(inv, payload.getInventory()); + assertSame(player, payload.getPlayer()); + + assertEquals(slot, payload.getClickedSlot()); + assertEquals(layout.getGroup("test"), payload.getClickedSlotGroup()); + assertEquals(new ItemStack(Material.APPLE), payload.getClickedItemStack()); + + assertNotEquals(interactable, event.isCancelled()); + } + + @Test + void testMultipleFactories() { + Map eventsFired = new HashMap<>(); + + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .interactable(true) + .onClick(payload -> { + CustomInventoryFactory factory = payload.getInventory().getFactory(); + eventsFired.merge(factory, 1, Integer::sum); + }) + .build() + ) + .build(); + // @formatter:on + + CustomInventory inv = factory.createInventory(layout); + CustomInventory inv2 = factory2.createInventory(layout); + + simulateClickEvents(inv, 2); + simulateClickEvents(inv2, 4); + + assertEquals(2, eventsFired.get(factory)); + assertEquals(4, eventsFired.get(factory2)); + } + + @ParametersAreNonnullByDefault + private void simulateClickEvents(CustomInventory inv, int amount) { + for (int i = 0; i < amount; i++) { + Player player = server.addPlayer(); + InventoryView view = inv.open(player); + InventoryClickEvent event = new InventoryClickEvent(view, SlotType.CONTAINER, 1, ClickType.LEFT, InventoryAction.PICKUP_ONE); + + Bukkit.getPluginManager().callEvent(event); + player.closeInventory(); + } + } + + /** + * This method asserts that the {@link Listener} for our {@link CustomInventoryFactory} + * is properly registered to the {@link Server} and listens to the {@link InventoryClickEvent}. + */ + private void assertListenerRegistered() { + // @formatter:off + assertEquals(1,Arrays.stream(InventoryClickEvent.getHandlerList().getRegisteredListeners()) + .filter(listener -> { + Plugin plugin = listener.getPlugin(); + Listener clickListener = listener.getListener(); + + if (plugin.equals(factory.getPlugin()) && clickListener instanceof CustomInventoryListener) { + return factory.equals(((CustomInventoryListener) clickListener).getInventoryFactory()); + } else { + return false; + } + }).count() + ); + // @formatter:off + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java new file mode 100644 index 00000000..9693fe61 --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java @@ -0,0 +1,65 @@ +package io.github.thebusybiscuit.dough.inventory.factory; + +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertSame; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.InventoryView; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; + +class TestInventoryClosing { + + private static CustomInventoryFactory factory; + private static ServerMock server; + + @BeforeAll + static void setup() { + server = MockBukkit.mock(); + factory = new MockInventoryFactory(); + } + + @AfterAll + static void teardown() { + MockBukkit.unmock(); + } + + @Test + void testCloseAll() { + // @formatter:off + InventoryLayout layout = new InventoryLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + CustomInventory inv = factory.createInventory(layout); + + Player player = server.addPlayer(); + InventoryView view = inv.open(player); + + Player player2 = server.addPlayer(); + InventoryView view2 = inv.open(player2); + + assertSame(view, player.getOpenInventory()); + assertSame(view2, player2.getOpenInventory()); + + inv.closeAllViews(); + + assertNull(player.getOpenInventory()); + assertNull(player2.getOpenInventory()); + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryCreation.java similarity index 87% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryCreation.java index 4349d8ef..23ad3cef 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryCreation.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryCreation.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.thebusybiscuit.dough.inventory.factory; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -18,6 +18,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; @@ -25,9 +28,12 @@ class TestInventoryCreation { + private static CustomInventoryFactory factory; + @BeforeAll static void setup() { MockBukkit.mock(); + factory = new MockInventoryFactory(); } @AfterAll @@ -37,7 +43,7 @@ static void teardown() { @ParameterizedTest @ValueSource(ints = { 9, 18, 27, 36, 45, 54 }) - void testInventorySize(int size) { + void testCreationWithSize(int size) { // @formatter:off InventoryLayout layout = new InventoryLayoutBuilder(size) .title("Awesome Inventory!") @@ -49,10 +55,11 @@ void testInventorySize(int size) { .build(); // @formatter:on - CustomInventory inv = layout.createInventory(); + CustomInventory inv = factory.createInventory(layout); assertNotNull(inv); assertEquals(layout, inv.getLayout()); + assertEquals(factory, inv.getFactory()); assertEquals(layout.getTitle(), inv.getTitle()); assertEquals(layout.getSize(), inv.getSize()); @@ -72,7 +79,7 @@ void testInventoryValidation() { .build(); // @formatter:on - CustomInventory inv = new CustomInventoryImpl(layout); + CustomInventory inv = new CustomInventoryImpl(factory, layout); assertThrows(UnsupportedOperationException.class, () -> inv.getInventory()); } @@ -89,7 +96,7 @@ void testInventoryHolderValidation() { .build(); // @formatter:on - CustomInventoryImpl inv = new CustomInventoryImpl(layout); + CustomInventoryImpl inv = new CustomInventoryImpl(factory, layout); // InventoryHolder == null Inventory inventory = Bukkit.createInventory(null, 9); @@ -120,7 +127,7 @@ void testDefaultItem() { .build(); // @formatter:on - CustomInventory inv = layout.createInventory(); + CustomInventory inv = factory.createInventory(layout); assertEquals(new ItemStack(Material.APPLE), inv.getItem(0)); assertEquals(new ItemStack(Material.APPLE), inv.getItem(1)); @@ -150,7 +157,7 @@ void testAddItem() { .build(); // @formatter:on - CustomInventory inv = layout.createInventory(); + CustomInventory inv = factory.createInventory(layout); SlotGroup group = layout.getGroup('y'); inv.setItem(6, new ItemStack(Material.AIR)); From d43d1f61e05abdb556ee2762ea4f220cf394b2c5 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 13 Jul 2021 21:07:49 +0200 Subject: [PATCH 08/24] Renamed to `Menu` --- .../{CustomInventory.java => Menu.java} | 15 +++---- .../{InventoryLayout.java => MenuLayout.java} | 2 +- .../dough/inventory/SlotGroup.java | 4 +- ...outBuilder.java => MenuLayoutBuilder.java} | 14 +++--- ...BuilderResult.java => MenuLayoutImpl.java} | 6 +-- .../inventory/builders/SlotGroupBuilder.java | 8 ++-- ...pBuilderResult.java => SlotGroupImpl.java} | 10 ++--- ...InventoryFactory.java => MenuFactory.java} | 16 +++---- ...CustomInventoryImpl.java => MenuImpl.java} | 16 +++---- ...ventoryListener.java => MenuListener.java} | 14 +++--- .../handlers/CustomInventoryClickHandler.java | 12 ----- .../inventory/handlers/MenuClickHandler.java | 12 +++++ .../payloads/AbstractInventoryPayload.java | 19 -------- .../payloads/AbstractMenuPayload.java | 19 ++++++++ ...lickPayload.java => MenuClickPayload.java} | 6 +-- .../dough/inventory/payloads/Payloads.java | 6 +-- ...outBuilder.java => TestLayoutBuilder.java} | 16 +++---- ...ntoryFactory.java => MockMenuFactory.java} | 4 +- ...ClickEvents.java => TestMenuClicking.java} | 44 +++++++++---------- ...ntoryClosing.java => TestMenuClosing.java} | 16 +++---- ...oryCreation.java => TestMenuCreation.java} | 32 +++++++------- 21 files changed, 145 insertions(+), 146 deletions(-) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/{CustomInventory.java => Menu.java} (77%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/{InventoryLayout.java => MenuLayout.java} (94%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/{InventoryLayoutBuilder.java => MenuLayoutBuilder.java} (70%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/{InventoryLayoutBuilderResult.java => MenuLayoutImpl.java} (94%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/{SlotGroupBuilderResult.java => SlotGroupImpl.java} (81%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/{CustomInventoryFactory.java => MenuFactory.java} (67%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/{CustomInventoryImpl.java => MenuImpl.java} (87%) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/{CustomInventoryListener.java => MenuListener.java} (72%) delete mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java delete mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/{InventoryClickPayload.java => MenuClickPayload.java} (79%) rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/{TestInventoryLayoutBuilder.java => TestLayoutBuilder.java} (90%) rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/{MockInventoryFactory.java => MockMenuFactory.java} (91%) rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/{TestClickEvents.java => TestMenuClicking.java} (77%) rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/{TestInventoryClosing.java => TestMenuClosing.java} (75%) rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/{TestInventoryCreation.java => TestMenuCreation.java} (83%) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java similarity index 77% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java index 7ecdba1d..fa42c74d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/CustomInventory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java @@ -14,22 +14,21 @@ import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.factory.CustomInventoryFactory; +import io.github.thebusybiscuit.dough.inventory.factory.MenuFactory; -// TODO: Rename this class -public interface CustomInventory extends InventoryHolder { +public interface Menu extends InventoryHolder { @Nonnull - CustomInventoryFactory getFactory(); + MenuFactory getFactory(); /** - * This returns the {@link InventoryLayout} which was used to create - * this {@link CustomInventory}. + * This returns the {@link MenuLayout} which was used to create + * this {@link Menu}. * - * @return The {@link InventoryLayout} + * @return The {@link MenuLayout} */ @Nonnull - InventoryLayout getLayout(); + MenuLayout getLayout(); @Nullable String getTitle(); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java similarity index 94% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java index 4d64187d..12652063 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/InventoryLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java @@ -7,7 +7,7 @@ import org.bukkit.inventory.Inventory; -public interface InventoryLayout { +public interface MenuLayout { @Nonnull Set getSlotGroups(); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java index 5ee47301..ebde3957 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java @@ -9,7 +9,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.handlers.CustomInventoryClickHandler; +import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; /** * A {@link SlotGroup} groups slots together and divides an {@link Inventory} @@ -79,7 +79,7 @@ default int size() { ItemStack getDefaultItemStack(); @Nullable - CustomInventoryClickHandler getClickHandler(); + MenuClickHandler getClickHandler(); @Override default @Nonnull Iterator iterator() { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutBuilder.java similarity index 70% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutBuilder.java index 0a87c6b3..2b558fbb 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutBuilder.java @@ -9,16 +9,16 @@ import org.apache.commons.lang.Validate; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -public class InventoryLayoutBuilder { +public class MenuLayoutBuilder { protected final int size; protected final Set groups = new HashSet<>(); protected String title; - public InventoryLayoutBuilder(int size) { + public MenuLayoutBuilder(int size) { Validate.isTrue(size > 0, "The size must be greater than 0."); Validate.isTrue(size % 9 == 0, "The size must be a multiple of 9."); Validate.isTrue(size <= 54, "The size must not be greater than 54."); @@ -26,21 +26,21 @@ public InventoryLayoutBuilder(int size) { this.size = size; } - public @Nonnull InventoryLayoutBuilder title(@Nullable String title) { + public @Nonnull MenuLayoutBuilder title(@Nullable String title) { this.title = title; return this; } @ParametersAreNonnullByDefault - public @Nonnull InventoryLayoutBuilder addSlotGroup(SlotGroup group) { + public @Nonnull MenuLayoutBuilder addSlotGroup(SlotGroup group) { groups.add(group); return this; } - public @Nonnull InventoryLayout build() { + public @Nonnull MenuLayout build() { Validate.notEmpty(groups, "There are no SlotGroups defined."); - return new InventoryLayoutBuilderResult(this); + return new MenuLayoutImpl(this); } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java similarity index 94% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java index b08ee5f1..8398abd4 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/InventoryLayoutBuilderResult.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java @@ -11,10 +11,10 @@ import org.apache.commons.lang.Validate; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -class InventoryLayoutBuilderResult implements InventoryLayout { +class MenuLayoutImpl implements MenuLayout { private final int size; private final String title; @@ -22,7 +22,7 @@ class InventoryLayoutBuilderResult implements InventoryLayout { private final Set groups = new HashSet<>(); private final SlotGroup[] groupsBySlot; - InventoryLayoutBuilderResult(@Nonnull InventoryLayoutBuilder builder) { + MenuLayoutImpl(@Nonnull MenuLayoutBuilder builder) { this.size = builder.size; this.title = builder.title; this.groups.addAll(builder.groups); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java index c8f430e6..c750a0b9 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java @@ -11,7 +11,7 @@ import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.handlers.CustomInventoryClickHandler; +import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; public class SlotGroupBuilder { @@ -19,7 +19,7 @@ public class SlotGroupBuilder { protected final String name; protected final Set slots = new HashSet<>(); - protected CustomInventoryClickHandler clickHandler = null; + protected MenuClickHandler clickHandler = null; protected ItemStack defaultItem = null; protected boolean interactable = false; @@ -51,7 +51,7 @@ public SlotGroupBuilder(char identifier, String name) { return this; } - public @Nonnull SlotGroupBuilder onClick(@Nullable CustomInventoryClickHandler clickHandler) { + public @Nonnull SlotGroupBuilder onClick(@Nullable MenuClickHandler clickHandler) { this.clickHandler = clickHandler; return this; } @@ -61,7 +61,7 @@ public SlotGroupBuilder(char identifier, String name) { Validate.notNull(name, "The name may not be null."); Validate.notEmpty(slots, "A SlotGroup must have at least one slot."); - return new SlotGroupBuilderResult(this); + return new SlotGroupImpl(this); } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java similarity index 81% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java index 90ad0d67..8e67b9da 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilderResult.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java @@ -8,18 +8,18 @@ import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.handlers.CustomInventoryClickHandler; +import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; -class SlotGroupBuilderResult implements SlotGroup { +class SlotGroupImpl implements SlotGroup { private final char identifier; private final String name; private final boolean interactable; private final ItemStack defaultItem; - private final CustomInventoryClickHandler clickHandler; + private final MenuClickHandler clickHandler; private final int[] slots; - SlotGroupBuilderResult(@Nonnull SlotGroupBuilder builder) { + SlotGroupImpl(@Nonnull SlotGroupBuilder builder) { this.identifier = builder.identifier; this.name = builder.name; this.interactable = builder.interactable; @@ -63,7 +63,7 @@ public boolean isInteractable() { } @Override - public @Nonnull CustomInventoryClickHandler getClickHandler() { + public @Nonnull MenuClickHandler getClickHandler() { return clickHandler; } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java similarity index 67% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java index 447d20fe..5323b7d4 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryFactory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java @@ -7,21 +7,21 @@ import org.bukkit.inventory.Inventory; import org.bukkit.plugin.Plugin; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -public class CustomInventoryFactory { +public class MenuFactory { private final Plugin plugin; - public CustomInventoryFactory(@Nonnull Plugin plugin) { + public MenuFactory(@Nonnull Plugin plugin) { this.plugin = plugin; registerListener(plugin); } - private @Nonnull CustomInventoryListener registerListener(@Nonnull Plugin plugin) { - CustomInventoryListener listener = new CustomInventoryListener(this); + private @Nonnull MenuListener registerListener(@Nonnull Plugin plugin) { + MenuListener listener = new MenuListener(this); plugin.getServer().getPluginManager().registerEvents(listener, plugin); return listener; } @@ -31,8 +31,8 @@ public CustomInventoryFactory(@Nonnull Plugin plugin) { } @OverridingMethodsMustInvokeSuper - public @Nonnull CustomInventory createInventory(@Nonnull InventoryLayout layout) { - CustomInventoryImpl impl = new CustomInventoryImpl(this, layout); + public @Nonnull Menu createInventory(@Nonnull MenuLayout layout) { + MenuImpl impl = new MenuImpl(this, layout); String title = layout.getTitle(); Inventory inv; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuImpl.java similarity index 87% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryImpl.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuImpl.java index 746e486a..2ab52078 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryImpl.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuImpl.java @@ -8,19 +8,19 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -class CustomInventoryImpl implements CustomInventory { +class MenuImpl implements Menu { - private final CustomInventoryFactory factory; - private final InventoryLayout layout; + private final MenuFactory factory; + private final MenuLayout layout; private final String title; private Inventory inventory; @ParametersAreNonnullByDefault - CustomInventoryImpl(CustomInventoryFactory factory, InventoryLayout layout) { + MenuImpl(MenuFactory factory, MenuLayout layout) { Validate.notNull(layout, "The layout cannot be null."); this.factory = factory; @@ -43,7 +43,7 @@ private void validate() { } @Override - public @Nonnull CustomInventoryFactory getFactory() { + public @Nonnull MenuFactory getFactory() { validate(); return factory; @@ -57,7 +57,7 @@ private void validate() { } @Override - public @Nonnull InventoryLayout getLayout() { + public @Nonnull MenuLayout getLayout() { validate(); return layout; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java similarity index 72% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java index f98ab254..ba05b1e6 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomInventoryListener.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java @@ -7,19 +7,19 @@ import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.InventoryHolder; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.Menu; import io.github.thebusybiscuit.dough.inventory.SlotGroup; import io.github.thebusybiscuit.dough.inventory.payloads.Payloads; -class CustomInventoryListener implements Listener { +class MenuListener implements Listener { - private final CustomInventoryFactory factory; + private final MenuFactory factory; - CustomInventoryListener(@Nonnull CustomInventoryFactory factory) { + MenuListener(@Nonnull MenuFactory factory) { this.factory = factory; } - public @Nonnull CustomInventoryFactory getInventoryFactory() { + public @Nonnull MenuFactory getInventoryFactory() { return factory; } @@ -27,8 +27,8 @@ class CustomInventoryListener implements Listener { public void onClick(InventoryClickEvent e) { InventoryHolder holder = e.getInventory().getHolder(); - if (holder instanceof CustomInventory) { - CustomInventory inv = (CustomInventory) holder; + if (holder instanceof Menu) { + Menu inv = (Menu) holder; if (!inv.getFactory().equals(factory)) { // Not one of our inventories - abort diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java deleted file mode 100644 index 0cca49b2..00000000 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/CustomInventoryClickHandler.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.github.thebusybiscuit.dough.inventory.handlers; - -import javax.annotation.Nonnull; - -import io.github.thebusybiscuit.dough.inventory.payloads.InventoryClickPayload; - -@FunctionalInterface -public interface CustomInventoryClickHandler { - - void onClick(@Nonnull InventoryClickPayload e); - -} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java new file mode 100644 index 00000000..2545052f --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java @@ -0,0 +1,12 @@ +package io.github.thebusybiscuit.dough.inventory.handlers; + +import javax.annotation.Nonnull; + +import io.github.thebusybiscuit.dough.inventory.payloads.MenuClickPayload; + +@FunctionalInterface +public interface MenuClickHandler { + + void onClick(@Nonnull MenuClickPayload e); + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java deleted file mode 100644 index 3e20915f..00000000 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractInventoryPayload.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.github.thebusybiscuit.dough.inventory.payloads; - -import javax.annotation.Nonnull; - -import io.github.thebusybiscuit.dough.inventory.CustomInventory; - -abstract class AbstractInventoryPayload { - - private final CustomInventory inventory; - - AbstractInventoryPayload(@Nonnull CustomInventory inventory) { - this.inventory = inventory; - } - - public @Nonnull CustomInventory getInventory() { - return inventory; - } - -} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java new file mode 100644 index 00000000..d18d782a --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java @@ -0,0 +1,19 @@ +package io.github.thebusybiscuit.dough.inventory.payloads; + +import javax.annotation.Nonnull; + +import io.github.thebusybiscuit.dough.inventory.Menu; + +abstract class AbstractMenuPayload { + + private final Menu inventory; + + AbstractMenuPayload(@Nonnull Menu inventory) { + this.inventory = inventory; + } + + public @Nonnull Menu getInventory() { + return inventory; + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java similarity index 79% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java index 1ec2d77b..2211996e 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/InventoryClickPayload.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java @@ -6,16 +6,16 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.Menu; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -public class InventoryClickPayload extends AbstractInventoryPayload { +public class MenuClickPayload extends AbstractMenuPayload { private final Player player; private final int slot; @ParametersAreNonnullByDefault - InventoryClickPayload(CustomInventory inventory, Player player, int slot) { + MenuClickPayload(Menu inventory, Player player, int slot) { super(inventory); this.player = player; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java index c014bb80..d6169ab4 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java @@ -6,18 +6,18 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; +import io.github.thebusybiscuit.dough.inventory.Menu; public class Payloads { private Payloads() {} @ParametersAreNonnullByDefault - public static @Nonnull InventoryClickPayload create(CustomInventory inv, InventoryClickEvent e) { + public static @Nonnull MenuClickPayload create(Menu inv, InventoryClickEvent e) { Player player = (Player) e.getWhoClicked(); int slot = e.getSlot(); - return new InventoryClickPayload(inv, player, slot); + return new MenuClickPayload(inv, player, slot); } } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestLayoutBuilder.java similarity index 90% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestLayoutBuilder.java index d0e62d54..979018a5 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestInventoryLayoutBuilder.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestLayoutBuilder.java @@ -26,12 +26,12 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; import be.seeseemelk.mockbukkit.MockBukkit; -class TestInventoryLayoutBuilder { +class TestLayoutBuilder { @BeforeAll static void setup() { @@ -46,7 +46,7 @@ static void teardown() { @Test void testSlotGroups() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .interactable(false) @@ -96,7 +96,7 @@ void testSlotGroups() { @Test void testSlotGroupOverlapping() { // @formatter:off - InventoryLayoutBuilder builder = new InventoryLayoutBuilder(9) + MenuLayoutBuilder builder = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlot(1) @@ -116,7 +116,7 @@ void testSlotGroupOverlapping() { @ValueSource(ints = { -1, 10 }) void testOutsideSlotGroups(int slot) { // @formatter:off - InventoryLayoutBuilder builder = new InventoryLayoutBuilder(9) + MenuLayoutBuilder builder = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlot(slot) @@ -130,7 +130,7 @@ void testOutsideSlotGroups(int slot) { @Test void testUnknownSlotGroups() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) @@ -149,7 +149,7 @@ void testUnknownSlotGroups() { @Test void testIncompleteSlotGroups() { // @formatter:off - InventoryLayoutBuilder builder = new InventoryLayoutBuilder(9) + MenuLayoutBuilder builder = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(1, 2, 3, 4, 5, 6, 7, 8) @@ -163,7 +163,7 @@ void testIncompleteSlotGroups() { @ParameterizedTest(name = "{0} is not a valid inventory size.") @MethodSource("getIllegalInventorySizes") void testIllegalInventorySizes(int size) { - assertThrows(IllegalArgumentException.class, () -> new InventoryLayoutBuilder(size)); + assertThrows(IllegalArgumentException.class, () -> new MenuLayoutBuilder(size)); } private static @Nonnull Stream getIllegalInventorySizes() { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java similarity index 91% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java index e13ccd6b..112ee56c 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockInventoryFactory.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java @@ -10,9 +10,9 @@ import be.seeseemelk.mockbukkit.MockBukkit; -class MockInventoryFactory extends CustomInventoryFactory { +class MockMenuFactory extends MenuFactory { - MockInventoryFactory() { + MockMenuFactory() { // @formatter:off super(MockBukkit.loadWith(MockJavaPlugin.class, new PluginDescriptionFile( "MockPlugin", diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java similarity index 77% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java index 32bf82b5..50ca7f55 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestClickEvents.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java @@ -30,26 +30,26 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; -import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; -import io.github.thebusybiscuit.dough.inventory.payloads.InventoryClickPayload; +import io.github.thebusybiscuit.dough.inventory.payloads.MenuClickPayload; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; -class TestClickEvents { +class TestMenuClicking { private static ServerMock server; - private static CustomInventoryFactory factory; - private static CustomInventoryFactory factory2; + private static MenuFactory factory; + private static MenuFactory factory2; @BeforeAll static void setup() { server = MockBukkit.mock(); - factory = new MockInventoryFactory(); - factory2 = new MockInventoryFactory(); + factory = new MockMenuFactory(); + factory2 = new MockMenuFactory(); } @AfterAll @@ -60,10 +60,10 @@ static void teardown() { @ParameterizedTest @ValueSource(booleans = { true, false }) void testClickItemInSlot(boolean interactable) { - AtomicReference payloadRef = new AtomicReference<>(); + AtomicReference payloadRef = new AtomicReference<>(); // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(0, 1) @@ -82,7 +82,7 @@ void testClickItemInSlot(boolean interactable) { assertListenerRegistered(); - CustomInventory inv = factory.createInventory(layout); + Menu inv = factory.createInventory(layout); Player player = server.addPlayer(); int slot = 1; @@ -90,7 +90,7 @@ void testClickItemInSlot(boolean interactable) { InventoryClickEvent event = new InventoryClickEvent(view, SlotType.CONTAINER, slot, ClickType.LEFT, InventoryAction.PICKUP_ONE); Bukkit.getPluginManager().callEvent(event); - InventoryClickPayload payload = payloadRef.get(); + MenuClickPayload payload = payloadRef.get(); assertNotNull(payload); assertSame(inv, payload.getInventory()); @@ -105,16 +105,16 @@ void testClickItemInSlot(boolean interactable) { @Test void testMultipleFactories() { - Map eventsFired = new HashMap<>(); + Map eventsFired = new HashMap<>(); // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) .interactable(true) .onClick(payload -> { - CustomInventoryFactory factory = payload.getInventory().getFactory(); + MenuFactory factory = payload.getInventory().getFactory(); eventsFired.merge(factory, 1, Integer::sum); }) .build() @@ -122,8 +122,8 @@ void testMultipleFactories() { .build(); // @formatter:on - CustomInventory inv = factory.createInventory(layout); - CustomInventory inv2 = factory2.createInventory(layout); + Menu inv = factory.createInventory(layout); + Menu inv2 = factory2.createInventory(layout); simulateClickEvents(inv, 2); simulateClickEvents(inv2, 4); @@ -133,7 +133,7 @@ void testMultipleFactories() { } @ParametersAreNonnullByDefault - private void simulateClickEvents(CustomInventory inv, int amount) { + private void simulateClickEvents(Menu inv, int amount) { for (int i = 0; i < amount; i++) { Player player = server.addPlayer(); InventoryView view = inv.open(player); @@ -145,7 +145,7 @@ private void simulateClickEvents(CustomInventory inv, int amount) { } /** - * This method asserts that the {@link Listener} for our {@link CustomInventoryFactory} + * This method asserts that the {@link Listener} for our {@link MenuFactory} * is properly registered to the {@link Server} and listens to the {@link InventoryClickEvent}. */ private void assertListenerRegistered() { @@ -155,8 +155,8 @@ private void assertListenerRegistered() { Plugin plugin = listener.getPlugin(); Listener clickListener = listener.getListener(); - if (plugin.equals(factory.getPlugin()) && clickListener instanceof CustomInventoryListener) { - return factory.equals(((CustomInventoryListener) clickListener).getInventoryFactory()); + if (plugin.equals(factory.getPlugin()) && clickListener instanceof MenuListener) { + return factory.equals(((MenuListener) clickListener).getInventoryFactory()); } else { return false; } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java similarity index 75% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java index 9693fe61..6fc4c9fd 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryClosing.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java @@ -9,23 +9,23 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; -import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; -class TestInventoryClosing { +class TestMenuClosing { - private static CustomInventoryFactory factory; + private static MenuFactory factory; private static ServerMock server; @BeforeAll static void setup() { server = MockBukkit.mock(); - factory = new MockInventoryFactory(); + factory = new MockMenuFactory(); } @AfterAll @@ -36,7 +36,7 @@ static void teardown() { @Test void testCloseAll() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) @@ -45,7 +45,7 @@ void testCloseAll() { .build(); // @formatter:on - CustomInventory inv = factory.createInventory(layout); + Menu inv = factory.createInventory(layout); Player player = server.addPlayer(); InventoryView view = inv.open(player); diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryCreation.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java similarity index 83% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryCreation.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java index 23ad3cef..e844ec7a 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestInventoryCreation.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java @@ -18,22 +18,22 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.CustomInventory; -import io.github.thebusybiscuit.dough.inventory.InventoryLayout; +import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.builders.InventoryLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; import be.seeseemelk.mockbukkit.MockBukkit; -class TestInventoryCreation { +class TestMenuCreation { - private static CustomInventoryFactory factory; + private static MenuFactory factory; @BeforeAll static void setup() { MockBukkit.mock(); - factory = new MockInventoryFactory(); + factory = new MockMenuFactory(); } @AfterAll @@ -45,7 +45,7 @@ static void teardown() { @ValueSource(ints = { 9, 18, 27, 36, 45, 54 }) void testCreationWithSize(int size) { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(size) + MenuLayout layout = new MenuLayoutBuilder(size) .title("Awesome Inventory!") .addSlotGroup( new SlotGroupBuilder('x', "test") @@ -55,7 +55,7 @@ void testCreationWithSize(int size) { .build(); // @formatter:on - CustomInventory inv = factory.createInventory(layout); + Menu inv = factory.createInventory(layout); assertNotNull(inv); assertEquals(layout, inv.getLayout()); @@ -70,7 +70,7 @@ void testCreationWithSize(int size) { @Test void testInventoryValidation() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(IntStream.range(0, 9).toArray()) @@ -79,7 +79,7 @@ void testInventoryValidation() { .build(); // @formatter:on - CustomInventory inv = new CustomInventoryImpl(factory, layout); + Menu inv = new MenuImpl(factory, layout); assertThrows(UnsupportedOperationException.class, () -> inv.getInventory()); } @@ -87,7 +87,7 @@ void testInventoryValidation() { @Test void testInventoryHolderValidation() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(IntStream.range(0, 9).toArray()) @@ -96,7 +96,7 @@ void testInventoryHolderValidation() { .build(); // @formatter:on - CustomInventoryImpl inv = new CustomInventoryImpl(factory, layout); + MenuImpl inv = new MenuImpl(factory, layout); // InventoryHolder == null Inventory inventory = Bukkit.createInventory(null, 9); @@ -112,7 +112,7 @@ void testInventoryHolderValidation() { @Test void testDefaultItem() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(0, 1) @@ -127,7 +127,7 @@ void testDefaultItem() { .build(); // @formatter:on - CustomInventory inv = factory.createInventory(layout); + Menu inv = factory.createInventory(layout); assertEquals(new ItemStack(Material.APPLE), inv.getItem(0)); assertEquals(new ItemStack(Material.APPLE), inv.getItem(1)); @@ -143,7 +143,7 @@ void testDefaultItem() { @Test void testAddItem() { // @formatter:off - InventoryLayout layout = new InventoryLayoutBuilder(9) + MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") .withSlots(0, 1, 2, 3, 4, 5) @@ -157,7 +157,7 @@ void testAddItem() { .build(); // @formatter:on - CustomInventory inv = factory.createInventory(layout); + Menu inv = factory.createInventory(layout); SlotGroup group = layout.getGroup('y'); inv.setItem(6, new ItemStack(Material.AIR)); From a18af1bc08e23ba6b29c27272ddcfe1986396a43 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 13 Jul 2021 21:18:49 +0200 Subject: [PATCH 09/24] Detect key and name collisions --- .../thebusybiscuit/dough/inventory/Menu.java | 6 +++ .../dough/inventory/SlotGroup.java | 2 +- .../inventory/builders/MenuLayoutImpl.java | 24 +++++++--- .../inventory/builders/SlotGroupImpl.java | 2 +- .../dough/inventory/factory/MenuFactory.java | 2 +- .../dough/inventory/factory/MenuListener.java | 4 +- .../{Payloads.java => MenuEventPayloads.java} | 12 +++-- .../{ => builders}/TestLayoutBuilder.java | 44 +++++++++++++++++-- .../inventory/factory/TestMenuClicking.java | 6 +-- .../inventory/factory/TestMenuClosing.java | 2 +- .../inventory/factory/TestMenuCreation.java | 6 +-- 11 files changed, 86 insertions(+), 24 deletions(-) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/{Payloads.java => MenuEventPayloads.java} (75%) rename dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/{ => builders}/TestLayoutBuilder.java (81%) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java index fa42c74d..64270321 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java @@ -18,6 +18,12 @@ public interface Menu extends InventoryHolder { + /** + * This method returns the {@link MenuFactory} which was used + * to create this {@link Menu}. + * + * @return The original {@link MenuFactory} + */ @Nonnull MenuFactory getFactory(); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java index ebde3957..9179cbf6 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java @@ -27,7 +27,7 @@ public interface SlotGroup extends Iterable { * @return The unique identifier of this {@link SlotGroup} */ @Nonnull - char getCharIdentifier(); + char getIdentifier(); /** * This method returns whether this {@link SlotGroup} is interactable. diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java index 8398abd4..090e279b 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java @@ -28,15 +28,27 @@ class MenuLayoutImpl implements MenuLayout { this.groups.addAll(builder.groups); this.groupsBySlot = new SlotGroup[size]; - Set slots = new HashSet<>(); + Set uniqueCharacters = new HashSet<>(); + Set uniqueNames = new HashSet<>(); + Set coveredSlots = new HashSet<>(); for (SlotGroup group : groups) { Validate.notNull(group, "SlotGroups cannot be null."); + // Check for duplicate identifiers + if (!uniqueCharacters.add(group.getIdentifier())) { + throw new IllegalStateException("Identifier '" + group.getIdentifier() + "' is used more than once!"); + } + + // Check for duplicate names + if (!uniqueNames.add(group.getName())) { + throw new IllegalStateException("Name '" + group.getName() + "' is used more than once!"); + } + for (int slot : group) { - Validate.isTrue(slot >= 0 && slot < size, "Slot " + slot + " is outside the bounds of this inventory (0 - " + size + ')'); + Validate.isTrue(slot >= 0 && slot < size, "The slot " + slot + " is outside the bounds of this inventory (0 - " + size + ')'); - if (!slots.add(slot)) { + if (!coveredSlots.add(slot)) { throw new IllegalStateException("Slot " + slot + " is defined by multiple slot groups."); } @@ -44,8 +56,8 @@ class MenuLayoutImpl implements MenuLayout { } } - if (slots.size() != size) { - throw new IllegalStateException("Only " + slots.size() + " / " + size + " slots are covered by slot groups."); + if (coveredSlots.size() != size) { + throw new IllegalStateException("Only " + coveredSlots.size() + " / " + size + " slots are covered by slot groups."); } } @@ -66,7 +78,7 @@ public int getSize() { @Override public @Nonnull SlotGroup getGroup(char identifier) { - SlotGroup result = findGroup(group -> group.getCharIdentifier() == identifier); + SlotGroup result = findGroup(group -> group.getIdentifier() == identifier); if (result != null) { return result; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java index 8e67b9da..e304db55 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java @@ -38,7 +38,7 @@ class SlotGroupImpl implements SlotGroup { } @Override - public char getCharIdentifier() { + public char getIdentifier() { return identifier; } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java index 5323b7d4..aba32036 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java @@ -31,7 +31,7 @@ public MenuFactory(@Nonnull Plugin plugin) { } @OverridingMethodsMustInvokeSuper - public @Nonnull Menu createInventory(@Nonnull MenuLayout layout) { + public @Nonnull Menu createMenu(@Nonnull MenuLayout layout) { MenuImpl impl = new MenuImpl(this, layout); String title = layout.getTitle(); Inventory inv; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java index ba05b1e6..1da9255d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java @@ -9,7 +9,7 @@ import io.github.thebusybiscuit.dough.inventory.Menu; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.payloads.Payloads; +import io.github.thebusybiscuit.dough.inventory.payloads.MenuEventPayloads; class MenuListener implements Listener { @@ -42,7 +42,7 @@ public void onClick(InventoryClickEvent e) { e.setCancelled(true); } - slotGroup.getClickHandler().onClick(Payloads.create(inv, e)); + slotGroup.getClickHandler().onClick(MenuEventPayloads.create(inv, e)); } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuEventPayloads.java similarity index 75% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuEventPayloads.java index d6169ab4..eb1ffe33 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/Payloads.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuEventPayloads.java @@ -8,9 +8,15 @@ import io.github.thebusybiscuit.dough.inventory.Menu; -public class Payloads { - - private Payloads() {} +/** + * Utility class for constructing an event payload for menu handlers. + * + * @author TheBusyBiscuit + * + */ +public class MenuEventPayloads { + + private MenuEventPayloads() {} @ParametersAreNonnullByDefault public static @Nonnull MenuClickPayload create(Menu inv, InventoryClickEvent e) { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestLayoutBuilder.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/builders/TestLayoutBuilder.java similarity index 81% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestLayoutBuilder.java rename to dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/builders/TestLayoutBuilder.java index 979018a5..ebb299f5 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestLayoutBuilder.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/builders/TestLayoutBuilder.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.thebusybiscuit.dough.inventory.builders; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -26,8 +26,8 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; import be.seeseemelk.mockbukkit.MockBukkit; @@ -112,6 +112,44 @@ void testSlotGroupOverlapping() { assertThrows(IllegalStateException.class, builder::build); } + @Test + void testSlotGroupIdentifierCollision() { + // @formatter:off + MenuLayoutBuilder builder = new MenuLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('x', "test2") + .withSlots(4, 5, 6, 7, 8) + .build() + ); + // @formatter:on + + assertThrows(IllegalStateException.class, builder::build); + } + + @Test + void testSlotGroupNameCollision() { + // @formatter:off + MenuLayoutBuilder builder = new MenuLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test") + .withSlots(4, 5, 6, 7, 8) + .build() + ); + // @formatter:on + + assertThrows(IllegalStateException.class, builder::build); + } + @ParameterizedTest @ValueSource(ints = { -1, 10 }) void testOutsideSlotGroups(int slot) { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java index 50ca7f55..682c3097 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java @@ -82,7 +82,7 @@ void testClickItemInSlot(boolean interactable) { assertListenerRegistered(); - Menu inv = factory.createInventory(layout); + Menu inv = factory.createMenu(layout); Player player = server.addPlayer(); int slot = 1; @@ -122,8 +122,8 @@ void testMultipleFactories() { .build(); // @formatter:on - Menu inv = factory.createInventory(layout); - Menu inv2 = factory2.createInventory(layout); + Menu inv = factory.createMenu(layout); + Menu inv2 = factory2.createMenu(layout); simulateClickEvents(inv, 2); simulateClickEvents(inv2, 4); diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java index 6fc4c9fd..c4fee5c2 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java @@ -45,7 +45,7 @@ void testCloseAll() { .build(); // @formatter:on - Menu inv = factory.createInventory(layout); + Menu inv = factory.createMenu(layout); Player player = server.addPlayer(); InventoryView view = inv.open(player); diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java index e844ec7a..61f05a91 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java @@ -55,7 +55,7 @@ void testCreationWithSize(int size) { .build(); // @formatter:on - Menu inv = factory.createInventory(layout); + Menu inv = factory.createMenu(layout); assertNotNull(inv); assertEquals(layout, inv.getLayout()); @@ -127,7 +127,7 @@ void testDefaultItem() { .build(); // @formatter:on - Menu inv = factory.createInventory(layout); + Menu inv = factory.createMenu(layout); assertEquals(new ItemStack(Material.APPLE), inv.getItem(0)); assertEquals(new ItemStack(Material.APPLE), inv.getItem(1)); @@ -157,7 +157,7 @@ void testAddItem() { .build(); // @formatter:on - Menu inv = factory.createInventory(layout); + Menu inv = factory.createMenu(layout); SlotGroup group = layout.getGroup('y'); inv.setItem(6, new ItemStack(Material.AIR)); From 3164f0fa82ddcbd6dd74575c33a956065e2e744d Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 13 Jul 2021 21:36:16 +0200 Subject: [PATCH 10/24] Allow factories to construct custom menu implementations --- .../{MenuImpl.java => CustomMenu.java} | 15 ++++++------ .../dough/inventory/factory/MenuFactory.java | 24 ++++++++++++++----- .../inventory/factory/TestMenuCreation.java | 4 ++-- 3 files changed, 28 insertions(+), 15 deletions(-) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/{MenuImpl.java => CustomMenu.java} (87%) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuImpl.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java similarity index 87% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuImpl.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java index 2ab52078..493efd4b 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuImpl.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java @@ -12,7 +12,7 @@ import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; -class MenuImpl implements Menu { +public class CustomMenu implements Menu { private final MenuFactory factory; private final MenuLayout layout; @@ -20,7 +20,8 @@ class MenuImpl implements Menu { private Inventory inventory; @ParametersAreNonnullByDefault - MenuImpl(MenuFactory factory, MenuLayout layout) { + protected CustomMenu(MenuFactory factory, MenuLayout layout) { + Validate.notNull(factory, "The factory cannot be null."); Validate.notNull(layout, "The layout cannot be null."); this.factory = factory; @@ -28,7 +29,7 @@ class MenuImpl implements Menu { this.title = layout.getTitle(); } - void setInventory(@Nonnull Inventory inventory) { + final void setInventory(@Nonnull Inventory inventory) { Validate.notNull(inventory, "The Inventory must not be null."); Validate.isTrue(inventory.getSize() == layout.getSize(), "The inventory has a different size."); Validate.isTrue(inventory.getHolder() == this, "The Inventory does not seem to belong here. Holder: " + inventory.getHolder()); @@ -38,26 +39,26 @@ void setInventory(@Nonnull Inventory inventory) { private void validate() { if (inventory == null) { - throw new UnsupportedOperationException("No inventory has been set yet."); + throw new UnsupportedOperationException("No inventory found! Menus must be created using MenuFactory#createMenu(...)"); } } @Override - public @Nonnull MenuFactory getFactory() { + public final @Nonnull MenuFactory getFactory() { validate(); return factory; } @Override - public @Nonnull Inventory getInventory() { + public final @Nonnull Inventory getInventory() { validate(); return inventory; } @Override - public @Nonnull MenuLayout getLayout() { + public final @Nonnull MenuLayout getLayout() { validate(); return layout; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java index aba32036..a699b640 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java @@ -1,8 +1,12 @@ package io.github.thebusybiscuit.dough.inventory.factory; +import java.util.function.BiFunction; + import javax.annotation.Nonnull; import javax.annotation.OverridingMethodsMustInvokeSuper; +import javax.annotation.ParametersAreNonnullByDefault; +import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.inventory.Inventory; import org.bukkit.plugin.Plugin; @@ -32,24 +36,32 @@ public MenuFactory(@Nonnull Plugin plugin) { @OverridingMethodsMustInvokeSuper public @Nonnull Menu createMenu(@Nonnull MenuLayout layout) { - MenuImpl impl = new MenuImpl(this, layout); + return createMenu(layout, CustomMenu::new); + } + + @ParametersAreNonnullByDefault + public @Nonnull T createMenu(MenuLayout layout, BiFunction constructor) { + Validate.notNull(layout, "The menu layout cannot be null!"); + Validate.notNull(constructor, "The provided constructor is not allowed to be null!"); + + T menu = constructor.apply(this, layout); String title = layout.getTitle(); Inventory inv; if (title == null) { - inv = Bukkit.createInventory(impl, layout.getSize()); + inv = Bukkit.createInventory(menu, layout.getSize()); } else { - inv = Bukkit.createInventory(impl, layout.getSize(), title); + inv = Bukkit.createInventory(menu, layout.getSize(), title); } - impl.setInventory(inv); + menu.setInventory(inv); // Set all default items for (SlotGroup group : layout.getSlotGroups()) { - impl.setAll(group, group.getDefaultItemStack()); + menu.setAll(group, group.getDefaultItemStack()); } - return impl; + return menu; } } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java index 61f05a91..1ef173a9 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java @@ -79,7 +79,7 @@ void testInventoryValidation() { .build(); // @formatter:on - Menu inv = new MenuImpl(factory, layout); + Menu inv = new CustomMenu(factory, layout); assertThrows(UnsupportedOperationException.class, () -> inv.getInventory()); } @@ -96,7 +96,7 @@ void testInventoryHolderValidation() { .build(); // @formatter:on - MenuImpl inv = new MenuImpl(factory, layout); + CustomMenu inv = new CustomMenu(factory, layout); // InventoryHolder == null Inventory inventory = Bukkit.createInventory(null, 9); From 67b9106cc4fd34af5661902e6e751eabf7a5fefe Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Tue, 13 Jul 2021 23:32:51 +0200 Subject: [PATCH 11/24] Improved docs and logging --- .../dough/inventory/factory/CustomMenu.java | 5 ++ .../dough/inventory/factory/MenuFactory.java | 18 +++++ .../dough/inventory/factory/MenuListener.java | 69 ++++++++++++++++--- .../inventory/factory/TestMenuClicking.java | 2 +- 4 files changed, 82 insertions(+), 12 deletions(-) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java index 493efd4b..9457d29d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java @@ -128,4 +128,9 @@ public void setItem(int slot, @Nullable ItemStack item) { return inventory.getItem(slot); } + @Override + public @Nonnull String toString() { + return getClass().getSimpleName() + " [size: " + layout.getSize() + ", title=" + title + "]"; + } + } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java index a699b640..4b8cf864 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java @@ -1,6 +1,7 @@ package io.github.thebusybiscuit.dough.inventory.factory; import java.util.function.BiFunction; +import java.util.logging.Logger; import javax.annotation.Nonnull; import javax.annotation.OverridingMethodsMustInvokeSuper; @@ -20,6 +21,8 @@ public class MenuFactory { private final Plugin plugin; public MenuFactory(@Nonnull Plugin plugin) { + Validate.notNull(plugin, "The plugin instance cannot be null."); + this.plugin = plugin; registerListener(plugin); } @@ -30,10 +33,25 @@ public MenuFactory(@Nonnull Plugin plugin) { return listener; } + /** + * This returns the {@link Plugin} which instantiated this {@link MenuFactory}. + * + * @return The {@link Plugin} instance + */ public final @Nonnull Plugin getPlugin() { return plugin; } + /** + * Shortcut method for getting the {@link Logger} from + * {@link #getPlugin()}. + * + * @return The {@link Logger} of our {@link Plugin} + */ + public final @Nonnull Logger getLogger() { + return plugin.getLogger(); + } + @OverridingMethodsMustInvokeSuper public @Nonnull Menu createMenu(@Nonnull MenuLayout layout) { return createMenu(layout, CustomMenu::new); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java index 1da9255d..7c4d4890 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java @@ -1,48 +1,95 @@ package io.github.thebusybiscuit.dough.inventory.factory; +import java.util.logging.Level; + import javax.annotation.Nonnull; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import io.github.thebusybiscuit.dough.inventory.Menu; import io.github.thebusybiscuit.dough.inventory.SlotGroup; import io.github.thebusybiscuit.dough.inventory.payloads.MenuEventPayloads; +/** + * The {@link MenuListener} is responsible for handling any + * {@link Event} related to our {@link Menu}s. + *

+ * It is registered by a {@link MenuFactory} and there should only + * be one {@link MenuListener} per {@link MenuFactory}. + * + * @author TheBusyBiscuit + * + */ class MenuListener implements Listener { + /** + * Our {@link MenuFactory} instance. + */ private final MenuFactory factory; + /** + * This constructs a new {@link MenuListener} for the given + * {@link MenuFactory}. + * + * @param factory + * Our {@link MenuFactory} instance + */ MenuListener(@Nonnull MenuFactory factory) { this.factory = factory; } - public @Nonnull MenuFactory getInventoryFactory() { + /** + * This returns the {@link MenuFactory} which instantiated and + * registered this {@link MenuListener}. + * + * @return The {@link MenuFactory} + */ + public @Nonnull MenuFactory getFactory() { return factory; } + /** + * Here we listen for the {@link InventoryClickEvent}. + * This event is fired whenever a {@link Player} clicks a slot + * in an {@link Inventory}. We only care for events which happen + * within our {@link Menu} though. + * + * @param e + * The {@link InventoryClickEvent} which was fired + */ @EventHandler public void onClick(InventoryClickEvent e) { InventoryHolder holder = e.getInventory().getHolder(); + // Check if the Inventory is a Menu if (holder instanceof Menu) { Menu inv = (Menu) holder; - if (!inv.getFactory().equals(factory)) { - // Not one of our inventories - abort - return; - } + try { + // Check if this was created by our factory + if (!inv.getFactory().equals(factory)) { + // Not one of our inventories - abort + return; + } - // TODO: Check if the clicked slot is within that inventory - SlotGroup slotGroup = inv.getLayout().getGroup(e.getSlot()); + // TODO: Check if the clicked slot is within that inventory + SlotGroup slotGroup = inv.getLayout().getGroup(e.getSlot()); - if (!slotGroup.isInteractable()) { - e.setCancelled(true); - } + if (!slotGroup.isInteractable()) { + e.setCancelled(true); + } - slotGroup.getClickHandler().onClick(MenuEventPayloads.create(inv, e)); + // Fire the click handler + slotGroup.getClickHandler().onClick(MenuEventPayloads.create(inv, e)); + } catch (Exception | LinkageError x) { + factory.getLogger().log(Level.SEVERE, x, () -> "Could not pass click event for " + inv + " (slot: " + e.getSlot() + ", player:" + e.getWhoClicked().getName() + ")"); + } } } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java index 682c3097..dfeba866 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java @@ -156,7 +156,7 @@ private void assertListenerRegistered() { Listener clickListener = listener.getListener(); if (plugin.equals(factory.getPlugin()) && clickListener instanceof MenuListener) { - return factory.equals(((MenuListener) clickListener).getInventoryFactory()); + return factory.equals(((MenuListener) clickListener).getFactory()); } else { return false; } From 0556b86adddc04f8fee1abdd7d62014af4e90d60 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 00:42:04 +0200 Subject: [PATCH 12/24] Implemented layout parsing and added unit tests for it --- .../dough/inventory/factory/MenuListener.java | 20 +-- .../json/InvalidLayoutException.java | 28 ++++ .../dough/inventory/json/LayoutShape.java | 58 ++++++++ .../inventory/json/MenuLayoutParser.java | 139 ++++++++++++++++++ .../inventory/factory/TestMenuClicking.java | 3 + .../dough/inventory/json/TestJsonParsing.java | 100 +++++++++++++ .../src/test/resources/invalid1.json | 25 ++++ .../src/test/resources/invalid10.json | 21 +++ .../src/test/resources/invalid11.json | 24 +++ .../src/test/resources/invalid12.json | 21 +++ .../src/test/resources/invalid2.json | 18 +++ .../src/test/resources/invalid3.json | 16 ++ .../src/test/resources/invalid4.json | 10 ++ .../src/test/resources/invalid5.json | 16 ++ .../src/test/resources/invalid6.json | 17 +++ .../src/test/resources/invalid7.json | 11 ++ .../src/test/resources/invalid8.json | 22 +++ .../src/test/resources/invalid9.json | 21 +++ .../src/test/resources/valid1.json | 51 +++++++ 19 files changed, 609 insertions(+), 12 deletions(-) create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java create mode 100644 dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java create mode 100644 dough-inventories/src/test/resources/invalid1.json create mode 100644 dough-inventories/src/test/resources/invalid10.json create mode 100644 dough-inventories/src/test/resources/invalid11.json create mode 100644 dough-inventories/src/test/resources/invalid12.json create mode 100644 dough-inventories/src/test/resources/invalid2.json create mode 100644 dough-inventories/src/test/resources/invalid3.json create mode 100644 dough-inventories/src/test/resources/invalid4.json create mode 100644 dough-inventories/src/test/resources/invalid5.json create mode 100644 dough-inventories/src/test/resources/invalid6.json create mode 100644 dough-inventories/src/test/resources/invalid7.json create mode 100644 dough-inventories/src/test/resources/invalid8.json create mode 100644 dough-inventories/src/test/resources/invalid9.json create mode 100644 dough-inventories/src/test/resources/valid1.json diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java index 7c4d4890..1eefa2ad 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java @@ -72,21 +72,17 @@ public void onClick(InventoryClickEvent e) { Menu inv = (Menu) holder; try { - // Check if this was created by our factory - if (!inv.getFactory().equals(factory)) { - // Not one of our inventories - abort - return; - } + // Check if this was created by our factory and the clicked slot is within the upper inventory + if (inv.getFactory().equals(factory) && e.getRawSlot() < e.getInventory().getSize()) { + SlotGroup slotGroup = inv.getLayout().getGroup(e.getSlot()); - // TODO: Check if the clicked slot is within that inventory - SlotGroup slotGroup = inv.getLayout().getGroup(e.getSlot()); + if (!slotGroup.isInteractable()) { + e.setCancelled(true); + } - if (!slotGroup.isInteractable()) { - e.setCancelled(true); + // Fire the click handler + slotGroup.getClickHandler().onClick(MenuEventPayloads.create(inv, e)); } - - // Fire the click handler - slotGroup.getClickHandler().onClick(MenuEventPayloads.create(inv, e)); } catch (Exception | LinkageError x) { factory.getLogger().log(Level.SEVERE, x, () -> "Could not pass click event for " + inv + " (slot: " + e.getSlot() + ", player:" + e.getWhoClicked().getName() + ")"); } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java new file mode 100644 index 00000000..a9164690 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java @@ -0,0 +1,28 @@ +package io.github.thebusybiscuit.dough.inventory.json; + +import javax.annotation.Nonnull; + +import com.google.gson.JsonObject; + +import io.github.thebusybiscuit.dough.inventory.MenuLayout; + +/** + * An {@link InvalidLayoutException} is thrown when the {@link MenuLayout} + * was not successfully read from a {@link JsonObject}. + * + * @author TheBusyBiscuit + * + */ +class InvalidLayoutException extends Exception { + + private static final long serialVersionUID = -1891678815608214476L; + + InvalidLayoutException(@Nonnull String message) { + super(message); + } + + InvalidLayoutException(@Nonnull Exception exception) { + super(exception); + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java new file mode 100644 index 00000000..5661a5f1 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java @@ -0,0 +1,58 @@ +package io.github.thebusybiscuit.dough.inventory.json; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang.Validate; + +class LayoutShape { + + private final Map> groups = new HashMap<>(); + private final int size; + + LayoutShape(@Nonnull String[] rows) throws InvalidLayoutException { + Validate.notNull(rows, "Layout cannot be null."); + + if (rows.length > 0 && rows.length < 7) { + this.size = rows.length * 9; + + int i = 0; + + for (String row : rows) { + if (row.length() == 9) { + addSlots(i, row); + i++; + } else { + throw new InvalidLayoutException("Each row in a layout must have 9 characters."); + } + } + } else { + throw new InvalidLayoutException("Layout has " + rows.length + " rows. Must be 1, 2, 3, 4, 5 or 6."); + } + } + + public int getSize() { + return size; + } + + public @Nonnull Map> getGroups() { + return groups; + } + + @ParametersAreNonnullByDefault + private void addSlots(int i, String row) { + int j = 0; + + for (char identifier : row.toCharArray()) { + Set slots = groups.computeIfAbsent(identifier, id -> new HashSet<>()); + slots.add(i * 9 + j); + j++; + } + } + +} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java new file mode 100644 index 00000000..0e72561b --- /dev/null +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java @@ -0,0 +1,139 @@ +package io.github.thebusybiscuit.dough.inventory.json; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang.Validate; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; +import com.google.gson.JsonParser; + +import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; + +public class MenuLayoutParser { + + private MenuLayoutParser() {} + + @ParametersAreNonnullByDefault + public static @Nonnull MenuLayout parseStream(InputStream stream) throws InvalidLayoutException { + Validate.notNull(stream, "InputStream must not be null"); + + try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { + return parseString(reader.lines().collect(Collectors.joining(""))); + } catch (IOException x) { + throw new InvalidLayoutException(x); + } + } + + @ParametersAreNonnullByDefault + public static @Nonnull MenuLayout parseString(String string) throws InvalidLayoutException { + Validate.notNull(string, "String must not be null"); + + try { + JsonParser parser = new JsonParser(); + JsonObject root = parser.parse(string).getAsJsonObject(); + return parseJson(root); + } catch (IllegalStateException | JsonParseException x) { + throw new InvalidLayoutException(x); + } + } + + @ParametersAreNonnullByDefault + public static @Nonnull MenuLayout parseJson(JsonObject json) throws InvalidLayoutException { + Validate.notNull(json, "JsonObject must not be null"); + + try { + LayoutShape shape = parseShape(json); + MenuLayoutBuilder builder = new MenuLayoutBuilder(shape.getSize()); + + for (Map.Entry> entry : shape.getGroups().entrySet()) { + builder.addSlotGroup(parseGroup(json, entry.getKey(), entry.getValue())); + } + + return builder.build(); + } catch (Exception x) { + throw new InvalidLayoutException(x); + } + } + + @ParametersAreNonnullByDefault + private static @Nonnull LayoutShape parseShape(JsonObject json) throws InvalidLayoutException { + String attribute = "layout"; + + if (!json.has(attribute) || !json.get(attribute).isJsonArray()) { + throw new InvalidLayoutException("Missing 'layout' child!"); + } + + JsonArray array = json.getAsJsonArray(attribute); + String[] rows = new String[array.size()]; + + if (rows.length == 0) { + throw new InvalidLayoutException("'layout' is empty!"); + } + + int i = 0; + for (JsonElement row : array) { + if (row.isJsonPrimitive() && row.getAsJsonPrimitive().isString()) { + rows[i] = row.getAsString(); + i++; + } else { + throw new InvalidLayoutException("Expected String in layout, found: " + row); + } + } + + return new LayoutShape(rows); + } + + @ParametersAreNonnullByDefault + private static @Nonnull SlotGroup parseGroup(JsonObject json, char identifier, Set slots) throws InvalidLayoutException { + String attribute = "groups"; + + if (!json.has(attribute) || !json.get(attribute).isJsonObject()) { + throw new InvalidLayoutException("Missing 'groups' child!"); + } + + JsonObject groups = json.getAsJsonObject(attribute); + String key = String.valueOf(identifier); + + if (!groups.has(key) || !groups.get(key).isJsonObject()) { + throw new InvalidLayoutException("Missing 'groups." + identifier + "' child!"); + } + + JsonObject group = groups.getAsJsonObject(key); + JsonElement name = group.get("name"); + + if (name == null) { + throw new InvalidLayoutException("Slot group '" + identifier + "' has no name!"); + } + + SlotGroupBuilder builder = new SlotGroupBuilder(identifier, name.getAsString()); + + JsonElement interactable = group.get("interactable"); + + if (interactable != null && interactable.isJsonPrimitive() && interactable.getAsJsonPrimitive().isBoolean()) { + builder.interactable(interactable.getAsBoolean()); + } else { + throw new InvalidLayoutException("Slot group '" + identifier + "' has no valid 'interactable' attribute!"); + } + + builder.withSlots(slots.stream().mapToInt(Integer::intValue).toArray()); + + return builder.build(); + } + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java index dfeba866..2ba7adb1 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java @@ -149,6 +149,9 @@ private void simulateClickEvents(Menu inv, int amount) { * is properly registered to the {@link Server} and listens to the {@link InventoryClickEvent}. */ private void assertListenerRegistered() { + assertNotNull(factory.getPlugin()); + assertNotNull(factory.getLogger()); + // @formatter:off assertEquals(1,Arrays.stream(InventoryClickEvent.getHandlerList().getRegisteredListeners()) .filter(listener -> { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java new file mode 100644 index 00000000..7855dafb --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java @@ -0,0 +1,100 @@ +package io.github.thebusybiscuit.dough.inventory.json; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.InputStream; + +import javax.annotation.Nonnull; + +import org.junit.jupiter.api.Test; + +import io.github.thebusybiscuit.dough.inventory.MenuLayout; + +class TestJsonParsing { + + @Test + void testValidFile() { + assertDoesNotThrow(() -> parse("valid1")); + } + + @Test + void testNonExistingFile() { + assertThrows(IllegalArgumentException.class, () -> parse("I do not exist")); + } + + @Test + void testMalformedJson() { + assertThrows(InvalidLayoutException.class, () -> MenuLayoutParser.parseString("{ Is this \"\" how ] you json...?: false,")); + } + + @Test + void testTooManyRows() { + assertInvalid("invalid1"); + } + + @Test + void testNoRows() { + assertInvalid("invalid2"); + } + + @Test + void testMissingLayoutObject() { + assertInvalid("invalid3"); + } + + @Test + void testMissingGroupsObject() { + assertInvalid("invalid4"); + } + + @Test + void testIncompleteGroupsObject() { + assertInvalid("invalid5"); + } + + @Test + void testLayoutWrongType() { + assertInvalid("invalid6"); + } + + @Test + void testGroupsWrongType() { + assertInvalid("invalid7"); + } + + @Test + void testLayoutRowsWrongType() { + assertInvalid("invalid8"); + } + + @Test + void testMissingSlotGroupName() { + assertInvalid("invalid9"); + } + + @Test + void testMissingSlotGroupInteractable() { + assertInvalid("invalid10"); + } + + @Test + void testSlotGroupInteractableWrongType() { + assertInvalid("invalid11"); + } + + @Test + void testTooLongRow() { + assertInvalid("invalid12"); + } + + private void assertInvalid(@Nonnull String name) { + assertThrows(InvalidLayoutException.class, () -> parse(name)); + } + + private @Nonnull MenuLayout parse(@Nonnull String name) throws InvalidLayoutException { + InputStream inputStream = getClass().getResourceAsStream("/" + name + ".json"); + return MenuLayoutParser.parseStream(inputStream); + } + +} diff --git a/dough-inventories/src/test/resources/invalid1.json b/dough-inventories/src/test/resources/invalid1.json new file mode 100644 index 00000000..998124d0 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid1.json @@ -0,0 +1,25 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********", + "*********" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "test1", + "interactable" : false + }, + "-" : { + "name" : "test2", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid10.json b/dough-inventories/src/test/resources/invalid10.json new file mode 100644 index 00000000..c1b38173 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid10.json @@ -0,0 +1,21 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********" + ], + "groups" : { + "*" : { + "name" : "background" + }, + "+" : { + "name" : "test1" + }, + "-" : { + "name" : "test2" + } + } +} diff --git a/dough-inventories/src/test/resources/invalid11.json b/dough-inventories/src/test/resources/invalid11.json new file mode 100644 index 00000000..f57f7b24 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid11.json @@ -0,0 +1,24 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : 1 + }, + "+" : { + "name" : "test1", + "interactable" : 2 + }, + "-" : { + "name" : "test2", + "interactable" : 3 + } + } +} diff --git a/dough-inventories/src/test/resources/invalid12.json b/dough-inventories/src/test/resources/invalid12.json new file mode 100644 index 00000000..3a99c721 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid12.json @@ -0,0 +1,21 @@ +{ + "layout" : [ + "**************************", + "++++*----", + "++++*----" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "test1", + "interactable" : false + }, + "-" : { + "name" : "test2", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid2.json b/dough-inventories/src/test/resources/invalid2.json new file mode 100644 index 00000000..a3089366 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid2.json @@ -0,0 +1,18 @@ +{ + "layout" : [ + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "test1", + "interactable" : false + }, + "-" : { + "name" : "test2", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid3.json b/dough-inventories/src/test/resources/invalid3.json new file mode 100644 index 00000000..5c72b7d6 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid3.json @@ -0,0 +1,16 @@ +{ + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "test1", + "interactable" : false + }, + "-" : { + "name" : "test2", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid4.json b/dough-inventories/src/test/resources/invalid4.json new file mode 100644 index 00000000..57831e54 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid4.json @@ -0,0 +1,10 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********" + ] +} diff --git a/dough-inventories/src/test/resources/invalid5.json b/dough-inventories/src/test/resources/invalid5.json new file mode 100644 index 00000000..97497b80 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid5.json @@ -0,0 +1,16 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid6.json b/dough-inventories/src/test/resources/invalid6.json new file mode 100644 index 00000000..502f0e05 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid6.json @@ -0,0 +1,17 @@ +{ + "layout" : true, + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "test1", + "interactable" : false + }, + "-" : { + "name" : "test2", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid7.json b/dough-inventories/src/test/resources/invalid7.json new file mode 100644 index 00000000..90d6e4c2 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid7.json @@ -0,0 +1,11 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********" + ], + "groups" : 6 +} diff --git a/dough-inventories/src/test/resources/invalid8.json b/dough-inventories/src/test/resources/invalid8.json new file mode 100644 index 00000000..8dd56ba1 --- /dev/null +++ b/dough-inventories/src/test/resources/invalid8.json @@ -0,0 +1,22 @@ +{ + "layout" : [ + 1, + 2, + 3, + 4 + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "test1", + "interactable" : false + }, + "-" : { + "name" : "test2", + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/invalid9.json b/dough-inventories/src/test/resources/invalid9.json new file mode 100644 index 00000000..8458deee --- /dev/null +++ b/dough-inventories/src/test/resources/invalid9.json @@ -0,0 +1,21 @@ +{ + "layout" : [ + "*********", + "*********", + "++++*----", + "++++*----", + "*********", + "*********" + ], + "groups" : { + "*" : { + "interactable" : false + }, + "+" : { + "interactable" : false + }, + "-" : { + "interactable" : false + } + } +} diff --git a/dough-inventories/src/test/resources/valid1.json b/dough-inventories/src/test/resources/valid1.json new file mode 100644 index 00000000..0adebe3e --- /dev/null +++ b/dough-inventories/src/test/resources/valid1.json @@ -0,0 +1,51 @@ +{ + "layout" : [ + "*********", + "++++*----", + "+ii+P-oo-", + "++++*----", + "*********" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false, + "item" : { + "material" : "minecraft:gray_stained_glass_pane", + "name" : "" + } + }, + "+" : { + "name" : "input_background", + "interactable" : false, + "item" : { + "material" : "minecraft:cyan_stained_gl ass_pane", + "name" : "" + } + }, + "-" : { + "name" : "output_background", + "interactable" : false, + "item" : { + "material" : "minecraft:orange_stained_glass_pane", + "name" : "" + } + }, + "P" : { + "name" : "progress_bar", + "interactable" : false, + "item" : { + "material" : "minecraft:black_stained_glass_pane", + "name" : "" + } + }, + "i" : { + "name" : "input", + "interactable" : true + }, + "o" : { + "name" : "output", + "interactable" : true + } + } +} From fe9a08a61d169e80c737e57a5ec3c6a65db60064 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 00:57:35 +0200 Subject: [PATCH 13/24] Added another unit test (just to be sure) --- .../dough/inventory/json/TestJsonParsing.java | 36 +++++++++++++++++++ .../src/test/resources/valid1.json | 2 +- .../src/test/resources/valid2.json | 25 +++++++++++++ 3 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 dough-inventories/src/test/resources/valid2.json diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java index 7855dafb..ca8c17a6 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java @@ -1,15 +1,19 @@ package io.github.thebusybiscuit.dough.inventory.json; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; import java.io.InputStream; import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; import org.junit.jupiter.api.Test; import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.thebusybiscuit.dough.inventory.SlotGroup; class TestJsonParsing { @@ -18,6 +22,38 @@ void testValidFile() { assertDoesNotThrow(() -> parse("valid1")); } + @Test + void testCorrectSlotGroups() throws InvalidLayoutException { + MenuLayout layout = parse("valid2"); + + assertEquals(27, layout.getSize()); + assertEquals(3, layout.getSlotGroups().size()); + + assertSlotGroup(layout, 0, '*', "background", false); + assertSlotGroup(layout, 13, '*', "background", false); + assertSlotGroup(layout, 26, '*', "background", false); + + assertSlotGroup(layout, 10, '+', "input", true); + assertSlotGroup(layout, 11, '+', "input", true); + + assertSlotGroup(layout, 14, '-', "output", true); + assertSlotGroup(layout, 17, '-', "output", true); + } + + @ParametersAreNonnullByDefault + private void assertSlotGroup(MenuLayout layout, int slot, char identifier, String name, boolean interactable) { + SlotGroup group1 = layout.getGroup(slot); + SlotGroup group2 = layout.getGroup(identifier); + SlotGroup group3 = layout.getGroup(name); + + assertSame(group1, group2); + assertSame(group1, group3); + assertSame(group2, group3); + + // All three are the same, so this should apply to all of them. + assertEquals(interactable, group1.isInteractable()); + } + @Test void testNonExistingFile() { assertThrows(IllegalArgumentException.class, () -> parse("I do not exist")); diff --git a/dough-inventories/src/test/resources/valid1.json b/dough-inventories/src/test/resources/valid1.json index 0adebe3e..9809def6 100644 --- a/dough-inventories/src/test/resources/valid1.json +++ b/dough-inventories/src/test/resources/valid1.json @@ -19,7 +19,7 @@ "name" : "input_background", "interactable" : false, "item" : { - "material" : "minecraft:cyan_stained_gl ass_pane", + "material" : "minecraft:cyan_stained_glass_pane", "name" : "" } }, diff --git a/dough-inventories/src/test/resources/valid2.json b/dough-inventories/src/test/resources/valid2.json new file mode 100644 index 00000000..aa9c812b --- /dev/null +++ b/dough-inventories/src/test/resources/valid2.json @@ -0,0 +1,25 @@ +{ + "layout" : [ + "*********", + "++++*----", + "*********" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false, + "item" : { + "material" : "minecraft:gray_stained_glass_pane", + "name" : "" + } + }, + "+" : { + "name" : "input", + "interactable" : true + }, + "-" : { + "name" : "output", + "interactable" : true + } + } +} From 9bc5481b9ed7db6f81d53ba35e9491526e157476 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 01:47:13 +0200 Subject: [PATCH 14/24] Test exception handling --- .../thebusybiscuit/dough/inventory/Menu.java | 11 +++ .../factory/MockExceptionHandler.java | 32 +++++++++ .../inventory/factory/TestMenuClicking.java | 69 +++++++++++++++++++ 3 files changed, 112 insertions(+) create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java index 64270321..7944eebf 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java @@ -36,6 +36,12 @@ public interface Menu extends InventoryHolder { @Nonnull MenuLayout getLayout(); + /** + * This returns the title of this {@link Menu}. + * If no title was set, null will be returned. + * + * @return The title of this {@link Menu} or null + */ @Nullable String getTitle(); @@ -64,6 +70,11 @@ default void closeAllViews() { } } + /** + * This returns the size of this {@link Menu}. + * + * @return The size of the {@link Menu}. + */ default int getSize() { return getInventory().getSize(); } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java new file mode 100644 index 00000000..7b21b3c6 --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java @@ -0,0 +1,32 @@ +package io.github.thebusybiscuit.dough.inventory.factory; + +import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogRecord; + +import javax.annotation.ParametersAreNonnullByDefault; + +class MockExceptionHandler extends Handler { + + private final AtomicReference ref; + + @ParametersAreNonnullByDefault + MockExceptionHandler(AtomicReference ref) { + this.ref = ref; + } + + @Override + public void publish(LogRecord record) { + if (record.getLevel() == Level.SEVERE) { + ref.set(record.getThrown()); + } + } + + @Override + public void flush() {} + + @Override + public void close() throws SecurityException {} + +} diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java index 2ba7adb1..514ce156 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java @@ -3,13 +3,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import java.util.logging.Handler; +import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import org.bukkit.Bukkit; @@ -21,6 +25,7 @@ import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryType.SlotType; +import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.Plugin; @@ -103,6 +108,70 @@ void testClickItemInSlot(boolean interactable) { assertNotEquals(interactable, event.isCancelled()); } + @Test + void testOtherInventoriesAreIgnored() { + AtomicReference payloadRef = new AtomicReference<>(); + + // @formatter:off + MenuLayout layout = new MenuLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .onClick(payloadRef::set) + .build() + ) + .build(); + // @formatter:on + + factory.createMenu(layout); + + Player player = server.addPlayer(); + Inventory inv = Bukkit.createInventory(null, 9); + InventoryView view = player.openInventory(inv); + InventoryClickEvent event = new InventoryClickEvent(view, SlotType.CONTAINER, 1, ClickType.LEFT, InventoryAction.PICKUP_ONE); + + Bukkit.getPluginManager().callEvent(event); + + // Make sure our listener ignored this inventory + assertNull(payloadRef.get()); + } + + @Test + void testExceptionHandling() { + // @formatter:off + MenuLayout layout = new MenuLayoutBuilder(9) + .addSlotGroup( + new SlotGroupBuilder('x', "test") + .withSlots(0, 1, 2) + .onClick(payload -> { + throw new NullPointerException("NPE was thrown."); + }) + .build() + ) + .addSlotGroup( + new SlotGroupBuilder('y', "test2") + .withSlots(3, 4, 5, 6, 7, 8) + .build() + ) + .build(); + // @formatter:on + + Menu inv = factory.createMenu(layout); + assertExceptionCaughtOnClick(inv); + } + + private void assertExceptionCaughtOnClick(@Nonnull Menu inv) { + AtomicReference thrownException = new AtomicReference<>(); + Handler handler = new MockExceptionHandler(thrownException); + + factory.getLogger().addHandler(handler); + simulateClickEvents(inv, 1); + factory.getLogger().removeHandler(handler); + + assertNotNull(thrownException.get()); + assertTrue(thrownException.get() instanceof NullPointerException); + } + @Test void testMultipleFactories() { Map eventsFired = new HashMap<>(); From b37ecb7666a547c456cd8c93e0915e922f346ac3 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 10:55:50 +0200 Subject: [PATCH 15/24] Added item and click event injection --- .../thebusybiscuit/dough/inventory/Menu.java | 4 + .../inventory/builders/SlotGroupBuilder.java | 4 + ...enuLayoutParser.java => LayoutParser.java} | 35 ++++-- .../inventory/factory/MockMenuFactory.java | 4 +- .../dough/inventory/json/TestJsonParsing.java | 4 +- .../json/TestSlotGroupInjection.java | 111 ++++++++++++++++++ .../src/test/resources/valid3.json | 21 ++++ 7 files changed, 170 insertions(+), 13 deletions(-) rename dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/{MenuLayoutParser.java => LayoutParser.java} (82%) create mode 100644 dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java create mode 100644 dough-inventories/src/test/resources/valid3.json diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java index 7944eebf..74b3a3b3 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java @@ -47,6 +47,10 @@ public interface Menu extends InventoryHolder { void setAll(@Nonnull SlotGroup group, @Nullable ItemStack item); + default void clear(@Nonnull SlotGroup group) { + setAll(group, null); + } + @ParametersAreNonnullByDefault @Nullable ItemStack addItem(SlotGroup group, ItemStack item); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java index c750a0b9..2ace5f7c 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java @@ -29,6 +29,10 @@ public SlotGroupBuilder(char identifier, String name) { this.name = name; } + public @Nonnull String name() { + return name; + } + public @Nonnull SlotGroupBuilder interactable(boolean interactable) { this.interactable = interactable; return this; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutParser.java similarity index 82% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java rename to dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutParser.java index 0e72561b..96d0fdac 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/MenuLayoutParser.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutParser.java @@ -7,6 +7,7 @@ import java.nio.charset.StandardCharsets; import java.util.Map; import java.util.Set; +import java.util.function.Consumer; import java.util.stream.Collectors; import javax.annotation.Nonnull; @@ -25,36 +26,46 @@ import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; -public class MenuLayoutParser { +public class LayoutParser { - private MenuLayoutParser() {} + private LayoutParser() {} @ParametersAreNonnullByDefault - public static @Nonnull MenuLayout parseStream(InputStream stream) throws InvalidLayoutException { + public static @Nonnull MenuLayout parseStream(InputStream stream, Consumer slotGroups) throws InvalidLayoutException { Validate.notNull(stream, "InputStream must not be null"); try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8))) { - return parseString(reader.lines().collect(Collectors.joining(""))); + return parseString(reader.lines().collect(Collectors.joining("")), slotGroups); } catch (IOException x) { throw new InvalidLayoutException(x); } } @ParametersAreNonnullByDefault - public static @Nonnull MenuLayout parseString(String string) throws InvalidLayoutException { + public static @Nonnull MenuLayout parseStream(InputStream stream) throws InvalidLayoutException { + return parseStream(stream, builder -> {}); + } + + @ParametersAreNonnullByDefault + public static @Nonnull MenuLayout parseString(String string, Consumer slotGroups) throws InvalidLayoutException { Validate.notNull(string, "String must not be null"); try { JsonParser parser = new JsonParser(); JsonObject root = parser.parse(string).getAsJsonObject(); - return parseJson(root); + return parseJson(root, slotGroups); } catch (IllegalStateException | JsonParseException x) { throw new InvalidLayoutException(x); } } @ParametersAreNonnullByDefault - public static @Nonnull MenuLayout parseJson(JsonObject json) throws InvalidLayoutException { + public static @Nonnull MenuLayout parseString(String string) throws InvalidLayoutException { + return parseString(string, builder -> {}); + } + + @ParametersAreNonnullByDefault + public static @Nonnull MenuLayout parseJson(JsonObject json, Consumer slotGroups) throws InvalidLayoutException { Validate.notNull(json, "JsonObject must not be null"); try { @@ -62,7 +73,7 @@ private MenuLayoutParser() {} MenuLayoutBuilder builder = new MenuLayoutBuilder(shape.getSize()); for (Map.Entry> entry : shape.getGroups().entrySet()) { - builder.addSlotGroup(parseGroup(json, entry.getKey(), entry.getValue())); + builder.addSlotGroup(parseGroup(json, entry.getKey(), entry.getValue(), slotGroups)); } return builder.build(); @@ -71,6 +82,11 @@ private MenuLayoutParser() {} } } + @ParametersAreNonnullByDefault + public static @Nonnull MenuLayout parseJson(JsonObject json) throws InvalidLayoutException { + return parseJson(json, builder -> {}); + } + @ParametersAreNonnullByDefault private static @Nonnull LayoutShape parseShape(JsonObject json) throws InvalidLayoutException { String attribute = "layout"; @@ -100,7 +116,7 @@ private MenuLayoutParser() {} } @ParametersAreNonnullByDefault - private static @Nonnull SlotGroup parseGroup(JsonObject json, char identifier, Set slots) throws InvalidLayoutException { + private static @Nonnull SlotGroup parseGroup(JsonObject json, char identifier, Set slots, Consumer consumer) throws InvalidLayoutException { String attribute = "groups"; if (!json.has(attribute) || !json.get(attribute).isJsonObject()) { @@ -132,6 +148,7 @@ private MenuLayoutParser() {} } builder.withSlots(slots.stream().mapToInt(Integer::intValue).toArray()); + consumer.accept(builder); return builder.build(); } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java index 112ee56c..63bb6edf 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java @@ -10,9 +10,9 @@ import be.seeseemelk.mockbukkit.MockBukkit; -class MockMenuFactory extends MenuFactory { +public class MockMenuFactory extends MenuFactory { - MockMenuFactory() { + public MockMenuFactory() { // @formatter:off super(MockBukkit.loadWith(MockJavaPlugin.class, new PluginDescriptionFile( "MockPlugin", diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java index ca8c17a6..9054e2bc 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java @@ -61,7 +61,7 @@ void testNonExistingFile() { @Test void testMalformedJson() { - assertThrows(InvalidLayoutException.class, () -> MenuLayoutParser.parseString("{ Is this \"\" how ] you json...?: false,")); + assertThrows(InvalidLayoutException.class, () -> LayoutParser.parseString("{ Is this \"\" how ] you json...?: false,")); } @Test @@ -130,7 +130,7 @@ private void assertInvalid(@Nonnull String name) { private @Nonnull MenuLayout parse(@Nonnull String name) throws InvalidLayoutException { InputStream inputStream = getClass().getResourceAsStream("/" + name + ".json"); - return MenuLayoutParser.parseStream(inputStream); + return LayoutParser.parseStream(inputStream); } } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java new file mode 100644 index 00000000..8ac396a6 --- /dev/null +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java @@ -0,0 +1,111 @@ +package io.github.thebusybiscuit.dough.inventory.json; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.InputStream; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; +import org.bukkit.event.inventory.InventoryAction; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType.SlotType; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.thebusybiscuit.dough.inventory.factory.MenuFactory; +import io.github.thebusybiscuit.dough.inventory.factory.MockMenuFactory; + +import be.seeseemelk.mockbukkit.MockBukkit; +import be.seeseemelk.mockbukkit.ServerMock; + +class TestSlotGroupInjection { + + private static ServerMock server; + private static MenuFactory factory; + + @BeforeAll + static void setup() { + server = MockBukkit.mock(); + factory = new MockMenuFactory(); + } + + @AfterAll + static void teardown() { + MockBukkit.unmock(); + } + + @Test + void testClickEvent() throws InvalidLayoutException { + AtomicInteger clicks = new AtomicInteger(); + + MenuLayout layout = parse("valid3", builder -> { + if (!builder.name().equals("background")) { + builder.onClick(payload -> clicks.incrementAndGet()); + } + }); + + Menu menu = factory.createMenu(layout); + Player player = server.addPlayer(); + InventoryView view = menu.open(player); + + simulateClick(player, view, 1); + simulateClick(player, view, 11); + + // Only slot 11 should have triggered this + assertEquals(1, clicks.get()); + } + + @Test + void testItemInjection() throws InvalidLayoutException { + MenuLayout layout = parse("valid3", builder -> { + if (builder.name().equals("background")) { + builder.withDefaultItem(new ItemStack(Material.GRAY_STAINED_GLASS_PANE)); + } + }); + + Menu menu = factory.createMenu(layout); + Player player = server.addPlayer(); + InventoryView view = menu.open(player); + + InventoryClickEvent clickEvent = simulateClick(player, view, 1); + + assertEquals(new ItemStack(Material.GRAY_STAINED_GLASS_PANE), menu.getItem(clickEvent.getSlot())); + assertTrue(clickEvent.isCancelled()); + + InventoryClickEvent clickEvent2 = simulateClick(player, view, 11); + + assertEquals(null, menu.getItem(clickEvent2.getSlot())); + assertFalse(clickEvent2.isCancelled()); + } + + @ParametersAreNonnullByDefault + private @Nonnull InventoryClickEvent simulateClick(Player player, InventoryView view, int slot) { + InventoryClickEvent event = new InventoryClickEvent(view, SlotType.CONTAINER, slot, ClickType.LEFT, InventoryAction.PICKUP_ONE); + + Bukkit.getPluginManager().callEvent(event); + player.closeInventory(); + return event; + } + + @ParametersAreNonnullByDefault + private @Nonnull MenuLayout parse(String name, Consumer consumer) throws InvalidLayoutException { + InputStream inputStream = getClass().getResourceAsStream("/" + name + ".json"); + return LayoutParser.parseStream(inputStream, consumer); + } + +} diff --git a/dough-inventories/src/test/resources/valid3.json b/dough-inventories/src/test/resources/valid3.json new file mode 100644 index 00000000..4674484a --- /dev/null +++ b/dough-inventories/src/test/resources/valid3.json @@ -0,0 +1,21 @@ +{ + "layout" : [ + "*********", + "++++*----", + "*********" + ], + "groups" : { + "*" : { + "name" : "background", + "interactable" : false + }, + "+" : { + "name" : "input", + "interactable" : true + }, + "-" : { + "name" : "output", + "interactable" : true + } + } +} From 6c1dbbafb722dfaa856e665d205f5abe411b8564 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 13:04:18 +0200 Subject: [PATCH 16/24] Fixed NullPointerException --- .../dough/inventory/factory/MenuListener.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java index 1eefa2ad..111a2c1d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java @@ -14,6 +14,7 @@ import io.github.thebusybiscuit.dough.inventory.Menu; import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; import io.github.thebusybiscuit.dough.inventory.payloads.MenuEventPayloads; /** @@ -76,12 +77,17 @@ public void onClick(InventoryClickEvent e) { if (inv.getFactory().equals(factory) && e.getRawSlot() < e.getInventory().getSize()) { SlotGroup slotGroup = inv.getLayout().getGroup(e.getSlot()); + // Cancel the interaction if that slot is not interactable if (!slotGroup.isInteractable()) { e.setCancelled(true); } // Fire the click handler - slotGroup.getClickHandler().onClick(MenuEventPayloads.create(inv, e)); + MenuClickHandler clickHandler = slotGroup.getClickHandler(); + + if (clickHandler != null) { + clickHandler.onClick(MenuEventPayloads.create(inv, e)); + } } } catch (Exception | LinkageError x) { factory.getLogger().log(Level.SEVERE, x, () -> "Could not pass click event for " + inv + " (slot: " + e.getSlot() + ", player:" + e.getWhoClicked().getName() + ")"); From cd4c6f93a900af95426a082c5c4d1ada257ffe34 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 13:17:51 +0200 Subject: [PATCH 17/24] Added some documentation --- .../dough/inventory/MenuLayout.java | 6 +++ .../dough/inventory/SlotGroupIterator.java | 13 ++++++ .../dough/inventory/factory/MenuFactory.java | 32 ++++++++++++- .../payloads/AbstractMenuPayload.java | 45 ++++++++++++++++--- .../inventory/payloads/MenuClickPayload.java | 12 ++--- .../inventory/factory/TestMenuClicking.java | 4 +- 6 files changed, 94 insertions(+), 18 deletions(-) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java index 12652063..e1080147 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java @@ -19,6 +19,12 @@ public interface MenuLayout { */ int getSize(); + /** + * This returns the title to be set for the resulting {@link Menu}. + * If no title was set, this will return null. + * + * @return The title or null + */ @Nullable String getTitle(); diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java index f063d21e..23f0e97d 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java @@ -5,11 +5,24 @@ import javax.annotation.Nonnull; +/** + * This {@link Iterator} implementation iterates through all slots within a {@link SlotGroup}. + * + * @author TheBusyBiscuit + * + */ class SlotGroupIterator implements Iterator { private final int[] slots; private int index = 0; + /** + * This creates a new {@link SlotGroupIterator} for the given + * {@link SlotGroup}. + * + * @param slotGroup + * The {@link SlotGroup} + */ SlotGroupIterator(@Nonnull SlotGroup slotGroup) { this.slots = slotGroup.getSlots(); } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java index 4b8cf864..615f4f26 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java @@ -9,6 +9,9 @@ import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; +import org.bukkit.Server; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.Inventory; import org.bukkit.plugin.Plugin; @@ -16,18 +19,43 @@ import io.github.thebusybiscuit.dough.inventory.MenuLayout; import io.github.thebusybiscuit.dough.inventory.SlotGroup; +/** + * The {@link MenuFactory} is the core of this system, this is where everything + * starts. You can use this {@link MenuFactory} to create {@link Menu}s from a + * {@link MenuLayout}. + *

+ * This class also handles the registration of our {@link Listener}. + * + * @author TheBusyBiscuit + * + */ public class MenuFactory { + /** + * Our {@link Plugin} instance. + */ private final Plugin plugin; + /** + * This constructs a new {@link MenuFactory} for the given {@link Plugin}. + * + * @param plugin + * The {@link Plugin} instance + */ public MenuFactory(@Nonnull Plugin plugin) { Validate.notNull(plugin, "The plugin instance cannot be null."); this.plugin = plugin; - registerListener(plugin); + registerListener(); } - private @Nonnull MenuListener registerListener(@Nonnull Plugin plugin) { + /** + * This method registers our {@link MenuListener} to the {@link Server}. + * This way, we can listen to and handle {@link InventoryClickEvent}s and alike. + * + * @return Our registered {@link MenuListener} + */ + private @Nonnull MenuListener registerListener() { MenuListener listener = new MenuListener(this); plugin.getServer().getPluginManager().registerEvents(listener, plugin); return listener; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java index d18d782a..d232cc58 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java @@ -1,19 +1,54 @@ package io.github.thebusybiscuit.dough.inventory.payloads; import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.entity.Player; import io.github.thebusybiscuit.dough.inventory.Menu; +/** + * An abstract super class for our menu event payloads. + * + * @author TheBusyBiscuit + * + */ abstract class AbstractMenuPayload { - private final Menu inventory; + private final Menu menu; + private final Player player; + + /** + * This constructs a new {@link AbstractMenuPayload} for the given {@link Menu} + * and {@link Player}. + * + * @param menu + * The {@link Menu} + * @param player + * The {@link Player} + */ + @ParametersAreNonnullByDefault + AbstractMenuPayload(Menu menu, Player player) { + this.menu = menu; + this.player = player; + } - AbstractMenuPayload(@Nonnull Menu inventory) { - this.inventory = inventory; + /** + * This returns the {@link Menu} from this payload. + * + * @return The {@link Menu} + */ + public @Nonnull Menu getMenu() { + return menu; } - public @Nonnull Menu getInventory() { - return inventory; + /** + * This returns the {@link Player} who triggered this payload. + * + * @return The {@link Player} + */ + public @Nonnull Player getPlayer() { + return player; } } diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java index 2211996e..574cbc53 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java +++ b/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java @@ -11,31 +11,25 @@ public class MenuClickPayload extends AbstractMenuPayload { - private final Player player; private final int slot; @ParametersAreNonnullByDefault MenuClickPayload(Menu inventory, Player player, int slot) { - super(inventory); + super(inventory, player); - this.player = player; this.slot = slot; } - public @Nonnull Player getPlayer() { - return player; - } - public int getClickedSlot() { return slot; } public @Nonnull ItemStack getClickedItemStack() { - return getInventory().getItem(getClickedSlot()); + return getMenu().getItem(getClickedSlot()); } public @Nonnull SlotGroup getClickedSlotGroup() { - return getInventory().getLayout().getGroup(getClickedSlot()); + return getMenu().getLayout().getGroup(getClickedSlot()); } } diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java index 514ce156..36a36856 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java @@ -98,7 +98,7 @@ void testClickItemInSlot(boolean interactable) { MenuClickPayload payload = payloadRef.get(); assertNotNull(payload); - assertSame(inv, payload.getInventory()); + assertSame(inv, payload.getMenu()); assertSame(player, payload.getPlayer()); assertEquals(slot, payload.getClickedSlot()); @@ -183,7 +183,7 @@ void testMultipleFactories() { .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) .interactable(true) .onClick(payload -> { - MenuFactory factory = payload.getInventory().getFactory(); + MenuFactory factory = payload.getMenu().getFactory(); eventsFired.merge(factory, 1, Integer::sum); }) .build() From 48158d06157c6220f69888b777edca4ddb188d50 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 14:24:48 +0200 Subject: [PATCH 18/24] Updated package names --- .../dough/inventory/Menu.java | 4 ++-- .../dough/inventory/MenuLayout.java | 2 +- .../dough/inventory/SlotGroup.java | 4 ++-- .../dough/inventory/SlotGroupIterator.java | 2 +- .../inventory/builders/MenuLayoutBuilder.java | 6 +++--- .../dough/inventory/builders/MenuLayoutImpl.java | 6 +++--- .../dough/inventory/builders/SlotGroupBuilder.java | 6 +++--- .../dough/inventory/builders/SlotGroupImpl.java | 6 +++--- .../dough/inventory/factory/CustomMenu.java | 8 ++++---- .../dough/inventory/factory/MenuFactory.java | 8 ++++---- .../dough/inventory/factory/MenuListener.java | 10 +++++----- .../dough/inventory/handlers/MenuClickHandler.java | 4 ++-- .../inventory/json/InvalidLayoutException.java | 4 ++-- .../dough/inventory/json/LayoutParser.java | 10 +++++----- .../dough/inventory/json/LayoutShape.java | 2 +- .../inventory/payloads/AbstractMenuPayload.java | 4 ++-- .../dough/inventory/payloads/MenuClickPayload.java | 6 +++--- .../inventory/payloads/MenuEventPayloads.java | 4 ++-- .../dough/inventory/TestSlotGroupIterator.java | 5 +++-- .../inventory/builders/TestLayoutBuilder.java | 8 +++++--- .../inventory/factory/MockExceptionHandler.java | 2 +- .../dough/inventory/factory/MockMenuFactory.java | 4 +++- .../dough/inventory/factory/TestMenuClicking.java | 14 ++++++++------ .../dough/inventory/factory/TestMenuClosing.java | 11 ++++++----- .../dough/inventory/factory/TestMenuCreation.java | 14 ++++++++------ .../dough/inventory/json/TestJsonParsing.java | 8 +++++--- .../inventory/json/TestSlotGroupInjection.java | 14 ++++++++------ 27 files changed, 95 insertions(+), 81 deletions(-) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/Menu.java (94%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/MenuLayout.java (93%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/SlotGroup.java (94%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/SlotGroupIterator.java (95%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/builders/MenuLayoutBuilder.java (86%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/builders/MenuLayoutImpl.java (95%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/builders/SlotGroupBuilder.java (90%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/builders/SlotGroupImpl.java (88%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/CustomMenu.java (94%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/MenuFactory.java (93%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/MenuListener.java (90%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/handlers/MenuClickHandler.java (51%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/json/InvalidLayoutException.java (82%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/json/LayoutParser.java (94%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/json/LayoutShape.java (96%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/payloads/AbstractMenuPayload.java (90%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/payloads/MenuClickPayload.java (80%) rename dough-inventories/src/main/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/payloads/MenuEventPayloads.java (84%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/TestSlotGroupIterator.java (84%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/builders/TestLayoutBuilder.java (95%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/MockExceptionHandler.java (92%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/MockMenuFactory.java (88%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/TestMenuClicking.java (94%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/TestMenuClosing.java (80%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/factory/TestMenuCreation.java (92%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/json/TestJsonParsing.java (92%) rename dough-inventories/src/test/java/io/github/{thebusybiscuit => bakedlibs}/dough/inventory/json/TestSlotGroupInjection.java (87%) diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/Menu.java similarity index 94% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/Menu.java index 74b3a3b3..ef1ac001 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/Menu.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/Menu.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.bakedlibs.dough.inventory; import java.util.Iterator; @@ -14,7 +14,7 @@ import org.bukkit.inventory.InventoryView; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.factory.MenuFactory; +import io.github.bakedlibs.dough.inventory.factory.MenuFactory; public interface Menu extends InventoryHolder { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java similarity index 93% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java index e1080147..7cf4e182 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/MenuLayout.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.bakedlibs.dough.inventory; import java.util.Set; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java similarity index 94% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java index 9179cbf6..28be6197 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.bakedlibs.dough.inventory; import java.util.Iterator; @@ -9,7 +9,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; +import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; /** * A {@link SlotGroup} groups slots together and divides an {@link Inventory} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroupIterator.java similarity index 95% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroupIterator.java index 23f0e97d..34f71574 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/SlotGroupIterator.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroupIterator.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.bakedlibs.dough.inventory; import java.util.Iterator; import java.util.NoSuchElementException; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutBuilder.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java similarity index 86% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutBuilder.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java index 2b558fbb..24809e2e 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.builders; +package io.github.bakedlibs.dough.inventory.builders; import java.util.HashSet; import java.util.Set; @@ -9,8 +9,8 @@ import org.apache.commons.lang.Validate; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; public class MenuLayoutBuilder { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java similarity index 95% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java index 090e279b..2fa3d088 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/MenuLayoutImpl.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.builders; +package io.github.bakedlibs.dough.inventory.builders; import java.util.Collections; import java.util.HashSet; @@ -11,8 +11,8 @@ import org.apache.commons.lang.Validate; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; class MenuLayoutImpl implements MenuLayout { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java similarity index 90% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java index 2ace5f7c..2bae7186 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.builders; +package io.github.bakedlibs.dough.inventory.builders; import java.util.HashSet; import java.util.Set; @@ -10,8 +10,8 @@ import org.apache.commons.lang.Validate; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; public class SlotGroupBuilder { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java similarity index 88% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java index e304db55..ebc2afd8 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/builders/SlotGroupImpl.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.builders; +package io.github.bakedlibs.dough.inventory.builders; import java.util.Set; @@ -7,8 +7,8 @@ import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; class SlotGroupImpl implements SlotGroup { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java similarity index 94% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java index 9457d29d..7c245ee5 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/CustomMenu.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -8,9 +8,9 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; public class CustomMenu implements Menu { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuFactory.java similarity index 93% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuFactory.java index 615f4f26..cef5f4d9 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuFactory.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuFactory.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import java.util.function.BiFunction; import java.util.logging.Logger; @@ -15,9 +15,9 @@ import org.bukkit.inventory.Inventory; import org.bukkit.plugin.Plugin; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; /** * The {@link MenuFactory} is the core of this system, this is where everything diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java similarity index 90% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java index 111a2c1d..edc041eb 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/factory/MenuListener.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import java.util.logging.Level; @@ -12,10 +12,10 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.handlers.MenuClickHandler; -import io.github.thebusybiscuit.dough.inventory.payloads.MenuEventPayloads; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; +import io.github.bakedlibs.dough.inventory.payloads.MenuEventPayloads; /** * The {@link MenuListener} is responsible for handling any diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/handlers/MenuClickHandler.java similarity index 51% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/handlers/MenuClickHandler.java index 2545052f..2c2e785c 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/handlers/MenuClickHandler.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/handlers/MenuClickHandler.java @@ -1,8 +1,8 @@ -package io.github.thebusybiscuit.dough.inventory.handlers; +package io.github.bakedlibs.dough.inventory.handlers; import javax.annotation.Nonnull; -import io.github.thebusybiscuit.dough.inventory.payloads.MenuClickPayload; +import io.github.bakedlibs.dough.inventory.payloads.MenuClickPayload; @FunctionalInterface public interface MenuClickHandler { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/InvalidLayoutException.java similarity index 82% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/InvalidLayoutException.java index a9164690..5c52e750 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/InvalidLayoutException.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/InvalidLayoutException.java @@ -1,10 +1,10 @@ -package io.github.thebusybiscuit.dough.inventory.json; +package io.github.bakedlibs.dough.inventory.json; import javax.annotation.Nonnull; import com.google.gson.JsonObject; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.MenuLayout; /** * An {@link InvalidLayoutException} is thrown when the {@link MenuLayout} diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutParser.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java similarity index 94% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutParser.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java index 96d0fdac..a6558053 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutParser.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.json; +package io.github.bakedlibs.dough.inventory.json; import java.io.BufferedReader; import java.io.IOException; @@ -21,10 +21,10 @@ import com.google.gson.JsonParseException; import com.google.gson.JsonParser; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; public class LayoutParser { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java similarity index 96% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java index 5661a5f1..b3d952b1 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/json/LayoutShape.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.json; +package io.github.bakedlibs.dough.inventory.json; import java.util.HashMap; import java.util.HashSet; diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/AbstractMenuPayload.java similarity index 90% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/AbstractMenuPayload.java index d232cc58..3154d2d3 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/AbstractMenuPayload.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/AbstractMenuPayload.java @@ -1,11 +1,11 @@ -package io.github.thebusybiscuit.dough.inventory.payloads; +package io.github.bakedlibs.dough.inventory.payloads; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; import org.bukkit.entity.Player; -import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.Menu; /** * An abstract super class for our menu event payloads. diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuClickPayload.java similarity index 80% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuClickPayload.java index 574cbc53..a437eda0 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuClickPayload.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuClickPayload.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.payloads; +package io.github.bakedlibs.dough.inventory.payloads; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; @@ -6,8 +6,8 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.SlotGroup; public class MenuClickPayload extends AbstractMenuPayload { diff --git a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuEventPayloads.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java similarity index 84% rename from dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuEventPayloads.java rename to dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java index eb1ffe33..36b0c0e6 100644 --- a/dough-inventories/src/main/java/io/github/thebusybiscuit/dough/inventory/payloads/MenuEventPayloads.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.payloads; +package io.github.bakedlibs.dough.inventory.payloads; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; @@ -6,7 +6,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; -import io.github.thebusybiscuit.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.Menu; /** * Utility class for constructing an event payload for menu handlers. diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java similarity index 84% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java index 3522e9c4..bcd45b84 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/TestSlotGroupIterator.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory; +package io.github.bakedlibs.dough.inventory; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -8,7 +8,8 @@ import org.junit.jupiter.api.Test; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; class TestSlotGroupIterator { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/builders/TestLayoutBuilder.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java similarity index 95% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/builders/TestLayoutBuilder.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java index ebb299f5..e41918ad 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/builders/TestLayoutBuilder.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.builders; +package io.github.bakedlibs.dough.inventory.builders; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -26,8 +26,10 @@ import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; import be.seeseemelk.mockbukkit.MockBukkit; diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockExceptionHandler.java similarity index 92% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockExceptionHandler.java index 7b21b3c6..015de120 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockExceptionHandler.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockExceptionHandler.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import java.util.concurrent.atomic.AtomicReference; import java.util.logging.Handler; diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java similarity index 88% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java index 63bb6edf..f5d9249a 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/MockMenuFactory.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import java.io.File; @@ -8,6 +8,8 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; +import io.github.bakedlibs.dough.inventory.factory.MenuFactory; + import be.seeseemelk.mockbukkit.MockBukkit; public class MockMenuFactory extends MenuFactory { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java similarity index 94% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java index 36a36856..87db48d5 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotEquals; @@ -35,11 +35,13 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; -import io.github.thebusybiscuit.dough.inventory.payloads.MenuClickPayload; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.factory.MenuFactory; +import io.github.bakedlibs.dough.inventory.factory.MenuListener; +import io.github.bakedlibs.dough.inventory.payloads.MenuClickPayload; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java similarity index 80% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java index c4fee5c2..3234e9ec 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuClosing.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; @@ -9,10 +9,11 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.factory.MenuFactory; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java similarity index 92% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java index 1ef173a9..b44f64e5 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/factory/TestMenuCreation.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.factory; +package io.github.bakedlibs.dough.inventory.factory; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; @@ -18,11 +18,13 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; -import io.github.thebusybiscuit.dough.inventory.builders.MenuLayoutBuilder; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.factory.CustomMenu; +import io.github.bakedlibs.dough.inventory.factory.MenuFactory; import be.seeseemelk.mockbukkit.MockBukkit; diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java similarity index 92% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java index 9054e2bc..6a317d7b 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestJsonParsing.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.json; +package io.github.bakedlibs.dough.inventory.json; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -12,8 +12,10 @@ import org.junit.jupiter.api.Test; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.SlotGroup; +import io.github.bakedlibs.dough.inventory.json.InvalidLayoutException; +import io.github.bakedlibs.dough.inventory.json.LayoutParser; class TestJsonParsing { diff --git a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java similarity index 87% rename from dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java rename to dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java index 8ac396a6..efb17e6a 100644 --- a/dough-inventories/src/test/java/io/github/thebusybiscuit/dough/inventory/json/TestSlotGroupInjection.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java @@ -1,4 +1,4 @@ -package io.github.thebusybiscuit.dough.inventory.json; +package io.github.bakedlibs.dough.inventory.json; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; @@ -24,11 +24,13 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import io.github.thebusybiscuit.dough.inventory.Menu; -import io.github.thebusybiscuit.dough.inventory.MenuLayout; -import io.github.thebusybiscuit.dough.inventory.builders.SlotGroupBuilder; -import io.github.thebusybiscuit.dough.inventory.factory.MenuFactory; -import io.github.thebusybiscuit.dough.inventory.factory.MockMenuFactory; +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.MenuLayout; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; +import io.github.bakedlibs.dough.inventory.factory.MenuFactory; +import io.github.bakedlibs.dough.inventory.factory.MockMenuFactory; +import io.github.bakedlibs.dough.inventory.json.InvalidLayoutException; +import io.github.bakedlibs.dough.inventory.json.LayoutParser; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; From b530e018c1f77a10a47f1f660fc629ff979ef029 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 15:07:06 +0200 Subject: [PATCH 19/24] Removed redundant imports --- .../github/bakedlibs/dough/inventory/TestSlotGroupIterator.java | 1 - .../bakedlibs/dough/inventory/builders/TestLayoutBuilder.java | 2 -- .../bakedlibs/dough/inventory/factory/MockMenuFactory.java | 2 -- .../bakedlibs/dough/inventory/factory/TestMenuClicking.java | 2 -- .../bakedlibs/dough/inventory/factory/TestMenuClosing.java | 1 - .../bakedlibs/dough/inventory/factory/TestMenuCreation.java | 2 -- .../github/bakedlibs/dough/inventory/json/TestJsonParsing.java | 2 -- .../bakedlibs/dough/inventory/json/TestSlotGroupInjection.java | 2 -- 8 files changed, 14 deletions(-) diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java index bcd45b84..25818c33 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/TestSlotGroupIterator.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.Test; -import io.github.bakedlibs.dough.inventory.SlotGroup; import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; class TestSlotGroupIterator { diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java index e41918ad..16ce9132 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java @@ -28,8 +28,6 @@ import io.github.bakedlibs.dough.inventory.MenuLayout; import io.github.bakedlibs.dough.inventory.SlotGroup; -import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; -import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; import be.seeseemelk.mockbukkit.MockBukkit; diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java index f5d9249a..40672990 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java @@ -8,8 +8,6 @@ import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPluginLoader; -import io.github.bakedlibs.dough.inventory.factory.MenuFactory; - import be.seeseemelk.mockbukkit.MockBukkit; public class MockMenuFactory extends MenuFactory { diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java index 87db48d5..c0d47fda 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java @@ -39,8 +39,6 @@ import io.github.bakedlibs.dough.inventory.MenuLayout; import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; -import io.github.bakedlibs.dough.inventory.factory.MenuFactory; -import io.github.bakedlibs.dough.inventory.factory.MenuListener; import io.github.bakedlibs.dough.inventory.payloads.MenuClickPayload; import be.seeseemelk.mockbukkit.MockBukkit; diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java index 3234e9ec..1881198a 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java @@ -13,7 +13,6 @@ import io.github.bakedlibs.dough.inventory.MenuLayout; import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; -import io.github.bakedlibs.dough.inventory.factory.MenuFactory; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java index b44f64e5..f86869c7 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java @@ -23,8 +23,6 @@ import io.github.bakedlibs.dough.inventory.SlotGroup; import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; -import io.github.bakedlibs.dough.inventory.factory.CustomMenu; -import io.github.bakedlibs.dough.inventory.factory.MenuFactory; import be.seeseemelk.mockbukkit.MockBukkit; diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java index 6a317d7b..571b7d6e 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestJsonParsing.java @@ -14,8 +14,6 @@ import io.github.bakedlibs.dough.inventory.MenuLayout; import io.github.bakedlibs.dough.inventory.SlotGroup; -import io.github.bakedlibs.dough.inventory.json.InvalidLayoutException; -import io.github.bakedlibs.dough.inventory.json.LayoutParser; class TestJsonParsing { diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java index efb17e6a..933c85ff 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/json/TestSlotGroupInjection.java @@ -29,8 +29,6 @@ import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; import io.github.bakedlibs.dough.inventory.factory.MenuFactory; import io.github.bakedlibs.dough.inventory.factory.MockMenuFactory; -import io.github.bakedlibs.dough.inventory.json.InvalidLayoutException; -import io.github.bakedlibs.dough.inventory.json.LayoutParser; import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; From a5a4b1d318058b2cc8934bc81e1919f5954438a7 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 15:14:35 +0200 Subject: [PATCH 20/24] Small optimization --- .../bakedlibs/dough/inventory/factory/CustomMenu.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java index 7c245ee5..745cb6df 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/CustomMenu.java @@ -75,8 +75,13 @@ public String getTitle() { public void setAll(SlotGroup group, ItemStack item) { validate(); - for (int slot : group) { - setItem(slot, item); + if (group.size() == 1) { + // Little optimization, we don't need to create an Iterator for this + setItem(group.getSlots()[0], item); + } else { + for (int slot : group) { + setItem(slot, item); + } } } From 73177c508c18860ccda3177baacbd3128d75d0b5 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Wed, 14 Jul 2021 19:57:01 +0200 Subject: [PATCH 21/24] Bump version --- dough-api/pom.xml | 2 +- dough-chat/pom.xml | 2 +- dough-common/pom.xml | 2 +- dough-config/pom.xml | 2 +- dough-data/pom.xml | 2 +- dough-inventories/pom.xml | 2 +- dough-items/pom.xml | 2 +- dough-protection/pom.xml | 2 +- dough-recipes/pom.xml | 2 +- dough-reflection/pom.xml | 2 +- dough-scheduling/pom.xml | 2 +- dough-skins/pom.xml | 2 +- dough-tags/pom.xml | 2 +- dough-updater/pom.xml | 2 +- pom.xml | 2 +- 15 files changed, 15 insertions(+), 15 deletions(-) diff --git a/dough-api/pom.xml b/dough-api/pom.xml index 0b7850b4..458d197e 100644 --- a/dough-api/pom.xml +++ b/dough-api/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-api diff --git a/dough-chat/pom.xml b/dough-chat/pom.xml index d76899bf..c8f68772 100644 --- a/dough-chat/pom.xml +++ b/dough-chat/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-chat diff --git a/dough-common/pom.xml b/dough-common/pom.xml index 2d9190ec..685ccc94 100644 --- a/dough-common/pom.xml +++ b/dough-common/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-common diff --git a/dough-config/pom.xml b/dough-config/pom.xml index 38cfb057..5c953732 100644 --- a/dough-config/pom.xml +++ b/dough-config/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-config diff --git a/dough-data/pom.xml b/dough-data/pom.xml index e79647c9..a17aee45 100644 --- a/dough-data/pom.xml +++ b/dough-data/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-data diff --git a/dough-inventories/pom.xml b/dough-inventories/pom.xml index ae1180fd..a2b9cefc 100644 --- a/dough-inventories/pom.xml +++ b/dough-inventories/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-inventories diff --git a/dough-items/pom.xml b/dough-items/pom.xml index e4600032..16aec8e8 100644 --- a/dough-items/pom.xml +++ b/dough-items/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-items diff --git a/dough-protection/pom.xml b/dough-protection/pom.xml index 3c6893cd..47fe2dd9 100644 --- a/dough-protection/pom.xml +++ b/dough-protection/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-protection diff --git a/dough-recipes/pom.xml b/dough-recipes/pom.xml index d52b6f78..ff36589a 100644 --- a/dough-recipes/pom.xml +++ b/dough-recipes/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-recipes diff --git a/dough-reflection/pom.xml b/dough-reflection/pom.xml index 4fd5379c..1332f2b0 100644 --- a/dough-reflection/pom.xml +++ b/dough-reflection/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-reflection diff --git a/dough-scheduling/pom.xml b/dough-scheduling/pom.xml index f9b6def5..ccc1c980 100644 --- a/dough-scheduling/pom.xml +++ b/dough-scheduling/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-scheduling diff --git a/dough-skins/pom.xml b/dough-skins/pom.xml index 60fa4de4..6ee60ae4 100644 --- a/dough-skins/pom.xml +++ b/dough-skins/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-skins diff --git a/dough-tags/pom.xml b/dough-tags/pom.xml index c26d9260..87bff56a 100644 --- a/dough-tags/pom.xml +++ b/dough-tags/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-tags diff --git a/dough-updater/pom.xml b/dough-updater/pom.xml index 4f2af3a0..1c9badf8 100644 --- a/dough-updater/pom.xml +++ b/dough-updater/pom.xml @@ -7,7 +7,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 dough-updater diff --git a/pom.xml b/pom.xml index 9cd4afe1..6c26d0f7 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ io.github.baked-libs dough - 1.0.0 + 1.1.0 pom From 1b6fbd4010405cff3449babf3e0f7a306330e0d0 Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 15 Jul 2021 12:28:41 +0200 Subject: [PATCH 22/24] Added `SlotGroupBuilder#withSlotRange` and more documentation --- .../bakedlibs/dough/inventory/InvUtils.java | 1 + .../bakedlibs/dough/inventory/MenuLayout.java | 52 +++++++++++ .../bakedlibs/dough/inventory/SlotGroup.java | 17 +++- .../inventory/builders/SlotGroupBuilder.java | 93 +++++++++++++++++++ .../inventory/builders/TestLayoutBuilder.java | 12 +-- .../inventory/factory/TestMenuClicking.java | 12 +-- .../inventory/factory/TestMenuClosing.java | 2 +- .../inventory/factory/TestMenuCreation.java | 14 ++- 8 files changed, 180 insertions(+), 23 deletions(-) diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/InvUtils.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/InvUtils.java index f055742d..1099c8c6 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/InvUtils.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/InvUtils.java @@ -202,6 +202,7 @@ public static boolean fitAll(@Nonnull Inventory inv, @Nonnull ItemStack[] items, * Whether to replace consumables, e.g. turn potions into glass bottles etc... * @param predicate * The Predicate that tests the item + * * @return Whether the operation was successful */ public static boolean removeItem(@Nonnull Inventory inv, int amount, boolean replaceConsumables, @Nonnull Predicate predicate) { diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java index 7cf4e182..7082f379 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/MenuLayout.java @@ -7,8 +7,27 @@ import org.bukkit.inventory.Inventory; +import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; + +/** + * The {@link MenuLayout} covers the different {@link SlotGroup}s and basic characteristics + * of a {@link Menu}. + * + * @author TheBusyBiscuit + * + * @see Menu + * @see SlotGroup + * @see MenuLayoutBuilder + * + */ public interface MenuLayout { + /** + * This returns all defined {@link SlotGroup}s for this + * {@link MenuLayout}. + * + * @return A {@link Set} containing every {@link SlotGroup} + */ @Nonnull Set getSlotGroups(); @@ -28,12 +47,45 @@ public interface MenuLayout { @Nullable String getTitle(); + /** + * This returns the {@link SlotGroup} with the given identifier. + *

+ * If no corresponding {@link SlotGroup} was found, it will throw an + * {@link IllegalArgumentException}. + * + * @param identifier + * The unique identifier for this {@link SlotGroup}. + * + * @return The corresponding {@link SlotGroup} + */ @Nonnull SlotGroup getGroup(char identifier); + /** + * This returns the {@link SlotGroup} present at the given slot. + *

+ * If no corresponding {@link SlotGroup} was found, it will throw an + * {@link IllegalArgumentException}. + * + * @param slot + * The slot + * + * @return The corresponding {@link SlotGroup} + */ @Nonnull SlotGroup getGroup(int slot); + /** + * This returns the {@link SlotGroup} with the given name. + *

+ * If no corresponding {@link SlotGroup} was found, it will throw an + * {@link IllegalArgumentException}. + * + * @param name + * The unique name of this {@link SlotGroup}. + * + * @return The corresponding {@link SlotGroup} + */ @Nonnull SlotGroup getGroup(@Nonnull String name); diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java index 28be6197..a87ab5dc 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/SlotGroup.java @@ -9,6 +9,7 @@ import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; /** @@ -16,6 +17,9 @@ * into distinct regions which can be used for easy access. * * @author TheBusyBiscuit + * + * @see MenuLayout + * @see SlotGroupBuilder * */ public interface SlotGroup extends Iterable { @@ -71,16 +75,25 @@ default int size() { /** * This returns the default {@link ItemStack} for this {@link SlotGroup}. - * The item will be Material.AIR by default and never null. * - * @return The default {@link ItemStack} + * @return The default {@link ItemStack}, can be null */ @Nullable ItemStack getDefaultItemStack(); + /** + * This method returns the {@link MenuClickHandler} belonging to this {@link SlotGroup}. + * If no {@link MenuClickHandler} was added, this will return null. + * + * @return The {@link MenuClickHandler} or null + */ @Nullable MenuClickHandler getClickHandler(); + /** + * This returns an {@link Iterator} allowing you to iterate through + * all slots within this {@link SlotGroup}. + */ @Override default @Nonnull Iterator iterator() { return new SlotGroupIterator(this); diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java index 2bae7186..a73912cc 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java @@ -2,17 +2,27 @@ import java.util.HashSet; import java.util.Set; +import java.util.stream.IntStream; import javax.annotation.Nonnull; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; import org.apache.commons.lang.Validate; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.ItemStack; import io.github.bakedlibs.dough.inventory.SlotGroup; import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; +/** + * The {@link SlotGroupBuilder} allows you to construct a {@link SlotGroup} + * easily via the builder pattern. + * + * @author TheBusyBiscuit + * + */ public class SlotGroupBuilder { protected final char identifier; @@ -23,43 +33,126 @@ public class SlotGroupBuilder { protected ItemStack defaultItem = null; protected boolean interactable = false; + /** + * This creates a new {@link SlotGroupBuilder} of the given name and char id. + * You can construct the corresponding {@link SlotGroup} using {@link #build()}. + * + * @param identifier + * The unique {@link Character} id for this {@link SlotGroup} + * @param name + * A unique name for this {@link SlotGroup} + */ @ParametersAreNonnullByDefault public SlotGroupBuilder(char identifier, String name) { this.identifier = identifier; this.name = name; } + /** + * This simply returns the name of this {@link SlotGroup}. + * + * @return The name of this {@link SlotGroup} + */ public @Nonnull String name() { return name; } + /** + * This marks this {@link SlotGroup} as "interactable" or "non-interactable". + * Interactable {@link SlotGroup}s allow the {@link Player} to take items from this + * {@link SlotGroup} or place items into those slots. + *

+ * Non-interactable {@link SlotGroup}s will cancel any {@link InventoryClickEvent} within + * their bounds. + * + * @param interactable + * Whether this {@link SlotGroup} is interactable + * + * @return The {@link SlotGroupBuilder} instance + */ public @Nonnull SlotGroupBuilder interactable(boolean interactable) { this.interactable = interactable; return this; } + /** + * This method adds the given slot to this {@link SlotGroup} + * + * @param slot + * The slot to be added + * + * @return The {@link SlotGroupBuilder} instance + */ public @Nonnull SlotGroupBuilder withSlot(int slot) { this.slots.add(slot); return this; } + /** + * This method adds all the provided slots to this {@link SlotGroup} + * + * @param slots + * All slots that should be part of this {@link SlotGroup} + * + * @return The {@link SlotGroupBuilder} instance + */ public @Nonnull SlotGroupBuilder withSlots(int... slots) { for (int slot : slots) { this.slots.add(slot); } + + return this; + } + + /** + * This method adds all slot within the given range to this {@link SlotGroup}. + * Note that both parameters are inclusive. + * + * @param from + * The start of this slot range (inclusive) + * @param to + * The end of this slot range (inclusive) + * + * @return The {@link SlotGroupBuilder} instance + */ + public @Nonnull SlotGroupBuilder withSlotRange(int from, int to) { + IntStream.range(from, to + 1).forEach(slots::add); return this; } + /** + * This sets the {@link ItemStack} for this {@link SlotGroup}. + * This {@link ItemStack} will be placed into all slots from this {@link SlotGroup} + * by default. It can be overridden though. + * + * @param item + * The default {@link ItemStack} for this {@link SlotGroup} + * + * @return The {@link SlotGroupBuilder} instance + */ public @Nonnull SlotGroupBuilder withDefaultItem(@Nullable ItemStack item) { this.defaultItem = item; return this; } + /** + * This adds a {@link MenuClickHandler} to this {@link SlotGroup}. + * + * @param clickHandler + * The {@link MenuClickHandler} to fire when a slot from this {@link SlotGroup} was clicked + * + * @return The {@link SlotGroupBuilder} instance + */ public @Nonnull SlotGroupBuilder onClick(@Nullable MenuClickHandler clickHandler) { this.clickHandler = clickHandler; return this; } + /** + * This creates the final {@link SlotGroup} object from this {@link SlotGroupBuilder}. + * + * @return The resulting {@link SlotGroup} + */ public @Nonnull SlotGroup build() { Validate.notNull(identifier, "The char identifier may not be null."); Validate.notNull(name, "The name may not be null."); diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java index 16ce9132..e60e22e2 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/builders/TestLayoutBuilder.java @@ -118,12 +118,12 @@ void testSlotGroupIdentifierCollision() { MenuLayoutBuilder builder = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3) + .withSlotRange(0, 3) .build() ) .addSlotGroup( new SlotGroupBuilder('x', "test2") - .withSlots(4, 5, 6, 7, 8) + .withSlotRange(4, 8) .build() ); // @formatter:on @@ -137,12 +137,12 @@ void testSlotGroupNameCollision() { MenuLayoutBuilder builder = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3) + .withSlotRange(0, 3) .build() ) .addSlotGroup( new SlotGroupBuilder('y', "test") - .withSlots(4, 5, 6, 7, 8) + .withSlotRange(4, 8) .build() ); // @formatter:on @@ -171,7 +171,7 @@ void testUnknownSlotGroups() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .withSlotRange(0, 8) .build() ) .build(); @@ -190,7 +190,7 @@ void testIncompleteSlotGroups() { MenuLayoutBuilder builder = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(1, 2, 3, 4, 5, 6, 7, 8) + .withSlotRange(1, 8) .build() ); // @formatter:on diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java index c0d47fda..f34b9493 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClicking.java @@ -79,7 +79,7 @@ void testClickItemInSlot(boolean interactable) { ) .addSlotGroup( new SlotGroupBuilder('y', "test2") - .withSlots(2, 3, 4, 5, 6, 7, 8) + .withSlotRange(2, 8) .build() ) .build(); @@ -116,7 +116,7 @@ void testOtherInventoriesAreIgnored() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .withSlotRange(0, 8) .onClick(payloadRef::set) .build() ) @@ -142,15 +142,15 @@ void testExceptionHandling() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2) + .withSlotRange(0, 2) .onClick(payload -> { - throw new NullPointerException("NPE was thrown."); + throw new NullPointerException("NPE was thrown | This is expected!"); }) .build() ) .addSlotGroup( new SlotGroupBuilder('y', "test2") - .withSlots(3, 4, 5, 6, 7, 8) + .withSlotRange(3, 8) .build() ) .build(); @@ -180,7 +180,7 @@ void testMultipleFactories() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .withSlotRange(0, 8) .interactable(true) .onClick(payload -> { MenuFactory factory = payload.getMenu().getFactory(); diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java index 1881198a..3a3cb458 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuClosing.java @@ -39,7 +39,7 @@ void testCloseAll() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3, 4, 5, 6, 7, 8) + .withSlotRange(0, 8) .build() ) .build(); diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java index f86869c7..4c89125e 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/TestMenuCreation.java @@ -6,8 +6,6 @@ import static org.junit.jupiter.api.Assertions.assertSame; import static org.junit.jupiter.api.Assertions.assertThrows; -import java.util.stream.IntStream; - import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.inventory.Inventory; @@ -49,7 +47,7 @@ void testCreationWithSize(int size) { .title("Awesome Inventory!") .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(IntStream.range(0, size).toArray()) + .withSlotRange(0, size - 1) .build() ) .build(); @@ -73,7 +71,7 @@ void testInventoryValidation() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(IntStream.range(0, 9).toArray()) + .withSlotRange(0, 8) .build() ) .build(); @@ -90,7 +88,7 @@ void testInventoryHolderValidation() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(IntStream.range(0, 9).toArray()) + .withSlotRange(0, 8) .build() ) .build(); @@ -121,7 +119,7 @@ void testDefaultItem() { ) .addSlotGroup( new SlotGroupBuilder('y', "test2") - .withSlots(2, 3, 4, 5, 6, 7, 8) + .withSlotRange(2, 8) .build() ) .build(); @@ -146,12 +144,12 @@ void testAddItem() { MenuLayout layout = new MenuLayoutBuilder(9) .addSlotGroup( new SlotGroupBuilder('x', "test") - .withSlots(0, 1, 2, 3, 4, 5) + .withSlotRange(0, 5) .build() ) .addSlotGroup( new SlotGroupBuilder('y', "test2") - .withSlots(6, 7, 8) + .withSlotRange(6, 8) .build() ) .build(); From fea4f35be69fbea5f11a672344851663e20ce14d Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Thu, 15 Jul 2021 12:40:31 +0200 Subject: [PATCH 23/24] More documentation --- .../inventory/builders/MenuLayoutBuilder.java | 35 +++++++++++++++ .../inventory/builders/MenuLayoutImpl.java | 18 ++++++++ .../inventory/builders/SlotGroupImpl.java | 26 +++++++++++ .../dough/inventory/factory/MenuListener.java | 4 +- .../dough/inventory/json/LayoutParser.java | 7 +++ .../dough/inventory/json/LayoutShape.java | 22 ++++++++++ .../inventory/payloads/MenuEventPayloads.java | 29 ------------ .../inventory/payloads/MenuPayloads.java | 44 +++++++++++++++++++ .../inventory/factory/MockMenuFactory.java | 2 +- 9 files changed, 155 insertions(+), 32 deletions(-) delete mode 100644 dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java create mode 100644 dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuPayloads.java diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java index 24809e2e..e0d3e79a 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutBuilder.java @@ -9,15 +9,29 @@ import org.apache.commons.lang.Validate; +import io.github.bakedlibs.dough.inventory.Menu; import io.github.bakedlibs.dough.inventory.MenuLayout; import io.github.bakedlibs.dough.inventory.SlotGroup; +/** + * The {@link MenuLayoutBuilder} allows you to construct a {@link MenuLayout} + * easily via the builder pattern. + * + * @author TheBusyBiscuit + * + */ public class MenuLayoutBuilder { protected final int size; protected final Set groups = new HashSet<>(); protected String title; + /** + * This creates a new {@link MenuLayoutBuilder} with the given inventory size. + * + * @param size + * The inventory size for this {@link MenuLayout} + */ public MenuLayoutBuilder(int size) { Validate.isTrue(size > 0, "The size must be greater than 0."); Validate.isTrue(size % 9 == 0, "The size must be a multiple of 9."); @@ -26,17 +40,38 @@ public MenuLayoutBuilder(int size) { this.size = size; } + /** + * This sets an optional title for the resulting {@link Menu}. + * + * @param title + * The title or null + * + * @return Our {@link MenuLayoutBuilder} instance + */ public @Nonnull MenuLayoutBuilder title(@Nullable String title) { this.title = title; return this; } + /** + * This adds the given {@link SlotGroup} to this {@link MenuLayout}. + * + * @param group + * The {@link SlotGroup} to add + * + * @return Our {@link MenuLayoutBuilder} instance + */ @ParametersAreNonnullByDefault public @Nonnull MenuLayoutBuilder addSlotGroup(SlotGroup group) { groups.add(group); return this; } + /** + * This creates the final {@link MenuLayout} object from this {@link MenuLayoutBuilder}. + * + * @return The resulting {@link MenuLayout} + */ public @Nonnull MenuLayout build() { Validate.notEmpty(groups, "There are no SlotGroups defined."); diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java index 2fa3d088..a6bec979 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/MenuLayoutImpl.java @@ -61,21 +61,33 @@ class MenuLayoutImpl implements MenuLayout { } } + /** + * {@inheritDoc} + */ @Override public @Nonnull Set getSlotGroups() { return Collections.unmodifiableSet(groups); } + /** + * {@inheritDoc} + */ @Override public int getSize() { return size; } + /** + * {@inheritDoc} + */ @Override public @Nullable String getTitle() { return title; } + /** + * {@inheritDoc} + */ @Override public @Nonnull SlotGroup getGroup(char identifier) { SlotGroup result = findGroup(group -> group.getIdentifier() == identifier); @@ -87,6 +99,9 @@ public int getSize() { } } + /** + * {@inheritDoc} + */ @Override public @Nonnull SlotGroup getGroup(int slot) { Validate.isTrue(slot >= 0, "Slot cannot be a negative number: " + slot); @@ -100,6 +115,9 @@ public int getSize() { return groupsBySlot[slot]; } + /** + * {@inheritDoc} + */ @Override public @Nonnull SlotGroup getGroup(@Nonnull String name) { SlotGroup result = findGroup(group -> group.getName().equals(name)); diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java index ebc2afd8..d466a84b 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupImpl.java @@ -28,6 +28,14 @@ class SlotGroupImpl implements SlotGroup { this.clickHandler = builder.clickHandler; } + /** + * This method converts our {@link Set} of slots into a sorted array. + * + * @param slots + * The slots + * + * @return A sorted array of our slots + */ private @Nonnull int[] convertSlots(@Nonnull Set slots) { // @formatter:off return slots.stream() @@ -37,31 +45,49 @@ class SlotGroupImpl implements SlotGroup { // @formatter:on } + /** + * {@inheritDoc} + */ @Override public char getIdentifier() { return identifier; } + /** + * {@inheritDoc} + */ @Override public boolean isInteractable() { return interactable; } + /** + * {@inheritDoc} + */ @Override public @Nonnull String getName() { return name; } + /** + * {@inheritDoc} + */ @Override public @Nonnull int[] getSlots() { return slots; } + /** + * {@inheritDoc} + */ @Override public @Nullable ItemStack getDefaultItemStack() { return defaultItem; } + /** + * {@inheritDoc} + */ @Override public @Nonnull MenuClickHandler getClickHandler() { return clickHandler; diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java index edc041eb..5b54f03e 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/factory/MenuListener.java @@ -15,7 +15,7 @@ import io.github.bakedlibs.dough.inventory.Menu; import io.github.bakedlibs.dough.inventory.SlotGroup; import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; -import io.github.bakedlibs.dough.inventory.payloads.MenuEventPayloads; +import io.github.bakedlibs.dough.inventory.payloads.MenuPayloads; /** * The {@link MenuListener} is responsible for handling any @@ -86,7 +86,7 @@ public void onClick(InventoryClickEvent e) { MenuClickHandler clickHandler = slotGroup.getClickHandler(); if (clickHandler != null) { - clickHandler.onClick(MenuEventPayloads.create(inv, e)); + clickHandler.onClick(MenuPayloads.create(inv, e)); } } } catch (Exception | LinkageError x) { diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java index a6558053..a6d2fbba 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutParser.java @@ -26,6 +26,13 @@ import io.github.bakedlibs.dough.inventory.builders.MenuLayoutBuilder; import io.github.bakedlibs.dough.inventory.builders.SlotGroupBuilder; +/** + * This class allows you to parse {@link JsonObject}s, {@link String}s or {@link InputStream}s + * into a {@link MenuLayout}, given they follow our format. + * + * @author TheBusyBiscuit + * + */ public class LayoutParser { private LayoutParser() {} diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java index b3d952b1..4c73aadb 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/json/LayoutShape.java @@ -9,7 +9,17 @@ import javax.annotation.ParametersAreNonnullByDefault; import org.apache.commons.lang.Validate; +import org.bukkit.inventory.Inventory; +import io.github.bakedlibs.dough.inventory.SlotGroup; + +/** + * Little helper class to transition a {@link String} array into + * a {@link SlotGroup}-like map. + * + * @author TheBusyBiscuit + * + */ class LayoutShape { private final Map> groups = new HashMap<>(); @@ -36,10 +46,22 @@ class LayoutShape { } } + /** + * This returns the size of this {@link LayoutShape}, aka the size of the + * corresponding {@link Inventory}. + * + * @return The size of this {@link LayoutShape} + */ public int getSize() { return size; } + /** + * This returns the {@link SlotGroup}-ready representation of this shape. + * Grouped by their unique character keys. + * + * @return The "{@link SlotGroup} map". + */ public @Nonnull Map> getGroups() { return groups; } diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java deleted file mode 100644 index 36b0c0e6..00000000 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuEventPayloads.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.github.bakedlibs.dough.inventory.payloads; - -import javax.annotation.Nonnull; -import javax.annotation.ParametersAreNonnullByDefault; - -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; - -import io.github.bakedlibs.dough.inventory.Menu; - -/** - * Utility class for constructing an event payload for menu handlers. - * - * @author TheBusyBiscuit - * - */ -public class MenuEventPayloads { - - private MenuEventPayloads() {} - - @ParametersAreNonnullByDefault - public static @Nonnull MenuClickPayload create(Menu inv, InventoryClickEvent e) { - Player player = (Player) e.getWhoClicked(); - int slot = e.getSlot(); - - return new MenuClickPayload(inv, player, slot); - } - -} diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuPayloads.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuPayloads.java new file mode 100644 index 00000000..abec6ff0 --- /dev/null +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/payloads/MenuPayloads.java @@ -0,0 +1,44 @@ +package io.github.bakedlibs.dough.inventory.payloads; + +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.apache.commons.lang.Validate; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; + +import io.github.bakedlibs.dough.inventory.Menu; +import io.github.bakedlibs.dough.inventory.handlers.MenuClickHandler; + +/** + * Utility class for constructing an event payload for menu handlers. + * + * @author TheBusyBiscuit + * + */ +public class MenuPayloads { + + private MenuPayloads() {} + + /** + * This creates our payload for an {@link InventoryClickEvent}. + * + * @param menu + * The {@link Menu} involved in this event. + * @param e + * The {@link InventoryClickEvent} + * + * @return A {@link MenuClickPayload} to pass onto the {@link MenuClickHandler}. + */ + @ParametersAreNonnullByDefault + public static @Nonnull MenuClickPayload create(Menu menu, InventoryClickEvent e) { + Validate.notNull(menu, "The menu cannot be null"); + Validate.notNull(e, "Cannot create a payload for an event that is null"); + + Player player = (Player) e.getWhoClicked(); + int slot = e.getSlot(); + + return new MenuClickPayload(menu, player, slot); + } + +} diff --git a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java index 40672990..3c84dd6e 100644 --- a/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java +++ b/dough-inventories/src/test/java/io/github/bakedlibs/dough/inventory/factory/MockMenuFactory.java @@ -17,7 +17,7 @@ public MockMenuFactory() { super(MockBukkit.loadWith(MockJavaPlugin.class, new PluginDescriptionFile( "MockPlugin", "1.0.0", - "io.github.thebusybiscuit.dough.inventory.MockInventoryFactory.MockJavaPlugin") + MockJavaPlugin.class.getName()) )); // @formatter:on } From e36a8d4ef0e57d1080ab973d34c71076f8598abf Mon Sep 17 00:00:00 2001 From: TheBusyBiscuit Date: Sat, 1 Jan 2022 14:00:56 +0100 Subject: [PATCH 24/24] Update dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java Co-authored-by: Sfiguz7 <37039432+Sfiguz7@users.noreply.github.com> --- .../bakedlibs/dough/inventory/builders/SlotGroupBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java index a73912cc..aaac098f 100644 --- a/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java +++ b/dough-inventories/src/main/java/io/github/bakedlibs/dough/inventory/builders/SlotGroupBuilder.java @@ -105,7 +105,7 @@ public SlotGroupBuilder(char identifier, String name) { } /** - * This method adds all slot within the given range to this {@link SlotGroup}. + * This method adds all slots within the given range to this {@link SlotGroup}. * Note that both parameters are inclusive. * * @param from