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 2020/11/19 13:55:26 UTC

[syncope] branch 2_1_X updated: [SYNCOPE-1603] Ensuring PushCorrelationRule is always applied if available

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 2_1_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_1_X by this push:
     new 1acdd4e  [SYNCOPE-1603] Ensuring PushCorrelationRule is always applied if available
1acdd4e is described below

commit 1acdd4e45e2082be724b086b50528c38bd529cbd
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Nov 19 14:43:11 2020 +0100

    [SYNCOPE-1603] Ensuring PushCorrelationRule is always applied if available
---
 .../api/propagation/PropagationManager.java        | 16 -----
 .../java/DefaultUserProvisioningManager.java       |  3 +-
 .../java/data/AnyObjectDataBinderImpl.java         | 23 ++++---
 .../provisioning/java/data/UserDataBinderImpl.java | 23 ++++---
 .../AbstractPropagationTaskExecutor.java           | 57 ++--------------
 .../java/propagation/PropagationManagerImpl.java   | 75 ++++------------------
 .../stream/StreamAnyObjectPushResultHandler.java   |  1 -
 .../stream/StreamGroupPushResultHandler.java       |  1 -
 .../stream/StreamUserPushResultHandler.java        |  1 -
 .../camel/producer/DeleteProducer.java             |  3 +-
 .../org/apache/syncope/fit/core/UserITCase.java    | 12 +---
 11 files changed, 51 insertions(+), 164 deletions(-)

diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationManager.java
index 0b05b64..fc2cbe5 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationManager.java
@@ -142,28 +142,12 @@ public interface PropagationManager {
             PropagationByResource<Pair<String, String>> propByLinkedAccount,
             Collection<String> noPropResourceKeys);
 
-    /**
-     * Create the delete tasks for the any object from each resource associated, unless in {@code noPropResourceKeys}.
-     *
-     * @param key any object key
-     * @param propByRes operation to be performed per resource
-     * @param propByLinkedAccount operation to be performed for linked accounts
-     * @param noPropResourceKeys external resource keys not to be considered for propagation
-     * @return list of propagation tasks
-     */
-    List<PropagationTaskInfo> getUserDeleteTasks(
-            String key,
-            PropagationByResource<String> propByRes,
-            PropagationByResource<Pair<String, String>> propByLinkedAccount,
-            Collection<String> noPropResourceKeys);
-
     PropagationTaskInfo newTask(
             DerAttrHandler derAttrHandler,
             Any<?> any,
             ExternalResource resource,
             ResourceOperation operation,
             Provision provision,
-            boolean deleteOnResource,
             Stream<? extends Item> mappingItems,
             Pair<String, Set<Attribute>> preparedAttrs);
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
index 808f5b0..2f14c52 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
@@ -205,7 +205,8 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
         // information could only be available after uwfAdapter.delete(), which
         // will also effectively remove user from db, thus making virtually
         // impossible by NotificationManager to fetch required user information
-        List<PropagationTaskInfo> taskInfos = propagationManager.getUserDeleteTasks(
+        List<PropagationTaskInfo> taskInfos = propagationManager.getDeleteTasks(
+                AnyTypeKind.USER,
                 key,
                 propByRes,
                 propByLinkedAccount,
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index f0547fb..60b3280 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -493,27 +493,21 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                 forEach(delete -> {
                     groupDAO.find(delete).getResources().stream().
                             filter(resource -> !propByRes.contains(resource.getKey())).
-                            forEach(resource -> {
-                                propByRes.add(ResourceOperation.DELETE, resource.getKey());
-                            });
+                            forEach(resource -> propByRes.add(ResourceOperation.DELETE, resource.getKey()));
                 });
         dynGroupMembs.getLeft().stream().
                 filter(group -> dynGroupMembs.getRight().contains(group)).
                 forEach(update -> {
                     groupDAO.find(update).getResources().stream().
                             filter(resource -> !propByRes.contains(resource.getKey())).
-                            forEach(resource -> {
-                                propByRes.add(ResourceOperation.UPDATE, resource.getKey());
-                            });
+                            forEach(resource -> propByRes.add(ResourceOperation.UPDATE, resource.getKey()));
                 });
         dynGroupMembs.getRight().stream().
                 filter(group -> !dynGroupMembs.getLeft().contains(group)).
                 forEach(create -> {
                     groupDAO.find(create).getResources().stream().
                             filter(resource -> !propByRes.contains(resource.getKey())).
-                            forEach(resource -> {
-                                propByRes.add(ResourceOperation.CREATE, resource.getKey());
-                            });
+                            forEach(resource -> propByRes.add(ResourceOperation.CREATE, resource.getKey()));
                 });
 
         // Throw composite exception if there is at least one element set in the composing exceptions
@@ -522,7 +516,16 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
         }
 
         // Re-merge any pending change from above
-        anyObjectDAO.save(anyObject);
+        AnyObject saved = anyObjectDAO.save(anyObject);
+
+        // ensure not to DELETE on External Resources that remain assigned
+        Set<String> assigned = saved.getResources().stream().
+                map(ExternalResource::getKey).collect(Collectors.toCollection(HashSet::new));
+        assigned.addAll(saved.getMemberships().stream().
+                flatMap(m -> m.getRightEnd().getResources().stream()).map(ExternalResource::getKey).
+                collect(Collectors.toSet()));
+        propByRes.removeAll(ResourceOperation.DELETE, assigned);
+
         return propByRes;
     }
 }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 58e8a93..2553c61 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -710,27 +710,21 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
                 forEach(delete -> {
                     groupDAO.find(delete).getResources().stream().
                             filter(resource -> !propByRes.contains(resource.getKey())).
-                            forEach(resource -> {
-                                propByRes.add(ResourceOperation.DELETE, resource.getKey());
-                            });
+                            forEach(resource -> propByRes.add(ResourceOperation.DELETE, resource.getKey()));
                 });
         dynGroupMembs.getLeft().stream().
                 filter(group -> dynGroupMembs.getRight().contains(group)).
                 forEach(update -> {
                     groupDAO.find(update).getResources().stream().
                             filter(resource -> !propByRes.contains(resource.getKey())).
-                            forEach(resource -> {
-                                propByRes.add(ResourceOperation.UPDATE, resource.getKey());
-                            });
+                            forEach(resource -> propByRes.add(ResourceOperation.UPDATE, resource.getKey()));
                 });
         dynGroupMembs.getRight().stream().
                 filter(group -> !dynGroupMembs.getLeft().contains(group)).
                 forEach(create -> {
                     groupDAO.find(create).getResources().stream().
                             filter(resource -> !propByRes.contains(resource.getKey())).
-                            forEach(resource -> {
-                                propByRes.add(ResourceOperation.CREATE, resource.getKey());
-                            });
+                            forEach(resource -> propByRes.add(ResourceOperation.CREATE, resource.getKey()));
                 });
 
         // Throw composite exception if there is at least one element set in the composing exceptions
@@ -739,7 +733,16 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
         }
 
         // Re-merge any pending change from above
-        userDAO.save(user);
+        User saved = userDAO.save(user);
+
+        // ensure not to DELETE on External Resources that remain assigned
+        Set<String> assigned = saved.getResources().stream().
+                map(ExternalResource::getKey).collect(Collectors.toCollection(HashSet::new));
+        assigned.addAll(saved.getMemberships().stream().
+                flatMap(m -> m.getRightEnd().getResources().stream()).map(ExternalResource::getKey).
+                collect(Collectors.toSet()));
+        propByRes.removeAll(ResourceOperation.DELETE, assigned);
+
         return Pair.of(propByRes, propByLinkedAccount);
     }
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 5eb6365..ccff44b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -21,7 +21,6 @@ package org.apache.syncope.core.provisioning.java.propagation;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -278,61 +277,13 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
 
         Uid result;
         if (beforeObj == null) {
-            LOG.debug("{} not found on external resource: ignoring delete", task.getConnObjectKey());
+            LOG.debug("{} not found on {}: ignoring delete", task.getConnObjectKey(), task.getResource().getKey());
             result = null;
         } else {
-            /*
-             * We must choose here whether to
-             * a. actually delete the provided entity from the external resource
-             * b. just update the provided entity data onto the external resource
-             *
-             * (a) happens when either there is no entity associated with the PropagationTask (this takes place
-             * when the task is generated via Logic's delete()) or the provided updated
-             * entity hasn't the current resource assigned (when the task is generated via
-             * Logic's update()).
-             *
-             * (b) happens when the provided updated entity does have the current resource assigned (when the task
-             * is generated via Logic's update()): this basically means that before such
-             * update, this entity used to have the current resource assigned by more than one mean (for example,
-             * two different memberships with the same resource).
-             */
-            Collection<String> resources = Collections.emptySet();
-            if (task.getEntityKey() != null && task.getAnyTypeKind() != null) {
-                switch (task.getAnyTypeKind()) {
-                    case USER:
-                        try {
-                        resources = userDAO.findAllResourceKeys(task.getEntityKey());
-                    } catch (Exception e) {
-                        LOG.error("Could not read user {}", task.getEntityKey(), e);
-                    }
-                    break;
-
-                    case GROUP:
-                        try {
-                        resources = groupDAO.findAllResourceKeys(task.getEntityKey());
-                    } catch (Exception e) {
-                        LOG.error("Could not read group {}", task.getEntityKey(), e);
-                    }
-                    break;
+            LOG.debug("Delete {} on {}", beforeObj.getUid(), task.getResource().getKey());
 
-                    case ANY_OBJECT:
-                    default:
-                        try {
-                        resources = anyObjectDAO.findAllResourceKeys(task.getEntityKey());
-                    } catch (Exception e) {
-                        LOG.error("Could not read any object {}", task.getEntityKey(), e);
-                    }
-                    break;
-                }
-            }
-            if (task.getAnyTypeKind() == null || !resources.contains(task.getResource().getKey())) {
-                LOG.debug("Delete {} on {}", beforeObj.getUid(), task.getResource().getKey());
-
-                connector.delete(beforeObj.getObjectClass(), beforeObj.getUid(), null, propagationAttempted);
-                result = beforeObj.getUid();
-            } else {
-                result = createOrUpdate(task, beforeObj, connector, propagationAttempted);
-            }
+            connector.delete(beforeObj.getObjectClass(), beforeObj.getUid(), null, propagationAttempted);
+            result = beforeObj.getUid();
         }
 
         return result;
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
index 1782982..31316fa 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
@@ -36,13 +36,9 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
-import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
-import org.apache.syncope.core.persistence.api.dao.AnyDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
@@ -83,15 +79,6 @@ public class PropagationManagerImpl implements PropagationManager {
     protected VirSchemaDAO virSchemaDAO;
 
     @Autowired
-    protected AnyObjectDAO anyObjectDAO;
-
-    @Autowired
-    protected UserDAO userDAO;
-
-    @Autowired
-    protected GroupDAO groupDAO;
-
-    @Autowired
     protected ExternalResourceDAO resourceDAO;
 
     @Autowired
@@ -109,25 +96,6 @@ public class PropagationManagerImpl implements PropagationManager {
     @Autowired
     protected AnyUtilsFactory anyUtilsFactory;
 
-    protected AnyDAO<? extends Any<?>> dao(final AnyTypeKind kind) {
-        AnyDAO<? extends Any<?>> dao;
-        switch (kind) {
-            case ANY_OBJECT:
-                dao = anyObjectDAO;
-                break;
-
-            case GROUP:
-                dao = groupDAO;
-                break;
-
-            case USER:
-            default:
-                dao = userDAO;
-        }
-
-        return dao;
-    }
-
     @Override
     public List<PropagationTaskInfo> getCreateTasks(
             final AnyTypeKind kind,
@@ -138,7 +106,7 @@ public class PropagationManagerImpl implements PropagationManager {
             final Collection<String> noPropResourceKeys) {
 
         return getCreateTasks(
-                dao(kind).authFind(key),
+                anyUtilsFactory.getInstance(kind).dao().authFind(key),
                 null,
                 enable,
                 propByRes,
@@ -158,7 +126,7 @@ public class PropagationManagerImpl implements PropagationManager {
             final Collection<String> noPropResourceKeys) {
 
         return getCreateTasks(
-                userDAO.authFind(key),
+                anyUtilsFactory.getInstance(AnyTypeKind.USER).dao().authFind(key),
                 password,
                 enable,
                 propByRes,
@@ -193,7 +161,7 @@ public class PropagationManagerImpl implements PropagationManager {
             }
         }
 
-        return createTasks(any, password, true, enable, false, propByRes, propByLinkedAccount, vAttrs);
+        return createTasks(any, password, true, enable, propByRes, propByLinkedAccount, vAttrs);
     }
 
     @Override
@@ -208,7 +176,7 @@ public class PropagationManagerImpl implements PropagationManager {
             final Collection<String> noPropResourceKeys) {
 
         return getUpdateTasks(
-                dao(kind).authFind(key),
+                anyUtilsFactory.getInstance(kind).dao().authFind(key),
                 null,
                 changePwd,
                 enable,
@@ -225,7 +193,7 @@ public class PropagationManagerImpl implements PropagationManager {
             final Collection<String> noPropResourceKeys) {
 
         return getUpdateTasks(
-                userDAO.authFind(wfResult.getResult().getLeft().getKey()),
+                anyUtilsFactory.getInstance(AnyTypeKind.USER).dao().authFind(wfResult.getResult().getLeft().getKey()),
                 wfResult.getResult().getLeft().getPassword() == null
                 ? null
                 : wfResult.getResult().getLeft().getPassword().getValue(),
@@ -258,7 +226,8 @@ public class PropagationManagerImpl implements PropagationManager {
                     wfResult.getPerformedTasks());
 
             Set<String> pwdResourceNames = new HashSet<>(userPatch.getPassword().getResources());
-            Collection<String> allResourceNames = userDAO.findAllResourceKeys(userPatch.getKey());
+            Collection<String> allResourceNames = anyUtilsFactory.getInstance(AnyTypeKind.USER).
+                    dao().findAllResourceKeys(userPatch.getKey());
             pwdResourceNames.retainAll(allResourceNames);
 
             pwdWFResult.getPropByRes().addAll(ResourceOperation.UPDATE, pwdResourceNames);
@@ -320,7 +289,6 @@ public class PropagationManagerImpl implements PropagationManager {
                 password,
                 changePwd,
                 enable,
-                false,
                 propByRes == null ? new PropagationByResource<>() : propByRes,
                 propByLinkedAccount,
                 vAttrs);
@@ -334,17 +302,9 @@ public class PropagationManagerImpl implements PropagationManager {
             final PropagationByResource<Pair<String, String>> propByLinkedAccount,
             final Collection<String> noPropResourceKeys) {
 
-        return getDeleteTasks(dao(kind).authFind(key), propByRes, propByLinkedAccount, noPropResourceKeys);
-    }
-
-    @Override
-    public List<PropagationTaskInfo> getUserDeleteTasks(
-            final String key,
-            final PropagationByResource<String> propByRes,
-            final PropagationByResource<Pair<String, String>> propByLinkedAccount,
-            final Collection<String> noPropResourceKeys) {
-
-        return getDeleteTasks(userDAO.authFind(key), propByRes, propByLinkedAccount, noPropResourceKeys);
+        return getDeleteTasks(
+                anyUtilsFactory.getInstance(kind).dao().authFind(key),
+                propByRes, propByLinkedAccount, noPropResourceKeys);
     }
 
     protected List<PropagationTaskInfo> getDeleteTasks(
@@ -358,7 +318,7 @@ public class PropagationManagerImpl implements PropagationManager {
         if (propByRes == null || propByRes.isEmpty()) {
             localPropByRes.addAll(
                     ResourceOperation.DELETE,
-                    dao(any.getType().getKind()).findAllResourceKeys(any.getKey()));
+                    anyUtilsFactory.getInstance(any).dao().findAllResourceKeys(any.getKey()));
         } else {
             localPropByRes.merge(propByRes);
         }
@@ -376,7 +336,7 @@ public class PropagationManagerImpl implements PropagationManager {
             }
         }
 
-        return createTasks(any, null, false, false, true, localPropByRes, propByLinkedAccount, null);
+        return createTasks(any, null, false, false, localPropByRes, propByLinkedAccount, null);
     }
 
     @Override
@@ -386,7 +346,6 @@ public class PropagationManagerImpl implements PropagationManager {
             final ExternalResource resource,
             final ResourceOperation operation,
             final Provision provision,
-            final boolean deleteOnResource,
             final Stream<? extends Item> mappingItems,
             final Pair<String, Set<Attribute>> preparedAttrs) {
 
@@ -394,9 +353,7 @@ public class PropagationManagerImpl implements PropagationManager {
         task.setObjectClassName(provision.getObjectClass().getObjectClassValue());
         task.setAnyTypeKind(any.getType().getKind());
         task.setAnyType(any.getType().getKey());
-        if (!deleteOnResource) {
-            task.setEntityKey(any.getKey());
-        }
+        task.setEntityKey(any.getKey());
         task.setOperation(operation);
         task.setConnObjectKey(preparedAttrs.getLeft());
 
@@ -436,7 +393,6 @@ public class PropagationManagerImpl implements PropagationManager {
      * @param password clear text password to be provisioned
      * @param changePwd whether password should be included for propagation attributes or not
      * @param enable whether user must be enabled or not
-     * @param deleteOnResource whether any must be deleted anyway from external resource or not
      * @param propByRes operation to be performed per resource
      * @param propByLinkedAccount operation to be performed on linked accounts
      * @param vAttrs virtual attributes to be set
@@ -447,7 +403,6 @@ public class PropagationManagerImpl implements PropagationManager {
             final String password,
             final boolean changePwd,
             final Boolean enable,
-            final boolean deleteOnResource,
             final PropagationByResource<String> propByRes,
             final PropagationByResource<Pair<String, String>> propByLinkedAccount,
             final Collection<AttrTO> vAttrs) {
@@ -462,7 +417,7 @@ public class PropagationManagerImpl implements PropagationManager {
         Set<String> virtualResources = new HashSet<>();
         virtualResources.addAll(propByRes.get(ResourceOperation.CREATE));
         virtualResources.addAll(propByRes.get(ResourceOperation.UPDATE));
-        virtualResources.addAll(dao(any.getType().getKind()).findAllResourceKeys(any.getKey()));
+        virtualResources.addAll(anyUtilsFactory.getInstance(any).dao().findAllResourceKeys(any.getKey()));
 
         Map<String, Set<Attribute>> vAttrMap = new HashMap<>();
         if (vAttrs != null) {
@@ -524,7 +479,6 @@ public class PropagationManagerImpl implements PropagationManager {
                         resource,
                         operation,
                         provision,
-                        deleteOnResource,
                         mappingItems,
                         preparedAttrs);
                 task.setOldConnObjectKey(propByRes.getOldConnObjectKey(resourceKey));
@@ -568,7 +522,6 @@ public class PropagationManagerImpl implements PropagationManager {
                             account.getResource(),
                             operation,
                             provision,
-                            deleteOnResource,
                             mappingItems,
                             Pair.of(account.getConnObjectKeyValue(),
                                     mappingManager.prepareAttrsFromLinkedAccount(
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamAnyObjectPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamAnyObjectPushResultHandler.java
index fd860ef..aabaf4a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamAnyObjectPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamAnyObjectPushResultHandler.java
@@ -55,7 +55,6 @@ public class StreamAnyObjectPushResultHandler extends DefaultAnyObjectPushResult
                 profile.getTask().getResource(),
                 ResourceOperation.CREATE,
                 provision,
-                false,
                 items,
                 preparedAttrs);
         propagationTask.setConnector(profile.getConnector());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamGroupPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamGroupPushResultHandler.java
index a38c1ba..52e87ce 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamGroupPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamGroupPushResultHandler.java
@@ -55,7 +55,6 @@ public class StreamGroupPushResultHandler extends DefaultGroupPushResultHandler
                 profile.getTask().getResource(),
                 ResourceOperation.CREATE,
                 provision,
-                false,
                 items,
                 preparedAttrs);
         propagationTask.setConnector(profile.getConnector());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamUserPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamUserPushResultHandler.java
index 49f9b26..f63d17d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamUserPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/stream/StreamUserPushResultHandler.java
@@ -55,7 +55,6 @@ public class StreamUserPushResultHandler extends DefaultUserPushResultHandler {
                 profile.getTask().getResource(),
                 ResourceOperation.CREATE,
                 provision,
-                false,
                 items,
                 preparedAttrs);
         propagationTask.setConnector(profile.getConnector());
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
index e765f71..60d33c0 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeleteProducer.java
@@ -74,7 +74,8 @@ public class DeleteProducer extends AbstractProducer {
                     // information could only be available after uwfAdapter.delete(), which
                     // will also effectively remove user from db, thus making virtually
                     // impossible by NotificationManager to fetch required user information
-                    taskInfos = getPropagationManager().getUserDeleteTasks(
+                    taskInfos = getPropagationManager().getDeleteTasks(
+                            AnyTypeKind.USER,
                             key,
                             propByRes,
                             propByLinkedAccount,
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
index 862bccf..b767d33 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
@@ -1325,9 +1325,7 @@ public class UserITCase extends AbstractITCase {
         userTO.getResources().add(RESOURCE_NAME_REST);
 
         // 1. create
-        ProvisioningResult<UserTO> result = userService.create(userTO, true).readEntity(
-                new GenericType<ProvisioningResult<UserTO>>() {
-        });
+        ProvisioningResult<UserTO> result = createUser(userTO);
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(ExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals(RESOURCE_NAME_REST, result.getPropagationStatuses().get(0).getResource());
@@ -1344,9 +1342,7 @@ public class UserITCase extends AbstractITCase {
         patch.setKey(result.getEntity().getKey());
         patch.getPlainAttrs().add(new AttrPatch.Builder().
                 attrTO(new AttrTO.Builder().schema("surname").value("surname2").build()).build());
-        result = userService.update(patch).readEntity(
-                new GenericType<ProvisioningResult<UserTO>>() {
-        });
+        result = updateUser(patch);
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(ExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals(RESOURCE_NAME_REST, result.getPropagationStatuses().get(0).getResource());
@@ -1358,9 +1354,7 @@ public class UserITCase extends AbstractITCase {
         assertNotNull(response.getEntity());
 
         // 3. delete
-        result = userService.delete(result.getEntity().getKey()).readEntity(
-                new GenericType<ProvisioningResult<UserTO>>() {
-        });
+        result = deleteUser(result.getEntity().getKey());
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(ExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals(RESOURCE_NAME_REST, result.getPropagationStatuses().get(0).getResource());