Author: andreapatricelli Date: Thu Jun 12 07:15:00 2014 New Revision: 1602076
URL: http://svn.apache.org/r1602076 Log: [SYNCOPE-501] improved management of user virtual attributes, implemented update of the only virtual attributes Modified: syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/data/UserDataBinder.java syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/rest/VirAttrTestITCase.java Modified: syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java?rev=1602076&r1=1602075&r2=1602076&view=diff ============================================================================== --- syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java (original) +++ syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/controller/UserController.java Thu Jun 12 07:15:00 2014 @@ -21,6 +21,7 @@ package org.apache.syncope.core.rest.con import java.lang.reflect.Method; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -350,12 +351,17 @@ public class UserController extends Abst if (tasks.isEmpty()) { // SYNCOPE-459: take care of user virtual attributes ... - binder.forceVirtualAttributes( + final PropagationByResource propByResVirAttr = binder.forceVirtualAttributes( updated.getResult().getKey(), actual.getVirtualAttributesToBeRemoved(), actual.getVirtualAttributesToBeUpdated()); + // SYNCOPE-501: update only virtual attributes (if any of them changed), change password must be null + tasks.addAll(propByResVirAttr.isEmpty() ? Collections.<PropagationTask>emptyList() + : propagationManager.getUserUpdateTaskIds(updated, null, actual. + getVirtualAttributesToBeRemoved(), actual.getVirtualAttributesToBeUpdated())); + } - } else { + if (!tasks.isEmpty()) { try { taskExecutor.execute(tasks, propagationReporter); } catch (PropagationException e) { Modified: syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/data/UserDataBinder.java URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/data/UserDataBinder.java?rev=1602076&r1=1602075&r2=1602076&view=diff ============================================================================== --- syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/data/UserDataBinder.java (original) +++ syncope/branches/1_1_X/core/src/main/java/org/apache/syncope/core/rest/data/UserDataBinder.java Thu Jun 12 07:15:00 2014 @@ -419,11 +419,11 @@ public class UserDataBinder extends Abst * @param vAttrsToBeRemoved virtual attribute to be removed. * @param vAttrsToBeUpdated virtyal attribute to be updated. */ - public void forceVirtualAttributes( + public PropagationByResource forceVirtualAttributes( final Long id, final Set<String> vAttrsToBeRemoved, final Set<AttributeMod> vAttrsToBeUpdated) { final SyncopeUser syncopeUser = getUserFromId(id); - fillVirtual( + return fillVirtual( syncopeUser, vAttrsToBeRemoved, vAttrsToBeUpdated, Modified: syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/rest/VirAttrTestITCase.java URL: http://svn.apache.org/viewvc/syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/rest/VirAttrTestITCase.java?rev=1602076&r1=1602075&r2=1602076&view=diff ============================================================================== --- syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/rest/VirAttrTestITCase.java (original) +++ syncope/branches/1_1_X/core/src/test/java/org/apache/syncope/core/rest/VirAttrTestITCase.java Thu Jun 12 07:15:00 2014 @@ -547,4 +547,49 @@ public class VirAttrTestITCase extends A userTO = userService.update(userTO.getId(), userMod); assertNotNull(userTO.getVirtualAttributeMap().get("virtualdata")); } + + @Test + public void issueSYNCOPE501() { + // 1. create user and propagate him on resource-db-virattr + UserTO userTO = getUniqueSampleTO("syncope...@apache.org"); + userTO.getResources().clear(); + userTO.getMemberships().clear(); + userTO.getVirtualAttributes().clear(); + + userTO.getResources().add(RESOURCE_NAME_DBVIRATTR); + + // virtualdata is mapped with username + final AttributeTO virtualData = attributeTO("virtualdata", "syncope...@apache.org"); + userTO.getVirtualAttributes().add(virtualData); + + userTO = createUser(userTO); + + assertNotNull(userTO.getVirtualAttributeMap().get("virtualdata")); + assertEquals("syncope...@apache.org", userTO.getVirtualAttributeMap().get("virtualdata").getValues().get(0)); + + // 2. update virtual attribute + UserMod userMod = new UserMod(); + userMod.setId(userTO.getId()); + + PropagationRequestTO propagationRequestTO = new PropagationRequestTO(); + propagationRequestTO.setResources(Collections.<String>emptySet()); + propagationRequestTO.setOnSyncope(Boolean.FALSE); + + userMod.setPwdPropRequest(propagationRequestTO); + + // change virtual attribute value + final AttributeMod virtualDataMod = new AttributeMod(); + virtualDataMod.setSchema("virtualdata"); + virtualDataMod.addValueToBeAdded("syncope501_upda...@apache.org"); + virtualDataMod.addValueToBeRemoved("syncope...@apache.org"); + userMod.addVirtualAttributeToBeUpdated(virtualDataMod); + + userTO = userService.update(userMod.getId(), userMod); + assertNotNull(userTO); + + // 3. check that user virtual attribute has been really updated + assertFalse(userTO.getVirtualAttributeMap().get("virtualdata").getValues().isEmpty()); + assertEquals("syncope501_upda...@apache.org", userTO.getVirtualAttributeMap().get("virtualdata").getValues(). + get(0)); + } }