mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2025-02-18 21:32:04 +01:00
Avoids loading islands into cache unless they are needed. (#2373)
* Avoids loading islands into cache unless they are needed. * Adjust methods that were calling all islands When we cached all island, this was an inexpensive call but not now. The methods remain but pull from the database directly. The use of them were changed to be player specific.
This commit is contained in:
parent
8aba736383
commit
e2d9c2ce34
@ -11,10 +11,8 @@ import org.bstats.charts.AdvancedPie;
|
|||||||
import org.bstats.charts.SimpleBarChart;
|
import org.bstats.charts.SimpleBarChart;
|
||||||
import org.bstats.charts.SimplePie;
|
import org.bstats.charts.SimplePie;
|
||||||
import org.bstats.charts.SingleLineChart;
|
import org.bstats.charts.SingleLineChart;
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
|
|
||||||
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
||||||
import world.bentobox.bentobox.api.flags.Flag;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Poslovitch
|
* @author Poslovitch
|
||||||
|
@ -75,12 +75,6 @@ public class IslandSetnameCommand extends CompositeCommand {
|
|||||||
name = ChatColor.translateAlternateColorCodes('&', name);
|
name = ChatColor.translateAlternateColorCodes('&', name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if the name doesn't already exist in the gamemode
|
|
||||||
if (getSettings().isNameUniqueness() && getIslands().nameExists(getWorld(), name)) {
|
|
||||||
user.sendMessage("commands.island.setname.name-already-exists");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,6 @@ import world.bentobox.bentobox.api.events.team.TeamEvent;
|
|||||||
import world.bentobox.bentobox.api.localization.TextVariables;
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
import world.bentobox.bentobox.api.user.User;
|
import world.bentobox.bentobox.api.user.User;
|
||||||
import world.bentobox.bentobox.database.objects.Island;
|
import world.bentobox.bentobox.database.objects.Island;
|
||||||
import world.bentobox.bentobox.managers.IslandsManager;
|
|
||||||
import world.bentobox.bentobox.managers.RanksManager;
|
import world.bentobox.bentobox.managers.RanksManager;
|
||||||
import world.bentobox.bentobox.util.Util;
|
import world.bentobox.bentobox.util.Util;
|
||||||
|
|
||||||
|
@ -24,7 +24,6 @@ import org.bukkit.potion.PotionEffectType;
|
|||||||
import org.bukkit.potion.PotionType;
|
import org.bukkit.potion.PotionType;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import com.google.common.base.Enums;
|
|
||||||
import com.meowj.langutils.lang.LanguageHelper;
|
import com.meowj.langutils.lang.LanguageHelper;
|
||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
|
@ -189,7 +189,7 @@ public class JoinLeaveListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void updateIslandRange(User user) {
|
private void updateIslandRange(User user) {
|
||||||
plugin.getIslands().getIslands().stream()
|
plugin.getIslands().getIslands(user.getUniqueId()).stream()
|
||||||
.filter(island -> island.getOwner() != null && island.getOwner().equals(user.getUniqueId()))
|
.filter(island -> island.getOwner() != null && island.getOwner().equals(user.getUniqueId()))
|
||||||
.forEach(island -> {
|
.forEach(island -> {
|
||||||
// Check if new owner has a different range permission than the island size
|
// Check if new owner has a different range permission than the island size
|
||||||
@ -220,8 +220,7 @@ public class JoinLeaveListener implements Listener {
|
|||||||
// Remove any coops if all the island players have left
|
// Remove any coops if all the island players have left
|
||||||
// Go through all the islands this player is a member of, check if all members
|
// Go through all the islands this player is a member of, check if all members
|
||||||
// have left, remove coops
|
// have left, remove coops
|
||||||
|
plugin.getIslands().getIslands(event.getPlayer().getUniqueId()).stream()
|
||||||
plugin.getIslands().getIslands().stream()
|
|
||||||
.filter(island -> island.getMembers().containsKey(event.getPlayer().getUniqueId())).forEach(island -> {
|
.filter(island -> island.getMembers().containsKey(event.getPlayer().getUniqueId())).forEach(island -> {
|
||||||
// Are there any online players still for this island?
|
// Are there any online players still for this island?
|
||||||
if (Bukkit.getOnlinePlayers().stream().filter(p -> !event.getPlayer().equals(p))
|
if (Bukkit.getOnlinePlayers().stream().filter(p -> !event.getPlayer().equals(p))
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package world.bentobox.bentobox.listeners.flags.protection;
|
package world.bentobox.bentobox.listeners.flags.protection;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
@ -23,7 +22,6 @@ import com.google.common.base.Optional;
|
|||||||
|
|
||||||
import world.bentobox.bentobox.api.flags.FlagListener;
|
import world.bentobox.bentobox.api.flags.FlagListener;
|
||||||
import world.bentobox.bentobox.lists.Flags;
|
import world.bentobox.bentobox.lists.Flags;
|
||||||
import world.bentobox.bentobox.util.Util;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Protects islands from visitors blowing things up
|
* Protects islands from visitors blowing things up
|
||||||
|
@ -18,7 +18,6 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.ChatColor;
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.Tag;
|
import org.bukkit.Tag;
|
||||||
@ -98,7 +97,7 @@ public class IslandsManager {
|
|||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
// Set up the database handler to store and retrieve Island classes
|
// Set up the database handler to store and retrieve Island classes
|
||||||
handler = new Database<>(plugin, Island.class);
|
handler = new Database<>(plugin, Island.class);
|
||||||
islandCache = new IslandCache();
|
islandCache = new IslandCache(handler);
|
||||||
// This list should always be empty unless database deletion failed
|
// This list should always be empty unless database deletion failed
|
||||||
// In that case a purge utility may be required in the future
|
// In that case a purge utility may be required in the future
|
||||||
deletedIslands = new ArrayList<>();
|
deletedIslands = new ArrayList<>();
|
||||||
@ -375,6 +374,17 @@ public class IslandsManager {
|
|||||||
return islandCache.getIslands(world, uniqueId);
|
return islandCache.getIslands(world, uniqueId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets all the islands for this player in any world where this player has any presence
|
||||||
|
*
|
||||||
|
* @param uniqueId user's UUID
|
||||||
|
* @return List of islands or empty list if none found for user
|
||||||
|
*/
|
||||||
|
@NonNull
|
||||||
|
public List<Island> getIslands(UUID uniqueId) {
|
||||||
|
return islandCache.getIslands(uniqueId);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets all the islands for this player in this world that this player owns.
|
* Gets all the islands for this player in this world that this player owns.
|
||||||
*
|
*
|
||||||
@ -441,7 +451,7 @@ public class IslandsManager {
|
|||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
public Collection<Island> getIslands() {
|
public Collection<Island> getIslands() {
|
||||||
return islandCache.getIslands();
|
return handler.loadObjects().stream().toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -455,7 +465,7 @@ public class IslandsManager {
|
|||||||
*/
|
*/
|
||||||
@NonNull
|
@NonNull
|
||||||
public Collection<Island> getIslands(@NonNull World world) {
|
public Collection<Island> getIslands(@NonNull World world) {
|
||||||
return islandCache.getIslands(world);
|
return handler.loadObjects().stream().filter(i -> world.equals(i.getWorld())).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1678,20 +1688,6 @@ public class IslandsManager {
|
|||||||
this.saveAll();
|
this.saveAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns whether the specified island custom name exists in this world.
|
|
||||||
*
|
|
||||||
* @param world World of the gamemode
|
|
||||||
* @param name Name of an island
|
|
||||||
* @return {@code true} if there is an island with the specified name in this
|
|
||||||
* world, {@code false} otherwise.
|
|
||||||
* @since 1.7.0
|
|
||||||
*/
|
|
||||||
public boolean nameExists(@NonNull World world, @NonNull String name) {
|
|
||||||
return getIslands(world).stream().map(Island::getName).filter(Objects::nonNull)
|
|
||||||
.anyMatch(n -> ChatColor.stripColor(n).equals(ChatColor.stripColor(name)));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is user mid home teleport?
|
* Is user mid home teleport?
|
||||||
*
|
*
|
||||||
|
@ -21,6 +21,7 @@ import org.eclipse.jdt.annotation.Nullable;
|
|||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.api.flags.Flag;
|
import world.bentobox.bentobox.api.flags.Flag;
|
||||||
|
import world.bentobox.bentobox.database.Database;
|
||||||
import world.bentobox.bentobox.database.objects.Island;
|
import world.bentobox.bentobox.database.objects.Island;
|
||||||
import world.bentobox.bentobox.managers.RanksManager;
|
import world.bentobox.bentobox.managers.RanksManager;
|
||||||
import world.bentobox.bentobox.util.Util;
|
import world.bentobox.bentobox.util.Util;
|
||||||
@ -45,11 +46,13 @@ public class IslandCache {
|
|||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private final Map<@NonNull World, @NonNull IslandGrid> grids;
|
private final Map<@NonNull World, @NonNull IslandGrid> grids;
|
||||||
|
private final @NonNull Database<Island> handler;
|
||||||
|
|
||||||
public IslandCache() {
|
public IslandCache(@NonNull Database<Island> handler) {
|
||||||
islandsById = new HashMap<>();
|
islandsById = new HashMap<>();
|
||||||
islandsByUUID = new HashMap<>();
|
islandsByUUID = new HashMap<>();
|
||||||
grids = new HashMap<>();
|
grids = new HashMap<>();
|
||||||
|
this.handler = handler;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,7 +94,7 @@ public class IslandCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds an island to the grid
|
* Adds an island to the grid, used for new islands
|
||||||
*
|
*
|
||||||
* @param island island to add, not null
|
* @param island island to add, not null
|
||||||
* @return true if successfully added, false if not
|
* @return true if successfully added, false if not
|
||||||
@ -113,14 +116,13 @@ public class IslandCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a player's UUID to the look up for islands. Does no checking
|
* Adds a player's UUID to the look up for islands. Does no checking. The island for this player must have been added beforehand.
|
||||||
*
|
*
|
||||||
* @param uuid player's uuid
|
* @param uuid player's uuid
|
||||||
* @param island island to associate with this uuid. Only one island can be
|
* @param island island to associate with this uuid. Only one island can be
|
||||||
* associated per world.
|
* associated per world.
|
||||||
*/
|
*/
|
||||||
public void addPlayer(@NonNull UUID uuid, @NonNull Island island) {
|
public void addPlayer(@NonNull UUID uuid, @NonNull Island island) {
|
||||||
this.setIslandById(island);
|
|
||||||
this.islandsByUUID.computeIfAbsent(uuid, k -> new HashSet<>()).add(island.getUniqueId());
|
this.islandsByUUID.computeIfAbsent(uuid, k -> new HashSet<>()).add(island.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +397,8 @@ public class IslandCache {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
public Island getIslandById(@NonNull String uniqueId) {
|
public Island getIslandById(@NonNull String uniqueId) {
|
||||||
return islandsById.get(uniqueId);
|
// Load from cache or database
|
||||||
|
return islandsById.computeIfAbsent(uniqueId, handler::loadObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Island setIslandById(Island island) {
|
private Island setIslandById(Island island) {
|
||||||
@ -443,4 +446,13 @@ public class IslandCache {
|
|||||||
return islandsById.keySet();
|
return islandsById.keySet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a unmodifiable list of all islands this player is involved with
|
||||||
|
* @param uniqueId player's UUID
|
||||||
|
* @return list of islands
|
||||||
|
*/
|
||||||
|
public @NonNull List<Island> getIslands(UUID uniqueId) {
|
||||||
|
return islandsByUUID.get(uniqueId).stream().map(this::getIslandById).toList();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,6 @@ import world.bentobox.bentobox.database.objects.IslandDeletion;
|
|||||||
import world.bentobox.bentobox.hooks.ItemsAdderHook;
|
import world.bentobox.bentobox.hooks.ItemsAdderHook;
|
||||||
import world.bentobox.bentobox.hooks.SlimefunHook;
|
import world.bentobox.bentobox.hooks.SlimefunHook;
|
||||||
import world.bentobox.bentobox.util.MyBiomeGrid;
|
import world.bentobox.bentobox.util.MyBiomeGrid;
|
||||||
import world.bentobox.bentobox.util.Util;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Regenerates by using a seed world. The seed world is created using the same generator as the game
|
* Regenerates by using a seed world. The seed world is created using the same generator as the game
|
||||||
|
@ -7,15 +7,20 @@
|
|||||||
package world.bentobox.bentobox.panels.customizable;
|
package world.bentobox.bentobox.panels.customizable;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.eclipse.jdt.annotation.NonNull;
|
import org.eclipse.jdt.annotation.NonNull;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import java.io.File;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
||||||
|
@ -7,16 +7,21 @@
|
|||||||
package world.bentobox.bentobox.panels.customizable;
|
package world.bentobox.bentobox.panels.customizable;
|
||||||
|
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import org.apache.commons.lang.WordUtils;
|
import org.apache.commons.lang.WordUtils;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.eclipse.jdt.annotation.NonNull;
|
import org.eclipse.jdt.annotation.NonNull;
|
||||||
import org.eclipse.jdt.annotation.Nullable;
|
import org.eclipse.jdt.annotation.Nullable;
|
||||||
import java.io.File;
|
|
||||||
import java.util.*;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
||||||
|
@ -7,7 +7,6 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.eclipse.jdt.annotation.NonNull;
|
import org.eclipse.jdt.annotation.NonNull;
|
||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
|
||||||
import world.bentobox.bentobox.api.flags.Flag.Type;
|
import world.bentobox.bentobox.api.flags.Flag.Type;
|
||||||
import world.bentobox.bentobox.api.flags.clicklisteners.WorldToggleClick;
|
import world.bentobox.bentobox.api.flags.clicklisteners.WorldToggleClick;
|
||||||
import world.bentobox.bentobox.api.localization.TextVariables;
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
|
@ -1,14 +1,18 @@
|
|||||||
package world.bentobox.bentobox.util;
|
package world.bentobox.bentobox.util;
|
||||||
|
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.*;
|
import java.util.Arrays;
|
||||||
|
import java.util.Base64;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.MissingFormatArgumentException;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.DyeColor;
|
import org.bukkit.DyeColor;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.block.banner.Pattern;
|
import org.bukkit.block.banner.Pattern;
|
||||||
import org.bukkit.block.banner.PatternType;
|
import org.bukkit.block.banner.PatternType;
|
||||||
import org.bukkit.inventory.ItemFactory;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.BannerMeta;
|
import org.bukkit.inventory.meta.BannerMeta;
|
||||||
import org.bukkit.inventory.meta.Damageable;
|
import org.bukkit.inventory.meta.Damageable;
|
||||||
|
@ -4,7 +4,6 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
import org.bukkit.profile.PlayerProfile;
|
import org.bukkit.profile.PlayerProfile;
|
||||||
|
|
||||||
|
@ -42,7 +42,6 @@ import org.powermock.modules.junit4.PowerMockRunner;
|
|||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.Settings;
|
import world.bentobox.bentobox.Settings;
|
||||||
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
||||||
import world.bentobox.bentobox.api.flags.Flag.Mode;
|
|
||||||
import world.bentobox.bentobox.api.localization.TextVariables;
|
import world.bentobox.bentobox.api.localization.TextVariables;
|
||||||
import world.bentobox.bentobox.api.user.User;
|
import world.bentobox.bentobox.api.user.User;
|
||||||
import world.bentobox.bentobox.database.objects.Island;
|
import world.bentobox.bentobox.database.objects.Island;
|
||||||
|
@ -9,7 +9,6 @@ import static org.junit.Assert.assertTrue;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.anyString;
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
@ -227,29 +226,6 @@ public class IslandSetnameCommandTest {
|
|||||||
verify(user).sendMessage("commands.island.setname.name-too-long", TextVariables.NUMBER, "20");
|
verify(user).sendMessage("commands.island.setname.name-too-long", TextVariables.NUMBER, "20");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Test method for {@link world.bentobox.bentobox.api.commands.island.IslandSetnameCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testIslandSetnameCommandNameNotUnique() {
|
|
||||||
settings.setNameUniqueness(true);
|
|
||||||
when(im.nameExists(eq(world), anyString())).thenReturn(true);
|
|
||||||
assertFalse(isc.canExecute(user, isc.getLabel(), List.of("name2")));
|
|
||||||
verify(user).sendMessage("commands.island.setname.name-already-exists");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Test method for {@link world.bentobox.bentobox.api.commands.island.IslandSetnameCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testIslandSetnameCommandNameApplyColors() {
|
|
||||||
when(user.hasPermission(anyString())).thenReturn(true);
|
|
||||||
settings.setNameUniqueness(true);
|
|
||||||
when(im.nameExists(world, "name§b")).thenReturn(true);
|
|
||||||
assertFalse(isc.canExecute(user, isc.getLabel(), List.of("name&b")));
|
|
||||||
verify(user).sendMessage("commands.island.setname.name-already-exists");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test method for {@link world.bentobox.bentobox.api.commands.island.IslandSetnameCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
|
* Test method for {@link world.bentobox.bentobox.api.commands.island.IslandSetnameCommand#canExecute(world.bentobox.bentobox.api.user.User, java.lang.String, java.util.List)}.
|
||||||
*/
|
*/
|
||||||
|
@ -166,6 +166,7 @@ public class JoinLeaveListenerTest {
|
|||||||
when(im.getIsland(any(), any(User.class))).thenReturn(island);
|
when(im.getIsland(any(), any(User.class))).thenReturn(island);
|
||||||
when(im.getIsland(any(), any(UUID.class))).thenReturn(island);
|
when(im.getIsland(any(), any(UUID.class))).thenReturn(island);
|
||||||
when(im.getIslands()).thenReturn(Collections.singletonList(island));
|
when(im.getIslands()).thenReturn(Collections.singletonList(island));
|
||||||
|
when(im.getIslands(any(UUID.class))).thenReturn(Collections.singletonList(island));
|
||||||
Map<UUID, Integer> memberMap = new HashMap<>();
|
Map<UUID, Integer> memberMap = new HashMap<>();
|
||||||
|
|
||||||
memberMap.put(uuid, RanksManager.OWNER_RANK);
|
memberMap.put(uuid, RanksManager.OWNER_RANK);
|
||||||
|
@ -20,7 +20,6 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.Tag;
|
import org.bukkit.Tag;
|
||||||
import org.bukkit.block.Block;
|
import org.bukkit.block.Block;
|
||||||
import org.bukkit.block.BlockFace;
|
import org.bukkit.block.BlockFace;
|
||||||
import org.bukkit.block.BlockState;
|
|
||||||
import org.bukkit.block.Sign;
|
import org.bukkit.block.Sign;
|
||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.bukkit.event.block.Action;
|
import org.bukkit.event.block.Action;
|
||||||
|
@ -25,8 +25,6 @@ import org.bukkit.Bukkit;
|
|||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
import org.bukkit.damage.DamageSource;
|
|
||||||
import org.bukkit.damage.DamageType;
|
|
||||||
import org.bukkit.entity.AreaEffectCloud;
|
import org.bukkit.entity.AreaEffectCloud;
|
||||||
import org.bukkit.entity.Arrow;
|
import org.bukkit.entity.Arrow;
|
||||||
import org.bukkit.entity.Creeper;
|
import org.bukkit.entity.Creeper;
|
||||||
|
@ -2,6 +2,8 @@ package world.bentobox.bentobox.managers;
|
|||||||
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyInt;
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.Mockito.doAnswer;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
@ -71,10 +73,12 @@ public abstract class RanksManagerBeforeClassTest {
|
|||||||
public RanksManager rm;
|
public RanksManager rm;
|
||||||
|
|
||||||
protected static AbstractDatabaseHandler<Object> h;
|
protected static AbstractDatabaseHandler<Object> h;
|
||||||
|
protected static Object savedObject;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void beforeClass() throws IllegalAccessException, InvocationTargetException, IntrospectionException {
|
public static void beforeClass() throws IllegalAccessException, InvocationTargetException, IntrospectionException,
|
||||||
|
InstantiationException, ClassNotFoundException, NoSuchMethodException {
|
||||||
// This has to be done beforeClass otherwise the tests will interfere with each
|
// This has to be done beforeClass otherwise the tests will interfere with each
|
||||||
// other
|
// other
|
||||||
h = mock(AbstractDatabaseHandler.class);
|
h = mock(AbstractDatabaseHandler.class);
|
||||||
@ -83,7 +87,27 @@ public abstract class RanksManagerBeforeClassTest {
|
|||||||
DatabaseSetup dbSetup = mock(DatabaseSetup.class);
|
DatabaseSetup dbSetup = mock(DatabaseSetup.class);
|
||||||
when(DatabaseSetup.getDatabase()).thenReturn(dbSetup);
|
when(DatabaseSetup.getDatabase()).thenReturn(dbSetup);
|
||||||
when(dbSetup.getHandler(any())).thenReturn(h);
|
when(dbSetup.getHandler(any())).thenReturn(h);
|
||||||
when(h.saveObject(any())).thenReturn(CompletableFuture.completedFuture(true));
|
//when(h.saveObject(any())).thenReturn(CompletableFuture.completedFuture(true));
|
||||||
|
// Capture the parameter passed to saveObject() and store it in savedObject
|
||||||
|
doAnswer(invocation -> {
|
||||||
|
savedObject = invocation.getArgument(0);
|
||||||
|
return CompletableFuture.completedFuture(true);
|
||||||
|
}).when(h).saveObject(any());
|
||||||
|
|
||||||
|
// Now when loadObject() is called, return the savedObject
|
||||||
|
when(h.loadObject(any())).thenAnswer(invocation -> savedObject);
|
||||||
|
|
||||||
|
// Delete object
|
||||||
|
doAnswer(invocation -> {
|
||||||
|
savedObject = null;
|
||||||
|
return null;
|
||||||
|
}).when(h).deleteObject(any());
|
||||||
|
|
||||||
|
doAnswer(invocation -> {
|
||||||
|
savedObject = null;
|
||||||
|
return null;
|
||||||
|
}).when(h).deleteID(anyString());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@ -95,6 +119,8 @@ public abstract class RanksManagerBeforeClassTest {
|
|||||||
when(RanksManager.getInstance()).thenReturn(rm);
|
when(RanksManager.getInstance()).thenReturn(rm);
|
||||||
when(rm.getRanks()).thenReturn(DEFAULT_RANKS);
|
when(rm.getRanks()).thenReturn(DEFAULT_RANKS);
|
||||||
when(rm.getRank(anyInt())).thenReturn("");
|
when(rm.getRank(anyInt())).thenReturn("");
|
||||||
|
// Clear savedObject
|
||||||
|
savedObject = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
|
@ -6,6 +6,7 @@ import static org.junit.Assert.assertNotSame;
|
|||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyInt;
|
||||||
import static org.mockito.ArgumentMatchers.eq;
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
@ -33,17 +34,17 @@ import com.google.common.collect.ImmutableSet.Builder;
|
|||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.api.flags.Flag;
|
import world.bentobox.bentobox.api.flags.Flag;
|
||||||
|
import world.bentobox.bentobox.database.Database;
|
||||||
import world.bentobox.bentobox.database.objects.Island;
|
import world.bentobox.bentobox.database.objects.Island;
|
||||||
import world.bentobox.bentobox.managers.IslandWorldManager;
|
import world.bentobox.bentobox.managers.IslandWorldManager;
|
||||||
import world.bentobox.bentobox.managers.IslandsManager;
|
import world.bentobox.bentobox.managers.IslandsManager;
|
||||||
|
import world.bentobox.bentobox.managers.RanksManagerBeforeClassTest;
|
||||||
import world.bentobox.bentobox.util.Util;
|
import world.bentobox.bentobox.util.Util;
|
||||||
|
|
||||||
@RunWith(PowerMockRunner.class)
|
@RunWith(PowerMockRunner.class)
|
||||||
@PrepareForTest({ BentoBox.class, Util.class })
|
@PrepareForTest({ BentoBox.class, Util.class })
|
||||||
public class IslandCacheTest {
|
public class IslandCacheTest extends RanksManagerBeforeClassTest {
|
||||||
|
|
||||||
@Mock
|
|
||||||
private BentoBox plugin;
|
|
||||||
@Mock
|
@Mock
|
||||||
private World world;
|
private World world;
|
||||||
@Mock
|
@Mock
|
||||||
@ -60,7 +61,10 @@ public class IslandCacheTest {
|
|||||||
private Flag flag;
|
private Flag flag;
|
||||||
@Mock
|
@Mock
|
||||||
private IslandsManager im;
|
private IslandsManager im;
|
||||||
|
// Database
|
||||||
|
Database<Island> db;
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
// Plugin
|
// Plugin
|
||||||
@ -74,22 +78,24 @@ public class IslandCacheTest {
|
|||||||
when(iwm.inWorld(any(Location.class))).thenReturn(true);
|
when(iwm.inWorld(any(Location.class))).thenReturn(true);
|
||||||
|
|
||||||
PowerMockito.mockStatic(Util.class);
|
PowerMockito.mockStatic(Util.class);
|
||||||
when(Util.getWorld(Mockito.any())).thenReturn(world);
|
when(Util.getWorld(any())).thenReturn(world);
|
||||||
|
|
||||||
// Mock up IslandsManager
|
// Mock up IslandsManager
|
||||||
when(plugin.getIslands()).thenReturn(im);
|
when(plugin.getIslands()).thenReturn(im);
|
||||||
|
|
||||||
// Island
|
|
||||||
when(island.getWorld()).thenReturn(world);
|
|
||||||
when(island.getUniqueId()).thenReturn("uniqueId");
|
|
||||||
@NonNull
|
|
||||||
String uniqueId = UUID.randomUUID().toString();
|
|
||||||
when(island.getUniqueId()).thenReturn(uniqueId);
|
|
||||||
// Location
|
// Location
|
||||||
when(location.getWorld()).thenReturn(world);
|
when(location.getWorld()).thenReturn(world);
|
||||||
when(location.getBlockX()).thenReturn(0);
|
when(location.getBlockX()).thenReturn(0);
|
||||||
when(location.getBlockY()).thenReturn(0);
|
when(location.getBlockY()).thenReturn(0);
|
||||||
when(location.getBlockZ()).thenReturn(0);
|
when(location.getBlockZ()).thenReturn(0);
|
||||||
|
|
||||||
|
// Island
|
||||||
|
when(island.getWorld()).thenReturn(world);
|
||||||
|
when(island.getUniqueId()).thenReturn("uniqueId");
|
||||||
|
when(island.inIslandSpace(anyInt(), anyInt())).thenReturn(true);
|
||||||
|
@NonNull
|
||||||
|
String uniqueId = UUID.randomUUID().toString();
|
||||||
|
when(island.getUniqueId()).thenReturn(uniqueId);
|
||||||
when(island.getCenter()).thenReturn(location);
|
when(island.getCenter()).thenReturn(location);
|
||||||
when(island.getOwner()).thenReturn(owner);
|
when(island.getOwner()).thenReturn(owner);
|
||||||
when(island.isOwned()).thenReturn(true);
|
when(island.isOwned()).thenReturn(true);
|
||||||
@ -102,8 +108,11 @@ public class IslandCacheTest {
|
|||||||
when(island.getMinX()).thenReturn(-200);
|
when(island.getMinX()).thenReturn(-200);
|
||||||
when(island.getMinZ()).thenReturn(-200);
|
when(island.getMinZ()).thenReturn(-200);
|
||||||
|
|
||||||
|
// database must be mocked here
|
||||||
|
db = mock(Database.class);
|
||||||
|
|
||||||
// New cache
|
// New cache
|
||||||
ic = new IslandCache();
|
ic = new IslandCache(db);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@ -117,6 +126,7 @@ public class IslandCacheTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testAddIsland() {
|
public void testAddIsland() {
|
||||||
assertTrue(ic.addIsland(island));
|
assertTrue(ic.addIsland(island));
|
||||||
|
assertEquals(island, ic.getIslandAt(island.getCenter()));
|
||||||
// Check if they are added
|
// Check if they are added
|
||||||
assertEquals(island, ic.getIsland(world, owner));
|
assertEquals(island, ic.getIsland(world, owner));
|
||||||
}
|
}
|
||||||
@ -126,6 +136,7 @@ public class IslandCacheTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testAddPlayer() {
|
public void testAddPlayer() {
|
||||||
|
ic.addIsland(island);
|
||||||
UUID playerUUID = UUID.randomUUID();
|
UUID playerUUID = UUID.randomUUID();
|
||||||
ic.addPlayer(playerUUID, island);
|
ic.addPlayer(playerUUID, island);
|
||||||
// Check if they are added
|
// Check if they are added
|
||||||
@ -162,7 +173,7 @@ public class IslandCacheTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testGetIslandAtLocation() {
|
public void testGetIslandAtLocation() {
|
||||||
// Set coords to be in island space
|
// Set coords to be in island space
|
||||||
when(island.inIslandSpace(Mockito.any(Integer.class), Mockito.any(Integer.class))).thenReturn(true);
|
when(island.inIslandSpace(any(Integer.class), any(Integer.class))).thenReturn(true);
|
||||||
// Set plugin
|
// Set plugin
|
||||||
Util.setPlugin(plugin);
|
Util.setPlugin(plugin);
|
||||||
ic.addIsland(island);
|
ic.addIsland(island);
|
||||||
@ -179,7 +190,7 @@ public class IslandCacheTest {
|
|||||||
|
|
||||||
|
|
||||||
assertEquals(island, ic.getIslandAt(location2));
|
assertEquals(island, ic.getIslandAt(location2));
|
||||||
when(island.inIslandSpace(Mockito.any(Integer.class), Mockito.any(Integer.class))).thenReturn(false);
|
when(island.inIslandSpace(any(Integer.class), any(Integer.class))).thenReturn(false);
|
||||||
assertNull(ic.getIslandAt(location2));
|
assertNull(ic.getIslandAt(location2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,12 @@ import static org.mockito.Mockito.when;
|
|||||||
|
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.Paths;
|
import java.nio.file.Paths;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
|
@ -1,6 +1,23 @@
|
|||||||
package world.bentobox.bentobox.panels.customizable;
|
package world.bentobox.bentobox.panels.customizable;
|
||||||
|
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.ArgumentMatchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.times;
|
||||||
|
import static org.mockito.Mockito.verify;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import java.nio.file.Path;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Locale;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
@ -23,23 +40,14 @@ import org.powermock.api.mockito.PowerMockito;
|
|||||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||||
import org.powermock.modules.junit4.PowerMockRunner;
|
import org.powermock.modules.junit4.PowerMockRunner;
|
||||||
import org.powermock.reflect.Whitebox;
|
import org.powermock.reflect.Whitebox;
|
||||||
import java.awt.Panel;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import world.bentobox.bentobox.BentoBox;
|
import world.bentobox.bentobox.BentoBox;
|
||||||
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
import world.bentobox.bentobox.api.addons.GameModeAddon;
|
||||||
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
import world.bentobox.bentobox.api.commands.CompositeCommand;
|
||||||
import world.bentobox.bentobox.api.localization.BentoBoxLocale;
|
import world.bentobox.bentobox.api.localization.BentoBoxLocale;
|
||||||
import world.bentobox.bentobox.api.panels.builders.PanelBuilder;
|
|
||||||
import world.bentobox.bentobox.api.user.User;
|
import world.bentobox.bentobox.api.user.User;
|
||||||
import world.bentobox.bentobox.managers.LocalesManager;
|
import world.bentobox.bentobox.managers.LocalesManager;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.mockito.ArgumentMatchers.*;
|
|
||||||
import static org.mockito.Mockito.*;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author tastybento
|
* @author tastybento
|
||||||
*
|
*
|
||||||
|
@ -6,13 +6,9 @@ import static org.junit.Assert.assertNull;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.times;
|
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.UnsafeValues;
|
import org.bukkit.UnsafeValues;
|
||||||
@ -22,12 +18,9 @@ import org.bukkit.inventory.meta.BannerMeta;
|
|||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.bukkit.inventory.meta.PotionMeta;
|
import org.bukkit.inventory.meta.PotionMeta;
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
import org.bukkit.potion.PotionData;
|
|
||||||
import org.bukkit.potion.PotionType;
|
import org.bukkit.potion.PotionType;
|
||||||
import org.bukkit.profile.PlayerProfile;
|
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
|
Loading…
Reference in New Issue
Block a user