Modified: syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java URL: http://svn.apache.org/viewvc/syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java?rev=1428498&r1=1428497&r2=1428498&view=diff ============================================================================== --- syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java (original) +++ syncope/trunk/core/src/main/java/org/apache/syncope/core/workflow/user/activiti/ActivitiUserWorkflowAdapter.java Thu Jan 3 17:34:01 2013 @@ -26,6 +26,7 @@ import java.io.InputStreamReader; import java.io.Reader; import java.io.StringWriter; import java.io.Writer; +import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -52,7 +53,6 @@ import org.activiti.engine.history.Histo import org.activiti.engine.repository.ProcessDefinition; import org.activiti.engine.runtime.ProcessInstance; import org.activiti.engine.task.Task; -import org.apache.commons.collections.keyvalue.DefaultMapEntry; import org.apache.commons.lang.StringUtils; import org.apache.syncope.client.mod.UserMod; import org.apache.syncope.client.to.UserTO; @@ -252,8 +252,8 @@ public class ActivitiUserWorkflowAdapter } } - return new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(user.getId(), propagateEnable), - propByRes, getPerformedTasks(user)); + return new WorkflowResult<Map.Entry<Long, Boolean>>( + new SimpleEntry<Long, Boolean>(user.getId(), propagateEnable), propByRes, getPerformedTasks(user)); } private Set<String> doExecuteTask(final SyncopeUser user, final String task, @@ -325,8 +325,8 @@ public class ActivitiUserWorkflowAdapter Boolean propagateEnable = (Boolean) runtimeService.getVariable(user.getWorkflowId(), PROPAGATE_ENABLE); - return new WorkflowResult<Map.Entry<Long, Boolean>>(new DefaultMapEntry(updated.getId(), propagateEnable), - propByRes, task); + return new WorkflowResult<Map.Entry<Long, Boolean>>(new SimpleEntry<Long, Boolean>( + updated.getId(), propagateEnable), propByRes, task); } @Override @@ -600,7 +600,7 @@ public class ActivitiUserWorkflowAdapter } } - return new DefaultMapEntry(task, formData); + return new SimpleEntry<Task, TaskFormData>(task, formData); } @Override @@ -668,7 +668,7 @@ public class ActivitiUserWorkflowAdapter clearPassword = decrypt(encryptedPwd); } - return new WorkflowResult<Map.Entry<Long, String>>(new DefaultMapEntry(updated.getId(), clearPassword), - propByRes, postTasks); + return new WorkflowResult<Map.Entry<Long, String>>(new SimpleEntry<Long, String>(updated.getId(), + clearPassword), propByRes, postTasks); } }
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=1428498&r1=1428497&r2=1428498&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 Thu Jan 3 17:34:01 2013 @@ -18,12 +18,7 @@ */ package org.apache.syncope.core.rest; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; +import static org.junit.Assert.*; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -32,7 +27,6 @@ import java.util.Collections; import java.util.Date; import java.util.List; import java.util.Map; - import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.syncope.client.http.PreemptiveAuthHttpRequestFactory; @@ -73,7 +67,13 @@ import org.springframework.web.client.Ht @FixMethodOrder(MethodSorters.JVM) public class UserTestITCase extends AbstractTest { - + + private ConnObjectTO readUserConnObj(String resourceName, String userId) { + return restTemplate.getForObject(BASE_URL + + "/resource/{resourceName}/read/USER/{objectId}.json", ConnObjectTO.class, + resourceName, userId); + } + public static UserTO getSampleTO(final String email) { UserTO userTO = new UserTO(); userTO.setPassword("password123"); @@ -100,7 +100,7 @@ public class UserTestITCase extends Abst requestFactory.getAuthScope(), new UsernamePasswordCredentials("user1", "password")); try { - userService.read(1l); + userService.read(1l); fail(); } catch (HttpClientErrorException e) { assertEquals(HttpStatus.FORBIDDEN, e.getStatusCode()); @@ -218,7 +218,7 @@ public class UserTestITCase extends Abst SyncopeClientException sce = null; try { - userTO = userService.update(userMod.getId(), userMod); + userTO = userService.update(userMod.getId(), userMod); } catch (SyncopeClientCompositeErrorException scce) { sce = scce.getException(SyncopeClientExceptionType.RequiredValuesMissing); } @@ -248,7 +248,7 @@ public class UserTestITCase extends Abst sce = null; try { - userTO = userService.update(userMod.getId(), userMod); + userTO = userService.update(userMod.getId(), userMod); } catch (SyncopeClientCompositeErrorException scce) { sce = scce.getException(SyncopeClientExceptionType.Propagation); } @@ -299,7 +299,7 @@ public class UserTestITCase extends Abst SyncopeClientException sce = null; try { - userTO = userService.create(userTO); + userTO = userService.create(userTO); } catch (SyncopeClientCompositeErrorException scce) { sce = scce.getException(SyncopeClientExceptionType.RequiredValuesMissing); } @@ -373,7 +373,7 @@ public class UserTestITCase extends Abst membershipTO.setRoleId(7L); userTO.addMembership(membershipTO); - + userService.create(userTO); } @@ -460,7 +460,7 @@ public class UserTestITCase extends Abst assertNotNull(newUserTO.getCreationDate()); // 2. check for virtual attribute value - newUserTO = userService.read(newUserTO.getId()); + newUserTO = userService.read(newUserTO.getId()); assertNotNull(newUserTO); assertNotNull(newUserTO.getVirtualAttributeMap()); @@ -494,7 +494,7 @@ public class UserTestITCase extends Abst assertEquals(maxTaskExecutions, taskTO.getExecutions().size()); // 3. verify password - Boolean verify =userService.verifyPassword(newUserTO.getUsername(), "password123"); + Boolean verify = userService.verifyPassword(newUserTO.getUsername(), "password123"); assertTrue(verify); verify = userService.verifyPassword(newUserTO.getUsername(), "passwordXX"); @@ -587,7 +587,7 @@ public class UserTestITCase extends Abst // 2. request if there is any pending task for user just created WorkflowFormTO form = userService.getFormForUser(userTO.getId()); - + assertNotNull(form); assertNotNull(form.getTaskId()); assertNull(form.getOwner()); @@ -600,7 +600,7 @@ public class UserTestITCase extends Abst SyncopeClientException sce = null; try { - userService.claimForm(form.getTaskId()); + userService.claimForm(form.getTaskId()); } catch (SyncopeClientCompositeErrorException scce) { sce = scce.getException(SyncopeClientExceptionType.Workflow); } @@ -707,7 +707,7 @@ public class UserTestITCase extends Abst @Test public void delete() { try { - userService.delete(0l); + userService.delete(0l); } catch (HttpStatusCodeException e) { assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode()); } @@ -760,7 +760,7 @@ public class UserTestITCase extends Abst assertTrue(userTO.getPropagationTOs().get(0).getStatus().isSuccessful()); try { - userService.read(userTO.getId()); + userService.read(userTO.getId()); } catch (HttpStatusCodeException e) { assertEquals(HttpStatus.NOT_FOUND, e.getStatusCode()); } @@ -1084,7 +1084,7 @@ public class UserTestITCase extends Abst assertEquals("created", userTO.getStatus()); - userTO = userService.activate(userTO.getId(), userTO.getToken()); + userTO = userService.activate(userTO.getId(), userTO.getToken()); assertNotNull(userTO); assertNull(userTO.getToken()); @@ -1112,7 +1112,7 @@ public class UserTestITCase extends Abst assertEquals("created", userTO.getStatus()); userTO = userService.activateByUsername(userTO.getUsername(), userTO.getToken()); - + assertNotNull(userTO); assertNull(userTO.getToken()); @@ -1439,7 +1439,7 @@ public class UserTestITCase extends Abst assertNotNull(actual.getDerivedAttributeMap().get("csvuserid")); String userId = actual.getDerivedAttributeMap().get("csvuserid").getValues().get(0); - ConnObjectTO connObjectTO = readUserConnObj("resource-csv", userId); + ConnObjectTO connObjectTO = readUserConnObj("resource-csv", userId); assertNotNull(connObjectTO); assertEquals("sx-dx", connObjectTO.getAttributeMap().get("ROLE").getValues().get(0)); } @@ -1468,7 +1468,7 @@ public class UserTestITCase extends Abst assertNotNull(actual.getDerivedAttributeMap().get("csvuserid")); String userId = actual.getDerivedAttributeMap().get("csvuserid").getValues().get(0); - ConnObjectTO connObjectTO = readUserConnObj("resource-csv", userId); + ConnObjectTO connObjectTO = readUserConnObj("resource-csv", userId); assertNotNull(connObjectTO); assertEquals("sx-dx", connObjectTO.getAttributeMap().get("MEMBERSHIP").getValues().get(0)); } @@ -1533,7 +1533,7 @@ public class UserTestITCase extends Abst assertEquals(1, actual.getResources().size()); String userId = actual.getDerivedAttributeMap().get("csvuserid").getValues().get(0); - ConnObjectTO connObjectTO = readUserConnObj("resource-csv", userId); + ConnObjectTO connObjectTO = readUserConnObj("resource-csv", userId); assertNotNull(connObjectTO); // ----------------------------------- @@ -1585,7 +1585,7 @@ public class UserTestITCase extends Abst Throwable t = null; try { - readUserConnObj("resource-csv", userId); + readUserConnObj("resource-csv", userId); } catch (SyncopeClientCompositeErrorException e) { assertNotNull(e.getException(SyncopeClientExceptionType.NotFound)); t = e; @@ -1719,9 +1719,97 @@ public class UserTestITCase extends Abst assertEquals(defaultConfigurationTO, oldConfTO); } - private ConnObjectTO readUserConnObj(String resourceName, String userId) { - return restTemplate.getForObject(BASE_URL - + "/resource/{resourceName}/read/USER/{objectId}.json", ConnObjectTO.class, - resourceName, userId); - } + @Test + public void issueSYNCOPE260() { + // ---------------------------------- + // create user and check virtual attribute value propagation + // ---------------------------------- + UserTO userTO = getSampleTO("[email protected]"); + userTO.addResource("ws-target-resource-2"); + + userTO = restTemplate.postForObject(BASE_URL + "user/create", userTO, UserTO.class); + assertNotNull(userTO); + assertFalse(userTO.getPropagationTOs().isEmpty()); + assertEquals("ws-target-resource-2", userTO.getPropagationTOs().get(0).getResourceName()); + assertEquals(PropagationTaskExecStatus.SUBMITTED, userTO.getPropagationTOs().get(0).getStatus()); + + ConnObjectTO connObjectTO = readUserConnObj("ws-target-resource-2", userTO.getUsername()); + assertNotNull(connObjectTO); + assertEquals("virtualvalue", connObjectTO.getAttributeMap().get("NAME").getValues().get(0)); + // ---------------------------------- + + // ---------------------------------- + // update user virtual attribute and check virtual attribute value update propagation + // ---------------------------------- + UserMod userMod = new UserMod(); + userMod.setId(userTO.getId()); + + AttributeMod attrMod = new AttributeMod(); + attrMod.setSchema("virtualdata"); + attrMod.addValueToBeRemoved("virtualvalue"); + attrMod.addValueToBeAdded("virtualvalue2"); + + userMod.addVirtualAttributeToBeUpdated(attrMod); + + userTO = restTemplate.postForObject(BASE_URL + "user/update", userMod, UserTO.class); + assertNotNull(userTO); + assertFalse(userTO.getPropagationTOs().isEmpty()); + assertEquals("ws-target-resource-2", userTO.getPropagationTOs().get(0).getResourceName()); + assertEquals(PropagationTaskExecStatus.SUBMITTED, userTO.getPropagationTOs().get(0).getStatus()); + + connObjectTO = readUserConnObj("ws-target-resource-2", userTO.getUsername()); + assertNotNull(connObjectTO); + assertEquals("virtualvalue2", connObjectTO.getAttributeMap().get("NAME").getValues().get(0)); + // ---------------------------------- + + // ---------------------------------- + // update user attribute and check virtual attribute value (unchanged) + // ---------------------------------- + userMod = new UserMod(); + userMod.setId(userTO.getId()); + + attrMod = new AttributeMod(); + attrMod.setSchema("surname"); + attrMod.addValueToBeRemoved("Surname"); + attrMod.addValueToBeAdded("Surname2"); + + userMod.addAttributeToBeUpdated(attrMod); + + userTO = restTemplate.postForObject(BASE_URL + "user/update", userMod, UserTO.class); + assertNotNull(userTO); + assertFalse(userTO.getPropagationTOs().isEmpty()); + assertEquals("ws-target-resource-2", userTO.getPropagationTOs().get(0).getResourceName()); + assertEquals(PropagationTaskExecStatus.SUBMITTED, userTO.getPropagationTOs().get(0).getStatus()); + + connObjectTO = readUserConnObj("ws-target-resource-2", userTO.getUsername()); + assertNotNull(connObjectTO); + assertEquals("Surname2", connObjectTO.getAttributeMap().get("SURNAME").getValues().get(0)); + + // attribute "name" mapped on virtual attribute "virtualdata" shouldn't be changed + assertFalse(connObjectTO.getAttributeMap().get("NAME").getValues().isEmpty()); + assertEquals("virtualvalue2", connObjectTO.getAttributeMap().get("NAME").getValues().get(0)); + // ---------------------------------- + + // ---------------------------------- + // remove user virtual attribute and check virtual attribute value (reset) + // ---------------------------------- + userMod = new UserMod(); + userMod.setId(userTO.getId()); + userMod.addVirtualAttributeToBeRemoved("virtualdata"); + + userTO = restTemplate.postForObject(BASE_URL + "user/update", userMod, UserTO.class); + assertNotNull(userTO); + assertTrue(userTO.getVirtualAttributes().isEmpty()); + assertFalse(userTO.getPropagationTOs().isEmpty()); + assertEquals("ws-target-resource-2", userTO.getPropagationTOs().get(0).getResourceName()); + assertEquals(PropagationTaskExecStatus.SUBMITTED, userTO.getPropagationTOs().get(0).getStatus()); + + connObjectTO = readUserConnObj("ws-target-resource-2", userTO.getUsername()); + assertNotNull(connObjectTO); + + // attribute "name" mapped on virtual attribute "virtualdata" should be reset + assertTrue(connObjectTO.getAttributeMap().get("NAME").getValues() == null + || connObjectTO.getAttributeMap().get("NAME").getValues().isEmpty()); + // ---------------------------------- + } }
