diff --git a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java index 4616e76299a..c2c6c4e1745 100755 --- a/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java +++ b/java/com.sap.sse.security.userstore.mongodb/src/com/sap/sse/security/userstore/mongodb/AccessControlStoreImpl.java @@ -175,31 +175,38 @@ public class AccessControlStoreImpl implements AccessControlStore { @Override public void run() { - ownerships.put(id, ownership); - if (tenantOwner != null) { - Set currentGroupOwnerships = userGroupToOwnership.get(tenantOwner); - if (currentGroupOwnerships == null) { - currentGroupOwnerships = Collections - .newSetFromMap(new ConcurrentHashMap()); - userGroupToOwnership.put(tenantOwner, currentGroupOwnerships); - } - currentGroupOwnerships.add(ownership); - } - if (tenantOwner != null) { - Set currentUserOwnerships = userToOwnership.get(userOwnerName); - if (currentUserOwnerships == null) { - currentUserOwnerships = Collections - .newSetFromMap(new ConcurrentHashMap()); - userToOwnership.put(userOwnerName, currentUserOwnerships); - } - currentUserOwnerships.add(ownership); - } + internalRemoveOwnershipFromUserAndGroupMapsWithoutDBWrite(ownership); + internalSetOwnershipWithoutDBWrite(ownership); } }); mongoObjectFactory.storeOwnership(ownership); return ownership; } + private void internalSetOwnershipWithoutDBWrite(final OwnershipAnnotation ownership) { + ownerships.put(ownership.getIdOfAnnotatedObject(), ownership); + UserGroup tenantOwner = ownership.getAnnotation().getTenantOwner(); + if (tenantOwner != null) { + Set currentGroupOwnerships = userGroupToOwnership.get(tenantOwner); + if (currentGroupOwnerships == null) { + currentGroupOwnerships = Collections + .newSetFromMap(new ConcurrentHashMap()); + userGroupToOwnership.put(tenantOwner, currentGroupOwnerships); + } + currentGroupOwnerships.add(ownership); + } + SecurityUser userOwnerName = ownership.getAnnotation().getUserOwner(); + if (userOwnerName != null) { + Set currentUserOwnerships = userToOwnership.get(userOwnerName); + if (currentUserOwnerships == null) { + currentUserOwnerships = Collections + .newSetFromMap(new ConcurrentHashMap()); + userToOwnership.put(userOwnerName, currentUserOwnerships); + } + currentUserOwnerships.add(ownership); + } + } + @Override public void removeOwnership(final QualifiedObjectIdentifier idAsString) { LockUtil.executeWithWriteLock(lockForOwnerShips, new Runnable() { @@ -207,31 +214,35 @@ public class AccessControlStoreImpl implements AccessControlStore { public void run() { OwnershipAnnotation ownership = ownerships.remove(idAsString); if (ownership != null) { - Set currentGroupOwnerships = userGroupToOwnership - .get(ownership.getAnnotation().getTenantOwner()); - if (currentGroupOwnerships != null) { - currentGroupOwnerships.remove(ownership); - if (currentGroupOwnerships.isEmpty()) { - // no more entries, remove entry - userGroupToOwnership.remove(ownership.getAnnotation().getTenantOwner()); - } - } - Set currentUserOwnerships = userToOwnership - .get(ownership.getAnnotation().getUserOwner()); - if (currentUserOwnerships != null) { - currentUserOwnerships.remove(ownership); - if (currentUserOwnerships.isEmpty()) { - // no more entries, remove entry - userToOwnership.remove(ownership.getAnnotation().getUserOwner()); - } - - } + internalRemoveOwnershipFromUserAndGroupMapsWithoutDBWrite(ownership); mongoObjectFactory.deleteOwnership(idAsString, ownership.getAnnotation()); } } + }); } + private void internalRemoveOwnershipFromUserAndGroupMapsWithoutDBWrite(OwnershipAnnotation ownership) { + Set currentGroupOwnerships = userGroupToOwnership + .get(ownership.getAnnotation().getTenantOwner()); + if (currentGroupOwnerships != null) { + currentGroupOwnerships.remove(ownership); + if (currentGroupOwnerships.isEmpty()) { + // no more entries, remove entry + userGroupToOwnership.remove(ownership.getAnnotation().getTenantOwner()); + } + } + Set currentUserOwnerships = userToOwnership.get(ownership.getAnnotation().getUserOwner()); + if (currentUserOwnerships != null) { + currentUserOwnerships.remove(ownership); + if (currentUserOwnerships.isEmpty()) { + // no more entries, remove entry + userToOwnership.remove(ownership.getAnnotation().getUserOwner()); + } + + } + } + @Override public OwnershipAnnotation getOwnership(final QualifiedObjectIdentifier idOfOwnedObjectAsString) { return LockUtil.executeWithReadLockAndResult(lockForOwnerShips, new RunnableWithResult() { @@ -305,8 +316,22 @@ public class AccessControlStoreImpl implements AccessControlStore { } @Override - public void removeAllOwnershipsFor(SecurityUser user) { - // TODO Auto-generated method stub - + public void removeAllOwnershipsFor(final SecurityUser user) { + LockUtil.executeWithWriteLock(lockForOwnerShips, new Runnable() { + @Override + public void run() { + Set knownOwnerships = userToOwnership.get(user); + // do not use setOwnership, we know the group will not change, and we can use the more effective remove + // for userToOwnership after deleting + for (OwnershipAnnotation ownership : knownOwnerships) { + final OwnershipAnnotation userLessOwnership = new OwnershipAnnotation( + new OwnershipImpl(null, ownership.getAnnotation().getTenantOwner()), + ownership.getIdOfAnnotatedObject(), ownership.getDisplayNameOfAnnotatedObject()); + ownerships.put(ownership.getIdOfAnnotatedObject(), userLessOwnership); + mongoObjectFactory.storeOwnership(userLessOwnership); + } + userToOwnership.remove(user); + } + }); } }