Refactor Sponge subject handling

This commit is contained in:
Luck
2016-11-25 20:59:28 +00:00
Unverified
parent 443906da55
commit 18dd59ed0f
50 changed files with 919 additions and 741 deletions
@@ -138,7 +138,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public User getUser(@NonNull String name) {
final me.lucko.luckperms.common.core.model.User user = plugin.getUserManager().get(name);
final me.lucko.luckperms.common.core.model.User user = plugin.getUserManager().getByUsername(name);
return user == null ? null : new UserLink(user);
}
@@ -165,7 +165,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Group getGroup(@NonNull String name) {
final me.lucko.luckperms.common.core.model.Group group = plugin.getGroupManager().get(name);
final me.lucko.luckperms.common.core.model.Group group = plugin.getGroupManager().getIfLoaded(name);
return group == null ? null : new GroupLink(group);
}
@@ -186,7 +186,7 @@ public class ApiProvider implements LuckPermsApi {
@Override
public Track getTrack(@NonNull String name) {
final me.lucko.luckperms.common.core.model.Track track = plugin.getTrackManager().get(name);
final me.lucko.luckperms.common.core.model.Track track = plugin.getTrackManager().getIfLoaded(name);
return track == null ? null : new TrackLink(track);
}
@@ -66,7 +66,7 @@ public class ParentAdd extends SharedSubCommand {
return CommandResult.INVALID_ARGS;
}
Group group = plugin.getGroupManager().get(groupName);
Group group = plugin.getGroupManager().getIfLoaded(groupName);
if (group == null) {
Message.GROUP_DOES_NOT_EXIST.send(sender);
return CommandResult.LOADING_ERROR;
@@ -69,7 +69,7 @@ public class ParentAddTemp extends SharedSubCommand {
return CommandResult.INVALID_ARGS;
}
Group group = plugin.getGroupManager().get(groupName);
Group group = plugin.getGroupManager().getIfLoaded(groupName);
if (group == null) {
Message.GROUP_DOES_NOT_EXIST.send(sender);
return CommandResult.INVALID_ARGS;
@@ -67,7 +67,7 @@ public class ParentSet extends SharedSubCommand {
return CommandResult.INVALID_ARGS;
}
Group group = plugin.getGroupManager().get(groupName);
Group group = plugin.getGroupManager().getIfLoaded(groupName);
if (group == null) {
Message.GROUP_DOES_NOT_EXIST.send(sender);
return CommandResult.LOADING_ERROR;
@@ -66,7 +66,7 @@ public class DeleteGroup extends SingleCommand {
return CommandResult.INVALID_ARGS;
}
Group group = plugin.getGroupManager().get(groupName);
Group group = plugin.getGroupManager().getIfLoaded(groupName);
if (group == null) {
Message.GROUP_LOAD_ERROR.send(sender);
return CommandResult.LOADING_ERROR;
@@ -62,7 +62,7 @@ public class GroupClone extends SubCommand<Group> {
return CommandResult.FAILURE;
}
Group newGroup = plugin.getGroupManager().get(newGroupName);
Group newGroup = plugin.getGroupManager().getIfLoaded(newGroupName);
if (newGroup == null) {
Message.GROUP_LOAD_ERROR.send(sender);
return CommandResult.LOADING_ERROR;
@@ -60,7 +60,7 @@ public class GroupMainCommand extends MainCommand<Group> {
return null;
}
Group group = plugin.getGroupManager().get(target);
Group group = plugin.getGroupManager().getIfLoaded(target);
if (group == null) {
Message.GROUP_NOT_FOUND.send(sender);
@@ -62,7 +62,7 @@ public class GroupRename extends SubCommand<Group> {
return CommandResult.FAILURE;
}
Group newGroup = plugin.getGroupManager().get(newGroupName);
Group newGroup = plugin.getGroupManager().getIfLoaded(newGroupName);
if (newGroup == null) {
Message.GROUP_LOAD_ERROR.send(sender);
return CommandResult.LOADING_ERROR;
@@ -60,7 +60,7 @@ public class DeleteTrack extends SingleCommand {
return CommandResult.INVALID_ARGS;
}
Track track = plugin.getTrackManager().get(trackName);
Track track = plugin.getTrackManager().getIfLoaded(trackName);
if (track == null) {
Message.TRACK_LOAD_ERROR.send(sender);
return CommandResult.LOADING_ERROR;
@@ -61,7 +61,7 @@ public class TrackAppend extends SubCommand<Track> {
return CommandResult.INVALID_ARGS;
}
Group group = plugin.getGroupManager().get(groupName);
Group group = plugin.getGroupManager().getIfLoaded(groupName);
if (group == null) {
Message.GROUP_DOES_NOT_EXIST.send(sender);
return CommandResult.LOADING_ERROR;
@@ -62,7 +62,7 @@ public class TrackClone extends SubCommand<Track> {
return CommandResult.FAILURE;
}
Track newTrack = plugin.getTrackManager().get(newTrackName);
Track newTrack = plugin.getTrackManager().getIfLoaded(newTrackName);
if (newTrack == null) {
Message.TRACK_LOAD_ERROR.send(sender);
return CommandResult.LOADING_ERROR;
@@ -72,7 +72,7 @@ public class TrackInsert extends SubCommand<Track> {
return CommandResult.INVALID_ARGS;
}
Group group = plugin.getGroupManager().get(groupName);
Group group = plugin.getGroupManager().getIfLoaded(groupName);
if (group == null) {
Message.GROUP_DOES_NOT_EXIST.send(sender);
return CommandResult.LOADING_ERROR;
@@ -54,7 +54,7 @@ public class TrackMainCommand extends MainCommand<Track> {
return null;
}
Track track = plugin.getTrackManager().get(target);
Track track = plugin.getTrackManager().getIfLoaded(target);
if (track == null) {
Message.TRACK_NOT_FOUND.send(sender);
return null;
@@ -62,7 +62,7 @@ public class TrackRename extends SubCommand<Track> {
return CommandResult.FAILURE;
}
Track newTrack = plugin.getTrackManager().get(newTrackName);
Track newTrack = plugin.getTrackManager().getIfLoaded(newTrackName);
if (newTrack == null) {
Message.TRACK_LOAD_ERROR.send(sender);
return CommandResult.LOADING_ERROR;
@@ -77,7 +77,7 @@ public class UserDemote extends SubCommand<User> {
return CommandResult.INVALID_ARGS;
}
Track track = plugin.getTrackManager().get(trackName);
Track track = plugin.getTrackManager().getIfLoaded(trackName);
if (track == null) {
Message.TRACK_DOES_NOT_EXIST.send(sender);
return CommandResult.LOADING_ERROR;
@@ -152,7 +152,7 @@ public class UserDemote extends SubCommand<User> {
return CommandResult.STATE_ERROR;
}
Group previousGroup = plugin.getGroupManager().get(previous);
Group previousGroup = plugin.getGroupManager().getIfLoaded(previous);
if (previousGroup == null) {
Message.USER_DEMOTE_ERROR_MALFORMED.send(sender, previous);
return CommandResult.LOADING_ERROR;
@@ -77,7 +77,7 @@ public class UserPromote extends SubCommand<User> {
return CommandResult.INVALID_ARGS;
}
Track track = plugin.getTrackManager().get(trackName);
Track track = plugin.getTrackManager().getIfLoaded(trackName);
if (track == null) {
Message.TRACK_DOES_NOT_EXIST.send(sender);
return CommandResult.LOADING_ERROR;
@@ -152,7 +152,7 @@ public class UserPromote extends SubCommand<User> {
return CommandResult.STATE_ERROR;
}
Group nextGroup = plugin.getGroupManager().get(next);
Group nextGroup = plugin.getGroupManager().getIfLoaded(next);
if (nextGroup == null) {
Message.USER_PROMOTE_ERROR_MALFORMED.send(sender, next);
return CommandResult.LOADING_ERROR;
@@ -47,7 +47,7 @@ public class UserSwitchPrimaryGroup extends SubCommand<User> {
@Override
public CommandResult execute(LuckPermsPlugin plugin, Sender sender, User user, List<String> args, String label) throws CommandException {
Group group = plugin.getGroupManager().get(args.get(0).toLowerCase());
Group group = plugin.getGroupManager().getIfLoaded(args.get(0).toLowerCase());
if (group == null) {
Message.GROUP_DOES_NOT_EXIST.send(sender);
return CommandResult.INVALID_ARGS;
@@ -45,7 +45,7 @@ public class Group extends PermissionHolder implements Identifiable<String> {
@Override
public String getId() {
return name;
return name.toLowerCase();
}
public String getRawDisplayName() {
@@ -285,7 +285,7 @@ public abstract class PermissionHolder {
for (Map.Entry<Integer, Node> e : sortedParents) {
Node parent = e.getValue();
Group group = plugin.getGroupManager().get(parent.getGroupName());
Group group = plugin.getGroupManager().getIfLoaded(parent.getGroupName());
if (group == null) {
continue;
}
@@ -361,7 +361,7 @@ public abstract class PermissionHolder {
for (Map.Entry<Integer, Node> e : sortedParents) {
Node parent = e.getValue();
Group group = plugin.getGroupManager().get(parent.getGroupName());
Group group = plugin.getGroupManager().getIfLoaded(parent.getGroupName());
if (group == null) {
continue;
}
@@ -58,7 +58,7 @@ public class Track implements Identifiable<String> {
@Override
public String getId() {
return name;
return name.toLowerCase();
}
/**
@@ -59,17 +59,30 @@ public abstract class AbstractManager<I, T extends Identifiable<I>> implements M
@Override
public T getOrMake(I id) {
return objects.getUnchecked(id);
if (id instanceof String) {
return objects.getUnchecked((I) ((String) id).toLowerCase());
} else {
return objects.getUnchecked(id);
}
}
@Override
public T get(I id) {
return objects.getIfPresent(id);
public T getIfLoaded(I id) {
if (id instanceof String) {
return objects.getIfPresent(((String) id).toLowerCase());
} else {
return objects.getIfPresent(id);
}
}
@Override
public boolean isLoaded(I id) {
return objects.asMap().containsKey(id);
if (id instanceof String) {
return objects.asMap().containsKey(((String) id).toLowerCase());
} else {
return objects.asMap().containsKey(id);
}
}
@Override
@@ -38,7 +38,7 @@ public interface Manager<I, T extends Identifiable<I>> extends Function<I, T> {
* Gets a map containing all cached instances held by this manager.
* @return all instances held in this manager
*/
Map<I, T> getAll();
Map<I, ? extends T> getAll();
/**
* Gets or creates an object by id
@@ -52,7 +52,7 @@ public interface Manager<I, T extends Identifiable<I>> extends Function<I, T> {
* @param id The id to search by
* @return a {@link T} object if the object is loaded, returns null if the object is not loaded
*/
T get(I id);
T getIfLoaded(I id);
/**
* Check to see if a object is loaded or not
@@ -35,7 +35,7 @@ public interface UserManager extends Manager<UserIdentifier, User> {
* @param name The name to search by
* @return a {@link User} object if the user is loaded, returns null if the user is not loaded
*/
User get(String name);
User getByUsername(String name);
/**
* Get a user object by uuid
@@ -50,13 +50,6 @@ public interface UserManager extends Manager<UserIdentifier, User> {
*/
boolean giveDefaultIfNeeded(User user, boolean save);
/**
* Check whether the user's state indicates that they should be persisted to storage.
* @param user the user to check
* @return true if the user should be saved
*/
boolean shouldSave(User user);
/**
* Checks to see if the user is online, and if they are not, runs {@link #unload(Identifiable)}
* @param user The user to be cleaned up
@@ -29,7 +29,6 @@ import me.lucko.luckperms.common.core.UserIdentifier;
import me.lucko.luckperms.common.core.model.User;
import me.lucko.luckperms.common.managers.AbstractManager;
import me.lucko.luckperms.common.managers.UserManager;
import me.lucko.luckperms.common.utils.Identifiable;
import me.lucko.luckperms.exceptions.ObjectAlreadyHasException;
import java.util.Set;
@@ -46,12 +45,8 @@ public class GenericUserManager extends AbstractManager<UserIdentifier, User> im
new User(id.getUuid(), id.getUsername(), plugin);
}
/**
* Get a user object by name
* @param name The name to search by
* @return a {@link User} object if the user is loaded, returns null if the user is not loaded
*/
public User get(String name) {
@Override
public User getByUsername(String name) {
for (User user : getAll().values()) {
if (user.getName().equalsIgnoreCase(name)) {
return user;
@@ -60,15 +55,37 @@ public class GenericUserManager extends AbstractManager<UserIdentifier, User> im
return null;
}
@Override
public User get(UUID uuid) {
return get(UserIdentifier.of(uuid, null));
return getIfLoaded(UserIdentifier.of(uuid, null));
}
/**
* Set a user to the default group
* @param user the user to give to
*/
@Override
public boolean giveDefaultIfNeeded(User user, boolean save) {
return giveDefaultIfNeeded(user, save, plugin);
}
@Override
public void cleanup(User user) {
if (!plugin.isOnline(plugin.getUuidCache().getExternalUUID(user.getUuid()))) {
unload(user);
}
}
@Override
public void updateAllUsers() {
plugin.doSync(() -> {
Set<UUID> players = plugin.getOnlinePlayers();
plugin.doAsync(() -> {
for (UUID uuid : players) {
UUID internal = plugin.getUuidCache().getUUID(uuid);
plugin.getStorage().loadUser(internal, "null").join();
}
});
});
}
public static boolean giveDefaultIfNeeded(User user, boolean save, LuckPermsPlugin plugin) {
boolean hasGroup = false;
if (user.getPrimaryGroup() != null && !user.getPrimaryGroup().isEmpty()) {
@@ -96,7 +113,12 @@ public class GenericUserManager extends AbstractManager<UserIdentifier, User> im
return true;
}
public boolean shouldSave(User user) {
/**
* Check whether the user's state indicates that they should be persisted to storage.
* @param user the user to check
* @return true if the user should be saved
*/
public static boolean shouldSave(User user) {
if (user.getNodes().size() != 1) {
return true;
}
@@ -123,29 +145,4 @@ public class GenericUserManager extends AbstractManager<UserIdentifier, User> im
return false;
}
/**
* Checks to see if the user is online, and if they are not, runs {@link #unload(Identifiable)}
* @param user The user to be cleaned up
*/
public void cleanup(User user) {
if (!plugin.isOnline(plugin.getUuidCache().getExternalUUID(user.getUuid()))) {
unload(user);
}
}
/**
* Reloads the data of all online users
*/
public void updateAllUsers() {
plugin.doSync(() -> {
Set<UUID> players = plugin.getOnlinePlayers();
plugin.doAsync(() -> {
for (UUID uuid : players) {
UUID internal = plugin.getUuidCache().getUUID(uuid);
plugin.getStorage().loadUser(internal, "null").join();
}
});
});
}
}
@@ -32,6 +32,7 @@ import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.core.model.User;
import me.lucko.luckperms.common.managers.GroupManager;
import me.lucko.luckperms.common.managers.TrackManager;
import me.lucko.luckperms.common.managers.impl.GenericUserManager;
import java.io.*;
import java.util.*;
@@ -131,7 +132,7 @@ public class JSONBacking extends FlatfileBacking {
return true;
});
} else {
if (plugin.getUserManager().shouldSave(user)) {
if (GenericUserManager.shouldSave(user)) {
user.clearNodes();
user.setPrimaryGroup(null);
plugin.getUserManager().giveDefaultIfNeeded(user, false);
@@ -151,7 +152,7 @@ public class JSONBacking extends FlatfileBacking {
try {
return call(() -> {
File userFile = new File(usersDir, user.getUuid().toString() + ".json");
if (!plugin.getUserManager().shouldSave(user)) {
if (!GenericUserManager.shouldSave(user)) {
if (userFile.exists()) {
userFile.delete();
}
@@ -38,6 +38,7 @@ import me.lucko.luckperms.common.core.model.User;
import me.lucko.luckperms.common.data.Log;
import me.lucko.luckperms.common.managers.GroupManager;
import me.lucko.luckperms.common.managers.TrackManager;
import me.lucko.luckperms.common.managers.impl.GenericUserManager;
import me.lucko.luckperms.common.storage.DatastoreConfiguration;
import org.bson.Document;
@@ -167,7 +168,7 @@ public class MongoDBBacking extends AbstractBacking {
c.replaceOne(new Document("_id", user.getUuid()), fromUser(user));
}
} else {
if (plugin.getUserManager().shouldSave(user)) {
if (GenericUserManager.shouldSave(user)) {
user.clearNodes();
user.setPrimaryGroup(null);
plugin.getUserManager().giveDefaultIfNeeded(user, false);
@@ -184,7 +185,7 @@ public class MongoDBBacking extends AbstractBacking {
@Override
public boolean saveUser(User user) {
if (!plugin.getUserManager().shouldSave(user)) {
if (!GenericUserManager.shouldSave(user)) {
user.getIoLock().lock();
try {
return call(() -> {
@@ -33,6 +33,7 @@ import me.lucko.luckperms.common.core.model.User;
import me.lucko.luckperms.common.data.Log;
import me.lucko.luckperms.common.managers.GroupManager;
import me.lucko.luckperms.common.managers.TrackManager;
import me.lucko.luckperms.common.managers.impl.GenericUserManager;
import java.lang.reflect.Type;
import java.sql.Connection;
@@ -205,7 +206,7 @@ abstract class SQLBacking extends AbstractBacking {
}
} else {
if (plugin.getUserManager().shouldSave(user)) {
if (GenericUserManager.shouldSave(user)) {
user.clearNodes();
user.setPrimaryGroup(null);
plugin.getUserManager().giveDefaultIfNeeded(user, false);
@@ -221,7 +222,7 @@ abstract class SQLBacking extends AbstractBacking {
@Override
public boolean saveUser(User user) {
if (!plugin.getUserManager().shouldSave(user)) {
if (!GenericUserManager.shouldSave(user)) {
user.getIoLock().lock();
try {
return runQuery(USER_DELETE, preparedStatement -> {
@@ -30,6 +30,7 @@ import me.lucko.luckperms.common.core.model.Track;
import me.lucko.luckperms.common.core.model.User;
import me.lucko.luckperms.common.managers.GroupManager;
import me.lucko.luckperms.common.managers.TrackManager;
import me.lucko.luckperms.common.managers.impl.GenericUserManager;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;
@@ -113,7 +114,7 @@ public class YAMLBacking extends FlatfileBacking {
return true;
});
} else {
if (plugin.getUserManager().shouldSave(user)) {
if (GenericUserManager.shouldSave(user)) {
user.clearNodes();
user.setPrimaryGroup(null);
plugin.getUserManager().giveDefaultIfNeeded(user, false);
@@ -133,7 +134,7 @@ public class YAMLBacking extends FlatfileBacking {
try {
return call(() -> {
File userFile = new File(usersDir, user.getUuid().toString() + ".yml");
if (!plugin.getUserManager().shouldSave(user)) {
if (!GenericUserManager.shouldSave(user)) {
if (userFile.exists()) {
userFile.delete();
}
@@ -22,8 +22,17 @@
package me.lucko.luckperms.common.utils;
/**
* Interface to represent an identifiable object
* @param <T>
*/
public interface Identifiable<T> {
/**
* Returns the objects identifier.
* If the type is a {@link String}, this method must return a {@link String#toLowerCase()} representation
* @return the identifier
*/
T getId();
}