From e862e3c87b4cc98b880894877db17845370c22d9 Mon Sep 17 00:00:00 2001 From: ElgarL Date: Thu, 19 Jun 2014 07:59:20 +0100 Subject: Add internal name to UUID resolution to speed data lookups. --- EssentialsGroupManager/src/Changelog.txt | 3 +- .../groupmanager/dataholder/WorldDataHolder.java | 95 +++++++++++++++++++++- 2 files changed, 94 insertions(+), 4 deletions(-) (limited to 'EssentialsGroupManager/src') diff --git a/EssentialsGroupManager/src/Changelog.txt b/EssentialsGroupManager/src/Changelog.txt index bc050c97b..f2b4b5d6f 100644 --- a/EssentialsGroupManager/src/Changelog.txt +++ b/EssentialsGroupManager/src/Changelog.txt @@ -232,4 +232,5 @@ v2.1: - Fix clones forgetting sub groups. - Prevent players who have never logged in before from taking over existing accounts. - Added metrics. - - Prevent GM's own permission tests from allowing inherited permissions to override inherited negations (caused when we added the exception override for sub groups). \ No newline at end of file + - Prevent GM's own permission tests from allowing inherited permissions to override inherited negations (caused when we added the exception override for sub groups). + - Add internal name to UUID resolution to speed data lookups. \ No newline at end of file diff --git a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java index f2a43d11e..9c5a9959f 100644 --- a/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java +++ b/EssentialsGroupManager/src/org/anjocaido/groupmanager/dataholder/WorldDataHolder.java @@ -18,6 +18,8 @@ import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; import java.util.logging.Level; import java.util.logging.Logger; @@ -58,6 +60,11 @@ public class WorldDataHolder { * The actual users holder */ protected UsersDataHolder users = new UsersDataHolder(); + + /** + * List of UUID's associated with this user name. + */ + protected static Map> nameToUUIDLookup = new TreeMap>(); /** * */ @@ -116,8 +123,10 @@ public class WorldDataHolder { // Legacy name matching if (userId.length() < 36) { - // Search for a LastName match - for (User user : getUserList()) { + // Search for a name to UUID match + for (String uid : getUUIDLookup(userId)) { + + User user = getUsers().get(uid); if (user.getLastName().equalsIgnoreCase(userId)) { return user; @@ -153,7 +162,9 @@ public class WorldDataHolder { } // Search for a LastName match - for (User usr : getUserList()) { + for (String uid : getUUIDLookup(currentName)) { + + User usr = getUsers().get(uid); if (usr.getLastName().equalsIgnoreCase(currentName) && usr.getUUID().equalsIgnoreCase(usr.getLastName())) { @@ -195,6 +206,10 @@ public class WorldDataHolder { } removeUser(theUser.getUUID()); getUsers().put(theUser.getUUID().toLowerCase(), theUser); + + // Store for name to UUID lookups. + putUUIDLookup(theUser.getLastName(), theUser.getUUID().toLowerCase()); + setUsersChanged(true); if (GroupManager.isLoaded()) GroupManager.getGMEventHandler().callEvent(theUser, Action.USER_ADDED); @@ -209,10 +224,19 @@ public class WorldDataHolder { public boolean removeUser(String userId) { if (getUsers().containsKey(userId.toLowerCase())) { + + User user = getUser(userId.toLowerCase()); + + // Remove the name to UUID lookup for this user object. + removeUUIDLookup(user.getLastName(), user.getUUID()); + getUsers().remove(userId.toLowerCase()); + setUsersChanged(true); + if (GroupManager.isLoaded()) GroupManager.getGMEventHandler().callEvent(userId, GMUserEvent.Action.USER_REMOVED); + return true; } return false; @@ -1351,6 +1375,7 @@ public class WorldDataHolder { public void resetUsers() { users.resetUsers(); + this.clearUUIDLookup(); } /** @@ -1444,5 +1469,69 @@ public class WorldDataHolder { if (getUsersFile() != null) setTimeStampUsers(getUsersFile().lastModified()); } + + /** Name to UUID lookups **/ + + /** + * Add a new name to UUID lookup. + * + * @param name the User name key to index on. + * @param UUID the User object UUID (same as name if there is no UUID). + */ + public void putUUIDLookup(String name, String UUID) { + + Set lookup = getUUIDLookup(name); + + if (lookup == null) + lookup = new TreeSet(); + + lookup.add(UUID); + + nameToUUIDLookup.put(name, lookup); + } + + /** + * Delete a name lookup. + * Allows for multiple UUID's assigned to a single name (offline/online) + * + * @param name + * @param UUID + */ + public void removeUUIDLookup(String name, String UUID) { + + if (nameToUUIDLookup.containsKey(name)) { + + Set lookup = getUUIDLookup(name); + + lookup.remove(UUID); + + if (lookup.isEmpty()) { + nameToUUIDLookup.remove(name); + return; + } + + nameToUUIDLookup.put(name, lookup); + + } + + } + + /** + * + * @param name + * @return a Set of strings containing the User objects UUID (or name if they don't have a UUID) + */ + public Set getUUIDLookup(String name) { + + return nameToUUIDLookup.get(name); + } + + /** + * Reset the UUID Lookup cache + */ + protected void clearUUIDLookup() { + + nameToUUIDLookup.clear(); + } } -- cgit v1.2.3