Try to use consistent UUIDs and not rely on Bukkit lookup while saving.

This commit is contained in:
KHobbits 2014-06-07 15:45:57 +01:00
parent 9d9af25c7f
commit 7e9328bd25
4 changed files with 38 additions and 25 deletions

View file

@ -12,8 +12,8 @@ import org.bukkit.Bukkit;
public class EssentialsUserConf extends EssentialsConf public class EssentialsUserConf extends EssentialsConf
{ {
final String username; public final String username;
final UUID uuid; public final UUID uuid;
public EssentialsUserConf(final String username, final UUID uuid, final File configFile) public EssentialsUserConf(final String username, final UUID uuid, final File configFile)
{ {

View file

@ -240,7 +240,7 @@ public class User extends UserData implements Comparable<User>, IReplyTo, net.es
{ {
if (!base.isOnline()) if (!base.isOnline())
{ {
this.base = new OfflinePlayer(base.getUniqueId(), ess.getServer()); this.base = new OfflinePlayer(getConfigUUID(), ess.getServer());
} }
cleanup(); cleanup();
} }

View file

@ -50,7 +50,10 @@ public abstract class UserData extends PlayerExtension implements IConf
{ {
config.forceSave(); config.forceSave();
config.getFile().delete(); config.getFile().delete();
ess.getUserMap().removeUser(this.getBase().getName()); if (config.username != null)
{
ess.getUserMap().removeUser(config.username);
}
} }
public final void cleanup() public final void cleanup()
@ -838,7 +841,7 @@ public abstract class UserData extends PlayerExtension implements IConf
this.lastAccountName = lastAccountName; this.lastAccountName = lastAccountName;
config.setProperty("lastAccountName", lastAccountName); config.setProperty("lastAccountName", lastAccountName);
config.save(); config.save();
ess.getUserMap().trackUUID(base.getUniqueId(), lastAccountName); ess.getUserMap().trackUUID(getConfigUUID(), lastAccountName);
} }
public void setNPC(boolean set) public void setNPC(boolean set)
@ -968,6 +971,11 @@ public abstract class UserData extends PlayerExtension implements IConf
return new HashMap<String, Object>(); return new HashMap<String, Object>();
} }
public UUID getConfigUUID()
{
return config.uuid;
}
public void save() public void save()
{ {
config.save(); config.save();

View file

@ -29,7 +29,7 @@ public class UserMap extends CacheLoader<String, User> implements IConf
private final transient ConcurrentSkipListMap<String, UUID> names = new ConcurrentSkipListMap<String, UUID>(); private final transient ConcurrentSkipListMap<String, UUID> names = new ConcurrentSkipListMap<String, UUID>();
private final transient ConcurrentSkipListMap<UUID, ArrayList<String>> history = new ConcurrentSkipListMap<UUID, ArrayList<String>>(); private final transient ConcurrentSkipListMap<UUID, ArrayList<String>> history = new ConcurrentSkipListMap<UUID, ArrayList<String>>();
private UUIDMap uuidMap; private UUIDMap uuidMap;
public UserMap(final IEssentials ess) public UserMap(final IEssentials ess)
{ {
super(); super();
@ -39,7 +39,7 @@ public class UserMap extends CacheLoader<String, User> implements IConf
//users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().removalListener(remListener).build(this); //users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().removalListener(remListener).build(this);
users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().build(this); users = CacheBuilder.newBuilder().maximumSize(ess.getSettings().getMaxUserCacheCount()).softValues().build(this);
} }
private void loadAllUsersAsync(final IEssentials ess) private void loadAllUsersAsync(final IEssentials ess)
{ {
ess.runTaskAsynchronously(new Runnable() ess.runTaskAsynchronously(new Runnable()
@ -77,12 +77,12 @@ public class UserMap extends CacheLoader<String, User> implements IConf
} }
}); });
} }
public boolean userExists(final UUID uuid) public boolean userExists(final UUID uuid)
{ {
return keys.contains(uuid); return keys.contains(uuid);
} }
public User getUser(final String name) public User getUser(final String name)
{ {
try try
@ -109,7 +109,7 @@ public class UserMap extends CacheLoader<String, User> implements IConf
return null; return null;
} }
} }
public User getUser(final UUID uuid) public User getUser(final UUID uuid)
{ {
try try
@ -125,7 +125,7 @@ public class UserMap extends CacheLoader<String, User> implements IConf
return null; return null;
} }
} }
public void trackUUID(final UUID uuid, final String name) public void trackUUID(final UUID uuid, final String name)
{ {
if (uuid != null) if (uuid != null)
@ -142,7 +142,7 @@ public class UserMap extends CacheLoader<String, User> implements IConf
} }
} }
} }
@Override @Override
public User load(final String stringUUID) throws Exception public User load(final String stringUUID) throws Exception
{ {
@ -154,9 +154,9 @@ public class UserMap extends CacheLoader<String, User> implements IConf
trackUUID(uuid, user.getName()); trackUUID(uuid, user.getName());
return user; return user;
} }
final File userFile = getUserFileFromID(uuid); final File userFile = getUserFileFromID(uuid);
if (userFile.exists()) if (userFile.exists())
{ {
player = new OfflinePlayer(uuid, ess.getServer()); player = new OfflinePlayer(uuid, ess.getServer());
@ -165,24 +165,29 @@ public class UserMap extends CacheLoader<String, User> implements IConf
trackUUID(uuid, user.getName()); trackUUID(uuid, user.getName());
return user; return user;
} }
throw new Exception("User not found!"); throw new Exception("User not found!");
} }
@Override @Override
public void reloadConfig() public void reloadConfig()
{ {
getUUIDMap().forceWriteUUIDMap(); getUUIDMap().forceWriteUUIDMap();
loadAllUsersAsync(ess); loadAllUsersAsync(ess);
} }
public void invalidateAll() public void invalidateAll()
{ {
users.invalidateAll(); users.invalidateAll();
} }
public void removeUser(final String name) public void removeUser(final String name)
{ {
if (names == null)
{
ess.getLogger().warning("Name collection is null, cannot remove user.");
return;
}
UUID uuid = names.get(name); UUID uuid = names.get(name);
if (uuid != null) if (uuid != null)
{ {
@ -192,12 +197,12 @@ public class UserMap extends CacheLoader<String, User> implements IConf
names.remove(name); names.remove(name);
names.remove(StringUtil.safeString(name)); names.remove(StringUtil.safeString(name));
} }
public Set<UUID> getAllUniqueUsers() public Set<UUID> getAllUniqueUsers()
{ {
return Collections.unmodifiableSet(keys.clone()); return Collections.unmodifiableSet(keys.clone());
} }
public int getUniqueUsers() public int getUniqueUsers()
{ {
return keys.size(); return keys.size();
@ -207,28 +212,28 @@ public class UserMap extends CacheLoader<String, User> implements IConf
{ {
return names; return names;
} }
protected ConcurrentSkipListMap<UUID, ArrayList<String>> getHistory() protected ConcurrentSkipListMap<UUID, ArrayList<String>> getHistory()
{ {
return history; return history;
} }
public List<String> getUserHistory(final UUID uuid) public List<String> getUserHistory(final UUID uuid)
{ {
return history.get(uuid); return history.get(uuid);
} }
public UUIDMap getUUIDMap() public UUIDMap getUUIDMap()
{ {
return uuidMap; return uuidMap;
} }
private File getUserFileFromID(final UUID uuid) private File getUserFileFromID(final UUID uuid)
{ {
final File userFolder = new File(ess.getDataFolder(), "userdata"); final File userFolder = new File(ess.getDataFolder(), "userdata");
return new File(userFolder, uuid.toString() + ".yml"); return new File(userFolder, uuid.toString() + ".yml");
} }
public File getUserFileFromString(final String name) public File getUserFileFromString(final String name)
{ {
final File userFolder = new File(ess.getDataFolder(), "userdata"); final File userFolder = new File(ess.getDataFolder(), "userdata");