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 14:12:56 UTC

[syncope] branch master 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 master
in repository https://gitbox.apache.org/repos/asf/syncope.git


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

commit a9386fcadee463d08037a6383d294b959a8c92f8
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         | 11 +++-
 .../provisioning/java/data/UserDataBinderImpl.java | 11 +++-
 .../AbstractPropagationTaskExecutor.java           | 56 ++--------------
 .../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, 45 insertions(+), 145 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 dec9af3..7cb3979 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 dd3a2ef..4751c5f 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
@@ -213,7 +213,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 709d4ab..a12f3db 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
@@ -509,7 +509,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 2d015d7..70ad56a 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
@@ -725,7 +725,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 0aabd5f..bc88e91 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
@@ -272,61 +272,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 = Set.of();
-            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 8d603c6..627384c 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,10 +36,6 @@ import org.apache.syncope.common.lib.request.UserUR;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 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.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;
@@ -84,15 +80,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
@@ -110,25 +97,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,
@@ -139,7 +107,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,
@@ -159,7 +127,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,
@@ -194,7 +162,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
@@ -209,7 +177,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,
@@ -226,7 +194,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(),
@@ -259,7 +227,8 @@ public class PropagationManagerImpl implements PropagationManager {
                     wfResult.getPerformedTasks());
 
             Set<String> pwdResourceNames = new HashSet<>(userUR.getPassword().getResources());
-            Collection<String> allResourceNames = userDAO.findAllResourceKeys(userUR.getKey());
+            Collection<String> allResourceNames = anyUtilsFactory.getInstance(AnyTypeKind.USER).
+                    dao().findAllResourceKeys(userUR.getKey());
             pwdResourceNames.retainAll(allResourceNames);
 
             pwdWFResult.getPropByRes().addAll(ResourceOperation.UPDATE, pwdResourceNames);
@@ -321,7 +290,6 @@ public class PropagationManagerImpl implements PropagationManager {
                 password,
                 changePwd,
                 enable,
-                false,
                 Optional.ofNullable(propByRes).orElseGet(PropagationByResource::new),
                 propByLinkedAccount,
                 vAttrs);
@@ -335,17 +303,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(
@@ -359,7 +319,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);
         }
@@ -377,7 +337,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
@@ -387,7 +347,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) {
 
@@ -395,9 +354,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());
 
@@ -437,7 +394,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
@@ -448,7 +404,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<Attr> vAttrs) {
@@ -463,7 +418,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) {
@@ -527,7 +482,6 @@ public class PropagationManagerImpl implements PropagationManager {
                         resource,
                         operation,
                         provision,
-                        deleteOnResource,
                         mappingItems,
                         preparedAttrs);
                 task.setOldConnObjectKey(propByRes.getOldConnObjectKey(resourceKey));
@@ -571,7 +525,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 918c2a5..887968b 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
@@ -61,7 +61,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 ad169fd..f3411ab 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
@@ -61,7 +61,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 e2b3446..45a6dcb 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
@@ -61,7 +61,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 7049b8c..46b6165 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 6af9440..c501aae 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
@@ -1299,9 +1299,7 @@ public class UserITCase extends AbstractITCase {
         userCR.getResources().add(RESOURCE_NAME_REST);
 
         // 1. create
-        ProvisioningResult<UserTO> result = userService.create(userCR).readEntity(
-                new GenericType<ProvisioningResult<UserTO>>() {
-        });
+        ProvisioningResult<UserTO> result = createUser(userCR);
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(ExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals(RESOURCE_NAME_REST, result.getPropagationStatuses().get(0).getResource());
@@ -1317,9 +1315,7 @@ public class UserITCase extends AbstractITCase {
         UserUR userUR = new UserUR.Builder(result.getEntity().getKey()).
                 plainAttr(new AttrPatch.Builder(new Attr.Builder("surname").value("surname2").build()).build()).
                 build();
-        result = userService.update(userUR).readEntity(
-                new GenericType<ProvisioningResult<UserTO>>() {
-        });
+        result = updateUser(userUR);
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(ExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals(RESOURCE_NAME_REST, result.getPropagationStatuses().get(0).getResource());
@@ -1331,9 +1327,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());