11package vg .civcraft .mc .namelayer ;
22
3- import java .sql .Timestamp ;
43import java .util .ArrayList ;
54import java .util .HashMap ;
6- import java .util .LinkedList ;
75import java .util .List ;
86import java .util .Map ;
9- import java .util .Map .Entry ;
107import java .util .UUID ;
118import java .util .concurrent .ConcurrentHashMap ;
129import java .util .logging .Level ;
@@ -32,8 +29,8 @@ public class GroupManager{
3229 private static GroupManagerDao groupManagerDao ;
3330 private PermissionHandler permhandle ;
3431
35- private static Map <String , Group > groupsByName = new ConcurrentHashMap <String , Group >();
36- private static Map <Integer , Group > groupsById = new ConcurrentHashMap <Integer , Group >();
32+ private static Map <String , Group > groupsByName = new ConcurrentHashMap <>();
33+ private static Map <Integer , Group > groupsById = new ConcurrentHashMap <>();
3734
3835 public GroupManager (){
3936 groupManagerDao = NameLayerPlugin .getGroupManagerDao ();
@@ -42,7 +39,8 @@ public GroupManager(){
4239
4340 /**
4441 * Saves the group into caching and saves it into the db. Also fires the GroupCreateEvent.
45- * @param The group to create to db.
42+ * @param group the group to create to db.
43+ * @return the internal ID of the group created.
4644 */
4745 public int createGroup (Group group ){
4846 return createGroup (group ,true );
@@ -232,6 +230,9 @@ public void transferGroup(Group g, UUID uuid, boolean savetodb){
232230 * _for now_ simply invalidating the cache on servers.
233231 *
234232 * Eventually, we'll need to go line-by-line through the db code and just replicate in cache. That day is not today.
233+ *
234+ * @param group the origin group
235+ * @param toMerge the group to merge in
235236 */
236237 public void doneMergeGroup (Group group , Group toMerge ) {
237238 if (group == null || toMerge == null ) {
@@ -410,6 +411,9 @@ public static Group getSpecialCircumstanceGroup(String name){
410411 /**
411412 * DO NOT WORK WITH THE PERMISSION OBJECT ITSELF TO DETERMINE ACCESS. Use the methods provided in this class instead, as they
412413 * respect all the permission inheritation stuff
414+ *
415+ * @param group the group to retrieve permissions from
416+ * @return the actual permissions for this object or null
413417 */
414418 public GroupPermission getPermissionforGroup (Group group ){
415419 if (group == null ) {
@@ -432,7 +436,7 @@ public boolean hasAccess(Group group, UUID player, PermissionType perm) {
432436 if (p != null && (p .isOp () || p .hasPermission ("namelayer.admin" ))) {
433437 return true ;
434438 }
435- if (group == null || player == null || perm == null ) {
439+ if (group == null || perm == null ) {
436440 NameLayerPlugin .getInstance ().getLogger ().log (Level .INFO , "hasAccess failed, caller passed in null" , new Exception ());
437441 return false ;
438442 }
@@ -443,26 +447,25 @@ public boolean hasAccess(Group group, UUID player, PermissionType perm) {
443447 return false ;
444448 }
445449 }
446- GroupPermission perms = getPermissionforGroup (group );
447- for (PlayerType rank : getRecursivePlayerTypes (group , player )) {
448- if (perms .hasPermission (rank , perm )) {
449- //player has right rank in the group itself or at least one super group
450+ return hasPlayerInheritsPerms (group , player , perm );
451+ }
452+
453+ /**
454+ * Checks if a player has a permission in a group or one of its parent groups
455+ * @param group the group, and its parents etc to check
456+ * @param player the player
457+ * @param perm the permission to check
458+ * @return if the player has the specified permission in a group or one of its parents
459+ */
460+ private boolean hasPlayerInheritsPerms (Group group , UUID player , PermissionType perm ) {
461+ while (group != null ) {
462+ PlayerType type = group .getPlayerType (player );
463+ if (type != null && getPermissionforGroup (group ).hasPermission (type , perm )) {
450464 return true ;
451465 }
452- }
453- return false ;
454- }
455-
456- private List <PlayerType > getRecursivePlayerTypes (Group group , UUID player ) {
457- List <PlayerType > perms = new LinkedList <PlayerType >();
458- PlayerType type = group .getPlayerType (player );
459- if (type != null ) {
460- perms .add (type );
466+ group = group .getSuperGroup ();
461467 }
462- if (group .hasSuperGroup ()) {
463- perms .addAll (getRecursivePlayerTypes (group .getSuperGroup (), player ));
464- }
465- return perms ;
468+ return false ;
466469 }
467470
468471 // == PERMISSION HANDLING ============================================================= //
@@ -478,7 +481,7 @@ private void deleteGroupPerms(Group group){
478481 public List <String > getAllGroupNames (UUID uuid ){
479482 if (uuid == null ) {
480483 NameLayerPlugin .getInstance ().getLogger ().log (Level .INFO , "getAllGroupNames failed, caller passed in null" , new Exception ());
481- return new ArrayList <String >();
484+ return new ArrayList <>();
482485 }
483486 return groupManagerDao .getGroupNames (uuid );
484487 }
@@ -491,11 +494,7 @@ private void initiateDefaultPerms(Integer groupId){
491494 Map <PlayerType , List <PermissionType >> defaultPermMapping = new HashMap <GroupManager .PlayerType , List <PermissionType >>();
492495 for (PermissionType perm : PermissionType .getAllPermissions ()) {
493496 for (PlayerType type : perm .getDefaultPermLevels ()) {
494- List <PermissionType > perms = defaultPermMapping .get (type );
495- if (perms == null ) {
496- perms = new LinkedList <PermissionType >();
497- defaultPermMapping .put (type , perms );
498- }
497+ List <PermissionType > perms = defaultPermMapping .computeIfAbsent (type , k -> new ArrayList <>());
499498 perms .add (perm );
500499 }
501500 }
@@ -512,7 +511,7 @@ public String getDefaultGroup(UUID uuid){
512511
513512 /**
514513 * Invalidates a group from cache.
515- * @param group
514+ * @param group the group to invalidate cache for
516515 */
517516 public static void invalidateCache (String group ){
518517 if (group == null ) {
0 commit comments