You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by il...@apache.org on 2017/09/15 12:04:24 UTC

[1/2] syncope git commit: [SYNCOPE-1207] Further cleanup: now audit and notifications contain the actual patch applied

Repository: syncope
Updated Branches:
  refs/heads/2_0_X 86fc76eb9 -> e06b0f251
  refs/heads/master c4ba54c96 -> 6da490da5


[SYNCOPE-1207] Further cleanup: now audit and notifications contain the actual patch applied


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

Branch: refs/heads/2_0_X
Commit: e06b0f251f27463588724ac3036ab99554689629
Parents: 86fc76e
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Sep 15 14:00:31 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Sep 15 14:00:31 2017 +0200

----------------------------------------------------------------------
 .../DefaultAnyObjectProvisioningManager.java    | 10 +++----
 .../java/DefaultGroupProvisioningManager.java   | 11 ++++----
 .../pushpull/AbstractPullResultHandler.java     | 29 +++++++++++++-------
 .../pushpull/AbstractSyncopeResultHandler.java  |  2 +-
 .../AnyObjectPullResultHandlerImpl.java         |  2 +-
 .../AnyObjectPushResultHandlerImpl.java         |  2 +-
 .../pushpull/GroupPullResultHandlerImpl.java    |  2 +-
 .../pushpull/GroupPushResultHandlerImpl.java    |  2 +-
 .../pushpull/UserPullResultHandlerImpl.java     |  5 ++--
 .../pushpull/UserPushResultHandlerImpl.java     |  5 ++--
 .../activiti/ActivitiUserWorkflowAdapter.java   |  9 ++----
 .../core/workflow/activiti/task/Update.java     | 15 ++++++++++
 .../workflow/api/AnyObjectWorkflowAdapter.java  |  2 +-
 .../core/workflow/api/GroupWorkflowAdapter.java |  2 +-
 .../flowable/FlowableUserWorkflowAdapter.java   |  9 ++----
 .../core/workflow/flowable/task/Update.java     | 15 ++++++++++
 .../java/AbstractAnyObjectWorkflowAdapter.java  |  7 +++--
 .../java/AbstractGroupWorkflowAdapter.java      |  6 ++--
 .../java/DefaultAnyObjectWorkflowAdapter.java   | 15 ++++++++--
 .../java/DefaultGroupWorkflowAdapter.java       | 15 ++++++++--
 .../java/DefaultUserWorkflowAdapter.java        | 19 +++++++++----
 .../CamelAnyObjectProvisioningManager.java      |  4 +--
 .../camel/CamelGroupProvisioningManager.java    |  4 +--
 .../camel/CamelUserProvisioningManager.java     |  6 ++--
 .../camel/producer/UpdateProducer.java          |  7 +++--
 .../syncope/fit/core/UserIssuesITCase.java      |  2 +-
 26 files changed, 132 insertions(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
index 0af0b81..b8ef377 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
@@ -98,11 +98,11 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
     public Pair<AnyObjectPatch, List<PropagationStatus>> update(
             final AnyObjectPatch anyObjectPatch, final Set<String> excludedResources, final boolean nullPriorityAsync) {
 
-        WorkflowResult<String> updated = awfAdapter.update(anyObjectPatch);
+        WorkflowResult<AnyObjectPatch> updated = awfAdapter.update(anyObjectPatch);
 
         List<PropagationTask> tasks = propagationManager.getUpdateTasks(
                 AnyTypeKind.ANY_OBJECT,
-                updated.getResult(),
+                updated.getResult().getKey(),
                 false,
                 null,
                 updated.getPropByRes(),
@@ -110,7 +110,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return Pair.of(anyObjectPatch, propagationReporter.getStatuses());
+        return Pair.of(updated.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -149,12 +149,12 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
 
     @Override
     public String unlink(final AnyObjectPatch anyObjectPatch) {
-        return awfAdapter.update(anyObjectPatch).getResult();
+        return awfAdapter.update(anyObjectPatch).getResult().getKey();
     }
 
     @Override
     public String link(final AnyObjectPatch anyObjectPatch) {
-        return awfAdapter.update(anyObjectPatch).getResult();
+        return awfAdapter.update(anyObjectPatch).getResult().getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
index 0fbcd29..4d85bc4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
@@ -122,11 +122,11 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
     public Pair<GroupPatch, List<PropagationStatus>> update(
             final GroupPatch groupPatch, final Set<String> excludedResources, final boolean nullPriorityAsync) {
 
-        WorkflowResult<String> updated = gwfAdapter.update(groupPatch);
+        WorkflowResult<GroupPatch> updated = gwfAdapter.update(groupPatch);
 
         List<PropagationTask> tasks = propagationManager.getUpdateTasks(
                 AnyTypeKind.GROUP,
-                updated.getResult(),
+                updated.getResult().getKey(),
                 false,
                 null,
                 updated.getPropByRes(),
@@ -134,7 +134,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return Pair.of(groupPatch, propagationReporter.getStatuses());
+        return Pair.of(updated.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -186,8 +186,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
 
     @Override
     public String unlink(final GroupPatch groupPatch) {
-        WorkflowResult<String> updated = gwfAdapter.update(groupPatch);
-        return updated.getResult();
+        return gwfAdapter.update(groupPatch).getResult().getKey();
     }
 
     @Override
@@ -229,7 +228,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
 
     @Override
     public String link(final GroupPatch groupPatch) {
-        return gwfAdapter.update(groupPatch).getResult();
+        return gwfAdapter.update(groupPatch).getResult().getKey();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 85507bb..6b6f922 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -328,6 +328,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             if (!profile.isDryRun()) {
                 Result resultStatus;
                 Object output;
+                AnyPatch effectivePatch = null;
 
                 if (before == null) {
                     resultStatus = Result.FAILURE;
@@ -346,7 +347,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                             workingDelta = action.beforeUpdate(profile, workingDelta, before, anyPatch);
                         }
 
-                        AnyTO updated = AnyOperations.patch(before, doUpdate(before, anyPatch, workingDelta, result));
+                        effectivePatch = doUpdate(before, anyPatch, workingDelta, result);
+                        AnyTO updated = AnyOperations.patch(before, effectivePatch);
 
                         for (PullActions action : profile.getActions()) {
                             action.after(profile, workingDelta, updated, result);
@@ -375,7 +377,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                         resultStatus = Result.FAILURE;
                     }
                 }
-                finalize(MatchingRule.toEventName(MatchingRule.UPDATE), resultStatus, before, output, workingDelta);
+                finalize(MatchingRule.toEventName(MatchingRule.UPDATE),
+                        resultStatus, before, output, workingDelta, effectivePatch);
             }
             results.add(result);
         }
@@ -531,8 +534,9 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             }
 
             if (!profile.isDryRun()) {
-                Object output;
                 Result resultStatus;
+                Object output;
+                AnyPatch effectivePatch = null;
 
                 if (before == null) {
                     resultStatus = Result.FAILURE;
@@ -551,12 +555,13 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                             }
                         }
 
-                        AnyPatch patch = newPatch(before.getKey());
-                        patch.getResources().add(new StringPatchItem.Builder().
+                        AnyPatch anyPatch = newPatch(before.getKey());
+                        anyPatch.getResources().add(new StringPatchItem.Builder().
                                 operation(unlink ? PatchOperation.DELETE : PatchOperation.ADD_REPLACE).
                                 value(profile.getTask().getResource().getKey()).build());
 
-                        output = getAnyTO(update(patch).getResult());
+                        effectivePatch = update(anyPatch).getResult();
+                        output = AnyOperations.patch(before, effectivePatch);
 
                         for (PullActions action : profile.getActions()) {
                             action.after(profile, delta, AnyTO.class.cast(output), result);
@@ -585,7 +590,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 }
                 finalize(unlink
                         ? MatchingRule.toEventName(MatchingRule.UNLINK)
-                        : MatchingRule.toEventName(MatchingRule.LINK), resultStatus, before, output, delta);
+                        : MatchingRule.toEventName(MatchingRule.LINK),
+                        resultStatus, before, output, delta, effectivePatch);
             }
             results.add(result);
         }
@@ -813,7 +819,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             final Result result,
             final Object before,
             final Object output,
-            final SyncDelta delta) {
+            final SyncDelta delta,
+            final Object... furtherInput) {
 
         synchronized (this) {
             this.latestResult = result;
@@ -826,7 +833,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 result,
                 before,
                 output,
-                delta);
+                delta,
+                furtherInput);
 
         auditManager.audit(AuditElements.EventCategoryType.PULL,
                 getAnyUtils().getAnyTypeKind().name().toLowerCase(),
@@ -835,6 +843,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 result,
                 before,
                 output,
-                delta);
+                delta,
+                furtherInput);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
index 61e37e1..76bfe3e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
@@ -108,7 +108,7 @@ public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, A
 
     protected abstract AnyPatch newPatch(String key);
 
-    protected abstract WorkflowResult<String> update(AnyPatch patch);
+    protected abstract WorkflowResult<? extends AnyPatch> update(AnyPatch patch);
 
     @Override
     public void setProfile(final ProvisioningProfile<T, A> profile) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
index 6a6c93d..3e652ee 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
@@ -81,7 +81,7 @@ public class AnyObjectPullResultHandlerImpl extends AbstractPullResultHandler im
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         return awfAdapter.update((AnyObjectPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
index b4c3c74..48f464a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
@@ -63,7 +63,7 @@ public class AnyObjectPushResultHandlerImpl extends AbstractPushResultHandler im
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyObjectPatch> update(final AnyPatch patch) {
         return awfAdapter.update((AnyObjectPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
index b008efa..3e2b5bd 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
@@ -91,7 +91,7 @@ public class GroupPullResultHandlerImpl extends AbstractPullResultHandler implem
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         return gwfAdapter.update((GroupPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
index 74b40ad..01a112d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
@@ -63,7 +63,7 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         return gwfAdapter.update((GroupPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
index 349f863..fa299a0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
@@ -81,10 +81,9 @@ public class UserPullResultHandlerImpl extends AbstractPullResultHandler impleme
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         WorkflowResult<Pair<UserPatch, Boolean>> update = uwfAdapter.update((UserPatch) patch);
-        return new WorkflowResult<>(
-                update.getResult().getLeft().getKey(), update.getPropByRes(), update.getPerformedTasks());
+        return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
index 60dd98b..b89850f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
@@ -91,10 +91,9 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         WorkflowResult<Pair<UserPatch, Boolean>> update = uwfAdapter.update((UserPatch) patch);
-        return new WorkflowResult<>(
-                update.getResult().getLeft().getKey(), update.getPropByRes(), update.getPerformedTasks());
+        return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/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 319b886..e327a15 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
@@ -286,8 +286,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         Set<String> tasks = getPerformedTasks(user);
 
-        return new WorkflowResult<Pair<String, Boolean>>(
-                Pair.of(user.getKey(), propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(user.getKey(), propagateEnable), propByRes, tasks);
     }
 
     protected Set<String> doExecuteTask(final User user, final String task, final Map<String, Object> moreVariables) {
@@ -356,8 +355,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override
@@ -426,8 +424,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
index 163cf1c..b73179b 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
@@ -18,7 +18,12 @@
  */
 package org.apache.syncope.core.workflow.activiti.task;
 
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
@@ -39,7 +44,17 @@ public class Update extends AbstractActivitiServiceTask {
         UserPatch userPatch = engine.getRuntimeService().
                 getVariable(executionId, ActivitiUserWorkflowAdapter.USER_PATCH, UserPatch.class);
 
+        UserTO original = dataBinder.getUserTO(user, true);
+
         PropagationByResource propByRes = dataBinder.update(user, userPatch);
+        PasswordPatch password = userPatch.getPassword();
+        Set<AttrTO> virAttrs = userPatch.getVirAttrs();
+
+        UserTO updated = dataBinder.getUserTO(user.getKey());
+        userPatch = AnyOperations.diff(updated, original, false);
+        userPatch.setPassword(password);
+        userPatch.getVirAttrs().clear();
+        userPatch.getVirAttrs().addAll(virAttrs);
 
         // report updated user and propagation by resource as result
         engine.getRuntimeService().setVariable(executionId, ActivitiUserWorkflowAdapter.USER, user);

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
index 22dac48..3a9f21f 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
@@ -50,7 +50,7 @@ public interface AnyObjectWorkflowAdapter extends WorkflowAdapter {
      * @param anyObjectPatch modification set to be performed
      * @return anyObject just updated and propagations to be performed
      */
-    WorkflowResult<String> update(AnyObjectPatch anyObjectPatch);
+    WorkflowResult<AnyObjectPatch> update(AnyObjectPatch anyObjectPatch);
 
     /**
      * Delete a anyObject.

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
index df0740b..72595f6 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
@@ -50,7 +50,7 @@ public interface GroupWorkflowAdapter extends WorkflowAdapter {
      * @param groupPatch modification set to be performed
      * @return group just updated and propagations to be performed
      */
-    WorkflowResult<String> update(GroupPatch groupPatch);
+    WorkflowResult<GroupPatch> update(GroupPatch groupPatch);
 
     /**
      * Delete a group.

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/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 469ce90..7307bd0 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
@@ -286,8 +286,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         Set<String> tasks = getPerformedTasks(user);
 
-        return new WorkflowResult<Pair<String, Boolean>>(
-                Pair.of(user.getKey(), propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(user.getKey(), propagateEnable), propByRes, tasks);
     }
 
     protected Set<String> doExecuteTask(final User user, final String task, final Map<String, Object> moreVariables) {
@@ -356,8 +355,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override
@@ -426,8 +424,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
index 7f5d9d2..7f1c114 100644
--- a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
@@ -18,7 +18,12 @@
  */
 package org.apache.syncope.core.workflow.flowable.task;
 
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
@@ -39,7 +44,17 @@ public class Update extends AbstractFlowableServiceTask {
         UserPatch userPatch = engine.getRuntimeService().
                 getVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, UserPatch.class);
 
+        UserTO original = dataBinder.getUserTO(user, true);
+
         PropagationByResource propByRes = dataBinder.update(user, userPatch);
+        PasswordPatch password = userPatch.getPassword();
+        Set<AttrTO> virAttrs = userPatch.getVirAttrs();
+
+        UserTO updated = dataBinder.getUserTO(user.getKey());
+        userPatch = AnyOperations.diff(updated, original, false);
+        userPatch.setPassword(password);
+        userPatch.getVirAttrs().clear();
+        userPatch.getVirAttrs().addAll(virAttrs);
 
         // report updated user and propagation by resource as result
         engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER, user);

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
index dcc2e82..f502fb3 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
@@ -56,11 +56,12 @@ public abstract class AbstractAnyObjectWorkflowAdapter
         return doCreate(anyObjectTO);
     }
 
-    protected abstract WorkflowResult<String> doUpdate(AnyObject anyObject, AnyObjectPatch anyObjectPatch);
+    protected abstract WorkflowResult<AnyObjectPatch> doUpdate(AnyObject anyObject, AnyObjectPatch anyObjectPatch);
 
     @Override
-    public WorkflowResult<String> update(final AnyObjectPatch anyObjectPatch) {
-        WorkflowResult<String> result = doUpdate(anyObjectDAO.authFind(anyObjectPatch.getKey()), anyObjectPatch);
+    public WorkflowResult<AnyObjectPatch> update(final AnyObjectPatch anyObjectPatch) {
+        WorkflowResult<AnyObjectPatch> result =
+                doUpdate(anyObjectDAO.authFind(anyObjectPatch.getKey()), anyObjectPatch);
 
         // re-read to ensure that requester's administration rights are still valid
         anyObjectDAO.authFind(anyObjectPatch.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
index 3f5394b..153fb8a 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
@@ -55,11 +55,11 @@ public abstract class AbstractGroupWorkflowAdapter implements GroupWorkflowAdapt
         return doCreate(groupTO);
     }
 
-    protected abstract WorkflowResult<String> doUpdate(Group group, GroupPatch groupPatch);
+    protected abstract WorkflowResult<GroupPatch> doUpdate(Group group, GroupPatch groupPatch);
 
     @Override
-    public WorkflowResult<String> update(final GroupPatch groupPatch) {
-        WorkflowResult<String> result = doUpdate(groupDAO.authFind(groupPatch.getKey()), groupPatch);
+    public WorkflowResult<GroupPatch> update(final GroupPatch groupPatch) {
+        WorkflowResult<GroupPatch> result = doUpdate(groupDAO.authFind(groupPatch.getKey()), groupPatch);
 
         // re-read to ensure that requester's administration rights are still valid
         groupDAO.authFind(groupPatch.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
index 8dd536f..e1a6ad5 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
@@ -21,8 +21,11 @@ package org.apache.syncope.core.workflow.java;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
@@ -55,12 +58,18 @@ public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAd
     }
 
     @Override
-    protected WorkflowResult<String> doUpdate(final AnyObject anyObject, final AnyObjectPatch anyObjectPatch) {
+    protected WorkflowResult<AnyObjectPatch> doUpdate(final AnyObject anyObject, final AnyObjectPatch anyObjectPatch) {
+        AnyObjectTO original = dataBinder.getAnyObjectTO(anyObject, true);
+
         PropagationByResource propByRes = dataBinder.update(anyObject, anyObjectPatch);
+        Set<AttrTO> virAttrs = anyObjectPatch.getVirAttrs();
 
-        AnyObject updated = anyObjectDAO.save(anyObject);
+        AnyObjectTO updated = dataBinder.getAnyObjectTO(anyObjectDAO.save(anyObject), true);
+        AnyObjectPatch effectivePatch = AnyOperations.diff(updated, original, false);
+        effectivePatch.getVirAttrs().clear();
+        effectivePatch.getVirAttrs().addAll(virAttrs);
 
-        return new WorkflowResult<>(updated.getKey(), propByRes, "update");
+        return new WorkflowResult<>(effectivePatch, propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
index 86a7330..ef05edd 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
@@ -21,7 +21,10 @@ package org.apache.syncope.core.workflow.java;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.GroupPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
@@ -55,12 +58,18 @@ public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
     }
 
     @Override
-    protected WorkflowResult<String> doUpdate(final Group group, final GroupPatch groupPatch) {
+    protected WorkflowResult<GroupPatch> doUpdate(final Group group, final GroupPatch groupPatch) {
+        GroupTO original = dataBinder.getGroupTO(group, true);
+
         PropagationByResource propByRes = dataBinder.update(group, groupPatch);
+        Set<AttrTO> virAttrs = groupPatch.getVirAttrs();
 
-        Group updated = groupDAO.save(group);
+        GroupTO updated = dataBinder.getGroupTO(groupDAO.save(group), true);
+        GroupPatch effectivePatch = AnyOperations.diff(updated, original, false);
+        effectivePatch.getVirAttrs().clear();
+        effectivePatch.getVirAttrs().addAll(virAttrs);
 
-        return new WorkflowResult<>(updated.getKey(), propByRes, "update");
+        return new WorkflowResult<>(effectivePatch, propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
index 7fc8754..bf2ddab 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
@@ -21,9 +21,12 @@ package org.apache.syncope.core.workflow.java;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
@@ -83,8 +86,7 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.set(ResourceOperation.CREATE, userDAO.findAllResourceKeys(user.getKey()));
 
-        return new WorkflowResult<Pair<String, Boolean>>(
-                Pair.of(user.getKey(), propagateEnable), propByRes, "create");
+        return new WorkflowResult<>(Pair.of(user.getKey(), propagateEnable), propByRes, "create");
     }
 
     @Override
@@ -102,12 +104,19 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
     @Override
     protected WorkflowResult<Pair<UserPatch, Boolean>> doUpdate(final User user, final UserPatch userPatch) {
+        UserTO original = dataBinder.getUserTO(user, true);
+
         PropagationByResource propByRes = dataBinder.update(user, userPatch);
+        PasswordPatch password = userPatch.getPassword();
+        Set<AttrTO> virAttrs = userPatch.getVirAttrs();
 
-        userDAO.save(user);
+        UserTO updated = dataBinder.getUserTO(userDAO.save(user), true);
+        UserPatch effectivePatch = AnyOperations.diff(updated, original, false);
+        effectivePatch.setPassword(password);
+        effectivePatch.getVirAttrs().clear();
+        effectivePatch.getVirAttrs().addAll(virAttrs);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                Pair.of(userPatch, !user.isSuspended()), propByRes, "update");
+        return new WorkflowResult<>(Pair.of(effectivePatch, !user.isSuspended()), propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
index d89e4d2..8d1c24b 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
@@ -135,7 +135,7 @@ public class CamelAnyObjectProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(AnyObjectPatch.class).getKey();
     }
 
     @Override
@@ -150,7 +150,7 @@ public class CamelAnyObjectProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(AnyObjectPatch.class).getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
index 4f6620e..430a351 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
@@ -154,7 +154,7 @@ public class CamelGroupProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(GroupPatch.class).getKey();
     }
 
     @Override
@@ -169,7 +169,7 @@ public class CamelGroupProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(GroupPatch.class).getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
index f5c20f2..4118864 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
@@ -154,8 +154,7 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        exchange.getIn().setBody((exchange.getIn().getBody(UserPatch.class).getKey()));
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(UserPatch.class).getKey();
     }
 
     @Override
@@ -258,8 +257,7 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        exchange.getIn().setBody((exchange.getIn().getBody(UserPatch.class).getKey()));
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(UserPatch.class).getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
index 90fcb29..bbff7e2 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
@@ -63,11 +63,12 @@ public class UpdateProducer extends AbstractProducer {
                 exchange.getOut().setBody(Pair.of(
                         updated.getResult().getLeft(), propagationReporter.getStatuses()));
             } else if (actual instanceof AnyPatch) {
-                WorkflowResult<String> updated = (WorkflowResult<String>) exchange.getIn().getBody();
+                WorkflowResult<? extends AnyPatch> updated =
+                        (WorkflowResult<? extends AnyPatch>) exchange.getIn().getBody();
 
                 List<PropagationTask> tasks = getPropagationManager().getUpdateTasks(
                         actual instanceof AnyObjectPatch ? AnyTypeKind.ANY_OBJECT : AnyTypeKind.GROUP,
-                        updated.getResult(),
+                        updated.getResult().getKey(),
                         false,
                         null,
                         updated.getPropByRes(),
@@ -76,7 +77,7 @@ public class UpdateProducer extends AbstractProducer {
                 PropagationReporter propagationReporter =
                         getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
 
-                exchange.getOut().setBody(Pair.of(actual, propagationReporter.getStatuses()));
+                exchange.getOut().setBody(Pair.of(updated.getResult(), propagationReporter.getStatuses()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/e06b0f25/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
index a708cb2..b2cf3d9 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
@@ -566,7 +566,7 @@ public class UserIssuesITCase extends AbstractITCase {
     }
 
     @Test
-    public void isseSYNCOPE136Random() {
+    public void issueSYNCOPE136Random() {
         // 1. create user with no resources
         UserTO userTO = UserITCase.getUniqueSampleTO("syncope136_Random@apache.org");
         userTO.getResources().clear();


[2/2] syncope git commit: [syncope-1207] Further cleanup: now audit and notifications contain the actual patch applied

Posted by il...@apache.org.
[syncope-1207] Further cleanup: now audit and notifications contain the actual patch applied


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

Branch: refs/heads/master
Commit: 6da490da5887d1d82404915a48fe617574d5bad8
Parents: c4ba54c
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Fri Sep 15 14:00:31 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Fri Sep 15 14:04:09 2017 +0200

----------------------------------------------------------------------
 .../DefaultAnyObjectProvisioningManager.java    | 10 +++----
 .../java/DefaultGroupProvisioningManager.java   | 11 ++++----
 .../pushpull/AbstractPullResultHandler.java     | 29 +++++++++++++-------
 .../pushpull/AbstractSyncopeResultHandler.java  |  2 +-
 .../AnyObjectPullResultHandlerImpl.java         |  2 +-
 .../AnyObjectPushResultHandlerImpl.java         |  2 +-
 .../pushpull/GroupPullResultHandlerImpl.java    |  2 +-
 .../pushpull/GroupPushResultHandlerImpl.java    |  2 +-
 .../pushpull/UserPullResultHandlerImpl.java     |  5 ++--
 .../pushpull/UserPushResultHandlerImpl.java     |  5 ++--
 .../workflow/api/AnyObjectWorkflowAdapter.java  |  2 +-
 .../core/workflow/api/GroupWorkflowAdapter.java |  2 +-
 .../flowable/FlowableUserWorkflowAdapter.java   |  9 ++----
 .../core/workflow/flowable/task/Update.java     | 15 ++++++++++
 .../java/AbstractAnyObjectWorkflowAdapter.java  |  7 +++--
 .../java/AbstractGroupWorkflowAdapter.java      |  6 ++--
 .../java/DefaultAnyObjectWorkflowAdapter.java   | 15 ++++++++--
 .../java/DefaultGroupWorkflowAdapter.java       | 15 ++++++++--
 .../java/DefaultUserWorkflowAdapter.java        | 15 ++++++++--
 .../CamelAnyObjectProvisioningManager.java      |  4 +--
 .../camel/CamelGroupProvisioningManager.java    |  4 +--
 .../camel/CamelUserProvisioningManager.java     |  6 ++--
 .../camel/producer/UpdateProducer.java          |  7 +++--
 .../syncope/fit/core/UserIssuesITCase.java      |  2 +-
 24 files changed, 113 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
index ed4fc0a..e126281 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
@@ -98,11 +98,11 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
     public Pair<AnyObjectPatch, List<PropagationStatus>> update(
             final AnyObjectPatch anyObjectPatch, final Set<String> excludedResources, final boolean nullPriorityAsync) {
 
-        WorkflowResult<String> updated = awfAdapter.update(anyObjectPatch);
+        WorkflowResult<AnyObjectPatch> updated = awfAdapter.update(anyObjectPatch);
 
         List<PropagationTask> tasks = propagationManager.getUpdateTasks(
                 AnyTypeKind.ANY_OBJECT,
-                updated.getResult(),
+                updated.getResult().getKey(),
                 false,
                 null,
                 updated.getPropByRes(),
@@ -110,7 +110,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return Pair.of(anyObjectPatch, propagationReporter.getStatuses());
+        return Pair.of(updated.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -149,12 +149,12 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
 
     @Override
     public String unlink(final AnyObjectPatch anyObjectPatch) {
-        return awfAdapter.update(anyObjectPatch).getResult();
+        return awfAdapter.update(anyObjectPatch).getResult().getKey();
     }
 
     @Override
     public String link(final AnyObjectPatch anyObjectPatch) {
-        return awfAdapter.update(anyObjectPatch).getResult();
+        return awfAdapter.update(anyObjectPatch).getResult().getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
index 208cb00..7ff1156 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
@@ -123,11 +123,11 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
     public Pair<GroupPatch, List<PropagationStatus>> update(
             final GroupPatch groupPatch, final Set<String> excludedResources, final boolean nullPriorityAsync) {
 
-        WorkflowResult<String> updated = gwfAdapter.update(groupPatch);
+        WorkflowResult<GroupPatch> updated = gwfAdapter.update(groupPatch);
 
         List<PropagationTask> tasks = propagationManager.getUpdateTasks(
                 AnyTypeKind.GROUP,
-                updated.getResult(),
+                updated.getResult().getKey(),
                 false,
                 null,
                 updated.getPropByRes(),
@@ -135,7 +135,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return Pair.of(groupPatch, propagationReporter.getStatuses());
+        return Pair.of(updated.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -185,8 +185,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
 
     @Override
     public String unlink(final GroupPatch groupPatch) {
-        WorkflowResult<String> updated = gwfAdapter.update(groupPatch);
-        return updated.getResult();
+        return gwfAdapter.update(groupPatch).getResult().getKey();
     }
 
     @Override
@@ -230,7 +229,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
 
     @Override
     public String link(final GroupPatch groupPatch) {
-        return gwfAdapter.update(groupPatch).getResult();
+        return gwfAdapter.update(groupPatch).getResult().getKey();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index c31f094..b6fe9ac 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -328,6 +328,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             if (!profile.isDryRun()) {
                 Result resultStatus;
                 Object output;
+                AnyPatch effectivePatch = null;
 
                 if (before == null) {
                     resultStatus = Result.FAILURE;
@@ -346,7 +347,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                             workingDelta = action.beforeUpdate(profile, workingDelta, before, anyPatch);
                         }
 
-                        AnyTO updated = AnyOperations.patch(before, doUpdate(before, anyPatch, workingDelta, result));
+                        effectivePatch = doUpdate(before, anyPatch, workingDelta, result);
+                        AnyTO updated = AnyOperations.patch(before, effectivePatch);
 
                         for (PullActions action : profile.getActions()) {
                             action.after(profile, workingDelta, updated, result);
@@ -375,7 +377,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                         resultStatus = Result.FAILURE;
                     }
                 }
-                finalize(MatchingRule.toEventName(MatchingRule.UPDATE), resultStatus, before, output, workingDelta);
+                finalize(MatchingRule.toEventName(MatchingRule.UPDATE),
+                        resultStatus, before, output, workingDelta, effectivePatch);
             }
             results.add(result);
         }
@@ -531,8 +534,9 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             }
 
             if (!profile.isDryRun()) {
-                Object output;
                 Result resultStatus;
+                Object output;
+                AnyPatch effectivePatch = null;
 
                 if (before == null) {
                     resultStatus = Result.FAILURE;
@@ -551,12 +555,13 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                             }
                         }
 
-                        AnyPatch patch = newPatch(before.getKey());
-                        patch.getResources().add(new StringPatchItem.Builder().
+                        AnyPatch anyPatch = newPatch(before.getKey());
+                        anyPatch.getResources().add(new StringPatchItem.Builder().
                                 operation(unlink ? PatchOperation.DELETE : PatchOperation.ADD_REPLACE).
                                 value(profile.getTask().getResource().getKey()).build());
 
-                        output = getAnyTO(update(patch).getResult());
+                        effectivePatch = update(anyPatch).getResult();
+                        output = AnyOperations.patch(before, effectivePatch);
 
                         for (PullActions action : profile.getActions()) {
                             action.after(profile, delta, AnyTO.class.cast(output), result);
@@ -585,7 +590,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 }
                 finalize(unlink
                         ? MatchingRule.toEventName(MatchingRule.UNLINK)
-                        : MatchingRule.toEventName(MatchingRule.LINK), resultStatus, before, output, delta);
+                        : MatchingRule.toEventName(MatchingRule.LINK),
+                        resultStatus, before, output, delta, effectivePatch);
             }
             results.add(result);
         }
@@ -813,7 +819,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
             final Result result,
             final Object before,
             final Object output,
-            final SyncDelta delta) {
+            final SyncDelta delta,
+            final Object... furtherInput) {
 
         synchronized (this) {
             this.latestResult = result;
@@ -826,7 +833,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 result,
                 before,
                 output,
-                delta);
+                delta,
+                furtherInput);
 
         auditManager.audit(AuditElements.EventCategoryType.PULL,
                 getAnyUtils().getAnyTypeKind().name().toLowerCase(),
@@ -835,6 +843,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
                 result,
                 before,
                 output,
-                delta);
+                delta,
+                furtherInput);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
index 61e37e1..76bfe3e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractSyncopeResultHandler.java
@@ -108,7 +108,7 @@ public abstract class AbstractSyncopeResultHandler<T extends ProvisioningTask, A
 
     protected abstract AnyPatch newPatch(String key);
 
-    protected abstract WorkflowResult<String> update(AnyPatch patch);
+    protected abstract WorkflowResult<? extends AnyPatch> update(AnyPatch patch);
 
     @Override
     public void setProfile(final ProvisioningProfile<T, A> profile) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
index 6a6c93d..3e652ee 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPullResultHandlerImpl.java
@@ -81,7 +81,7 @@ public class AnyObjectPullResultHandlerImpl extends AbstractPullResultHandler im
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         return awfAdapter.update((AnyObjectPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
index b4c3c74..48f464a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AnyObjectPushResultHandlerImpl.java
@@ -63,7 +63,7 @@ public class AnyObjectPushResultHandlerImpl extends AbstractPushResultHandler im
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyObjectPatch> update(final AnyPatch patch) {
         return awfAdapter.update((AnyObjectPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
index b008efa..3e2b5bd 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPullResultHandlerImpl.java
@@ -91,7 +91,7 @@ public class GroupPullResultHandlerImpl extends AbstractPullResultHandler implem
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         return gwfAdapter.update((GroupPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
index 74b40ad..01a112d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/GroupPushResultHandlerImpl.java
@@ -63,7 +63,7 @@ public class GroupPushResultHandlerImpl extends AbstractPushResultHandler implem
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         return gwfAdapter.update((GroupPatch) patch);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
index 349f863..fa299a0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPullResultHandlerImpl.java
@@ -81,10 +81,9 @@ public class UserPullResultHandlerImpl extends AbstractPullResultHandler impleme
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         WorkflowResult<Pair<UserPatch, Boolean>> update = uwfAdapter.update((UserPatch) patch);
-        return new WorkflowResult<>(
-                update.getResult().getLeft().getKey(), update.getPropByRes(), update.getPerformedTasks());
+        return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
index 60dd98b..b89850f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
@@ -91,10 +91,9 @@ public class UserPushResultHandlerImpl extends AbstractPushResultHandler impleme
     }
 
     @Override
-    protected WorkflowResult<String> update(final AnyPatch patch) {
+    protected WorkflowResult<? extends AnyPatch> update(final AnyPatch patch) {
         WorkflowResult<Pair<UserPatch, Boolean>> update = uwfAdapter.update((UserPatch) patch);
-        return new WorkflowResult<>(
-                update.getResult().getLeft().getKey(), update.getPropByRes(), update.getPerformedTasks());
+        return new WorkflowResult<>(update.getResult().getLeft(), update.getPropByRes(), update.getPerformedTasks());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
index 22dac48..3a9f21f 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/AnyObjectWorkflowAdapter.java
@@ -50,7 +50,7 @@ public interface AnyObjectWorkflowAdapter extends WorkflowAdapter {
      * @param anyObjectPatch modification set to be performed
      * @return anyObject just updated and propagations to be performed
      */
-    WorkflowResult<String> update(AnyObjectPatch anyObjectPatch);
+    WorkflowResult<AnyObjectPatch> update(AnyObjectPatch anyObjectPatch);
 
     /**
      * Delete a anyObject.

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
index df0740b..72595f6 100644
--- a/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
+++ b/core/workflow-api/src/main/java/org/apache/syncope/core/workflow/api/GroupWorkflowAdapter.java
@@ -50,7 +50,7 @@ public interface GroupWorkflowAdapter extends WorkflowAdapter {
      * @param groupPatch modification set to be performed
      * @return group just updated and propagations to be performed
      */
-    WorkflowResult<String> update(GroupPatch groupPatch);
+    WorkflowResult<GroupPatch> update(GroupPatch groupPatch);
 
     /**
      * Delete a group.

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/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 44cd847..2862380 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
@@ -278,8 +278,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         Set<String> tasks = getPerformedTasks(user);
 
-        return new WorkflowResult<>(
-                Pair.of(user.getKey(), propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(user.getKey(), propagateEnable), propByRes, tasks);
     }
 
     protected Set<String> doExecuteTask(final User user, final String task, final Map<String, Object> moreVariables) {
@@ -348,8 +347,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<>(
-                Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override
@@ -418,8 +416,7 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<>(
-                Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(Pair.of(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
----------------------------------------------------------------------
diff --git a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
index 7f5d9d2..7f1c114 100644
--- a/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
+++ b/core/workflow-flowable/src/main/java/org/apache/syncope/core/workflow/flowable/task/Update.java
@@ -18,7 +18,12 @@
  */
 package org.apache.syncope.core.workflow.flowable.task;
 
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
@@ -39,7 +44,17 @@ public class Update extends AbstractFlowableServiceTask {
         UserPatch userPatch = engine.getRuntimeService().
                 getVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, UserPatch.class);
 
+        UserTO original = dataBinder.getUserTO(user, true);
+
         PropagationByResource propByRes = dataBinder.update(user, userPatch);
+        PasswordPatch password = userPatch.getPassword();
+        Set<AttrTO> virAttrs = userPatch.getVirAttrs();
+
+        UserTO updated = dataBinder.getUserTO(user.getKey());
+        userPatch = AnyOperations.diff(updated, original, false);
+        userPatch.setPassword(password);
+        userPatch.getVirAttrs().clear();
+        userPatch.getVirAttrs().addAll(virAttrs);
 
         // report updated user and propagation by resource as result
         engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER, user);

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
index dcc2e82..f502fb3 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractAnyObjectWorkflowAdapter.java
@@ -56,11 +56,12 @@ public abstract class AbstractAnyObjectWorkflowAdapter
         return doCreate(anyObjectTO);
     }
 
-    protected abstract WorkflowResult<String> doUpdate(AnyObject anyObject, AnyObjectPatch anyObjectPatch);
+    protected abstract WorkflowResult<AnyObjectPatch> doUpdate(AnyObject anyObject, AnyObjectPatch anyObjectPatch);
 
     @Override
-    public WorkflowResult<String> update(final AnyObjectPatch anyObjectPatch) {
-        WorkflowResult<String> result = doUpdate(anyObjectDAO.authFind(anyObjectPatch.getKey()), anyObjectPatch);
+    public WorkflowResult<AnyObjectPatch> update(final AnyObjectPatch anyObjectPatch) {
+        WorkflowResult<AnyObjectPatch> result =
+                doUpdate(anyObjectDAO.authFind(anyObjectPatch.getKey()), anyObjectPatch);
 
         // re-read to ensure that requester's administration rights are still valid
         anyObjectDAO.authFind(anyObjectPatch.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
index 3f5394b..153fb8a 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/AbstractGroupWorkflowAdapter.java
@@ -55,11 +55,11 @@ public abstract class AbstractGroupWorkflowAdapter implements GroupWorkflowAdapt
         return doCreate(groupTO);
     }
 
-    protected abstract WorkflowResult<String> doUpdate(Group group, GroupPatch groupPatch);
+    protected abstract WorkflowResult<GroupPatch> doUpdate(Group group, GroupPatch groupPatch);
 
     @Override
-    public WorkflowResult<String> update(final GroupPatch groupPatch) {
-        WorkflowResult<String> result = doUpdate(groupDAO.authFind(groupPatch.getKey()), groupPatch);
+    public WorkflowResult<GroupPatch> update(final GroupPatch groupPatch) {
+        WorkflowResult<GroupPatch> result = doUpdate(groupDAO.authFind(groupPatch.getKey()), groupPatch);
 
         // re-read to ensure that requester's administration rights are still valid
         groupDAO.authFind(groupPatch.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
index ada196f..8899b06 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
@@ -21,8 +21,11 @@ package org.apache.syncope.core.workflow.java;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
@@ -50,12 +53,18 @@ public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAd
     }
 
     @Override
-    protected WorkflowResult<String> doUpdate(final AnyObject anyObject, final AnyObjectPatch anyObjectPatch) {
+    protected WorkflowResult<AnyObjectPatch> doUpdate(final AnyObject anyObject, final AnyObjectPatch anyObjectPatch) {
+        AnyObjectTO original = dataBinder.getAnyObjectTO(anyObject, true);
+
         PropagationByResource propByRes = dataBinder.update(anyObject, anyObjectPatch);
+        Set<AttrTO> virAttrs = anyObjectPatch.getVirAttrs();
 
-        AnyObject updated = anyObjectDAO.save(anyObject);
+        AnyObjectTO updated = dataBinder.getAnyObjectTO(anyObjectDAO.save(anyObject), true);
+        AnyObjectPatch effectivePatch = AnyOperations.diff(updated, original, false);
+        effectivePatch.getVirAttrs().clear();
+        effectivePatch.getVirAttrs().addAll(virAttrs);
 
-        return new WorkflowResult<>(updated.getKey(), propByRes, "update");
+        return new WorkflowResult<>(effectivePatch, propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
index 7ebbf3d..b61bbf3 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
@@ -21,7 +21,10 @@ package org.apache.syncope.core.workflow.java;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.GroupPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
@@ -50,12 +53,18 @@ public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
     }
 
     @Override
-    protected WorkflowResult<String> doUpdate(final Group group, final GroupPatch groupPatch) {
+    protected WorkflowResult<GroupPatch> doUpdate(final Group group, final GroupPatch groupPatch) {
+        GroupTO original = dataBinder.getGroupTO(group, true);
+
         PropagationByResource propByRes = dataBinder.update(group, groupPatch);
+        Set<AttrTO> virAttrs = groupPatch.getVirAttrs();
 
-        Group updated = groupDAO.save(group);
+        GroupTO updated = dataBinder.getGroupTO(groupDAO.save(group), true);
+        GroupPatch effectivePatch = AnyOperations.diff(updated, original, false);
+        effectivePatch.getVirAttrs().clear();
+        effectivePatch.getVirAttrs().addAll(virAttrs);
 
-        return new WorkflowResult<>(updated.getKey(), propByRes, "update");
+        return new WorkflowResult<>(effectivePatch, propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
index 97c338a..6365c33 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
@@ -21,9 +21,12 @@ package org.apache.syncope.core.workflow.java;
 import java.io.OutputStream;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.AnyOperations;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
@@ -96,11 +99,19 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
     @Override
     protected WorkflowResult<Pair<UserPatch, Boolean>> doUpdate(final User user, final UserPatch userPatch) {
+        UserTO original = dataBinder.getUserTO(user, true);
+
         PropagationByResource propByRes = dataBinder.update(user, userPatch);
+        PasswordPatch password = userPatch.getPassword();
+        Set<AttrTO> virAttrs = userPatch.getVirAttrs();
 
-        userDAO.save(user);
+        UserTO updated = dataBinder.getUserTO(userDAO.save(user), true);
+        UserPatch effectivePatch = AnyOperations.diff(updated, original, false);
+        effectivePatch.setPassword(password);
+        effectivePatch.getVirAttrs().clear();
+        effectivePatch.getVirAttrs().addAll(virAttrs);
 
-        return new WorkflowResult<>(Pair.of(userPatch, !user.isSuspended()), propByRes, "update");
+        return new WorkflowResult<>(Pair.of(effectivePatch, !user.isSuspended()), propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
index d89e4d2..8d1c24b 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelAnyObjectProvisioningManager.java
@@ -135,7 +135,7 @@ public class CamelAnyObjectProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(AnyObjectPatch.class).getKey();
     }
 
     @Override
@@ -150,7 +150,7 @@ public class CamelAnyObjectProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(AnyObjectPatch.class).getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
index 4f6620e..430a351 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelGroupProvisioningManager.java
@@ -154,7 +154,7 @@ public class CamelGroupProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(GroupPatch.class).getKey();
     }
 
     @Override
@@ -169,7 +169,7 @@ public class CamelGroupProvisioningManager
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(GroupPatch.class).getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
index 7f721a5..b6ebe66 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
@@ -154,8 +154,7 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        exchange.getIn().setBody((exchange.getIn().getBody(UserPatch.class).getKey()));
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(UserPatch.class).getKey();
     }
 
     @Override
@@ -258,8 +257,7 @@ public class CamelUserProvisioningManager extends AbstractCamelProvisioningManag
             throw (RuntimeException) exchange.getProperty(Exchange.EXCEPTION_CAUGHT);
         }
 
-        exchange.getIn().setBody((exchange.getIn().getBody(UserPatch.class).getKey()));
-        return exchange.getIn().getBody(String.class);
+        return exchange.getIn().getBody(UserPatch.class).getKey();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
index 90fcb29..bbff7e2 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/UpdateProducer.java
@@ -63,11 +63,12 @@ public class UpdateProducer extends AbstractProducer {
                 exchange.getOut().setBody(Pair.of(
                         updated.getResult().getLeft(), propagationReporter.getStatuses()));
             } else if (actual instanceof AnyPatch) {
-                WorkflowResult<String> updated = (WorkflowResult<String>) exchange.getIn().getBody();
+                WorkflowResult<? extends AnyPatch> updated =
+                        (WorkflowResult<? extends AnyPatch>) exchange.getIn().getBody();
 
                 List<PropagationTask> tasks = getPropagationManager().getUpdateTasks(
                         actual instanceof AnyObjectPatch ? AnyTypeKind.ANY_OBJECT : AnyTypeKind.GROUP,
-                        updated.getResult(),
+                        updated.getResult().getKey(),
                         false,
                         null,
                         updated.getPropByRes(),
@@ -76,7 +77,7 @@ public class UpdateProducer extends AbstractProducer {
                 PropagationReporter propagationReporter =
                         getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
 
-                exchange.getOut().setBody(Pair.of(actual, propagationReporter.getStatuses()));
+                exchange.getOut().setBody(Pair.of(updated.getResult(), propagationReporter.getStatuses()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/6da490da/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
index a21bfa5..ca81a1d 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
@@ -565,7 +565,7 @@ public class UserIssuesITCase extends AbstractITCase {
     }
 
     @Test
-    public void isseSYNCOPE136Random() {
+    public void issueSYNCOPE136Random() {
         // 1. create user with no resources
         UserTO userTO = UserITCase.getUniqueSampleTO("syncope136_Random@apache.org");
         userTO.getResources().clear();