protected PermissionCheckResult permissionValue(String permission) {
try {
Validate.notNull(permission, "Permissions being checked must not be null!");
permission = permission.toLowerCase();
PermissionCheckResult res = cache.get(permission);
if (res != null) {
if (isDebug()) {
plugin.getLogger().info("User " + player.getName() + " checked for permission '" + permission + "', regex-matched a value of " + res + " from cache.");
}
return res;
}
res = PermissionCheckResult.UNDEFINED;
synchronized (permissionsLock) {
for (PermissionAttachmentInfo pai : permissions.values()) {
if ((res = checkSingle(pai.getPermission(), permission, pai.getValue())) != PermissionCheckResult.UNDEFINED) {
break;
}
}
}
if (res == PermissionCheckResult.UNDEFINED) {
for (Map.Entry<String, Boolean> ent : plugin.getRegexPerms().getPermissionList().getParents(permission)) {
if ((res = permissionValue(ent.getKey())) != PermissionCheckResult.UNDEFINED) {
res = PermissionCheckResult.fromBoolean(!(res.toBoolean() ^ ent.getValue()));
if (isDebug()) {
plugin.getLogger().info("User " + player.getName() + " checked for permission '" + permission + "', match from parent '" + ent.getKey() + "' (CACHE MISS)");
}
break;
}