1
0
mirror of https://github.com/essentials/Essentials.git synced 2025-08-17 20:11:21 +02:00

Getting rid of locks, part one

This commit is contained in:
snowleo
2012-10-06 15:31:59 +02:00
parent f2e31e56c5
commit 463c4ff62d
32 changed files with 432 additions and 209 deletions

View File

@@ -145,11 +145,7 @@ public class Jails extends AsyncStorageObjectHolder<net.ess3.settings.Jails> imp
acquireWriteLock();
try
{
if (getData().getJails() == null)
{
getData().setJails(new HashMap<String, net.ess3.storage.StoredLocation>());
}
getData().getJails().put(jailName.toLowerCase(Locale.ENGLISH), new net.ess3.storage.StoredLocation(loc));
getData().addJail(jailName.toLowerCase(Locale.ENGLISH), loc);
}
finally
{

View File

@@ -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<String> getHomes();
Set<String> getHomes();
void addMail(String string);

View File

@@ -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<String> homes = player.getHomes();
final Set<String> 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
{

View File

@@ -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;
}

View File

@@ -75,7 +75,7 @@ public class Commandnick extends EssentialsCommand
}
else
{
return FormatUtil.formatString(user, "essentials.nick", nick);
return FormatUtil.formatString(user, Permissions.NICK, nick);
}
}

View File

@@ -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<String, net.ess3.storage.StoredLocation>());
}
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<String, net.ess3.storage.StoredLocation>());
}
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<String, net.ess3.storage.StoredLocation>());
}
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()));

View File

@@ -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<MaterialData, Double> sell = new HashMap<MaterialData, Double>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<MaterialData, Double> sell;
public Map<MaterialData, Double> getSell()
{
return sell == null
? Collections.<MaterialData, Double>emptyMap()
: Collections.unmodifiableMap(sell);
}
@MapKeyType(MaterialData.class)
@MapValueType(Double.class)
private Map<MaterialData, Double> buy = new HashMap<MaterialData, Double>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<MaterialData, Double> buy;
public Map<MaterialData, Double> getBuy()
{
return buy == null
? Collections.<MaterialData, Double>emptyMap()
: Collections.unmodifiableMap(buy);
}
@MapKeyType(EnchantmentLevel.class)
@MapValueType(Double.class)
private Map<EnchantmentLevel, Double> enchantmentMultiplier = new HashMap<EnchantmentLevel, Double>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<EnchantmentLevel, Double> enchantmentMultiplier;
public Map<EnchantmentLevel, Double> getEnchantmentMultiplier()
{
return enchantmentMultiplier == null
? Collections.<EnchantmentLevel, Double>emptyMap()
: Collections.unmodifiableMap(enchantmentMultiplier);
}
public Worth()
{
sell = new HashMap<MaterialData, Double>();
sell.put(new MaterialData(Material.APPLE, (byte)0), 1.0);
}
void setSellPrice(MaterialData data, double price)
{
Map<MaterialData, Double> sellMap = new HashMap<MaterialData, Double>(sell);
sellMap.put(data, price);
sell = sellMap;
}
}

View File

@@ -83,10 +83,7 @@ public class WorthHolder extends AsyncStorageObjectHolder<net.ess3.economy.Worth
{
acquireWriteLock();
try {
if (getData().getSell() == null) {
getData().setSell(new HashMap<MaterialData, Double>());
}
getData().getSell().put(itemStack.getData(), price);
getData().setSellPrice(itemStack.getData(), price);
} finally {
unlock();
}

View File

@@ -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");
}

View File

@@ -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<String> overridden = new ArrayList<String>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private List<String> overridden = null;
@ListType
@Comment("Disabled commands will be completelly unavailable on the server.")
private List<String> disabled = new ArrayList<String>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private List<String> disabled = null;
public boolean isDisabled(final String commandName)
{

View File

@@ -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<String, Double> commandCosts = new HashMap<String, Double>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<String, Double> commandCosts = null;
@Comment("Set this to a currency symbol you want to use.")
private String currencySymbol = "$";

View File

@@ -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<String, StoredLocation> jails = new HashMap<String, StoredLocation>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<String, StoredLocation> jails;
public Map<String, StoredLocation> getJails()
{
return jails == null
? Collections.<String, StoredLocation>emptyMap()
: Collections.unmodifiableMap(jails);
}
public void addJail(String name, Location loc) {
Map<String, StoredLocation> jailMap = new HashMap<String, StoredLocation>(getJails());
jailMap.put(name, new StoredLocation(loc));
jails = jailMap;
}
}

View File

@@ -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<ItemStack> items = new ArrayList<ItemStack>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private List<ItemStack> items;
private Double delay;
public List<ItemStack> getItems()
{
return items == null
? Collections.<ItemStack>emptyList()
: Collections.unmodifiableList(items);
}
public void setItems(Collection<ItemStack> items) {
this.items = new ArrayList<ItemStack>(items);
}
}

View File

@@ -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.<ItemStack>asList(
new ItemStack(Material.DIAMOND_SPADE, 1),
new ItemStack(Material.DIAMOND_PICKAXE, 1),
new ItemStack(Material.DIAMOND_AXE, 1)));
kits = new HashMap<String, Kit>();
kits.put("tools", kit);
}
@MapValueType(Kit.class)
private Map<String, Kit> kits = new HashMap<String, Kit>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<String, Kit> kits;
public Map<String, Kit> getKits()
{
return kits == null
? Collections.<String, Kit>emptyMap()
: Collections.unmodifiableMap(kits);
}
}

View File

@@ -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<String, WorldOptions> worlds = new HashMap<String, WorldOptions>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<String, WorldOptions> worlds;
public WorldOptions getWorldOptions(final String name)
{
if (worlds == null)
{
worlds = new HashMap<String, WorldOptions>();
return new WorldOptions();
}
final WorldOptions options = worlds.get(name);
return (options == null) ? new WorldOptions() : options;

View File

@@ -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<String, StoredLocation> spawns = new HashMap<String, StoredLocation>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<String, StoredLocation> spawns;
public Map<String, StoredLocation> getSpawns()
{
return spawns == null
? Collections.<String, StoredLocation>emptyMap()
: Collections.unmodifiableMap(spawns);
}
public void addSpawn(String name, Location location)
{
Map<String, StoredLocation> newspawns = new HashMap<String, StoredLocation>(getSpawns());
newspawns.put(name, new StoredLocation(location));
spawns = newspawns;
}
}

View File

@@ -60,11 +60,7 @@ public class SpawnsHolder extends AsyncStorageObjectHolder<Spawns> implements IE
acquireWriteLock();
try
{
if (getData().getSpawns() == null)
{
getData().setSpawns(new HashMap<String, net.ess3.storage.StoredLocation>());
}
getData().getSpawns().put(group.toLowerCase(Locale.ENGLISH), new net.ess3.storage.StoredLocation(loc));
getData().addSpawn(group, loc);
}
finally
{

View File

@@ -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<EntityType, Boolean> creatureSpawn = new HashMap<EntityType, Boolean>();
public boolean getPreventSpawn(String creatureName)

View File

@@ -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<Material> alertOnPlacement = new HashSet<Material>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> alertOnPlacement;
@ListType(Material.class)
private Set<Material> alertOnUse = new HashSet<Material>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> alertOnUse;
@ListType(Material.class)
private Set<Material> alertOnBreak = new HashSet<Material>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> alertOnBreak;
public Alert()
{
//todo full default list
alertOnPlacement = new HashSet<Material>();
alertOnPlacement.add(Material.GLASS);
alertOnUse = new HashSet<Material>();
alertOnUse.add(Material.LAVA);
alertOnBreak = new HashSet<Material>();
alertOnBreak.add(Material.OBSIDIAN);
}
}

View File

@@ -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"})
@Comment(
{
"Should we tell people they are not allowed to build"
})
private boolean warnOnBuildDisallow = true;
Alert alert = new Alert();
BlackList blacklist = new BlackList();
}

View File

@@ -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,22 +17,38 @@ import org.bukkit.Material;
@EqualsAndHashCode(callSuper = false)
public class BlackList implements StorageObject
{
@Comment({"Which blocks should people be prevented from placing"})
@Comment(
{
"Which blocks should people be prevented from placing"
})
@ListType(Material.class)
private Set<Material> placement = new HashSet<Material>();
@Comment({"Which items should people be prevented from using"})
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> placement;
@Comment(
{
"Which items should people be prevented from using"
})
@ListType(Material.class)
private Set<Material> usage = new HashSet<Material>();
@Comment({"Which blocks should people be prevented from breaking"})
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> usage;
@Comment(
{
"Which blocks should people be prevented from breaking"
})
@ListType(Material.class)
private Set<Material> breaking = new HashSet<Material>();
@Comment({"Which blocks should not be pushed by pistons"})
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> breaking;
@Comment(
{
"Which blocks should not be pushed by pistons"
})
@ListType(Material.class)
private Set<Material> piston = new HashSet<Material>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> piston;
public BlackList()
{

View File

@@ -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";
}

View File

@@ -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;
}

View File

@@ -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;

View File

@@ -165,12 +165,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder<UserData> 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<UserData> implem
acquireWriteLock();
try
{
if (getData().getTimestamps() == null)
{
getData().setTimestamps(new HashMap<UserData.TimestampType, Long>());
}
getData().getTimestamps().put(name, value);
getData().setTimestamp(name, value);
}
finally
{
@@ -248,13 +239,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implem
acquireWriteLock();
try
{
Map<String, net.ess3.storage.StoredLocation> homes = getData().getHomes();
if (homes == null)
{
homes = new HashMap<String, net.ess3.storage.StoredLocation>();
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<UserData> implem
acquireWriteLock();
try
{
if (getData().getIgnore() == null)
{
getData().setIgnore(new HashSet<String>());
}
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<UserData> implem
acquireWriteLock();
try
{
if (getData().getMails() == null)
{
getData().setMails(new ArrayList<String>());
}
getData().getMails().add(string);
getData().addMail(string);
}
finally
{
@@ -392,14 +362,7 @@ public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implem
acquireReadLock();
try
{
if (getData().getMails() == null)
{
return Collections.emptyList();
}
else
{
return new ArrayList<String>(getData().getMails());
}
return getData().getMails();
}
finally
{
@@ -483,16 +446,12 @@ public abstract class UserBase extends AsyncStorageObjectHolder<UserData> implem
}
}
public List<String> getHomes()
public Set<String> getHomes()
{
acquireReadLock();
try
{
if (getData().getHomes() == null)
{
return null;
}
return new ArrayList<String>(getData().getHomes().keySet());
return getData().getHomes().keySet();
}
finally
{

View File

@@ -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<String, StoredLocation> homes = new HashMap<String, StoredLocation>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<String, StoredLocation> homes;
public Map<String, StoredLocation> getHomes()
{
return homes == null
? Collections.<String, StoredLocation>emptyMap()
: Collections.unmodifiableMap(homes);
}
@ListType(Material.class)
private Set<Material> unlimited = new HashSet<Material>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<Material> unlimited;
public Set<Material> getUnlimited()
{
return unlimited == null
? Collections.<Material>emptySet()
: Collections.unmodifiableSet(unlimited);
}
@MapValueType(List.class)
@MapKeyType(Material.class)
private Map<Material, List<String>> powerTools = new HashMap<Material, List<String>>();
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<Material, List<String>> powerTools;
public Map<Material, List<String>> getPowerTools()
{
return powerTools == null
? Collections.<Material, List<String>>emptyMap()
: Collections.unmodifiableMap(powerTools);
}
private StoredLocation lastLocation;
@MapKeyType(TimestampType.class)
@MapValueType(Long.class)
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Map<TimestampType, Long> timestamps = new HashMap<TimestampType, Long>();
public Map<TimestampType, Long> getTimestamps()
{
return timestamps == null
? Collections.<TimestampType, Long>emptyMap()
: Collections.unmodifiableMap(timestamps);
}
private String jail;
@ListType
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private List<String> mails;
public List<String> getMails()
{
return mails == null
? Collections.<String>emptyList()
: Collections.unmodifiableList(mails);
}
private Inventory inventory;
private boolean teleportEnabled;
@ListType
@Getter(AccessLevel.NONE)
@Setter(AccessLevel.NONE)
private Set<String> ignore;
public Set<String> getIgnore()
{
return ignore == null
? Collections.<String>emptySet()
: Collections.unmodifiableSet(ignore);
}
private boolean godmode;
private boolean muted;
private boolean jailed;
@@ -53,6 +110,19 @@ 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<TimestampType, Long> ts = new HashMap<TimestampType, Long>(getTimestamps());
ts.put(type, value);
timestamps = ts;
}
public boolean hasUnlimited(Material mat)
{
return unlimited != null && unlimited.contains(mat);
@@ -60,22 +130,25 @@ public class UserData implements StorageObject
public void setUnlimited(Material mat, boolean state)
{
if (unlimited.contains(mat))
if (!state && unlimited.contains(mat))
{
unlimited.remove(mat);
Set<Material> unlimitedSet = new HashSet<Material>(getUnlimited());
unlimitedSet.remove(mat);
unlimited = unlimitedSet;
}
if (state)
if (state && !unlimited.contains(mat))
{
unlimited.add(mat);
Set<Material> unlimitedSet = new HashSet<Material>(getUnlimited());
unlimitedSet.add(mat);
unlimited = unlimitedSet;
}
}
public List<String> getPowertool(Material mat)
{
return powerTools == null ? Collections.<String>emptyList() : powerTools.get(mat);
return powerTools == null ? Collections.<String>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<String> commands)
{
if (powerTools == null)
{
powerTools = new HashMap<Material, List<String>>();
}
powerTools.put(mat, commands);
Map<Material, List<String>> powerToolMap = new HashMap<Material, List<String>>(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<String, StoredLocation> homeMap = new HashMap<String, StoredLocation>(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<String, StoredLocation> homeMap = new HashMap<String, StoredLocation>(getHomes());
homeMap.remove(home);
homes = homeMap;
}
public void addMail(String mail)
{
List<String> mailList = new ArrayList<String>(getMails());
mailList.add(mail);
mails = mailList;
}
public void clearMails()
{
mails = null;
}
public void setIgnore(String name, boolean state)
{
if (state && !ignore.contains(name))
{
Set<String> ignoreSet = new HashSet<String>(getIgnore());
ignoreSet.add(name);
ignore = ignoreSet;
}
if (!state && ignore.contains(name))
{
Set<String> ignoreSet = new HashSet<String>(getIgnore());
ignoreSet.remove(name);
ignore = ignoreSet;
}
}
}

View File

@@ -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;
}
}

View File

@@ -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();
@@ -110,6 +111,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()
{

View File

@@ -16,7 +16,7 @@ public class ConfigHolder extends AsyncStorageObjectHolder<GeoIP>
{
super(ess, GeoIP.class);
this.geoip = geoip;
onReload();
onReload(true);
}
@Override

View File

@@ -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)

View File

@@ -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())

View File

@@ -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<String, IPermission> createpermissions = new HashMap<String, IPermission>();
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<String, IPermission> usepermissions = new HashMap<String, IPermission>();
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<String, IPermission> breakpermissions = new HashMap<String, IPermission>();
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");
}