Author: ilgrosso Date: Tue Jan 29 10:37:55 2013 New Revision: 1439821 URL: http://svn.apache.org/viewvc?rev=1439821&view=rev Log: [SYNCOPE-122] Making the whole process more robust
Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java?rev=1439821&r1=1439820&r2=1439821&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java Tue Jan 29 10:37:55 2013 @@ -139,7 +139,7 @@ public class UserController { public ModelAndView count() { return new ModelAndView().addObject(countInternal()); } - + @Transactional(readOnly = true, rollbackFor = {Throwable.class}) public int countInternal() { Set<Long> adminRoleIds = EntitlementUtil.getRoleIds(EntitlementUtil.getOwnedEntitlementNames()); @@ -285,7 +285,7 @@ public class UserController { response.setStatus(HttpServletResponse.SC_CREATED); return savedTO; } - + public UserTO createInternal(final UserTO userTO) { LOG.debug("User create called with {}", userTO); @@ -337,35 +337,39 @@ public class UserController { WorkflowResult<Map.Entry<Long, Boolean>> updated = uwfAdapter.update(userMod); // 2. propagate password update only to requested resources - List<PropagationTask> tasks; + List<PropagationTask> tasks = new ArrayList<PropagationTask>(); if (userMod.getPwdPropRequest() == null) { // 2a. no specific password propagation request: generate propagation tasks for any resource associated tasks = propagationManager.getUserUpdateTaskIds(updated, changedPwd, userMod.getVirtualAttributesToBeRemoved(), userMod.getVirtualAttributesToBeUpdated()); } else { - // 2b. generate the propagation task list in two phases: first the ones containing password, + // 2b. generate the propagation task list in two phases: first the ones containing password, // the the rest (with no password) final PropagationByResource origPropByRes = new PropagationByResource(); origPropByRes.merge(updated.getPropByRes()); - SyncopeUser user = dataBinder.getUserFromId(updated.getResult().getKey()); - origPropByRes.addAll(ResourceOperation.UPDATE, user.getResourceNames()); - origPropByRes.purge(); + Set<String> pwdResourceNames = userMod.getPwdPropRequest().getResources(); + SyncopeUser user = dataBinder.getUserFromId(updated.getResult().getKey()); + pwdResourceNames.retainAll(user.getResourceNames()); final PropagationByResource pwdPropByRes = new PropagationByResource(); - pwdPropByRes.merge(origPropByRes); - pwdPropByRes.retainAll(userMod.getPwdPropRequest().getResources()); + pwdPropByRes.addAll(ResourceOperation.UPDATE, pwdResourceNames); updated.setPropByRes(pwdPropByRes); - tasks = propagationManager.getUserUpdateTaskIds(updated, changedPwd, - userMod.getVirtualAttributesToBeRemoved(), userMod.getVirtualAttributesToBeUpdated()); + if (!pwdPropByRes.isEmpty()) { + tasks.addAll(propagationManager.getUserUpdateTaskIds(updated, changedPwd, + userMod.getVirtualAttributesToBeRemoved(), userMod.getVirtualAttributesToBeUpdated())); + } final PropagationByResource nonPwdPropByRes = new PropagationByResource(); nonPwdPropByRes.merge(origPropByRes); - nonPwdPropByRes.removeAll(userMod.getPwdPropRequest().getResources()); + nonPwdPropByRes.removeAll(pwdResourceNames); + nonPwdPropByRes.purge(); updated.setPropByRes(nonPwdPropByRes); - tasks.addAll(propagationManager.getUserUpdateTaskIds(updated, null, - userMod.getVirtualAttributesToBeRemoved(), userMod.getVirtualAttributesToBeUpdated())); + if (!nonPwdPropByRes.isEmpty()) { + tasks.addAll(propagationManager.getUserUpdateTaskIds(updated, null, + userMod.getVirtualAttributesToBeRemoved(), userMod.getVirtualAttributesToBeUpdated())); + } updated.setPropByRes(origPropByRes); } Modified: syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java?rev=1439821&r1=1439820&r2=1439821&view=diff ============================================================================== --- syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java (original) +++ syncope/trunk/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java Tue Jan 29 10:37:55 2013 @@ -1916,10 +1916,15 @@ public class UserTestITCase extends Abst userTO = userService.update(userMod.getId(), userMod); - // 3a. verify that password hasn't changed on Syncope + // 3a. Chech that only a single propagation took place + assertNotNull(userTO.getPropagationStatusTOs()); + assertEquals(1, userTO.getPropagationStatusTOs().size()); + assertEquals("resource-testdb", userTO.getPropagationStatusTOs().iterator().next().getResource()); + + // 3b. verify that password hasn't changed on Syncope assertEquals(pwdOnSyncope, userTO.getPassword()); - // 3b. verify that password *has* changed on testdb + // 3c. verify that password *has* changed on testdb userOnDb = resourceService.getConnector("resource-testdb", AttributableType.USER, userTO.getUsername()); final AttributeTO pwdOnTestDbAttrAfter = userOnDb.getAttributeMap().get(OperationalAttributes.PASSWORD_NAME); assertNotNull(pwdOnTestDbAttrAfter); @@ -1927,7 +1932,7 @@ public class UserTestITCase extends Abst assertFalse(pwdOnTestDbAttrAfter.getValues().isEmpty()); assertNotEquals(pwdOnTestDb, pwdOnTestDbAttrAfter.getValues().iterator().next()); - // 3c. verify that password hasn't changed on testdb2 + // 3d. verify that password hasn't changed on testdb2 userOnDb2 = resourceService.getConnector("resource-testdb2", AttributableType.USER, userTO.getUsername()); final AttributeTO pwdOnTestDb2AttrAfter = userOnDb2.getAttributeMap().get(OperationalAttributes.PASSWORD_NAME); assertNotNull(pwdOnTestDb2AttrAfter);