From 463c4ff62db553fc980545665a332ef7bbecdcc6 Mon Sep 17 00:00:00 2001 From: snowleo Date: Sat, 6 Oct 2012 15:31:59 +0200 Subject: Getting rid of locks, part one --- Essentials/src/net/ess3/Jails.java | 6 +- Essentials/src/net/ess3/api/IUser.java | 3 +- Essentials/src/net/ess3/commands/Commandhome.java | 5 +- Essentials/src/net/ess3/commands/Commandmail.java | 2 +- Essentials/src/net/ess3/commands/Commandnick.java | 2 +- .../src/net/ess3/commands/Commandsethome.java | 18 +-- Essentials/src/net/ess3/economy/Worth.java | 45 ++++++- Essentials/src/net/ess3/economy/WorthHolder.java | 5 +- .../src/net/ess3/permissions/Permissions.java | 2 + Essentials/src/net/ess3/settings/Commands.java | 12 +- Essentials/src/net/ess3/settings/Economy.java | 8 +- Essentials/src/net/ess3/settings/Jails.java | 22 +++- Essentials/src/net/ess3/settings/Kit.java | 19 ++- Essentials/src/net/ess3/settings/Kits.java | 24 +++- Essentials/src/net/ess3/settings/Settings.java | 9 +- Essentials/src/net/ess3/settings/Spawns.java | 26 +++- Essentials/src/net/ess3/settings/SpawnsHolder.java | 6 +- Essentials/src/net/ess3/settings/WorldOptions.java | 5 + .../src/net/ess3/settings/antibuild/Alert.java | 18 ++- .../src/net/ess3/settings/antibuild/AntiBuild.java | 18 +-- .../src/net/ess3/settings/antibuild/BlackList.java | 51 ++++--- .../src/net/ess3/settings/geoip/Database.java | 8 +- Essentials/src/net/ess3/settings/geoip/GeoIP.java | 2 +- .../src/net/ess3/storage/YamlStorageReader.java | 2 + Essentials/src/net/ess3/user/UserBase.java | 59 ++------- Essentials/src/net/ess3/user/UserData.java | 146 ++++++++++++++++++--- Essentials/src/net/ess3/utils/FormatUtil.java | 19 +-- Essentials/test/net/ess3/StorageTest.java | 48 ++++++- .../src/net/ess3/geoip/ConfigHolder.java | 2 +- .../src/net/ess3/signs/EssentialsSign.java | 6 +- .../src/net/ess3/signs/SignBlockListener.java | 3 +- .../src/net/ess3/signs/SignsPermissions.java | 40 +----- 32 files changed, 432 insertions(+), 209 deletions(-) diff --git a/Essentials/src/net/ess3/Jails.java b/Essentials/src/net/ess3/Jails.java index 7dc513a67..f2de376ca 100644 --- a/Essentials/src/net/ess3/Jails.java +++ b/Essentials/src/net/ess3/Jails.java @@ -145,11 +145,7 @@ public class Jails extends AsyncStorageObjectHolder imp acquireWriteLock(); try { - if (getData().getJails() == null) - { - getData().setJails(new HashMap()); - } - getData().getJails().put(jailName.toLowerCase(Locale.ENGLISH), new net.ess3.storage.StoredLocation(loc)); + getData().addJail(jailName.toLowerCase(Locale.ENGLISH), loc); } finally { diff --git a/Essentials/src/net/ess3/api/IUser.java b/Essentials/src/net/ess3/api/IUser.java index 800c8aa64..1f93aaaa3 100644 --- a/Essentials/src/net/ess3/api/IUser.java +++ b/Essentials/src/net/ess3/api/IUser.java @@ -1,6 +1,7 @@ package net.ess3.api; import java.util.List; +import java.util.Set; import net.ess3.storage.IStorageObjectHolder; import net.ess3.user.CooldownException; import net.ess3.user.UserData; @@ -77,7 +78,7 @@ public interface IUser extends OfflinePlayer, CommandSender, IStorageObjectHolde void updateCompass(); - List getHomes(); + Set getHomes(); void addMail(String string); diff --git a/Essentials/src/net/ess3/commands/Commandhome.java b/Essentials/src/net/ess3/commands/Commandhome.java index 73f2b1c82..730ef1a19 100644 --- a/Essentials/src/net/ess3/commands/Commandhome.java +++ b/Essentials/src/net/ess3/commands/Commandhome.java @@ -2,6 +2,7 @@ package net.ess3.commands; import java.util.List; import java.util.Locale; +import java.util.Set; import static net.ess3.I18n._; import net.ess3.api.IUser; import net.ess3.economy.Trade; @@ -58,7 +59,7 @@ public class Commandhome extends EssentialsCommand { bed = null; } - final List homes = player.getHomes(); + final Set homes = player.getHomes(); if (homes.isEmpty() && player.equals(user)) { if (bed != null) @@ -75,7 +76,7 @@ public class Commandhome extends EssentialsCommand } else if (homes.size() == 1 && player.equals(user)) { - goHome(user, player, homes.get(0), charge); + goHome(user, player, homes.iterator().next(), charge); } else { diff --git a/Essentials/src/net/ess3/commands/Commandmail.java b/Essentials/src/net/ess3/commands/Commandmail.java index 935a31803..d9d341e09 100644 --- a/Essentials/src/net/ess3/commands/Commandmail.java +++ b/Essentials/src/net/ess3/commands/Commandmail.java @@ -63,7 +63,7 @@ public class Commandmail extends EssentialsCommand if (args.length >= 1 && "clear".equalsIgnoreCase(args[0])) { user.acquireWriteLock(); - user.getData().setMails(null); + user.getData().clearMails(); user.sendMessage(_("mailCleared")); return; } diff --git a/Essentials/src/net/ess3/commands/Commandnick.java b/Essentials/src/net/ess3/commands/Commandnick.java index 0be72fd81..8dda9fa99 100644 --- a/Essentials/src/net/ess3/commands/Commandnick.java +++ b/Essentials/src/net/ess3/commands/Commandnick.java @@ -75,7 +75,7 @@ public class Commandnick extends EssentialsCommand } else { - return FormatUtil.formatString(user, "essentials.nick", nick); + return FormatUtil.formatString(user, Permissions.NICK, nick); } } diff --git a/Essentials/src/net/ess3/commands/Commandsethome.java b/Essentials/src/net/ess3/commands/Commandsethome.java index 4f74e55dc..e9dba7e57 100644 --- a/Essentials/src/net/ess3/commands/Commandsethome.java +++ b/Essentials/src/net/ess3/commands/Commandsethome.java @@ -34,11 +34,7 @@ public class Commandsethome extends EssentialsCommand || (user.getHomes().contains(args[0].toLowerCase(Locale.ENGLISH)))) { user.acquireWriteLock(); - if (user.getData().getHomes() == null) - { - user.getData().setHomes(new HashMap()); - } - user.getData().getHomes().put(args[0].toLowerCase(Locale.ENGLISH), new net.ess3.storage.StoredLocation(user.getPlayer().getLocation())); + user.getData().addHome(args[0].toLowerCase(Locale.ENGLISH), user.getPlayer().getLocation()); } else { @@ -72,22 +68,14 @@ public class Commandsethome extends EssentialsCommand } usersHome.acquireWriteLock(); - if (usersHome.getData().getHomes() == null) - { - usersHome.getData().setHomes(new HashMap()); - } - usersHome.getData().getHomes().put(name, new net.ess3.storage.StoredLocation(user.getPlayer().getLocation())); + usersHome.getData().addHome(name, user.getPlayer().getLocation()); } } } else { user.acquireWriteLock(); - if (user.getData().getHomes() == null) - { - user.getData().setHomes(new HashMap()); - } - user.getData().getHomes().put("home", new net.ess3.storage.StoredLocation(user.getPlayer().getLocation())); + user.getData().addHome("home", user.getPlayer().getLocation()); } user.sendMessage(_("homeSet", user.getPlayer().getLocation().getWorld().getName(), user.getPlayer().getLocation().getBlockX(), user.getPlayer().getLocation().getBlockY(), user.getPlayer().getLocation().getBlockZ())); diff --git a/Essentials/src/net/ess3/economy/Worth.java b/Essentials/src/net/ess3/economy/Worth.java index c14873b22..546a35168 100644 --- a/Essentials/src/net/ess3/economy/Worth.java +++ b/Essentials/src/net/ess3/economy/Worth.java @@ -1,9 +1,13 @@ package net.ess3.economy; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.EnchantmentLevel; import net.ess3.storage.MapKeyType; import net.ess3.storage.MapValueType; @@ -18,16 +22,51 @@ public class Worth implements StorageObject { @MapKeyType(MaterialData.class) @MapValueType(Double.class) - private Map sell = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map sell; + + public Map getSell() + { + return sell == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(sell); + } @MapKeyType(MaterialData.class) @MapValueType(Double.class) - private Map buy = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map buy; + + public Map getBuy() + { + return buy == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(buy); + } @MapKeyType(EnchantmentLevel.class) @MapValueType(Double.class) - private Map enchantmentMultiplier = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map enchantmentMultiplier; + + public Map getEnchantmentMultiplier() + { + return enchantmentMultiplier == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(enchantmentMultiplier); + } public Worth() { + sell = new HashMap(); sell.put(new MaterialData(Material.APPLE, (byte)0), 1.0); } + + void setSellPrice(MaterialData data, double price) + { + Map sellMap = new HashMap(sell); + sellMap.put(data, price); + sell = sellMap; + } } diff --git a/Essentials/src/net/ess3/economy/WorthHolder.java b/Essentials/src/net/ess3/economy/WorthHolder.java index 5b1f94736..736629f98 100644 --- a/Essentials/src/net/ess3/economy/WorthHolder.java +++ b/Essentials/src/net/ess3/economy/WorthHolder.java @@ -83,10 +83,7 @@ public class WorthHolder extends AsyncStorageObjectHolder()); - } - getData().getSell().put(itemStack.getData(), price); + getData().setSellPrice(itemStack.getData(), price); } finally { unlock(); } diff --git a/Essentials/src/net/ess3/permissions/Permissions.java b/Essentials/src/net/ess3/permissions/Permissions.java index cbbc22253..15017d4e3 100644 --- a/Essentials/src/net/ess3/permissions/Permissions.java +++ b/Essentials/src/net/ess3/permissions/Permissions.java @@ -152,4 +152,6 @@ public enum Permissions implements IPermission public static DotStarPermission WARPS = new DotStarPermission("essentials.warps", PermissionDefault.TRUE); public static DotStarPermission WARP_OVERWRITE = new DotStarPermission("essentials.warp.overwrite"); public static DotStarPermission WORLD = new DotStarPermission("essentials.world"); + public static DotStarPermission NICK = new DotStarPermission("essentials.nick"); + public static DotStarPermission SIGNS = new DotStarPermission("essentials.signs"); } diff --git a/Essentials/src/net/ess3/settings/Commands.java b/Essentials/src/net/ess3/settings/Commands.java index 5aeca1590..03629c3ca 100644 --- a/Essentials/src/net/ess3/settings/Commands.java +++ b/Essentials/src/net/ess3/settings/Commands.java @@ -1,9 +1,11 @@ package net.ess3.settings; -import java.util.ArrayList; import java.util.List; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.settings.commands.*; import net.ess3.storage.Comment; import net.ess3.storage.ListType; @@ -36,10 +38,14 @@ public class Commands implements StorageObject "We should try to take priority over /god. If this doesn't work, use /essentials:god or /egod.", "If god is set using WorldGuard, use /ungod to remove then use whichever you see fit." }) - private List overridden = new ArrayList(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private List overridden = null; @ListType @Comment("Disabled commands will be completelly unavailable on the server.") - private List disabled = new ArrayList(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private List disabled = null; public boolean isDisabled(final String commandName) { diff --git a/Essentials/src/net/ess3/settings/Economy.java b/Essentials/src/net/ess3/settings/Economy.java index ffbd57045..54315bca8 100644 --- a/Essentials/src/net/ess3/settings/Economy.java +++ b/Essentials/src/net/ess3/settings/Economy.java @@ -1,9 +1,11 @@ package net.ess3.settings; -import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.economy.Worth; import net.ess3.storage.Comment; import net.ess3.storage.MapValueType; @@ -18,7 +20,9 @@ public class Economy implements StorageObject private double startingBalance = 0.0; @MapValueType(Double.class) @Comment("Defines the cost to use the given commands PER USE") - private Map commandCosts = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map commandCosts = null; @Comment("Set this to a currency symbol you want to use.") private String currencySymbol = "$"; diff --git a/Essentials/src/net/ess3/settings/Jails.java b/Essentials/src/net/ess3/settings/Jails.java index 412e04f78..db8f5f9bc 100644 --- a/Essentials/src/net/ess3/settings/Jails.java +++ b/Essentials/src/net/ess3/settings/Jails.java @@ -1,12 +1,17 @@ package net.ess3.settings; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.MapValueType; import net.ess3.storage.StorageObject; import net.ess3.storage.StoredLocation; +import org.bukkit.Location; @Data @@ -14,5 +19,20 @@ import net.ess3.storage.StoredLocation; public class Jails implements StorageObject { @MapValueType(StoredLocation.class) - private Map jails = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map jails; + + public Map getJails() + { + return jails == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(jails); + } + + public void addJail(String name, Location loc) { + Map jailMap = new HashMap(getJails()); + jailMap.put(name, new StoredLocation(loc)); + jails = jailMap; + } } diff --git a/Essentials/src/net/ess3/settings/Kit.java b/Essentials/src/net/ess3/settings/Kit.java index 822209eda..4b671f25c 100644 --- a/Essentials/src/net/ess3/settings/Kit.java +++ b/Essentials/src/net/ess3/settings/Kit.java @@ -1,9 +1,14 @@ package net.ess3.settings; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; import java.util.List; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.ListType; import net.ess3.storage.StorageObject; import org.bukkit.inventory.ItemStack; @@ -14,7 +19,19 @@ import org.bukkit.inventory.ItemStack; public class Kit implements StorageObject { @ListType(ItemStack.class) - private List items = new ArrayList(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private List items; private Double delay; + + public List getItems() + { + return items == null + ? Collections.emptyList() + : Collections.unmodifiableList(items); + } + public void setItems(Collection items) { + this.items = new ArrayList(items); + } } diff --git a/Essentials/src/net/ess3/settings/Kits.java b/Essentials/src/net/ess3/settings/Kits.java index 79abaea59..1264c8e55 100644 --- a/Essentials/src/net/ess3/settings/Kits.java +++ b/Essentials/src/net/ess3/settings/Kits.java @@ -1,9 +1,14 @@ package net.ess3.settings; +import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.MapValueType; import net.ess3.storage.StorageObject; import org.bukkit.Material; @@ -18,11 +23,22 @@ public class Kits implements StorageObject { final Kit kit = new Kit(); kit.setDelay(10.0); - kit.getItems().add(new ItemStack(Material.DIAMOND_SPADE, 1)); - kit.getItems().add(new ItemStack(Material.DIAMOND_PICKAXE, 1)); - kit.getItems().add(new ItemStack(Material.DIAMOND_AXE, 1)); + kit.setItems(Arrays.asList( + new ItemStack(Material.DIAMOND_SPADE, 1), + new ItemStack(Material.DIAMOND_PICKAXE, 1), + new ItemStack(Material.DIAMOND_AXE, 1))); + kits = new HashMap(); kits.put("tools", kit); } @MapValueType(Kit.class) - private Map kits = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map kits; + + public Map getKits() + { + return kits == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(kits); + } } diff --git a/Essentials/src/net/ess3/settings/Settings.java b/Essentials/src/net/ess3/settings/Settings.java index f5d87ba20..967d4bc18 100644 --- a/Essentials/src/net/ess3/settings/Settings.java +++ b/Essentials/src/net/ess3/settings/Settings.java @@ -2,8 +2,11 @@ package net.ess3.settings; import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.Comment; import net.ess3.storage.MapValueType; import net.ess3.storage.StorageObject; @@ -58,13 +61,15 @@ public class Settings implements StorageObject "##########################################################" }) @MapValueType(WorldOptions.class) - private Map worlds = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map worlds; public WorldOptions getWorldOptions(final String name) { if (worlds == null) { - worlds = new HashMap(); + return new WorldOptions(); } final WorldOptions options = worlds.get(name); return (options == null) ? new WorldOptions() : options; diff --git a/Essentials/src/net/ess3/settings/Spawns.java b/Essentials/src/net/ess3/settings/Spawns.java index c01f366e2..2ebd5b283 100644 --- a/Essentials/src/net/ess3/settings/Spawns.java +++ b/Essentials/src/net/ess3/settings/Spawns.java @@ -1,13 +1,18 @@ package net.ess3.settings; +import java.util.Collections; import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.Comment; import net.ess3.storage.MapValueType; import net.ess3.storage.StorageObject; import net.ess3.storage.StoredLocation; +import org.bukkit.Location; @Data @@ -29,12 +34,29 @@ public class Spawns implements StorageObject "Set this to highest, if you want to force EssentialsSpawn to handle the respawning" }) private String respawnPriority = "normal"; - @Comment({ + @Comment( + { "When we spawn for the first time, which spawnpoint do we use?", "Set to none if you want to use the spawn point of the world." }) private String newbieSpawn = "none"; @Comment("List of all spawnpoints") @MapValueType(StoredLocation.class) - private Map spawns = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map spawns; + + public Map getSpawns() + { + return spawns == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(spawns); + } + + public void addSpawn(String name, Location location) + { + Map newspawns = new HashMap(getSpawns()); + newspawns.put(name, new StoredLocation(location)); + spawns = newspawns; + } } diff --git a/Essentials/src/net/ess3/settings/SpawnsHolder.java b/Essentials/src/net/ess3/settings/SpawnsHolder.java index c07191752..0adc733c6 100644 --- a/Essentials/src/net/ess3/settings/SpawnsHolder.java +++ b/Essentials/src/net/ess3/settings/SpawnsHolder.java @@ -60,11 +60,7 @@ public class SpawnsHolder extends AsyncStorageObjectHolder implements IE acquireWriteLock(); try { - if (getData().getSpawns() == null) - { - getData().setSpawns(new HashMap()); - } - getData().getSpawns().put(group.toLowerCase(Locale.ENGLISH), new net.ess3.storage.StoredLocation(loc)); + getData().addSpawn(group, loc); } finally { diff --git a/Essentials/src/net/ess3/settings/WorldOptions.java b/Essentials/src/net/ess3/settings/WorldOptions.java index e6620e614..fb0da4e07 100644 --- a/Essentials/src/net/ess3/settings/WorldOptions.java +++ b/Essentials/src/net/ess3/settings/WorldOptions.java @@ -2,8 +2,11 @@ package net.ess3.settings; import java.util.HashMap; import java.util.Map; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.Comment; import net.ess3.storage.StorageObject; import org.bukkit.entity.EntityType; @@ -29,6 +32,8 @@ public class WorldOptions implements StorageObject private boolean godmode = true; @Comment("Prevent creatures spawning") + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) private Map creatureSpawn = new HashMap(); public boolean getPreventSpawn(String creatureName) diff --git a/Essentials/src/net/ess3/settings/antibuild/Alert.java b/Essentials/src/net/ess3/settings/antibuild/Alert.java index 65a222575..80294d294 100644 --- a/Essentials/src/net/ess3/settings/antibuild/Alert.java +++ b/Essentials/src/net/ess3/settings/antibuild/Alert.java @@ -2,8 +2,11 @@ package net.ess3.settings.antibuild; import java.util.HashSet; import java.util.Set; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.Comment; import net.ess3.storage.ListType; import net.ess3.storage.StorageObject; @@ -16,17 +19,26 @@ public class Alert implements StorageObject { @Comment("For which block types would you like to be alerted?") @ListType(Material.class) - private Set alertOnPlacement = new HashSet(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set alertOnPlacement; @ListType(Material.class) - private Set alertOnUse = new HashSet(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set alertOnUse; @ListType(Material.class) - private Set alertOnBreak = new HashSet(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set alertOnBreak; public Alert() { //todo full default list + alertOnPlacement = new HashSet(); alertOnPlacement.add(Material.GLASS); + alertOnUse = new HashSet(); alertOnUse.add(Material.LAVA); + alertOnBreak = new HashSet(); alertOnBreak.add(Material.OBSIDIAN); } } \ No newline at end of file diff --git a/Essentials/src/net/ess3/settings/antibuild/AntiBuild.java b/Essentials/src/net/ess3/settings/antibuild/AntiBuild.java index b0eb48636..59f90466c 100644 --- a/Essentials/src/net/ess3/settings/antibuild/AntiBuild.java +++ b/Essentials/src/net/ess3/settings/antibuild/AntiBuild.java @@ -1,11 +1,8 @@ package net.ess3.settings.antibuild; -import java.util.HashSet; -import java.util.Set; import lombok.Data; import lombok.EqualsAndHashCode; import net.ess3.storage.*; -import org.bukkit.Material; @Data @@ -26,14 +23,11 @@ public class AntiBuild implements StorageObject "Setting to false means EssentialsAntiBuild will never prevent you from using" }) private boolean use = true; - - @Comment({"Should we tell people they are not allowed to build"}) - private boolean warnOnBuildDisallow = true; - - - Alert alert = new Alert(); - + @Comment( + { + "Should we tell people they are not allowed to build" + }) + private boolean warnOnBuildDisallow = true; + Alert alert = new Alert(); BlackList blacklist = new BlackList(); - - } diff --git a/Essentials/src/net/ess3/settings/antibuild/BlackList.java b/Essentials/src/net/ess3/settings/antibuild/BlackList.java index c14d39664..8c9b82f0b 100644 --- a/Essentials/src/net/ess3/settings/antibuild/BlackList.java +++ b/Essentials/src/net/ess3/settings/antibuild/BlackList.java @@ -2,8 +2,11 @@ package net.ess3.settings.antibuild; import java.util.HashSet; import java.util.Set; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.Comment; import net.ess3.storage.ListType; import net.ess3.storage.StorageObject; @@ -14,23 +17,39 @@ import org.bukkit.Material; @EqualsAndHashCode(callSuper = false) public class BlackList implements StorageObject { - @Comment({"Which blocks should people be prevented from placing"}) - @ListType(Material.class) - private Set placement = new HashSet(); - - @Comment({"Which items should people be prevented from using"}) - @ListType(Material.class) - private Set usage = new HashSet(); - - @Comment({"Which blocks should people be prevented from breaking"}) - @ListType(Material.class) - private Set breaking = new HashSet(); - - @Comment({"Which blocks should not be pushed by pistons"}) - @ListType(Material.class) - private Set piston = new HashSet(); + @Comment( + { + "Which blocks should people be prevented from placing" + }) + @ListType(Material.class) + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set placement; + @Comment( + { + "Which items should people be prevented from using" + }) + @ListType(Material.class) + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set usage; + @Comment( + { + "Which blocks should people be prevented from breaking" + }) + @ListType(Material.class) + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set breaking; + @Comment( + { + "Which blocks should not be pushed by pistons" + }) + @ListType(Material.class) + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set piston; - public BlackList() { //todo defaults diff --git a/Essentials/src/net/ess3/settings/geoip/Database.java b/Essentials/src/net/ess3/settings/geoip/Database.java index 5791853a3..06c3821f8 100644 --- a/Essentials/src/net/ess3/settings/geoip/Database.java +++ b/Essentials/src/net/ess3/settings/geoip/Database.java @@ -9,8 +9,8 @@ import net.ess3.storage.StorageObject; @EqualsAndHashCode(callSuper = false) public class Database implements StorageObject { - boolean showCities = false; - boolean downloadIfMissing = true; - String downloadUrlCity = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz"; - String downloadUrl = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz"; + private boolean showCities = false; + private boolean downloadIfMissing = true; + private String downloadUrlCity = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz"; + private String downloadUrl = "http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz"; } diff --git a/Essentials/src/net/ess3/settings/geoip/GeoIP.java b/Essentials/src/net/ess3/settings/geoip/GeoIP.java index 04f6f5a77..e265b3319 100644 --- a/Essentials/src/net/ess3/settings/geoip/GeoIP.java +++ b/Essentials/src/net/ess3/settings/geoip/GeoIP.java @@ -10,6 +10,6 @@ import net.ess3.storage.StorageObject; public class GeoIP implements StorageObject { private Database database = new Database(); - private boolean showOnWhois = true; private boolean showOnLogin = true; + private boolean showOnWhois = true; } diff --git a/Essentials/src/net/ess3/storage/YamlStorageReader.java b/Essentials/src/net/ess3/storage/YamlStorageReader.java index 03e40fe1e..8359ccd4b 100644 --- a/Essentials/src/net/ess3/storage/YamlStorageReader.java +++ b/Essentials/src/net/ess3/storage/YamlStorageReader.java @@ -8,6 +8,7 @@ import net.ess3.api.IPlugin; import org.yaml.snakeyaml.TypeDescription; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.Constructor; +import org.yaml.snakeyaml.introspector.BeanAccess; public class YamlStorageReader implements IStorageReader @@ -30,6 +31,7 @@ public class YamlStorageReader implements IStorageReader if (yaml == null) { yaml = new Yaml(prepareConstructor(clazz)); + yaml.setBeanAccess(BeanAccess.FIELD); PREPARED_YAMLS.put(clazz, yaml); } ReentrantLock lock; diff --git a/Essentials/src/net/ess3/user/UserBase.java b/Essentials/src/net/ess3/user/UserBase.java index 2b0b7ae21..fb84119d2 100644 --- a/Essentials/src/net/ess3/user/UserBase.java +++ b/Essentials/src/net/ess3/user/UserBase.java @@ -165,12 +165,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem acquireReadLock(); try { - if (getData().getTimestamps() == null) - { - return 0; - } - Long ts = getData().getTimestamps().get(name); - return ts == null ? 0 : ts; + return getData().getTimestamp(name); } finally { @@ -183,11 +178,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem acquireWriteLock(); try { - if (getData().getTimestamps() == null) - { - getData().setTimestamps(new HashMap()); - } - getData().getTimestamps().put(name, value); + getData().setTimestamp(name, value); } finally { @@ -248,13 +239,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem acquireWriteLock(); try { - Map homes = getData().getHomes(); - if (homes == null) - { - homes = new HashMap(); - getData().setHomes(homes); - } - homes.put(Util.sanitizeKey(name), new net.ess3.storage.StoredLocation(loc)); + getData().addHome(Util.sanitizeKey(name), loc); } finally { @@ -351,18 +336,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem acquireWriteLock(); try { - if (getData().getIgnore() == null) - { - getData().setIgnore(new HashSet()); - } - if (set) - { - getData().getIgnore().add(user.getName().toLowerCase(Locale.ENGLISH)); - } - else - { - getData().getIgnore().remove(user.getName().toLowerCase(Locale.ENGLISH)); - } + getData().setIgnore(user.getName().toLowerCase(Locale.ENGLISH), set); } finally { @@ -375,11 +349,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem acquireWriteLock(); try { - if (getData().getMails() == null) - { - getData().setMails(new ArrayList()); - } - getData().getMails().add(string); + getData().addMail(string); } finally { @@ -392,14 +362,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem acquireReadLock(); try { - if (getData().getMails() == null) - { - return Collections.emptyList(); - } - else - { - return new ArrayList(getData().getMails()); - } + return getData().getMails(); } finally { @@ -483,16 +446,12 @@ public abstract class UserBase extends AsyncStorageObjectHolder implem } } - public List getHomes() + public Set getHomes() { acquireReadLock(); try - { - if (getData().getHomes() == null) - { - return null; - } - return new ArrayList(getData().getHomes().keySet()); + { + return getData().getHomes().keySet(); } finally { diff --git a/Essentials/src/net/ess3/user/UserData.java b/Essentials/src/net/ess3/user/UserData.java index e5e71099c..b0ed2c03b 100644 --- a/Essentials/src/net/ess3/user/UserData.java +++ b/Essentials/src/net/ess3/user/UserData.java @@ -1,13 +1,16 @@ package net.ess3.user; import java.util.*; +import lombok.AccessLevel; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; import net.ess3.storage.*; +import org.bukkit.Location; import org.bukkit.Material; - @Data @EqualsAndHashCode(callSuper = false) public class UserData implements StorageObject @@ -19,23 +22,77 @@ public class UserData implements StorageObject private String nickname; private Double money; @MapValueType(StoredLocation.class) - private Map homes = new HashMap(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map homes; + + public Map getHomes() + { + return homes == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(homes); + } @ListType(Material.class) - private Set unlimited = new HashSet(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Set unlimited; + + public Set getUnlimited() + { + return unlimited == null + ? Collections.emptySet() + : Collections.unmodifiableSet(unlimited); + } @MapValueType(List.class) @MapKeyType(Material.class) - private Map> powerTools = new HashMap>(); + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) + private Map> powerTools; + + public Map> getPowerTools() + { + return powerTools == null + ? Collections.>emptyMap() + : Collections.unmodifiableMap(powerTools); + } private StoredLocation lastLocation; @MapKeyType(TimestampType.class) @MapValueType(Long.class) + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) private Map timestamps = new HashMap(); + + public Map getTimestamps() + { + return timestamps == null + ? Collections.emptyMap() + : Collections.unmodifiableMap(timestamps); + } private String jail; @ListType + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) private List mails; + + public List getMails() + { + return mails == null + ? Collections.emptyList() + : Collections.unmodifiableList(mails); + } private Inventory inventory; private boolean teleportEnabled; @ListType + @Getter(AccessLevel.NONE) + @Setter(AccessLevel.NONE) private Set ignore; + + public Set getIgnore() + { + return ignore == null + ? Collections.emptySet() + : Collections.unmodifiableSet(ignore); + } private boolean godmode; private boolean muted; private boolean jailed; @@ -53,29 +110,45 @@ public class UserData implements StorageObject timestamps.put(TimestampType.JAIL, Long.MIN_VALUE); } + public long getTimestamp(TimestampType type) + { + Long val = getTimestamps().get(type); + return val == null ? 0 : val; + } + + public void setTimestamp(TimestampType type, Long value) + { + Map ts = new HashMap(getTimestamps()); + ts.put(type, value); + timestamps = ts; + } + public boolean hasUnlimited(Material mat) { return unlimited != null && unlimited.contains(mat); } - + public void setUnlimited(Material mat, boolean state) { - if (unlimited.contains(mat)) + if (!state && unlimited.contains(mat)) { - unlimited.remove(mat); + Set unlimitedSet = new HashSet(getUnlimited()); + unlimitedSet.remove(mat); + unlimited = unlimitedSet; } - if (state) + if (state && !unlimited.contains(mat)) { - unlimited.add(mat); + Set unlimitedSet = new HashSet(getUnlimited()); + unlimitedSet.add(mat); + unlimited = unlimitedSet; } } public List getPowertool(Material mat) { - return powerTools == null ? Collections.emptyList() : powerTools.get(mat); + return powerTools == null ? Collections.emptyList() : Collections.unmodifiableList(powerTools.get(mat)); } - - + public boolean hasPowerTools() { return powerTools != null && !powerTools.isEmpty(); @@ -83,11 +156,9 @@ public class UserData implements StorageObject public void setPowertool(Material mat, List commands) { - if (powerTools == null) - { - powerTools = new HashMap>(); - } - powerTools.put(mat, commands); + Map> powerToolMap = new HashMap>(getPowerTools()); + powerToolMap.put(mat, commands); + powerTools = powerToolMap; } public void clearAllPowertools() @@ -95,12 +166,49 @@ public class UserData implements StorageObject powerTools = null; } + public void addHome(String name, Location location) + { + Map homeMap = new HashMap(getHomes()); + homeMap.put(name, new StoredLocation(location)); + homes = homeMap; + } + public void removeHome(String home) { - if (homes == null) + if (homes == null || !homes.containsKey(home)) { return; } - homes.remove(home); + Map homeMap = new HashMap(getHomes()); + homeMap.remove(home); + homes = homeMap; + } + + public void addMail(String mail) + { + List mailList = new ArrayList(getMails()); + mailList.add(mail); + mails = mailList; + } + + public void clearMails() + { + mails = null; + } + + public void setIgnore(String name, boolean state) + { + if (state && !ignore.contains(name)) + { + Set ignoreSet = new HashSet(getIgnore()); + ignoreSet.add(name); + ignore = ignoreSet; + } + if (!state && ignore.contains(name)) + { + Set ignoreSet = new HashSet(getIgnore()); + ignoreSet.remove(name); + ignore = ignoreSet; + } } } diff --git a/Essentials/src/net/ess3/utils/FormatUtil.java b/Essentials/src/net/ess3/utils/FormatUtil.java index f84368901..a00e43a47 100644 --- a/Essentials/src/net/ess3/utils/FormatUtil.java +++ b/Essentials/src/net/ess3/utils/FormatUtil.java @@ -1,6 +1,5 @@ package net.ess3.utils; -import de.bananaco.bpermissions.imp.Permissions; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.Locale; @@ -10,8 +9,11 @@ import static net.ess3.I18n._; import net.ess3.api.IEssentials; import net.ess3.api.ISettings; import net.ess3.api.IUser; +import net.ess3.permissions.DotStarPermission; -public class FormatUtil { + +public class FormatUtil +{ static final transient Pattern REPLACE_COLOR_PATTERN = Pattern.compile("&([0-9a-f])"); static final transient Pattern REPLACE_MAGIC_PATTERN = Pattern.compile("&(k)"); static final transient Pattern REPLACE_PATTERN = Pattern.compile("&([0-9a-fk-or])"); @@ -74,14 +76,14 @@ public class FormatUtil { return REPLACE_PATTERN.matcher(input).replaceAll("\u00a7$1"); } - public static String formatString(final IUser user, final String permBase, final String input) + public static String formatString(final IUser user, final DotStarPermission permBase, final String input) { if (input == null) { return null; } String message; - if (Permissions.hasPermission(user.getPlayer(), permBase + ".color")) + if (permBase.isAuthorized(user.getPlayer(), "color")) { message = replaceColor(input, REPLACE_COLOR_PATTERN); } @@ -89,7 +91,7 @@ public class FormatUtil { { message = stripColor(input, VANILLA_COLOR_PATTERN); } - if (Permissions.hasPermission(user.getPlayer(), permBase + ".magic")) + if (permBase.isAuthorized(user.getPlayer(), "magic")) { message = replaceColor(message, REPLACE_MAGIC_PATTERN); } @@ -97,7 +99,7 @@ public class FormatUtil { { message = stripColor(message, VANILLA_MAGIC_PATTERN); } - if (Permissions.hasPermission(user.getPlayer(), permBase + ".format")) + if (permBase.isAuthorized(user.getPlayer(), "format")) { message = replaceColor(message, REPLACE_FORMAT_PATTERN); } @@ -108,14 +110,14 @@ public class FormatUtil { return message; } - public static String formatMessage(final IUser user, final String permBase, final String input) + public static String formatMessage(final IUser user, final DotStarPermission permBase, final String input) { if (input == null) { return null; } String message = formatString(user, permBase, input); - if (!Permissions.hasPermission(user.getPlayer(), permBase + ".url")) + if (!permBase.isAuthorized(user.getPlayer(), "url")) { message = blockURL(message); } @@ -147,5 +149,4 @@ public class FormatUtil { } return str; } - } diff --git a/Essentials/test/net/ess3/StorageTest.java b/Essentials/test/net/ess3/StorageTest.java index 8274f0e91..723b76487 100644 --- a/Essentials/test/net/ess3/StorageTest.java +++ b/Essentials/test/net/ess3/StorageTest.java @@ -2,6 +2,7 @@ package net.ess3; import java.io.*; import net.ess3.settings.Settings; +import net.ess3.settings.geoip.GeoIP; import net.ess3.storage.ObjectLoadException; import net.ess3.storage.StorageObject; import net.ess3.storage.YamlStorageReader; @@ -48,7 +49,7 @@ public class StorageTest extends EssentialsTest System.out.println(settings2.toString()); ext.mark("reload settings"); System.out.println(ext.end()); - //assertEquals("Default and rewritten config should be equal", settings, settings2); + assertEquals("Default and rewritten config should be equal", settings, settings2); //that assertion fails, because empty list and maps return as null } catch (ObjectLoadException ex) @@ -75,7 +76,7 @@ public class StorageTest extends EssentialsTest for (int j = 0; j < 10000; j++) { - userdata.getHomes().put("home", new net.ess3.storage.StoredLocation(new Location(world, j, j, j))); + userdata.addHome("home", new Location(world, j, j, j)); } ext.mark("change home 10000 times"); final ByteArrayOutputStream baos = new ByteArrayOutputStream(); @@ -109,6 +110,49 @@ public class StorageTest extends EssentialsTest } } + + @Test + public void testGeoIp() + { + try + { + assertTrue(StorageObject.class.isAssignableFrom(Settings.class)); + ExecuteTimer ext = new ExecuteTimer(); + ext.start(); + final ByteArrayInputStream bais = new ByteArrayInputStream(new byte[0]); + final Reader reader = new InputStreamReader(bais); + GeoIP geoip = new YamlStorageReader(reader, null).load(GeoIP.class); + ext.mark("load empty geoip"); + final ByteArrayInputStream bais3 = new ByteArrayInputStream(new byte[0]); + final Reader reader3 = new InputStreamReader(bais3); + final GeoIP geoip3 = new YamlStorageReader(reader3, null).load(GeoIP.class); + ext.mark("load empty geoip (class cached)"); + final ByteArrayOutputStream baos = new ByteArrayOutputStream(); + final PrintWriter writer = new PrintWriter(baos); + //geoip = geoip.withDatabase(geoip.getDatabase().withDownloadIfMissing(false)); + new YamlStorageWriter(writer).save(geoip); + writer.close(); + ext.mark("write geoip"); + byte[] written = baos.toByteArray(); + String writtenStr = new String(written); + System.out.println(writtenStr); + //writtenStr = writtenStr.replace("downloadIfMissing: true", "downloadIfMissing: false"); + System.out.println(writtenStr); + final ByteArrayInputStream bais2 = new ByteArrayInputStream(writtenStr.getBytes()); + final Reader reader2 = new InputStreamReader(bais2); + final GeoIP geoip2 = new YamlStorageReader(reader2, null).load(GeoIP.class); + System.out.println(geoip.toString()); + System.out.println(geoip2.toString()); + ext.mark("reload geoip"); + System.out.println(ext.end()); + assertEquals("Default and rewritten config should be equal", geoip, geoip2); + //that assertion fails, because empty list and maps return as null + } + catch (ObjectLoadException ex) + { + fail(ex.getMessage()); + } + } /*@Test public void testOldUserdata() diff --git a/EssentialsGeoIP/src/net/ess3/geoip/ConfigHolder.java b/EssentialsGeoIP/src/net/ess3/geoip/ConfigHolder.java index 068a1ba45..64c4c3206 100644 --- a/EssentialsGeoIP/src/net/ess3/geoip/ConfigHolder.java +++ b/EssentialsGeoIP/src/net/ess3/geoip/ConfigHolder.java @@ -16,7 +16,7 @@ public class ConfigHolder extends AsyncStorageObjectHolder { super(ess, GeoIP.class); this.geoip = geoip; - onReload(); + onReload(true); } @Override diff --git a/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java b/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java index ad48074fb..1a229a8c8 100644 --- a/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java +++ b/EssentialsSigns/src/net/ess3/signs/EssentialsSign.java @@ -34,7 +34,7 @@ public class EssentialsSign { final ISign sign = new EventSign(event); final IUser user = ess.getUserMap().getUser(event.getPlayer()); - if (!SignsPermissions.getCreatePermission(signName).isAuthorized(user)) + if (!SignsPermissions.CREATE.isAuthorized(user, signName)) { // Return true, so other plugins can use the same sign title, just hope // they won't change it to ยง1[Signname] @@ -83,7 +83,7 @@ public class EssentialsSign final IUser user = ess.getUserMap().getUser(player); try { - return SignsPermissions.getUsePermission(signName).isAuthorized(user) + return SignsPermissions.USE.isAuthorized(user, signName) && onSignInteract(sign, user, getUsername(user), ess); } catch (ChargeException ex) @@ -104,7 +104,7 @@ public class EssentialsSign final IUser user = ess.getUserMap().getUser(player); try { - return SignsPermissions.getBreakPermission(signName).isAuthorized(user) + return SignsPermissions.BREAK.isAuthorized(user, signName) && onSignBreak(sign, user, getUsername(user), ess); } catch (SignException ex) diff --git a/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java b/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java index ac44e0a61..ba528006f 100644 --- a/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java +++ b/EssentialsSigns/src/net/ess3/signs/SignBlockListener.java @@ -6,6 +6,7 @@ import net.ess3.api.IUser; import net.ess3.utils.Util; import java.util.logging.Level; import java.util.logging.Logger; +import net.ess3.permissions.Permissions; import net.ess3.utils.FormatUtil; import org.bukkit.Material; import org.bukkit.block.Block; @@ -92,7 +93,7 @@ public class SignBlockListener implements Listener for (int i = 0; i < 4; i++) { - event.setLine(i, FormatUtil.formatString(user, "essentials.signs", event.getLine(i))); + event.setLine(i, FormatUtil.formatString(user, Permissions.SIGNS, event.getLine(i))); } for (Signs signs : Signs.values()) diff --git a/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java b/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java index 21c736b7d..2f45de72d 100644 --- a/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java +++ b/EssentialsSigns/src/net/ess3/signs/SignsPermissions.java @@ -5,6 +5,7 @@ import net.ess3.permissions.BasePermission; import java.util.HashMap; import java.util.Locale; import java.util.Map; +import net.ess3.permissions.DotStarPermission; public class SignsPermissions @@ -12,40 +13,7 @@ public class SignsPermissions public static final IPermission COLOR = new BasePermission("essentials.signs.", "color"); public static final IPermission PROTECTION_OVERRIDE = new BasePermission("essentials.signs.protection.", "override"); public static final IPermission TRADE_OVERRIDE = new BasePermission("essentials.signs.trade.", "override"); - private static Map createpermissions = new HashMap(); - - public static IPermission getCreatePermission(final String signName) - { - IPermission perm = createpermissions.get(signName); - if (perm == null) - { - perm = new BasePermission("essentials.signs.create.", signName.toLowerCase(Locale.ENGLISH)); - createpermissions.put(signName, perm); - } - return perm; - } - private static Map usepermissions = new HashMap(); - - public static IPermission getUsePermission(final String signName) - { - IPermission perm = usepermissions.get(signName); - if (perm == null) - { - perm = new BasePermission("essentials.signs.use.", signName.toLowerCase(Locale.ENGLISH)); - usepermissions.put(signName, perm); - } - return perm; - } - private static Map breakpermissions = new HashMap(); - - public static IPermission getBreakPermission(final String signName) - { - IPermission perm = breakpermissions.get(signName); - if (perm == null) - { - perm = new BasePermission("essentials.signs.break.", signName.toLowerCase(Locale.ENGLISH)); - breakpermissions.put(signName, perm); - } - return perm; - } + public static final DotStarPermission CREATE = new DotStarPermission("essentials.signs.create"); + public static final DotStarPermission USE = new DotStarPermission("essentials.signs.use"); + public static final DotStarPermission BREAK = new DotStarPermission("essentials.signs.break"); } -- cgit v1.2.3