Author: ivol37 at gmail.com
Date: Thu Jan 6 11:24:51 2011
New Revision: 568
Log:
[AMDATU-241] Fixed removing the user as member from each group when it is
removed
Modified:
trunk/amdatu-cassandra/cassandra-useradminstore/src/main/java/org/amdatu/cassandra/useradminstore/service/CassandraStorageProvider.java
Modified:
trunk/amdatu-cassandra/cassandra-useradminstore/src/main/java/org/amdatu/cassandra/useradminstore/service/CassandraStorageProvider.java
==============================================================================
---
trunk/amdatu-cassandra/cassandra-useradminstore/src/main/java/org/amdatu/cassandra/useradminstore/service/CassandraStorageProvider.java
(original)
+++
trunk/amdatu-cassandra/cassandra-useradminstore/src/main/java/org/amdatu/cassandra/useradminstore/service/CassandraStorageProvider.java
Thu Jan 6 11:24:51 2011
@@ -210,8 +210,10 @@
// Removes a member, but basic or required??? We remove both
public boolean removeMember(Group group, Role role) throws
StorageException {
- return internalRemoveMember(group, role, COLUMN_BASIC_MEMBERS)
- || internalRemoveMember(group, role, COLUMN_REQUIRED_MEMBERS);
+ String groupKey = getKey(group);
+ String roleKey = getKey(role);
+ return internalRemoveMember(groupKey, roleKey, COLUMN_BASIC_MEMBERS)
+ || internalRemoveMember(groupKey, roleKey, COLUMN_REQUIRED_MEMBERS);
}
// Sets the value of a role attribute
@@ -332,6 +334,11 @@
}
m_pm.deleteRow(CF_ROLE, key);
+ // Now if the role is a user, it must also be removed as member of
any groups
+ if (role.getType() == Role.USER) {
+ removeUserFromAllGroups(role);
+ }
+
// Sanity check
if (m_pm.exists(CF_ROLE, key)) {
throw new CassandraException("Row removed but still exists!");
@@ -345,7 +352,7 @@
public Collection<Role> internalLoadMembers(UserAdminFactory factory,
Group group, String column)
throws StorageException {
List<Role> roles = new ArrayList<Role>();
- List<String> memberIds = internalLoadMembers(group, column);
+ List<String> memberIds = internalLoadMembers(getKey(group), column);
for (String memberId : memberIds) {
String roleName;
if (memberId.startsWith(USER_KEY_PREFIX)) {
@@ -354,10 +361,12 @@
roleName = memberId.substring(GROUP_KEY_PREFIX.length());
}
Role role = getRole(factory, roleName);
+ // Sanity check, if the role not null?
if (role != null) {
- // FIXME: because of AMDATU-241 a role may be null in case
this is a group that refers to a member
- // that has been removed in the meantime. This is a temporary
quick-fix.
roles.add(getRole(factory, roleName));
+ } else {
+ m_logService.log(LogService.LOG_WARNING, "Member '" + roleName
+ "' for column '" + column + "' in group '"
+ + getKey(group) + "' doesn't seem to be a valid role
anymore.");
}
}
return roles;
@@ -365,12 +374,10 @@
// Loads list of members
@SuppressWarnings("unchecked")
- private List<String> internalLoadMembers(Role role, String column) throws
StorageException {
+ private List<String> internalLoadMembers(String roleKey, String column)
throws StorageException {
try {
- String key = getKey(role);
-
- if (m_pm.exists(CF_ROLE, key, SUPER_COLUMN_MEMBERS, column)) {
- String bm = m_pm.getStringValue(CF_ROLE, key,
SUPER_COLUMN_MEMBERS, column);
+ if (m_pm.exists(CF_ROLE, roleKey, SUPER_COLUMN_MEMBERS, column)) {
+ String bm = m_pm.getStringValue(CF_ROLE, roleKey,
SUPER_COLUMN_MEMBERS, column);
Type listType = new TypeToken<List<String>>() {}.getType();
return (List<String>) fromJson(bm, listType);
} else {
@@ -386,7 +393,7 @@
try {
String key = getKey(group);
String newbasicMember = getKey(role);
- List<String> basicMembers = internalLoadMembers(group, column);
+ List<String> basicMembers = internalLoadMembers(key, column);
if (basicMembers.contains(newbasicMember)) {
// Basic member was already added before
return false;
@@ -400,18 +407,15 @@
}
// Removes a member from basic or required if it was contained
- private boolean internalRemoveMember(Group group, Role role, String
column) throws StorageException {
+ private boolean internalRemoveMember(String groupKey, String roleKey,
String column) throws StorageException {
try {
-
- String key = getKey(group);
- String removeMember = getKey(role);
- List<String> members = internalLoadMembers(group, column);
- if (!members.contains(removeMember)) {
+ List<String> members = internalLoadMembers(groupKey, column);
+ if (!members.contains(roleKey)) {
// Member not found
return false;
}
- members.remove(removeMember);
- m_pm.setStringValue(CF_ROLE, key, SUPER_COLUMN_MEMBERS, column,
toJson(members));
+ members.remove(roleKey);
+ m_pm.setStringValue(CF_ROLE, groupKey, SUPER_COLUMN_MEMBERS,
column, toJson(members));
return true;
} catch (CassandraException e) {
throw new StorageException(e.getMessage());
@@ -491,4 +495,27 @@
}
return result;
}
+
+ // Removes the user as member of all groups, invoked for example when a
user is removed
+ private void removeUserFromAllGroups(Role role) throws StorageException {
+ try {
+ String roleKey = getKey(role);
+ List<String> groupKeys = m_pm.getRowKeys(CF_ROLE);
+ for (String groupKey : groupKeys) {
+ if (groupKey.startsWith(GROUP_KEY_PREFIX)) {
+ // This is a group
+ List<String> basicMembers = internalLoadMembers(groupKey,
COLUMN_BASIC_MEMBERS);
+ if (basicMembers.contains(getKey(role))) {
+ internalRemoveMember(groupKey, roleKey,
COLUMN_BASIC_MEMBERS);
+ }
+ List<String> requiredMembers =
internalLoadMembers(groupKey, COLUMN_REQUIRED_MEMBERS);
+ if (requiredMembers.contains(getKey(role))) {
+ internalRemoveMember(groupKey, roleKey,
COLUMN_REQUIRED_MEMBERS);
+ }
+ }
+ }
+ } catch (CassandraException e) {
+ throw new StorageException(e.getMessage());
+ }
+ }
}