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());
+        }
+    }
 }

Reply via email to