diff --git a/src/main/java/com/graywolf336/jail/JailIO.java b/src/main/java/com/graywolf336/jail/JailIO.java index b475ed0..6581c7f 100644 --- a/src/main/java/com/graywolf336/jail/JailIO.java +++ b/src/main/java/com/graywolf336/jail/JailIO.java @@ -2,11 +2,13 @@ package com.graywolf336.jail; import java.io.File; import java.io.IOException; +import java.util.Set; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import com.graywolf336.jail.beans.Jail; +import com.graywolf336.jail.beans.SimpleLocation; public class JailIO { private JailMain pl; @@ -50,10 +52,22 @@ public class JailIO { break; default: //load the jails from flatfile - if(flat.contains("jails")) - pl.getLogger().info("Jails exists"); + if(flat.isConfigurationSection("jails")) { + Set jails = flat.getConfigurationSection("jails").getKeys(false); + if(!jails.isEmpty()) { + pl.getLogger().info("Jails configuration section exists and there are " + jails.size() + "."); + for(String name : jails) { + loadJail(name); + } + }else { + pl.getLogger().warning("Jails configuration section exists but no jails are there."); + } + } break; } + + int s = pl.getJailManager().getJails().size(); + pl.getLogger().info("Loaded " + s + (s == 1 ? " jail." : " jails.")); } public void saveJail(Jail j) { @@ -66,6 +80,7 @@ public class JailIO { String node = "jails." + j.getName() + "."; //Corners + flat.set(node + "world", j.getWorldName()); flat.set(node + "top.x", j.getMaxPoint().getBlockX()); flat.set(node + "top.y", j.getMaxPoint().getBlockY()); flat.set(node + "top.z", j.getMaxPoint().getBlockZ()); @@ -77,15 +92,16 @@ public class JailIO { flat.set(node + "tps.in.x", j.getTeleportIn().getX()); flat.set(node + "tps.in.y", j.getTeleportIn().getY()); flat.set(node + "tps.in.z", j.getTeleportIn().getZ()); - flat.set(node + "tps.in.pitch", j.getTeleportIn().getPitch()); flat.set(node + "tps.in.yaw", j.getTeleportIn().getYaw()); + flat.set(node + "tps.in.pitch", j.getTeleportIn().getPitch()); //Tele out + flat.set(node + "tps.free.world", j.getTeleportFree().getWorld().getName()); flat.set(node + "tps.free.x", j.getTeleportFree().getX()); flat.set(node + "tps.free.y", j.getTeleportFree().getY()); flat.set(node + "tps.free.z", j.getTeleportFree().getZ()); - flat.set(node + "tps.free.pitch", j.getTeleportFree().getPitch()); flat.set(node + "tps.free.yaw", j.getTeleportFree().getYaw()); + flat.set(node + "tps.free.pitch", j.getTeleportFree().getPitch()); try { flat.save(new File(pl.getDataFolder(), "data.yml")); @@ -98,4 +114,37 @@ public class JailIO { break; } } + + private void loadJail(String name) { + switch(storage) { + case 1: + case 2: + break; + default: + String node = "jails." + name + "."; + Jail j = new Jail(pl, name); + + j.setWorld(node + "world"); + j.setMaxPoint(new int[] {flat.getInt(node + "top.x"), flat.getInt(node + "top.y"), flat.getInt(node + "top.z")}); + j.setMinPoint(new int[] {flat.getInt(node + "bottom.x"), flat.getInt(node + "bottom.y"), flat.getInt(node + "bottom.z")}); + + j.setTeleportIn(new SimpleLocation( + flat.getString(node + "world"), + flat.getDouble(node + "tps.in.x"), + flat.getDouble(node + "tps.in.y"), + flat.getDouble(node + "tps.in.z"), + (float) flat.getDouble(node + "tps.in.yaw"), + (float) flat.getDouble(node + "tps.in.pitch"))); + j.setTeleportFree(new SimpleLocation( + flat.getString(node + "tps.free.world"), + flat.getDouble(node + "tps.free.x"), + flat.getDouble(node + "tps.free.y"), + flat.getDouble(node + "tps.free.z"), + (float) flat.getDouble(node + "tps.free.yaw"), + (float) flat.getDouble(node + "tps.free.pitch"))); + + pl.getJailManager().addJail(j, false); + break; + } + } } diff --git a/src/main/java/com/graywolf336/jail/JailMain.java b/src/main/java/com/graywolf336/jail/JailMain.java index 905820a..38c767d 100644 --- a/src/main/java/com/graywolf336/jail/JailMain.java +++ b/src/main/java/com/graywolf336/jail/JailMain.java @@ -19,11 +19,11 @@ public class JailMain extends JavaPlugin { public void onEnable() { loadConfig(); + jm = new JailManager(this); io = new JailIO(this); io.prepareStorage(); io.loadJails(); - jm = new JailManager(this); cmdHand = new CommandHandler(this); PluginManager pm = this.getServer().getPluginManager(); diff --git a/src/main/java/com/graywolf336/jail/beans/Jail.java b/src/main/java/com/graywolf336/jail/beans/Jail.java index d03a89c..84d418f 100644 --- a/src/main/java/com/graywolf336/jail/beans/Jail.java +++ b/src/main/java/com/graywolf336/jail/beans/Jail.java @@ -1,231 +1,247 @@ -package com.graywolf336.jail.beans; - -import java.util.HashMap; -import java.util.HashSet; - -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.entity.Player; - -import com.graywolf336.jail.JailMain; - -/** Represents a Jail, contains the prisoners and the cells. - * - * @author graywolf336 - * @since 3.0.0 - * @version 1.0.2 - */ -public class Jail { - private JailMain plugin; - private HashMap cells; - private HashSet nocellPrisoners;//prisoners who aren't in a cell - private String name = "", world = ""; - private int minX, minY, minZ, maxX, maxY, maxZ; - private SimpleLocation in, free; - - public Jail(JailMain plugin, String name) { - this.plugin = plugin; - this.name = name; - cells = new HashMap(); - nocellPrisoners = new HashSet(); - } - - /** Gets the instance of the plugin's main class. */ - public JailMain getPlugin() { - return this.plugin; - } - - /** Sets the name of the jail. */ - public void setName(String name) { - this.name = name; - } - - /** Gets the name of the jail. */ - public String getName() { - return this.name; - } - - /** Sets the location of the minimum point to the given location's coordinates. */ - public void setMinPoint(Location location) { - if(this.world.isEmpty()) this.world = location.getWorld().getName(); - - this.minX = location.getBlockX(); - this.minY = location.getBlockY(); - this.minZ = location.getBlockZ(); - } - - /** Accepts an array of ints as the coord, where 0 = x, 1 = y, 2 = z. */ - public void setMinPoint(int[] coords) { - if(coords.length != 3) return; - - this.minX = coords[0]; - this.minY = coords[1]; - this.minZ = coords[2]; - } - - /** Gets the minimum point as a Bukkit Location class. */ - public Location getMinPoint() { - return new Location(Bukkit.getServer().getWorld(world), minX, minY, minZ); - } - - /** Sets the location of the maximum point to the given location's coordinates. */ - public void setMaxPoint(Location location) { - if(this.world.isEmpty()) this.world = location.getWorld().getName(); - - this.maxX = location.getBlockX(); - this.maxY = location.getBlockY(); - this.maxZ = location.getBlockZ(); - } - - /** Gets the minimum point as a Bukkit Location class. */ - public Location getMaxPoint() { - return new Location(Bukkit.getServer().getWorld(world), maxX, maxY, maxZ); - } - - /** Accepts an array of ints as the coord, where 0 = x, 1 = y, 2 = z. */ - public void setMaxPoint(int[] coords) { - if(coords.length != 3) return; - - this.maxX = coords[0]; - this.maxY = coords[1]; - this.maxZ = coords[2]; - } - - /** Sets the {@link SimpleLocation location} of the teleport in. */ - public void setTeleportIn(SimpleLocation location) { - if(this.world.isEmpty()) this.world = location.getWorldName(); - - this.in = location; - } - - /** Gets the {@link Location location} of the teleport in. */ - public Location getTeleportIn() { - return this.in.getLocation(); - } - - /** Sets the {@link SimpleLocation location} of the teleport for the free spot. */ - public void setTeleportFree(SimpleLocation location) { - this.free = location; - } - - /** Gets the {@link Location location} of the teleport free spot.*/ - public Location getTeleportFree() { - return this.free.getLocation(); - } - - /** Adds a cell to the Jail. */ - public void addCell(Cell cell) { - this.cells.put(cell.getName(), cell); - } - - /** Gets the cell with the given name. */ - public Cell getCell(String name) { - return this.cells.get(name); - } - - /** Returns the first empty cell, returns null if there aren't any cells or any free cells. */ - public Cell getFirstEmptyCell() { - for(Cell c : getCells()) - if(c.hasPrisoner()) - continue; - else - return c; - - return null; - } - - /** Gets the amount of cells the jail. */ - public int getCellCount() { - return this.cells.size(); - } - - /** Gets all the cells in the jail. */ - public HashSet getCells() { - return new HashSet(this.cells.values()); - } - - /** Gets a HashSet of all the prisoners, the ones in cells and ones who aren't. */ - public HashSet getAllPrisoners() { - HashSet all = new HashSet(nocellPrisoners); //initalize the temp one to return with the prisoners not in any cells - - for(Cell c : cells.values()) - if(c.hasPrisoner()) - all.add(c.getPrisoner()); - - return all; - } - - /** Gets a HashSet of the prisoners in cells. */ - public HashSet getPrisonersInCells() { - HashSet all = new HashSet(); - - for(Cell c : getCells()) - if(c.hasPrisoner()) - all.add(c.getPrisoner()); - - return all; - } - - /** Gets a HashSet of the prisoners not in cells.*/ - public HashSet getPrisonersNotInCells() { - return this.nocellPrisoners; - } - - /** - * Returns whether the player is a prisoner in the system, whether in a cell or no cell. - * - * @param player The {@link Player player instance} of the person we're checking. - * @return true if is jailed, false if not. - */ - public boolean isPlayerJailed(Player player) { - return this.isPlayerAPrisoner(player.getName()); - } - - /** - * Returns whether the name of a player is a prisoner in the system, whether in a cell or no cell. - * - * @param name The name of the person we're checking. - * @return true if is jailed, false if not. - */ - public boolean isPlayerJailed(String name) { - return this.isPlayerAPrisoner(name); - } - - /** - * Returns whether the name of a player is a prisoner in the system, whether in a cell or no cell. - * - * @param name The name of the person we're checking. - * @return true if is a prisoner, false if not. - */ - public boolean isPlayerAPrisoner(String name) { - boolean is = false; - - for(Prisoner p : this.getAllPrisoners()) { - if(p.getName().equalsIgnoreCase(name)) { - is = true; - break; - } - } - - return is; - } - - /** - * Gets the {@link Prisoner prisoner} instance for the given name. - * - * @param name The name of the prisoner to get. - * @return the prisoner instance, can be null - */ - public Prisoner getPrisoner(String name) { - Prisoner r = null; - - for(Prisoner p : this.getAllPrisoners()) { - if(p.getName().equalsIgnoreCase(name)) { - r = p; - break; - } - } - - return r; - } -} +package com.graywolf336.jail.beans; + +import java.util.HashMap; +import java.util.HashSet; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import com.graywolf336.jail.JailMain; + +/** Represents a Jail, contains the prisoners and the cells. + * + * @author graywolf336 + * @since 3.0.0 + * @version 1.0.3 + */ +public class Jail { + private JailMain plugin; + private HashMap cells; + private HashSet nocellPrisoners;//prisoners who aren't in a cell + private String name = "", world = ""; + private int minX, minY, minZ, maxX, maxY, maxZ; + private SimpleLocation in, free; + + public Jail(JailMain plugin, String name) { + this.plugin = plugin; + this.name = name; + cells = new HashMap(); + nocellPrisoners = new HashSet(); + } + + /** Gets the instance of the plugin's main class. */ + public JailMain getPlugin() { + return this.plugin; + } + + /** Sets the name of the jail. */ + public void setName(String name) { + this.name = name; + } + + /** Gets the name of the jail. */ + public String getName() { + return this.name; + } + + /** Sets the location of the minimum point to the given location's coordinates. */ + public void setMinPoint(Location location) { + if(this.world.isEmpty()) this.world = location.getWorld().getName(); + + this.minX = location.getBlockX(); + this.minY = location.getBlockY(); + this.minZ = location.getBlockZ(); + } + + /** Accepts an array of ints as the coord, where 0 = x, 1 = y, 2 = z. */ + public void setMinPoint(int[] coords) { + if(coords.length != 3) return; + + this.minX = coords[0]; + this.minY = coords[1]; + this.minZ = coords[2]; + } + + /** Gets the minimum point as a Bukkit Location class. */ + public Location getMinPoint() { + return new Location(Bukkit.getServer().getWorld(world), minX, minY, minZ); + } + + /** Sets the location of the maximum point to the given location's coordinates. */ + public void setMaxPoint(Location location) { + if(this.world.isEmpty()) this.world = location.getWorld().getName(); + + this.maxX = location.getBlockX(); + this.maxY = location.getBlockY(); + this.maxZ = location.getBlockZ(); + } + + /** Gets the minimum point as a Bukkit Location class. */ + public Location getMaxPoint() { + return new Location(Bukkit.getServer().getWorld(world), maxX, maxY, maxZ); + } + + /** Accepts an array of ints as the coord, where 0 = x, 1 = y, 2 = z. */ + public void setMaxPoint(int[] coords) { + if(coords.length != 3) return; + + this.maxX = coords[0]; + this.maxY = coords[1]; + this.maxZ = coords[2]; + } + + /** Sets the name of the world this Jail is in. */ + public void setWorld(String name) { + this.world = name; + } + + /** Gets the name of the world this Jail is in. */ + public String getWorldName() { + return this.world; + } + + /** Gets the instance of the {@link World world} this Jail is in. */ + public World getWorld() { + return plugin.getServer().getWorld(world); + } + + /** Sets the {@link SimpleLocation location} of the teleport in. */ + public void setTeleportIn(SimpleLocation location) { + if(this.world.isEmpty()) this.world = location.getWorldName(); + + this.in = location; + } + + /** Gets the {@link Location location} of the teleport in. */ + public Location getTeleportIn() { + return this.in.getLocation(); + } + + /** Sets the {@link SimpleLocation location} of the teleport for the free spot. */ + public void setTeleportFree(SimpleLocation location) { + this.free = location; + } + + /** Gets the {@link Location location} of the teleport free spot.*/ + public Location getTeleportFree() { + return this.free.getLocation(); + } + + /** Adds a cell to the Jail. */ + public void addCell(Cell cell) { + this.cells.put(cell.getName(), cell); + } + + /** Gets the cell with the given name. */ + public Cell getCell(String name) { + return this.cells.get(name); + } + + /** Returns the first empty cell, returns null if there aren't any cells or any free cells. */ + public Cell getFirstEmptyCell() { + for(Cell c : getCells()) + if(c.hasPrisoner()) + continue; + else + return c; + + return null; + } + + /** Gets the amount of cells the jail. */ + public int getCellCount() { + return this.cells.size(); + } + + /** Gets all the cells in the jail. */ + public HashSet getCells() { + return new HashSet(this.cells.values()); + } + + /** Gets a HashSet of all the prisoners, the ones in cells and ones who aren't. */ + public HashSet getAllPrisoners() { + HashSet all = new HashSet(nocellPrisoners); //initalize the temp one to return with the prisoners not in any cells + + for(Cell c : cells.values()) + if(c.hasPrisoner()) + all.add(c.getPrisoner()); + + return all; + } + + /** Gets a HashSet of the prisoners in cells. */ + public HashSet getPrisonersInCells() { + HashSet all = new HashSet(); + + for(Cell c : getCells()) + if(c.hasPrisoner()) + all.add(c.getPrisoner()); + + return all; + } + + /** Gets a HashSet of the prisoners not in cells.*/ + public HashSet getPrisonersNotInCells() { + return this.nocellPrisoners; + } + + /** + * Returns whether the player is a prisoner in the system, whether in a cell or no cell. + * + * @param player The {@link Player player instance} of the person we're checking. + * @return true if is jailed, false if not. + */ + public boolean isPlayerJailed(Player player) { + return this.isPlayerAPrisoner(player.getName()); + } + + /** + * Returns whether the name of a player is a prisoner in the system, whether in a cell or no cell. + * + * @param name The name of the person we're checking. + * @return true if is jailed, false if not. + */ + public boolean isPlayerJailed(String name) { + return this.isPlayerAPrisoner(name); + } + + /** + * Returns whether the name of a player is a prisoner in the system, whether in a cell or no cell. + * + * @param name The name of the person we're checking. + * @return true if is a prisoner, false if not. + */ + public boolean isPlayerAPrisoner(String name) { + boolean is = false; + + for(Prisoner p : this.getAllPrisoners()) { + if(p.getName().equalsIgnoreCase(name)) { + is = true; + break; + } + } + + return is; + } + + /** + * Gets the {@link Prisoner prisoner} instance for the given name. + * + * @param name The name of the prisoner to get. + * @return the prisoner instance, can be null + */ + public Prisoner getPrisoner(String name) { + Prisoner r = null; + + for(Prisoner p : this.getAllPrisoners()) { + if(p.getName().equalsIgnoreCase(name)) { + r = p; + break; + } + } + + return r; + } +} diff --git a/src/test/java/test/java/com/graywolf336/jail/util/MockPlayerInventory.java b/src/test/java/test/java/com/graywolf336/jail/util/MockPlayerInventory.java index bf2dbdc..ef00b40 100644 --- a/src/test/java/test/java/com/graywolf336/jail/util/MockPlayerInventory.java +++ b/src/test/java/test/java/com/graywolf336/jail/util/MockPlayerInventory.java @@ -277,6 +277,7 @@ public class MockPlayerInventory implements PlayerInventory { return false; } + @SuppressWarnings("deprecation") private static Map makeMap(ItemStack[] items) { Map contents = new LinkedHashMap( items.length); diff --git a/src/test/java/test/java/com/graywolf336/jail/util/MockWorldFactory.java b/src/test/java/test/java/com/graywolf336/jail/util/MockWorldFactory.java index a7ba26b..1685d25 100644 --- a/src/test/java/test/java/com/graywolf336/jail/util/MockWorldFactory.java +++ b/src/test/java/test/java/com/graywolf336/jail/util/MockWorldFactory.java @@ -1,214 +1,215 @@ -package test.java.com.graywolf336.jail.util; - -import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.WeakHashMap; - -import org.bukkit.Difficulty; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.WorldType; -import org.bukkit.block.Block; -import org.bukkit.generator.ChunkGenerator; - -import org.mockito.invocation.InvocationOnMock; -import org.mockito.stubbing.Answer; - -import static org.mockito.Mockito.*; - -public class MockWorldFactory { - - private static final Map createdWorlds = new HashMap(); - private static final Map worldUIDS = new HashMap(); - - private static final Map pvpStates = new WeakHashMap(); - private static final Map keepSpawnInMemoryStates = new WeakHashMap(); - private static final Map difficultyStates = new WeakHashMap(); - - private MockWorldFactory() { - } - - private static void registerWorld(World world) { - createdWorlds.put(world.getName(), world); - worldUIDS.put(world.getUID(), world); - new File(TestInstanceCreator.worldsDirectory, world.getName()).mkdir(); - } - - private static World basics(String world, World.Environment env, WorldType type) { - World mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn(world); - when(mockWorld.getPVP()).thenAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) throws Throwable { - World w = (World) invocation.getMock(); - if (!pvpStates.containsKey(w)) - pvpStates.put(w, true); // default value - return pvpStates.get(w); - } - }); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) throws Throwable { - pvpStates.put((World) invocation.getMock(), (Boolean) invocation.getArguments()[0]); - return null; - } - }).when(mockWorld).setPVP(anyBoolean()); - when(mockWorld.getKeepSpawnInMemory()).thenAnswer(new Answer() { - public Boolean answer(InvocationOnMock invocation) throws Throwable { - World w = (World) invocation.getMock(); - if (!keepSpawnInMemoryStates.containsKey(w)) - keepSpawnInMemoryStates.put(w, true); // default value - return keepSpawnInMemoryStates.get(w); - } - }); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) throws Throwable { - keepSpawnInMemoryStates.put((World) invocation.getMock(), (Boolean) invocation.getArguments()[0]); - return null; - } - }).when(mockWorld).setKeepSpawnInMemory(anyBoolean()); - when(mockWorld.getDifficulty()).thenAnswer(new Answer() { - public Difficulty answer(InvocationOnMock invocation) throws Throwable { - World w = (World) invocation.getMock(); - if (!difficultyStates.containsKey(w)) - difficultyStates.put(w, Difficulty.NORMAL); // default value - return difficultyStates.get(w); - } - }); - doAnswer(new Answer() { - public Void answer(InvocationOnMock invocation) throws Throwable { - difficultyStates.put((World) invocation.getMock(), (Difficulty) invocation.getArguments()[0]); - return null; - } - }).when(mockWorld).setDifficulty(any(Difficulty.class)); - when(mockWorld.getEnvironment()).thenReturn(env); - when(mockWorld.getWorldType()).thenReturn(type); - when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); - when(mockWorld.getWorldFolder()).thenAnswer(new Answer() { - public File answer(InvocationOnMock invocation) throws Throwable { - if (!(invocation.getMock() instanceof World)) - return null; - - World thiss = (World) invocation.getMock(); - return new File(TestInstanceCreator.serverDirectory, thiss.getName()); - } - }); - when(mockWorld.getBlockAt(any(Location.class))).thenAnswer(new Answer() { - public Block answer(InvocationOnMock invocation) throws Throwable { - Location loc; - try { - loc = (Location) invocation.getArguments()[0]; - } catch (Exception e) { - return null; - } - Material blockType = Material.AIR; - Block mockBlock = mock(Block.class); - if (loc.getBlockY() < 64) { - blockType = Material.DIRT; - } - - when(mockBlock.getType()).thenReturn(blockType); - when(mockBlock.getTypeId()).thenReturn(blockType.getId()); - when(mockBlock.getWorld()).thenReturn(loc.getWorld()); - when(mockBlock.getX()).thenReturn(loc.getBlockX()); - when(mockBlock.getY()).thenReturn(loc.getBlockY()); - when(mockBlock.getZ()).thenReturn(loc.getBlockZ()); - when(mockBlock.getLocation()).thenReturn(loc); - when(mockBlock.isEmpty()).thenReturn(blockType == Material.AIR); - return mockBlock; - } - }); - when(mockWorld.getUID()).thenReturn(UUID.randomUUID()); - return mockWorld; - } - - private static World nullWorld(String world, World.Environment env, WorldType type) { - World mockWorld = mock(World.class); - when(mockWorld.getName()).thenReturn(world); - when(mockWorld.getEnvironment()).thenReturn(env); - when(mockWorld.getWorldType()).thenReturn(type); - when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); - when(mockWorld.getWorldFolder()).thenAnswer(new Answer() { - public File answer(InvocationOnMock invocation) throws Throwable { - if (!(invocation.getMock() instanceof World)) - return null; - - World thiss = (World) invocation.getMock(); - return new File(TestInstanceCreator.serverDirectory, thiss.getName()); - } - }); - when(mockWorld.getBlockAt(any(Location.class))).thenAnswer(new Answer() { - public Block answer(InvocationOnMock invocation) throws Throwable { - Location loc; - try { - loc = (Location) invocation.getArguments()[0]; - } catch (Exception e) { - return null; - } - - Block mockBlock = mock(Block.class); - Material blockType = Material.AIR; - - when(mockBlock.getType()).thenReturn(blockType); - when(mockBlock.getTypeId()).thenReturn(blockType.getId()); - when(mockBlock.getWorld()).thenReturn(loc.getWorld()); - when(mockBlock.getX()).thenReturn(loc.getBlockX()); - when(mockBlock.getY()).thenReturn(loc.getBlockY()); - when(mockBlock.getZ()).thenReturn(loc.getBlockZ()); - when(mockBlock.getLocation()).thenReturn(loc); - when(mockBlock.isEmpty()).thenReturn(blockType == Material.AIR); - return mockBlock; - } - }); - return mockWorld; - } - - public static World makeNewMockWorld(String world, World.Environment env, WorldType type) { - World w = basics(world, env, type); - registerWorld(w); - return w; - } - - public static World makeNewNullMockWorld(String world, World.Environment env, WorldType type) { - World w = nullWorld(world, env, type); - registerWorld(w); - return w; - } - - public static World makeNewMockWorld(String world, World.Environment env, WorldType type, long seed, - ChunkGenerator generator) { - World mockWorld = basics(world, env, type); - when(mockWorld.getGenerator()).thenReturn(generator); - when(mockWorld.getSeed()).thenReturn(seed); - registerWorld(mockWorld); - return mockWorld; - } - - public static World getWorld(String name) { - return createdWorlds.get(name); - } - - public static World getWorld(UUID worldUID) { - return worldUIDS.get(worldUID); - } - - public static List getWorlds() { - // we have to invert the order! - ArrayList myList = new ArrayList(createdWorlds.values()); - List retList = new ArrayList(); - for (int i = (myList.size() - 1); i >= 0; i--) { - retList.add(myList.get(i)); - } - return retList; - } - - public static void clearWorlds() { - for (String name : createdWorlds.keySet()) - new File(TestInstanceCreator.worldsDirectory, name).delete(); - createdWorlds.clear(); - worldUIDS.clear(); - } -} +package test.java.com.graywolf336.jail.util; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.WeakHashMap; + +import org.bukkit.Difficulty; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.WorldType; +import org.bukkit.block.Block; +import org.bukkit.generator.ChunkGenerator; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import static org.mockito.Mockito.*; + +public class MockWorldFactory { + + private static final Map createdWorlds = new HashMap(); + private static final Map worldUIDS = new HashMap(); + + private static final Map pvpStates = new WeakHashMap(); + private static final Map keepSpawnInMemoryStates = new WeakHashMap(); + private static final Map difficultyStates = new WeakHashMap(); + + private MockWorldFactory() { + } + + private static void registerWorld(World world) { + createdWorlds.put(world.getName(), world); + worldUIDS.put(world.getUID(), world); + new File(TestInstanceCreator.worldsDirectory, world.getName()).mkdir(); + } + + private static World basics(String world, World.Environment env, WorldType type) { + World mockWorld = mock(World.class); + when(mockWorld.getName()).thenReturn(world); + when(mockWorld.getPVP()).thenAnswer(new Answer() { + public Boolean answer(InvocationOnMock invocation) throws Throwable { + World w = (World) invocation.getMock(); + if (!pvpStates.containsKey(w)) + pvpStates.put(w, true); // default value + return pvpStates.get(w); + } + }); + doAnswer(new Answer() { + public Void answer(InvocationOnMock invocation) throws Throwable { + pvpStates.put((World) invocation.getMock(), (Boolean) invocation.getArguments()[0]); + return null; + } + }).when(mockWorld).setPVP(anyBoolean()); + when(mockWorld.getKeepSpawnInMemory()).thenAnswer(new Answer() { + public Boolean answer(InvocationOnMock invocation) throws Throwable { + World w = (World) invocation.getMock(); + if (!keepSpawnInMemoryStates.containsKey(w)) + keepSpawnInMemoryStates.put(w, true); // default value + return keepSpawnInMemoryStates.get(w); + } + }); + doAnswer(new Answer() { + public Void answer(InvocationOnMock invocation) throws Throwable { + keepSpawnInMemoryStates.put((World) invocation.getMock(), (Boolean) invocation.getArguments()[0]); + return null; + } + }).when(mockWorld).setKeepSpawnInMemory(anyBoolean()); + when(mockWorld.getDifficulty()).thenAnswer(new Answer() { + public Difficulty answer(InvocationOnMock invocation) throws Throwable { + World w = (World) invocation.getMock(); + if (!difficultyStates.containsKey(w)) + difficultyStates.put(w, Difficulty.NORMAL); // default value + return difficultyStates.get(w); + } + }); + doAnswer(new Answer() { + public Void answer(InvocationOnMock invocation) throws Throwable { + difficultyStates.put((World) invocation.getMock(), (Difficulty) invocation.getArguments()[0]); + return null; + } + }).when(mockWorld).setDifficulty(any(Difficulty.class)); + when(mockWorld.getEnvironment()).thenReturn(env); + when(mockWorld.getWorldType()).thenReturn(type); + when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); + when(mockWorld.getWorldFolder()).thenAnswer(new Answer() { + public File answer(InvocationOnMock invocation) throws Throwable { + if (!(invocation.getMock() instanceof World)) + return null; + + World thiss = (World) invocation.getMock(); + return new File(TestInstanceCreator.serverDirectory, thiss.getName()); + } + }); + when(mockWorld.getBlockAt(any(Location.class))).thenAnswer(new Answer() { + @SuppressWarnings("deprecation") + public Block answer(InvocationOnMock invocation) throws Throwable { + Location loc; + try { + loc = (Location) invocation.getArguments()[0]; + } catch (Exception e) { + return null; + } + Material blockType = Material.AIR; + Block mockBlock = mock(Block.class); + if (loc.getBlockY() < 64) { + blockType = Material.DIRT; + } + + when(mockBlock.getType()).thenReturn(blockType); + when(mockBlock.getTypeId()).thenReturn(blockType.getId()); + when(mockBlock.getWorld()).thenReturn(loc.getWorld()); + when(mockBlock.getX()).thenReturn(loc.getBlockX()); + when(mockBlock.getY()).thenReturn(loc.getBlockY()); + when(mockBlock.getZ()).thenReturn(loc.getBlockZ()); + when(mockBlock.getLocation()).thenReturn(loc); + when(mockBlock.isEmpty()).thenReturn(blockType == Material.AIR); + return mockBlock; + } + }); + when(mockWorld.getUID()).thenReturn(UUID.randomUUID()); + return mockWorld; + } + + private static World nullWorld(String world, World.Environment env, WorldType type) { + World mockWorld = mock(World.class); + when(mockWorld.getName()).thenReturn(world); + when(mockWorld.getEnvironment()).thenReturn(env); + when(mockWorld.getWorldType()).thenReturn(type); + when(mockWorld.getSpawnLocation()).thenReturn(new Location(mockWorld, 0, 64, 0)); + when(mockWorld.getWorldFolder()).thenAnswer(new Answer() { + public File answer(InvocationOnMock invocation) throws Throwable { + if (!(invocation.getMock() instanceof World)) + return null; + + World thiss = (World) invocation.getMock(); + return new File(TestInstanceCreator.serverDirectory, thiss.getName()); + } + }); + when(mockWorld.getBlockAt(any(Location.class))).thenAnswer(new Answer() { + @SuppressWarnings("deprecation") + public Block answer(InvocationOnMock invocation) throws Throwable { + Location loc; + try { + loc = (Location) invocation.getArguments()[0]; + } catch (Exception e) { + return null; + } + + Block mockBlock = mock(Block.class); + Material blockType = Material.AIR; + + when(mockBlock.getType()).thenReturn(blockType); + when(mockBlock.getTypeId()).thenReturn(blockType.getId()); + when(mockBlock.getWorld()).thenReturn(loc.getWorld()); + when(mockBlock.getX()).thenReturn(loc.getBlockX()); + when(mockBlock.getY()).thenReturn(loc.getBlockY()); + when(mockBlock.getZ()).thenReturn(loc.getBlockZ()); + when(mockBlock.getLocation()).thenReturn(loc); + when(mockBlock.isEmpty()).thenReturn(blockType == Material.AIR); + return mockBlock; + } + }); + return mockWorld; + } + + public static World makeNewMockWorld(String world, World.Environment env, WorldType type) { + World w = basics(world, env, type); + registerWorld(w); + return w; + } + + public static World makeNewNullMockWorld(String world, World.Environment env, WorldType type) { + World w = nullWorld(world, env, type); + registerWorld(w); + return w; + } + + public static World makeNewMockWorld(String world, World.Environment env, WorldType type, long seed, + ChunkGenerator generator) { + World mockWorld = basics(world, env, type); + when(mockWorld.getGenerator()).thenReturn(generator); + when(mockWorld.getSeed()).thenReturn(seed); + registerWorld(mockWorld); + return mockWorld; + } + + public static World getWorld(String name) { + return createdWorlds.get(name); + } + + public static World getWorld(UUID worldUID) { + return worldUIDS.get(worldUID); + } + + public static List getWorlds() { + // we have to invert the order! + ArrayList myList = new ArrayList(createdWorlds.values()); + List retList = new ArrayList(); + for (int i = (myList.size() - 1); i >= 0; i--) { + retList.add(myList.get(i)); + } + return retList; + } + + public static void clearWorlds() { + for (String name : createdWorlds.keySet()) + new File(TestInstanceCreator.worldsDirectory, name).delete(); + createdWorlds.clear(); + worldUIDS.clear(); + } +}