Repository: syncope
Updated Branches:
  refs/heads/2_0_X 468e80a88 -> efbd83fdc
  refs/heads/master 1fa7fe115 -> 93b84e7ed


[SYNCOPE-1200] Ensuring createApproval works, besides updateApproval


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/efbd83fd
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/efbd83fd
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/efbd83fd

Branch: refs/heads/2_0_X
Commit: efbd83fdc6a565aca259098ddacf0dbedfca7fa2
Parents: 468e80a
Author: Francesco Chicchiriccò <ilgro...@apache.org>
Authored: Tue Aug 29 14:43:13 2017 +0200
Committer: Francesco Chicchiriccò <ilgro...@apache.org>
Committed: Tue Aug 29 14:43:13 2017 +0200

----------------------------------------------------------------------
 .../java/data/AbstractAnyDataBinder.java        |  9 ++----
 .../java/data/AnyObjectDataBinderImpl.java      |  7 +++--
 .../java/data/GroupDataBinderImpl.java          |  9 ++++--
 .../java/data/UserDataBinderImpl.java           |  7 +++--
 .../cxf/service/UserWorkflowServiceImpl.java    | 12 ++++----
 .../activiti/ActivitiUserWorkflowAdapter.java   | 28 +++++++++++++++++--
 .../workflow/activiti/task/AutoActivate.java    | 29 ++++++++++++++++++++
 .../flowable/FlowableUserWorkflowAdapter.java   | 28 +++++++++++++++++--
 .../workflow/flowable/task/AutoActivate.java    | 29 ++++++++++++++++++++
 .../syncope/fit/core/UserWorkflowITCase.java    | 15 +++++++++-
 10 files changed, 146 insertions(+), 27 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
index c950a6f..b280874 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
@@ -74,7 +74,6 @@ import 
org.apache.syncope.core.persistence.api.entity.group.Group;
 import 
org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
-import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.DerAttrHandler;
 import org.apache.syncope.core.provisioning.api.IntAttrName;
 import org.apache.syncope.core.provisioning.api.MappingManager;
@@ -634,14 +633,10 @@ abstract class AbstractAnyDataBinder {
         return membershipTO;
     }
 
-    protected Map<String, String> getConnObjectKeys(final Any<?> any) {
+    protected Map<String, String> getConnObjectKeys(final Any<?> any, final 
AnyUtils anyUtils) {
         Map<String, String> connObjectKeys = new HashMap<>();
 
-        Iterable<? extends ExternalResource> iterable = any instanceof User
-                ? userDAO.findAllResources((User) any)
-                : any instanceof AnyObject
-                        ? anyObjectDAO.findAllResources((AnyObject) any)
-                        : ((Group) any).getResources();
+        Iterable<? extends ExternalResource> iterable = 
anyUtils.getAllResources(any);
         for (ExternalResource resource : iterable) {
             Provision provision = resource.getProvision(any.getType());
             if (provision != null && provision.getMapping() != null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index 2e85e60..e6176b1 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -270,10 +270,12 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
 
         SyncopeClientCompositeException scce = 
SyncopeClientException.buildComposite();
 
+        AnyUtils anyUtils = 
anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT);
+
         Collection<String> currentResources = 
anyObjectDAO.findAllResourceKeys(anyObject.getKey());
 
         // fetch connObjectKeys before update
-        Map<String, String> oldConnObjectKeys = getConnObjectKeys(anyObject);
+        Map<String, String> oldConnObjectKeys = getConnObjectKeys(anyObject, 
anyUtils);
 
         // realm
         setRealm(anyObject, anyObjectPatch);
@@ -285,7 +287,6 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
             anyObject.setName(anyObjectPatch.getName().getValue());
         }
 
-        AnyUtils anyUtils = 
anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT);
         // attributes and resources
         propByRes.merge(fill(anyObject, anyObjectPatch, anyUtils, scce));
 
@@ -437,7 +438,7 @@ public class AnyObjectDataBinderImpl extends 
AbstractAnyDataBinder implements An
         }
 
         // check if some connObjectKey was changed by the update above
-        Map<String, String> newcCnnObjectKeys = getConnObjectKeys(anyObject);
+        Map<String, String> newcCnnObjectKeys = getConnObjectKeys(anyObject, 
anyUtils);
         for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
             if (newcCnnObjectKeys.containsKey(entry.getKey())
                     && 
!entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index 92fd3ab..96b249d 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -44,6 +44,7 @@ import 
org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
+import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.DynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.Realm;
@@ -195,8 +196,10 @@ public class GroupDataBinderImpl extends 
AbstractAnyDataBinder implements GroupD
 
         SyncopeClientCompositeException scce = 
SyncopeClientException.buildComposite();
 
+        AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.GROUP);
+
         // fetch connObjectKeys before update
-        Map<String, String> oldConnObjectKeys = getConnObjectKeys(group);
+        Map<String, String> oldConnObjectKeys = getConnObjectKeys(group, 
anyUtils);
 
         // realm
         setRealm(group, groupPatch);
@@ -221,10 +224,10 @@ public class GroupDataBinderImpl extends 
AbstractAnyDataBinder implements GroupD
         }
 
         // attributes and resources
-        propByRes.merge(fill(group, groupPatch, 
anyUtilsFactory.getInstance(AnyTypeKind.GROUP), scce));
+        propByRes.merge(fill(group, groupPatch, anyUtils, scce));
 
         // check if some connObjectKey was changed by the update above
-        Map<String, String> newConnObjectKeys = getConnObjectKeys(group);
+        Map<String, String> newConnObjectKeys = getConnObjectKeys(group, 
anyUtils);
         for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
             if (newConnObjectKeys.containsKey(entry.getKey())
                     && 
!entry.getValue().equals(newConnObjectKeys.get(entry.getKey()))) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 72d7243..b9bdf21 100644
--- 
a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ 
b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -309,10 +309,12 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
 
         SyncopeClientCompositeException scce = 
SyncopeClientException.buildComposite();
 
+        AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER);
+
         Collection<String> currentResources = 
userDAO.findAllResourceKeys(user.getKey());
 
         // fetch connObjectKeys before update
-        Map<String, String> oldConnObjectKeys = getConnObjectKeys(user);
+        Map<String, String> oldConnObjectKeys = getConnObjectKeys(user, 
anyUtils);
 
         // realm
         setRealm(user, userPatch);
@@ -382,7 +384,6 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
             }
         }
 
-        AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER);
         // attributes and resources
         propByRes.merge(fill(user, userPatch, anyUtils, scce));
 
@@ -535,7 +536,7 @@ public class UserDataBinderImpl extends 
AbstractAnyDataBinder implements UserDat
         }
 
         // check if some connObjectKey was changed by the update above
-        Map<String, String> newcCnnObjectKeys = getConnObjectKeys(user);
+        Map<String, String> newcCnnObjectKeys = getConnObjectKeys(user, 
anyUtils);
         for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
             if (newcCnnObjectKeys.containsKey(entry.getKey())
                     && 
!entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java
 
b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java
index a3e6040..c24d66f 100644
--- 
a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java
+++ 
b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/UserWorkflowServiceImpl.java
@@ -30,30 +30,30 @@ import org.springframework.stereotype.Service;
 public class UserWorkflowServiceImpl implements UserWorkflowService {
 
     @Autowired
-    private UserWorkflowLogic lofic;
+    private UserWorkflowLogic logic;
 
     @Override
     public WorkflowFormTO claimForm(final String taskId) {
-        return lofic.claimForm(taskId);
+        return logic.claimForm(taskId);
     }
 
     @Override
     public UserTO executeTask(final String taskId, final UserTO userTO) {
-        return lofic.executeWorkflowTask(userTO, taskId);
+        return logic.executeWorkflowTask(userTO, taskId);
     }
 
     @Override
     public WorkflowFormTO getFormForUser(final String userKey) {
-        return lofic.getFormForUser(userKey);
+        return logic.getFormForUser(userKey);
     }
 
     @Override
     public List<WorkflowFormTO> getForms() {
-        return lofic.getForms();
+        return logic.getForms();
     }
 
     @Override
     public UserTO submitForm(final WorkflowFormTO form) {
-        return lofic.submitForm(form);
+        return logic.submitForm(form);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
 
b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
index 3ad12eb..9530b17 100644
--- 
a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
+++ 
b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
@@ -206,14 +206,33 @@ public class ActivitiUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
     protected void saveForFormSubmit(final User user, final String password, 
final PropagationByResource propByRes) {
         String formTaskId = getFormTask(user);
         if (formTaskId != null) {
+            UserTO userTO = 
engine.getRuntimeService().getVariable(user.getWorkflowId(), USER_TO, 
UserTO.class);
+            if (userTO != null) {
+                userTO.setKey(user.getKey());
+                userTO.setCreationDate(user.getCreationDate());
+                userTO.setLastChangeDate(user.getLastChangeDate());
+                if (password == null) {
+                    String encryptedPwd = engine.getRuntimeService().
+                            getVariable(user.getWorkflowId(), ENCRYPTED_PWD, 
String.class);
+                    if (encryptedPwd != null) {
+                        userTO.setPassword(decrypt(encryptedPwd));
+                    }
+                } else {
+                    userTO.setPassword(password);
+                }
+
+                engine.getRuntimeService().setVariable(user.getWorkflowId(), 
USER_TO, userTO);
+            }
+
             // SYNCOPE-238: This is needed to simplify the task query in 
this.getForms()
             engine.getTaskService().setVariableLocal(formTaskId, TASK_IS_FORM, 
Boolean.TRUE);
+
             engine.getRuntimeService().setVariable(user.getWorkflowId(), 
PROP_BY_RESOURCE, propByRes);
             if (propByRes != null) {
                 propByRes.clear();
             }
 
-            if (StringUtils.isNotBlank(password)) {
+            if (password != null) {
                 engine.getRuntimeService().setVariable(user.getWorkflowId(), 
ENCRYPTED_PWD, encrypt(password));
             }
         }
@@ -441,13 +460,18 @@ public class ActivitiUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
     public WorkflowResult<String> execute(final UserTO userTO, final String 
taskId) {
         User user = userDAO.authFind(userTO.getKey());
 
-        final Map<String, Object> variables = new HashMap<>();
+        Map<String, Object> variables = new HashMap<>();
         variables.put(USER_TO, userTO);
 
         Set<String> performedTasks = doExecuteTask(user, taskId, variables);
         updateStatus(user);
         User updated = userDAO.save(user);
 
+        PropagationByResource propByRes = 
engine.getRuntimeService().getVariable(
+                user.getWorkflowId(), PROP_BY_RESOURCE, 
PropagationByResource.class);
+
+        saveForFormSubmit(user, userTO.getPassword(), propByRes);
+
         return new WorkflowResult<>(updated.getKey(), null, performedTasks);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java
 
b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java
index 51dfb50..c326ef5 100644
--- 
a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java
+++ 
b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/AutoActivate.java
@@ -18,14 +18,43 @@
  */
 package org.apache.syncope.core.workflow.activiti.task;
 
+import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.workflow.activiti.ActivitiUserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class AutoActivate extends AbstractActivitiServiceTask {
 
+    @Autowired
+    private UserDataBinder dataBinder;
+
+    @Autowired
+    private UserDAO userDAO;
+
     @Override
     protected void doExecute(final String executionId) {
+        User user = engine.getRuntimeService().
+                getVariable(executionId, ActivitiUserWorkflowAdapter.USER, 
User.class);
+        UserTO userTO = engine.getRuntimeService().
+                getVariable(executionId, ActivitiUserWorkflowAdapter.USER_TO, 
UserTO.class);
+        if (userTO != null && userTO.getKey() != null && user.getKey() != 
null) {
+            user = userDAO.save(user);
+
+            UserPatch userPatch = AnyOperations.diff(userTO, 
dataBinder.getUserTO(user, true), false);
+            // don't mess with password, as the cleartext values was already 
properly saved
+            userPatch.setPassword(null);
+
+            dataBinder.update(user, userPatch);
+
+            engine.getRuntimeService().setVariable(executionId, 
ActivitiUserWorkflowAdapter.USER, user);
+        }
+
         engine.getRuntimeService().setVariable(executionId, 
ActivitiUserWorkflowAdapter.PROPAGATE_ENABLE, Boolean.TRUE);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
 
b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
index 6552449..2ca3f08 100644
--- 
a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
+++ 
b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/FlowableUserWorkflowAdapter.java
@@ -206,14 +206,33 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
     protected void saveForFormSubmit(final User user, final String password, 
final PropagationByResource propByRes) {
         String formTaskId = getFormTask(user);
         if (formTaskId != null) {
+            UserTO userTO = 
engine.getRuntimeService().getVariable(user.getWorkflowId(), USER_TO, 
UserTO.class);
+            if (userTO != null) {
+                userTO.setKey(user.getKey());
+                userTO.setCreationDate(user.getCreationDate());
+                userTO.setLastChangeDate(user.getLastChangeDate());
+                if (password == null) {
+                    String encryptedPwd = engine.getRuntimeService().
+                            getVariable(user.getWorkflowId(), ENCRYPTED_PWD, 
String.class);
+                    if (encryptedPwd != null) {
+                        userTO.setPassword(decrypt(encryptedPwd));
+                    }
+                } else {
+                    userTO.setPassword(password);
+                }
+
+                engine.getRuntimeService().setVariable(user.getWorkflowId(), 
USER_TO, userTO);
+            }
+
             // SYNCOPE-238: This is needed to simplify the task query in 
this.getForms()
             engine.getTaskService().setVariableLocal(formTaskId, TASK_IS_FORM, 
Boolean.TRUE);
+
             engine.getRuntimeService().setVariable(user.getWorkflowId(), 
PROP_BY_RESOURCE, propByRes);
             if (propByRes != null) {
                 propByRes.clear();
             }
 
-            if (StringUtils.isNotBlank(password)) {
+            if (password != null) {
                 engine.getRuntimeService().setVariable(user.getWorkflowId(), 
ENCRYPTED_PWD, encrypt(password));
             }
         }
@@ -441,13 +460,18 @@ public class FlowableUserWorkflowAdapter extends 
AbstractUserWorkflowAdapter {
     public WorkflowResult<String> execute(final UserTO userTO, final String 
taskId) {
         User user = userDAO.authFind(userTO.getKey());
 
-        final Map<String, Object> variables = new HashMap<>();
+        Map<String, Object> variables = new HashMap<>();
         variables.put(USER_TO, userTO);
 
         Set<String> performedTasks = doExecuteTask(user, taskId, variables);
         updateStatus(user);
         User updated = userDAO.save(user);
 
+        PropagationByResource propByRes = 
engine.getRuntimeService().getVariable(
+                user.getWorkflowId(), PROP_BY_RESOURCE, 
PropagationByResource.class);
+
+        saveForFormSubmit(updated, userTO.getPassword(), propByRes);
+
         return new WorkflowResult<>(updated.getKey(), null, performedTasks);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java
----------------------------------------------------------------------
diff --git 
a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java
 
b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java
index 8aeb9f9..02ee77f 100644
--- 
a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java
+++ 
b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/AutoActivate.java
@@ -18,14 +18,43 @@
  */
 package org.apache.syncope.core.workflow.flowable.task;
 
+import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.UserTO;
+import org.apache.syncope.core.persistence.api.dao.UserDAO;
+import org.apache.syncope.core.persistence.api.entity.user.User;
+import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.workflow.flowable.FlowableUserWorkflowAdapter;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 @Component
 public class AutoActivate extends AbstractFlowableServiceTask {
 
+    @Autowired
+    private UserDataBinder dataBinder;
+
+    @Autowired
+    private UserDAO userDAO;
+
     @Override
     protected void doExecute(final String executionId) {
+        User user = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER, 
User.class);
+        UserTO userTO = engine.getRuntimeService().
+                getVariable(executionId, FlowableUserWorkflowAdapter.USER_TO, 
UserTO.class);
+        if (userTO != null && userTO.getKey() != null && user.getKey() != 
null) {
+            user = userDAO.save(user);
+
+            UserPatch userPatch = AnyOperations.diff(userTO, 
dataBinder.getUserTO(user, true), false);
+            // don't mess with password, as the cleartext values was already 
properly saved
+            userPatch.setPassword(null);
+
+            dataBinder.update(user, userPatch);
+
+            engine.getRuntimeService().setVariable(executionId, 
FlowableUserWorkflowAdapter.USER, user);
+        }
+
         engine.getRuntimeService().setVariable(executionId, 
FlowableUserWorkflowAdapter.PROPAGATE_ENABLE, Boolean.TRUE);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/efbd83fd/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
----------------------------------------------------------------------
diff --git 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
index ac563aa..6ea2f25 100644
--- 
a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
+++ 
b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
@@ -29,6 +29,7 @@ import static org.junit.Assert.fail;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.UUID;
 import javax.sql.DataSource;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.client.lib.SyncopeClient;
@@ -180,21 +181,33 @@ public class UserWorkflowITCase extends AbstractITCase {
         assertNotNull(forms);
         assertEquals(preForms + 1, forms.size());
 
+        // 3. as admin, request for changes: still pending approval
+        String updatedUsername = "changed-" + UUID.randomUUID().toString();
+        userTO.setUsername(updatedUsername);
+        userWorkflowService.executeTask("default", userTO);
+
         WorkflowFormTO form = 
userWorkflowService.getFormForUser(userTO.getKey());
         assertNotNull(form);
         assertNotNull(form.getTaskId());
+        assertNotNull(form.getUserTO());
+        assertEquals(updatedUsername, form.getUserTO().getUsername());
+        assertNull(form.getUserPatch());
         assertNull(form.getOwner());
 
-        // 4. claim task (from admin)
+        // 4. claim task (as admin)
         form = userWorkflowService.claimForm(form.getTaskId());
         assertNotNull(form);
         assertNotNull(form.getTaskId());
+        assertNotNull(form.getUserTO());
+        assertEquals(updatedUsername, form.getUserTO().getUsername());
+        assertNull(form.getUserPatch());
         assertNotNull(form.getOwner());
 
         // 5. approve user (and verify that propagation occurred)
         form.getProperty("approve").setValue(Boolean.TRUE.toString());
         userTO = userWorkflowService.submitForm(form);
         assertNotNull(userTO);
+        assertEquals(updatedUsername, userTO.getUsername());
         assertEquals("active", userTO.getStatus());
         assertEquals(Collections.singleton(RESOURCE_NAME_TESTDB), 
userTO.getResources());
 

Reply via email to