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 2018/06/27 11:04:36 UTC

[2/4] syncope git commit: Various cleanup and optimizations WRT dynamic memberships

Various cleanup and optimizations WRT dynamic memberships


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

Branch: refs/heads/2_0_X
Commit: 756dc386acf28d2b8f983bbf454200fc738859a0
Parents: cae1c87
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Jun 27 12:15:52 2018 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Jun 27 12:15:52 2018 +0200

----------------------------------------------------------------------
 .../org/apache/syncope/core/logic/RoleLogic.java    |  5 ++---
 .../core/persistence/api/dao/DynRealmDAO.java       |  2 ++
 .../syncope/core/persistence/api/dao/GroupDAO.java  |  7 +++++++
 .../syncope/core/persistence/api/dao/RoleDAO.java   |  2 ++
 .../core/persistence/jpa/dao/JPADynRealmDAO.java    |  8 ++++++--
 .../core/persistence/jpa/dao/JPAGroupDAO.java       | 10 +++++-----
 .../core/persistence/jpa/dao/JPARoleDAO.java        |  8 ++++++--
 .../core/persistence/jpa/outer/AnySearchTest.java   |  2 +-
 .../core/persistence/jpa/outer/DynRealmTest.java    |  3 +--
 .../core/persistence/jpa/outer/GroupTest.java       |  4 ++--
 .../core/persistence/jpa/outer/RoleTest.java        |  2 +-
 .../java/data/DynRealmDataBinderImpl.java           |  2 +-
 .../provisioning/java/data/GroupDataBinderImpl.java |  2 ++
 .../provisioning/java/data/RoleDataBinderImpl.java  |  2 +-
 .../activiti/ActivitiUserWorkflowAdapter.java       |  7 ++-----
 .../syncope/core/workflow/activiti/task/Update.java | 16 ----------------
 .../flowable/FlowableUserWorkflowAdapter.java       |  7 ++-----
 .../syncope/core/workflow/flowable/task/Update.java | 16 ----------------
 .../java/DefaultAnyObjectWorkflowAdapter.java       | 14 +-------------
 .../workflow/java/DefaultGroupWorkflowAdapter.java  | 16 ++--------------
 .../workflow/java/DefaultUserWorkflowAdapter.java   | 16 +---------------
 21 files changed, 47 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
index c5b3b9a..80fe6bb 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
@@ -72,7 +72,7 @@ public class RoleLogic extends AbstractTransactionalLogic<RoleTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_CREATE + "')")
     public RoleTO create(final RoleTO roleTO) {
-        return binder.getRoleTO(roleDAO.save(binder.create(roleTO)));
+        return binder.getRoleTO(binder.create(roleTO));
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_UPDATE + "')")
@@ -83,7 +83,7 @@ public class RoleLogic extends AbstractTransactionalLogic<RoleTO> {
             throw new NotFoundException(roleTO.getKey());
         }
 
-        return binder.getRoleTO(roleDAO.save(binder.update(role, roleTO)));
+        return binder.getRoleTO(binder.update(role, roleTO));
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_DELETE + "')")
@@ -159,5 +159,4 @@ public class RoleLogic extends AbstractTransactionalLogic<RoleTO> {
 
         throw new UnresolvedReferenceException();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DynRealmDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DynRealmDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DynRealmDAO.java
index a782ea8..cc2a7af 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DynRealmDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/DynRealmDAO.java
@@ -30,6 +30,8 @@ public interface DynRealmDAO extends DAO<DynRealm> {
 
     DynRealm save(DynRealm dynRealm);
 
+    DynRealm saveAndRefreshDynMemberships(DynRealm dynRealm);
+
     void delete(String key);
 
     void clearDynMembers(DynRealm dynRealm);

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index f296932..8a88618 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -94,4 +94,11 @@ public interface GroupDAO extends AnyDAO<Group> {
      */
     Set<String> removeDynMemberships(User user);
 
+    /**
+     * Saves the provided group and refreshes all User and AnyObject members.
+     *
+     * @param group group to save
+     * @return merged group
+     */
+    Group saveAndRefreshDynMemberships(Group group);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
index cc29852..f399734 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java
@@ -35,6 +35,8 @@ public interface RoleDAO extends DAO<Role> {
 
     Role save(Role role);
 
+    Role saveAndRefreshDynMemberships(Role role);
+
     void delete(Role role);
 
     void delete(String key);

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
index 0ef29e6..ea45afb 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java
@@ -87,7 +87,12 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO
 
     @Override
     public DynRealm save(final DynRealm dynRealm) {
-        DynRealm merged = entityManager().merge(dynRealm);
+        return entityManager().merge(dynRealm);
+    }
+
+    @Override
+    public DynRealm saveAndRefreshDynMemberships(final DynRealm dynRealm) {
+        DynRealm merged = save(dynRealm);
 
         // refresh dynamic memberships
         clearDynMembers(merged);
@@ -155,5 +160,4 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO
         delete.setParameter(1, key);
         delete.executeUpdate();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index 797dd96..c4b7362 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -292,8 +292,8 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     }
 
     @Override
-    public Group save(final Group group) {
-        Group merged = super.save(group);
+    public Group saveAndRefreshDynMemberships(final Group group) {
+        Group merged = save(group);
         publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged, AuthContextUtils.getDomain()));
 
         // refresh dynamic memberships
@@ -427,7 +427,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Override
     public int countAMembers(final Group group) {
         Query query = entityManager().createNativeQuery(
-            "SELECT COUNT(anyObject_id) FROM " + JPAAMembership.TABLE + " WHERE group_id=?");
+                "SELECT COUNT(anyObject_id) FROM " + JPAAMembership.TABLE + " WHERE group_id=?");
         query.setParameter(1, group.getKey());
 
         return ((Number) query.getSingleResult()).intValue();
@@ -436,7 +436,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Override
     public int countUMembers(final Group group) {
         Query query = entityManager().createNativeQuery(
-            "SELECT COUNT(user_id) FROM " + JPAUMembership.TABLE + " WHERE group_id=?");
+                "SELECT COUNT(user_id) FROM " + JPAUMembership.TABLE + " WHERE group_id=?");
         query.setParameter(1, group.getKey());
 
         return ((Number) query.getSingleResult()).intValue();
@@ -445,7 +445,7 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Override
     public int countADynMembers(final Group group) {
         Query query = entityManager().createNativeQuery(
-            "SELECT COUNT(any_id) FROM " + ADYNMEMB_TABLE + " WHERE group_id=?");
+                "SELECT COUNT(any_id) FROM " + ADYNMEMB_TABLE + " WHERE group_id=?");
         query.setParameter(1, group.getKey());
 
         return ((Number) query.getSingleResult()).intValue();

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index 37096c7..60dfe11 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -88,7 +88,12 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
 
     @Override
     public Role save(final Role role) {
-        Role merged = entityManager().merge(role);
+        return entityManager().merge(role);
+    }
+
+    @Override
+    public Role saveAndRefreshDynMemberships(final Role role) {
+        Role merged = save(role);
 
         // refresh dynamic memberships
         clearDynMembers(merged);
@@ -189,5 +194,4 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO {
         delete.setParameter(1, key);
         delete.executeUpdate();
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
index f3d3203..9d9d287 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
@@ -93,7 +93,7 @@ public class AnySearchTest extends AbstractTest {
 
         role.setDynMembership(dynMembership);
 
-        role = roleDAO.save(role);
+        role = roleDAO.saveAndRefreshDynMemberships(role);
         assertNotNull(role);
 
         roleDAO.flush();

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
index db47035..efeb338 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/DynRealmTest.java
@@ -76,7 +76,7 @@ public class DynRealmTest extends AbstractTest {
         }
 
         dynRealm.setKey("name");
-        DynRealm actual = dynRealmDAO.save(dynRealm);
+        DynRealm actual = dynRealmDAO.saveAndRefreshDynMemberships(dynRealm);
         assertNotNull(actual);
 
         dynRealmDAO.flush();
@@ -92,5 +92,4 @@ public class DynRealmTest extends AbstractTest {
 
         assertTrue(userDAO.findDynRealms(user.getKey()).contains(actual.getKey()));
     }
-
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
index fc359e3..6d9fa9e 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
@@ -227,7 +227,7 @@ public class GroupTest extends AbstractTest {
 
         group.setUDynMembership(dynMembership);
 
-        Group actual = groupDAO.save(group);
+        Group actual = groupDAO.saveAndRefreshDynMemberships(group);
         assertNotNull(actual);
 
         groupDAO.flush();
@@ -328,7 +328,7 @@ public class GroupTest extends AbstractTest {
 
         group.add(dynMembership);
 
-        Group actual = groupDAO.save(group);
+        Group actual = groupDAO.saveAndRefreshDynMemberships(group);
         assertNotNull(actual);
 
         groupDAO.flush();

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
index 6ba7906..eeae5b9 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java
@@ -121,7 +121,7 @@ public class RoleTest extends AbstractTest {
 
         role.setDynMembership(dynMembership);
 
-        Role actual = roleDAO.save(role);
+        Role actual = roleDAO.saveAndRefreshDynMemberships(role);
         assertNotNull(actual);
 
         roleDAO.flush();

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
index cf324ea..87b6a93 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
@@ -97,7 +97,7 @@ public class DynRealmDataBinderImpl implements DynRealmDataBinder {
             }
         }
 
-        return dynRealmDAO.save(dynRealm);
+        return dynRealmDAO.saveAndRefreshDynMemberships(dynRealm);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index c0e1b89..137bd82 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -264,6 +264,8 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
             }
         }
 
+        group = groupDAO.saveAndRefreshDynMemberships(group);
+
         // type extensions
         for (TypeExtensionTO typeExtTO : groupPatch.getTypeExtensions()) {
             AnyType anyType = anyTypeDAO.find(typeExtTO.getAnyType());

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
index b907051..9122118 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
@@ -125,7 +125,7 @@ public class RoleDataBinderImpl implements RoleDataBinder {
             setDynMembership(role, roleTO.getDynMembershipCond());
         }
 
-        return role;
+        return roleDAO.saveAndRefreshDynMemberships(role);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 b25ffd9..123f8df 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
@@ -351,16 +351,13 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         PropagationByResource propByRes = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROP_BY_RESOURCE, PropagationByResource.class);
-        UserPatch updatedPatch = engine.getRuntimeService().getVariable(
-                user.getWorkflowId(), USER_PATCH, UserPatch.class);
-
         saveForFormSubmit(
-                updated, updatedPatch.getPassword() == null ? null : updatedPatch.getPassword().getValue(), propByRes);
+                updated, userPatch.getPassword() == null ? null : userPatch.getPassword().getValue(), propByRes);
 
         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(userPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 e769871..0e65277 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,12 +18,7 @@
  */
 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.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -49,22 +44,11 @@ public class Update extends AbstractActivitiServiceTask {
                 getVariable(executionId, ActivitiUserWorkflowAdapter.USER_PATCH, UserPatch.class);
 
         user = userDAO.save(user);
-        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);
-        engine.getRuntimeService().setVariable(executionId, ActivitiUserWorkflowAdapter.USER_TO, updated);
-        engine.getRuntimeService().setVariable(executionId, ActivitiUserWorkflowAdapter.USER_PATCH, userPatch);
         engine.getRuntimeService().setVariable(executionId, ActivitiUserWorkflowAdapter.PROP_BY_RESOURCE, propByRes);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 23a4da1..8755572 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
@@ -350,16 +350,13 @@ public class FlowableUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         PropagationByResource propByRes = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROP_BY_RESOURCE, PropagationByResource.class);
-        UserPatch updatedPatch = engine.getRuntimeService().getVariable(
-                user.getWorkflowId(), USER_PATCH, UserPatch.class);
-
         saveForFormSubmit(
-                updated, updatedPatch.getPassword() == null ? null : updatedPatch.getPassword().getValue(), propByRes);
+                updated, userPatch.getPassword() == null ? null : userPatch.getPassword().getValue(), propByRes);
 
         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(userPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 c619211..757d009 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,12 +18,7 @@
  */
 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.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -49,22 +44,11 @@ public class Update extends AbstractFlowableServiceTask {
                 getVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, UserPatch.class);
 
         user = userDAO.save(user);
-        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);
-        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER_TO, updated);
-        engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.USER_PATCH, userPatch);
         engine.getRuntimeService().setVariable(executionId, FlowableUserWorkflowAdapter.PROP_BY_RESOURCE, propByRes);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 2a35600..eac899a 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,11 +21,8 @@ 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.common.lib.to.WorkflowTaskTO;
@@ -60,17 +57,8 @@ public class DefaultAnyObjectWorkflowAdapter extends AbstractAnyObjectWorkflowAd
 
     @Override
     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();
-
-        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<>(effectivePatch, propByRes, "update");
+        return new WorkflowResult<>(anyObjectPatch, propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 e3adfab..d430200 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,10 +21,7 @@ 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,7 +47,7 @@ public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
     protected WorkflowResult<String> doCreate(final GroupTO groupTO) {
         Group group = entityFactory.newEntity(Group.class);
         dataBinder.create(group, groupTO);
-        group = groupDAO.save(group);
+        group = groupDAO.saveAndRefreshDynMemberships(group);
 
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.set(ResourceOperation.CREATE, groupDAO.findAllResourceKeys(group.getKey()));
@@ -60,17 +57,8 @@ public class DefaultGroupWorkflowAdapter extends AbstractGroupWorkflowAdapter {
 
     @Override
     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();
-
-        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<>(effectivePatch, propByRes, "update");
+        return new WorkflowResult<>(groupPatch, propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/756dc386/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 8503622..c055d8f 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,12 +21,9 @@ 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;
@@ -105,19 +102,8 @@ 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();
-
-        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(effectivePatch, !user.isSuspended()), propByRes, "update");
+        return new WorkflowResult<>(Pair.of(userPatch, !user.isSuspended()), propByRes, "update");
     }
 
     @Override