Skip to content

Commit e04a70e

Browse files
committed
BREAKING: Everything touching permission caches is now broke
1 parent 4c2f8db commit e04a70e

File tree

6 files changed

+54
-52
lines changed

6 files changed

+54
-52
lines changed

API/src/main/java/me/innectic/permissify/api/database/DatabaseHandler.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
public abstract class DatabaseHandler {
4242

4343
@Getter protected Map<UUID, List<Permission>> cachedPermissions = new HashMap<>();
44-
@Getter protected List<PermissionGroup> cachedGroups = new ArrayList<>();
44+
@Getter protected Map<String, PermissionGroup> cachedGroups = new HashMap<>();
4545
@Getter protected Optional<PermissionGroup> defaultGroup = Optional.empty();
4646
@Getter protected final Optional<ConnectionInformation> connectionInformation;
4747
@Getter protected List<UUID> superAdmins = new ArrayList<>();
@@ -165,7 +165,7 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
165165
*
166166
* @return the registered permission groups
167167
*/
168-
public abstract List<PermissionGroup> getGroups();
168+
public abstract Map<String, PermissionGroup> getGroups();
169169

170170
/**
171171
* Get all permission groups a player is in.
@@ -276,6 +276,6 @@ public DatabaseHandler(ConnectionInformation connectionInformation) {
276276
*/
277277
public abstract void setDefaultGroup(PermissionGroup group);
278278

279-
public abstract void setGroupLadder(PermissionGroup group, AbstractLadder ladder);
280-
public abstract Optional<AbstractLadder> getGroupLadder(PermissionGroup group);
279+
public abstract void setGroupLadder(String group, AbstractLadder ladder);
280+
public abstract Optional<AbstractLadder> getGroupLadder(String group);
281281
}

API/src/main/java/me/innectic/permissify/api/database/handlers/SQLHandler.java

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import me.innectic.permissify.api.database.ConnectionInformation;
3232
import me.innectic.permissify.api.group.group.PermissionGroup;
3333
import me.innectic.permissify.api.group.ladder.AbstractLadder;
34+
import me.innectic.permissify.api.group.ladder.impl.DefaultLadder;
3435
import me.innectic.permissify.api.profile.PermissifyProfile;
3536
import me.innectic.permissify.api.util.FormatterType;
3637

@@ -159,7 +160,7 @@ public boolean connect() {
159160

160161
@Override
161162
public void reload(List<UUID> onlinePlayers) {
162-
cachedGroups = new ArrayList<>();
163+
cachedGroups = new HashMap<>();
163164
cachedPermissions = new HashMap<>();
164165
superAdmins = new ArrayList<>();
165166

@@ -182,10 +183,11 @@ public void reload(List<UUID> onlinePlayers) {
182183
PreparedStatement groupStatement = connection.get().prepareStatement("SELECT * from groups");
183184
ResultSet groupResults = groupStatement.executeQuery();
184185
while (groupResults.next()) {
185-
PermissionGroup group = new PermissionGroup(groupResults.getString("name"),
186+
String groupName = groupResults.getString("name");
187+
PermissionGroup group = new PermissionGroup(groupName,
186188
groupResults.getString("chatcolor"),
187189
groupResults.getString("prefix"),
188-
groupResults.getString("suffix"));
190+
groupResults.getString("suffix"), getGroupLadder(groupName).orElse(new DefaultLadder()));
189191
PreparedStatement groupPermissionsStatement = connection.get().prepareStatement("SELECT * FROM groupPermissions WHERE groupName=?");
190192
groupPermissionsStatement.setString(1, group.getName());
191193
ResultSet groupPermissionsResult = groupPermissionsStatement.executeQuery();
@@ -203,7 +205,7 @@ public void reload(List<UUID> onlinePlayers) {
203205
}
204206
groupMembersResults.close();
205207
groupMembersStatement.close();
206-
cachedGroups.add(group);
208+
cachedGroups.put(groupName, group);
207209
if (groupResults.getBoolean("defaultGroup")) defaultGroup = Optional.of(group);
208210
}
209211
groupStatement.close();
@@ -218,7 +220,7 @@ public void reload(List<UUID> onlinePlayers) {
218220

219221
@Override
220222
public void drop() {
221-
cachedGroups = new ArrayList<>();
223+
cachedGroups = new HashMap<>();
222224
cachedPermissions = new HashMap<>();
223225
superAdmins = new ArrayList<>();
224226
chatFormat = "";
@@ -233,7 +235,7 @@ public void loadProfile(PermissifyProfile profile) {
233235
else removePermission(uuid, permission.getPermission());
234236
}));
235237
// Create groups
236-
profile.getGroups().forEach(group -> {
238+
profile.getGroups().forEach((key, group) -> {
237239
createGroup(group.getName(), group.getPrefix(), group.getSuffix(), group.getChatColor());
238240
Optional<PermissionGroup> created = getGroup(group.getName());
239241
if (!created.isPresent()) {
@@ -386,9 +388,9 @@ public List<Permission> getPermissions(UUID uuid) {
386388
@Override
387389
public boolean createGroup(String name, String prefix, String suffix, String chatColor) {
388390
// Make sure that this group doesn't already exist
389-
if (cachedGroups.stream().anyMatch(group -> group.getName().equalsIgnoreCase(name))) return false;
391+
if (cachedGroups.getOrDefault(name, null) != null) return false;
390392
// Add the new group to the cache
391-
cachedGroups.add(new PermissionGroup(name, chatColor, prefix, suffix));
393+
cachedGroups.put(name, new PermissionGroup(name, chatColor, prefix, suffix, new DefaultLadder()));
392394

393395
Optional<Connection> connection = getConnection();
394396
if (!connection.isPresent()) {
@@ -416,9 +418,10 @@ public boolean createGroup(String name, String prefix, String suffix, String cha
416418

417419
@Override
418420
public boolean deleteGroup(String name) {
419-
if (getGroups().stream().noneMatch(group -> group.getName().equalsIgnoreCase(name))) return false;
421+
if (getGroups().entrySet().stream().map(Map.Entry::getValue).noneMatch(group -> group.getName().equalsIgnoreCase(name)))
422+
return false;
420423
// Delete from the cache
421-
cachedGroups.removeIf(group -> group.getName().equalsIgnoreCase(name));
424+
cachedGroups.remove(name);
422425

423426
Optional<Connection> connection = getConnection();
424427
if (!connection.isPresent()) {
@@ -440,16 +443,15 @@ public boolean deleteGroup(String name) {
440443

441444
@Override
442445
public Optional<PermissionGroup> getGroup(String name) {
443-
return cachedGroups.stream().filter(group -> group.getName().equalsIgnoreCase(name)).findFirst();
446+
return Optional.ofNullable(cachedGroups.getOrDefault(name, null));
444447
}
445448

446449
@Override
447450
public boolean addPlayerToGroup(UUID uuid, PermissionGroup group) {
448451
if (group.hasPlayer(uuid)) return false;
449452
group.addPlayer(uuid, false);
450453
// Update the cache
451-
cachedGroups.removeIf(entry -> entry.getName().equals(group.getName()));
452-
cachedGroups.add(group);
454+
cachedGroups.put(group.getName(), group);
453455

454456
Optional<Connection> connection = getConnection();
455457
if (!connection.isPresent()) {
@@ -476,8 +478,8 @@ public boolean removePlayerFromGroup(UUID uuid, PermissionGroup group) {
476478
if (!group.hasPlayer(uuid)) return false;
477479
group.removePlayer(uuid);
478480
// Update the cache
479-
cachedGroups.removeIf(entry -> entry.getName().equals(group.getName()));
480-
cachedGroups.add(group);
481+
cachedGroups.remove(group.getName());
482+
cachedGroups.put(group.getName(), group);
481483

482484
Optional<Connection> connection = getConnection();
483485
if (!connection.isPresent()) {
@@ -499,13 +501,13 @@ public boolean removePlayerFromGroup(UUID uuid, PermissionGroup group) {
499501
}
500502

501503
@Override
502-
public List<PermissionGroup> getGroups() {
504+
public Map<String, PermissionGroup> getGroups() {
503505
return cachedGroups;
504506
}
505507

506508
@Override
507509
public List<PermissionGroup> getGroups(UUID uuid) {
508-
return cachedGroups.stream().filter(group -> group.hasPlayer(uuid)).collect(Collectors.toList());
510+
return cachedGroups.entrySet().stream().map(Map.Entry::getValue).filter(group -> group.hasPlayer(uuid)).collect(Collectors.toList());
509511
}
510512

511513
@Override
@@ -552,7 +554,7 @@ public void updateCache(UUID uuid) {
552554
ResultSet results = statement.executeQuery();
553555
while (results.next()) {
554556
String groupName = results.getString("group");
555-
Optional<PermissionGroup> group = cachedGroups.stream().filter(permissionGroup -> permissionGroup .getName().equals(groupName)).findFirst();
557+
Optional<PermissionGroup> group = getGroup(groupName);
556558
// Get the group from the database, if we don't have have it already
557559
if (!group.isPresent()) {
558560
PreparedStatement groupStatement = connection.get().prepareStatement("SELECT prefix,suffix,chatcolor FROM groups WHERE name=?");
@@ -561,7 +563,7 @@ public void updateCache(UUID uuid) {
561563
if (!groupResults.next()) return;
562564
PermissionGroup permissionGroup = new PermissionGroup(
563565
groupName, groupResults.getString("chatcolor"), groupResults.getString("prefix"),
564-
groupResults.getString("suffix"));
566+
groupResults.getString("suffix"), getGroupLadder(groupName).orElse(new DefaultLadder()));
565567
groupResults.close();
566568
groupStatement.close();
567569
PreparedStatement groupPlayersStatement = connection.get().prepareStatement("SELECT uuid,`primary` FROM groupMembers WHERE `group`=?");
@@ -571,7 +573,7 @@ public void updateCache(UUID uuid) {
571573
permissionGroup.addPlayer(UUID.fromString(groupPlayersResult.getString("uuid")),
572574
groupPlayersResult.getBoolean("primary"));
573575
}
574-
cachedGroups.add(permissionGroup);
576+
cachedGroups.put(groupName, permissionGroup);
575577
}
576578
}
577579
results.close();
@@ -585,7 +587,8 @@ public void updateCache(UUID uuid) {
585587
@Override
586588
public boolean addGroupPermission(String group, String... permissions) {
587589
// Make sure this is a valid group
588-
Optional<PermissionGroup> permissionGroup = getGroups().stream().filter(permission -> permission.getName().equalsIgnoreCase(group)).findFirst();
590+
Optional<PermissionGroup> permissionGroup = getGroups().entrySet().stream().map(Map.Entry::getValue)
591+
.filter(permission -> permission.getName().equalsIgnoreCase(group)).findFirst();
589592
if (!permissionGroup.isPresent()) return false;
590593
// Update the cache
591594
for (String permission : permissions) {
@@ -614,7 +617,8 @@ public boolean addGroupPermission(String group, String... permissions) {
614617

615618
@Override
616619
public boolean removeGroupPermission(String group, String... permissions) {
617-
Optional<PermissionGroup> permissionGroup = getGroups().stream().filter(permission -> permission.getName().equalsIgnoreCase(group)).findFirst();
620+
Optional<PermissionGroup> permissionGroup = getGroups().entrySet().stream().map(Map.Entry::getValue)
621+
.filter(permission -> permission.getName().equalsIgnoreCase(group)).findFirst();
618622
if (!permissionGroup.isPresent()) return false;
619623

620624
for (String permission : permissions) {
@@ -642,7 +646,8 @@ public boolean removeGroupPermission(String group, String... permissions) {
642646

643647
@Override
644648
public boolean hasGroupPermission(String group, String permission) {
645-
Optional<PermissionGroup> permissionGroup = getGroups().stream().filter(perm -> perm.getName().equalsIgnoreCase(group)).findFirst();
649+
Optional<PermissionGroup> permissionGroup = getGroups().entrySet().stream().map(Map.Entry::getValue)
650+
.filter(perm -> perm.getName().equalsIgnoreCase(group)).findFirst();
646651
return permissionGroup.map(groupPermission -> groupPermission.hasPermission(permission)).orElse(false);
647652
}
648653

@@ -795,17 +800,17 @@ public void setDefaultGroup(PermissionGroup group) {
795800
}
796801

797802
@Override
798-
public void setGroupLadder(PermissionGroup group, AbstractLadder ladder) {
799-
// TODO: Make this method less expensive
800-
group.setLadder(ladder);
801-
this.cachedGroups.removeIf(pGroup -> pGroup.getName().equals(group.getName())); // TODO: Groups should have their own equals thing
802-
this.cachedGroups.add(group);
803+
public void setGroupLadder(String name, AbstractLadder ladder) {
804+
getGroup(name).ifPresent(group -> {
805+
group.setLadder(ladder);
806+
this.cachedGroups.put(name, group);
807+
});
803808
}
804809

805810
@Override
806-
public Optional<AbstractLadder> getGroupLadder(PermissionGroup group) {
807-
// TODO: Actually commit this to the database
808-
return Optional.ofNullable(group.getLadder());
811+
public Optional<AbstractLadder> getGroupLadder(String name) {
812+
Optional<PermissionGroup> groupOptional = getGroup(name);
813+
return groupOptional.map(permissionGroup -> Optional.of(permissionGroup.getLadder())).orElseGet(() -> Optional.of(new DefaultLadder()));
809814
}
810815

811816
private boolean hasFormattingTable(Connection connection, String database) {

API/src/main/java/me/innectic/permissify/api/group/group/PermissionGroup.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
package me.innectic.permissify.api.group.group;
2626

2727
import lombok.Getter;
28+
import lombok.NonNull;
2829
import lombok.RequiredArgsConstructor;
2930
import lombok.Setter;
3031
import me.innectic.permissify.api.group.Permission;
@@ -43,9 +44,9 @@ public class PermissionGroup implements Serializable {
4344
@Getter private final String chatColor;
4445
@Getter private final String prefix;
4546
@Getter private final String suffix;
47+
@NonNull @Getter @Setter private AbstractLadder ladder;
4648
@Getter private List<Permission> permissions = new ArrayList<>();
4749
@Getter private Map<UUID, Boolean> players = new HashMap<>();
48-
@Getter @Setter private AbstractLadder ladder; // TODO: Ask the database for the ladder
4950

5051
/**
5152
* Remove a permission from the group

API/src/main/java/me/innectic/permissify/api/profile/PermissifyProfile.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
*/
4141
@AllArgsConstructor
4242
public class PermissifyProfile implements Serializable {
43-
@Getter private final List<PermissionGroup> groups;
43+
@Getter private final Map<String, PermissionGroup> groups;
4444
@Getter private Map<UUID, List<Permission>> playerPermissions;
4545
@Getter private PermissionGroup defaultGroup;
4646
@Getter private String chatFormat;

Spigot/src/main/java/me/innectic/permissify/spigot/commands/permissify/GroupCommand.java

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ public CommandResponse handlePermissionAdd(CommandSender sender, String[] args)
106106
String[] remaining = ArgumentUtil.getRemainingArgs(1, args);
107107
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
108108
if (!plugin.getPermissifyAPI().getDatabaseHandler().isPresent()) return;
109-
Optional<PermissionGroup> group = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroups()
110-
.stream().filter(permissionGroup -> permissionGroup.getName().equals(args[0])).findFirst();
109+
Optional<PermissionGroup> group = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroup(args[0]);
111110
group.ifPresent(permissionGroup -> {
112111
Arrays.stream(remaining).forEach(permissionGroup::addPermission);
113112
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> permissionGroup.getPlayers().entrySet().stream().map(Map.Entry::getKey).map(Bukkit::getPlayer).filter(Objects::nonNull).forEach(PermissionUtil::applyPermissions));
@@ -129,8 +128,7 @@ public CommandResponse handlePermissionRemove(CommandSender sender, String[] arg
129128
String[] remaining = ArgumentUtil.getRemainingArgs(1, args);
130129
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
131130
if (!plugin.getPermissifyAPI().getDatabaseHandler().isPresent()) return;
132-
Optional<PermissionGroup> group = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroups()
133-
.stream().filter(permissionGroup -> permissionGroup.getName().equals(args[0])).findFirst();
131+
Optional<PermissionGroup> group = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroup(args[0]);
134132
group.ifPresent(permissionGroup -> {
135133
for (String permission : remaining) {
136134
permissionGroup.removePermission(permission);
@@ -150,8 +148,7 @@ public CommandResponse handleListPermissions(CommandSender sender, String[] args
150148
if (!plugin.getPermissifyAPI().getDatabaseHandler().isPresent())
151149
return new CommandResponse(PermissifyConstants.UNABLE_TO_LIST.replace("<REASON>", "No database handler"), false);
152150
if (args.length < 1) return new CommandResponse(PermissifyConstants.NOT_ENOUGH_ARGUMENTS_GROUP_PERMISSION_LIST, false);
153-
Optional<PermissionGroup> group = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroups().stream()
154-
.filter(permissionGroup -> permissionGroup.getName().equals(args[0])).findFirst();
151+
Optional<PermissionGroup> group = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroup(args[0]);
155152
if (!group.isPresent()) return new CommandResponse(PermissifyConstants.INVALID_GROUP.replace("<GROUP>", args[0]), false);
156153
List<String> groupPermissions = group.get().getPermissions().stream().map(Permission::getPermission).collect(Collectors.toList());
157154
return new CommandResponse(PermissifyConstants.GROUP_PERMISSIONS.replace("<GROUP>", group.get().getName())
@@ -164,9 +161,8 @@ public CommandResponse handleListGroups(CommandSender sender, String[] args) {
164161
return new CommandResponse(PermissifyConstants.INSUFFICIENT_PERMISSIONS, false);
165162
if (!plugin.getPermissifyAPI().getDatabaseHandler().isPresent())
166163
return new CommandResponse(PermissifyConstants.UNABLE_TO_LIST.replace("<REASON>", "No database handler"), false);
167-
List<PermissionGroup> groups = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroups();
168-
List<String> groupNames = groups.stream().map(PermissionGroup::getName).collect(Collectors.toList());
169-
return new CommandResponse(PermissifyConstants.GROUP_LIST.replace("<GROUPS>", String.join(", ", groupNames)), true);
164+
Map<String, PermissionGroup> groups = plugin.getPermissifyAPI().getDatabaseHandler().get().getGroups();
165+
return new CommandResponse(PermissifyConstants.GROUP_LIST.replace("<GROUPS>", String.join(", ", groups.keySet())), true);
170166
}
171167

172168
public CommandResponse handleSetDefault(CommandSender sender, String[] args) {

0 commit comments

Comments
 (0)