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


Reply via email to