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 2022/10/14 08:19:30 UTC

[syncope] branch master updated: A few optimizations around incremental pull task execution

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 c7d3c995db A few optimizations around incremental pull task execution
c7d3c995db is described below

commit c7d3c995dbc972f619652ce45a84900eb238095c
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Fri Oct 14 10:19:22 2022 +0200

    A few optimizations around incremental pull task execution
---
 .../syncope/core/logic/ReconciliationLogic.java    |  2 +-
 .../apache/syncope/core/logic/ResourceLogic.java   |  6 ++--
 .../persistence/api/entity/ExternalResource.java   |  5 ++--
 .../jpa/entity/JPAExternalResource.java            |  7 ++---
 .../core/persistence/jpa/inner/AnyTypeTest.java    |  2 +-
 .../core/persistence/jpa/inner/PolicyTest.java     | 13 +++++----
 .../core/persistence/jpa/inner/ResourceTest.java   | 32 +++++++++++-----------
 .../persistence/jpa/outer/PlainSchemaTest.java     | 11 +++-----
 .../core/persistence/jpa/outer/ResourceTest.java   | 20 ++++++--------
 .../core/persistence/jpa/outer/VirSchemaTest.java  |  7 +++--
 .../provisioning/java/DefaultMappingManager.java   |  4 +--
 .../provisioning/java/DefaultVirAttrHandler.java   |  2 +-
 .../java/data/AbstractAnyDataBinder.java           |  4 +--
 .../java/data/ResourceDataBinderImpl.java          |  2 +-
 .../java/data/SchemaDataBinderImpl.java            |  2 +-
 .../provisioning/java/data/UserDataBinderImpl.java |  4 +--
 .../java/job/report/ReconciliationReportlet.java   |  2 +-
 .../AbstractPropagationTaskExecutor.java           |  5 ++--
 .../propagation/DefaultPropagationManager.java     | 12 ++++----
 .../LDAPMembershipPropagationActions.java          |  2 +-
 .../pushpull/AbstractProvisioningJobDelegate.java  |  9 +++---
 .../java/pushpull/AbstractPullResultHandler.java   |  3 +-
 .../java/pushpull/AbstractPushResultHandler.java   |  3 +-
 .../provisioning/java/pushpull/InboundMatcher.java |  2 +-
 .../java/pushpull/LDAPMembershipPullActions.java   |  3 +-
 .../java/pushpull/PullJobDelegate.java             | 13 +++++++--
 .../java/DefaultMappingManagerTest.java            |  6 ++--
 .../java/data/ResourceDataBinderTest.java          | 16 +++++------
 .../pushpull/LDAPMembershipPullActionsTest.java    |  4 +--
 .../core/spring/security/AuthDataAccessor.java     | 13 ++-------
 .../core/spring/security/WebSecurityContext.java   |  3 --
 31 files changed, 108 insertions(+), 111 deletions(-)

diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
index 5223b589ac..ec8e974a8e 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ReconciliationLogic.java
@@ -177,7 +177,7 @@ public class ReconciliationLogic extends AbstractTransactionalLogic<EntityTO> {
         if (resource == null) {
             throw new NotFoundException("Resource '" + resourceKey + "'");
         }
-        Provision provision = resource.getProvision(anyType.getKey()).
+        Provision provision = resource.getProvisionByAnyType(anyType.getKey()).
                 orElseThrow(() -> new NotFoundException(
                 "Provision for " + anyType + " on Resource '" + resourceKey + "'"));
         if (provision.getMapping() == null) {
diff --git a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
index 5407d59136..1fd59b9b63 100644
--- a/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
+++ b/core/idm/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
@@ -206,7 +206,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
             if (anyType == null) {
                 throw new NotFoundException("AnyType '" + anyTypeKey + '\'');
             }
-            Provision provision = resource.getProvision(anyType.getKey()).
+            Provision provision = resource.getProvisionByAnyType(anyType.getKey()).
                     orElseThrow(() -> new NotFoundException(
                     "Provision for AnyType '" + anyTypeKey + "' in Resource '" + key + '\''));
 
@@ -239,7 +239,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
             if (anyType == null) {
                 throw new NotFoundException("AnyType '" + anyTypeKey + '\'');
             }
-            Provision provision = resource.getProvision(anyType.getKey()).
+            Provision provision = resource.getProvisionByAnyType(anyType.getKey()).
                     orElseThrow(() -> new NotFoundException(
                     "Provision for AnyType '" + anyTypeKey + "' in Resource '" + key + '\''));
 
@@ -302,7 +302,7 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
         if (resource == null) {
             throw new NotFoundException("Resource '" + resourceKey + "'");
         }
-        Provision provision = resource.getProvision(anyType.getKey()).
+        Provision provision = resource.getProvisionByAnyType(anyType.getKey()).
                 orElseThrow(() -> new NotFoundException(
                 "Provision for " + anyType + " on Resource '" + resourceKey + "'"));
         if (provision.getMapping() == null) {
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ExternalResource.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ExternalResource.java
index 370c1932cc..657d16d098 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ExternalResource.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/ExternalResource.java
@@ -31,7 +31,6 @@ import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PropagationPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PushPolicy;
-import org.identityconnectors.framework.common.objects.ObjectClass;
 
 public interface ExternalResource extends ProvidedKeyEntity {
 
@@ -105,9 +104,9 @@ public interface ExternalResource extends ProvidedKeyEntity {
 
     void setRandomPwdIfNotProvided(boolean condition);
 
-    Optional<Provision> getProvision(String anyType);
+    Optional<Provision> getProvisionByAnyType(String anyType);
 
-    Optional<Provision> getProvision(ObjectClass objectClass);
+    Optional<Provision> getProvisionByObjectClass(String objectClass);
 
     List<Provision> getProvisions();
 
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java
index 5a5b1602a1..339ff1484a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAExternalResource.java
@@ -66,7 +66,6 @@ import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPullPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPushPolicy;
 import org.apache.syncope.core.persistence.jpa.validation.entity.ExternalResourceCheck;
 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
-import org.identityconnectors.framework.common.objects.ObjectClass;
 
 /**
  * Resource for propagation and pull.
@@ -202,15 +201,15 @@ public class JPAExternalResource extends AbstractProvidedKeyEntity implements Ex
     }
 
     @Override
-    public Optional<Provision> getProvision(final String anyType) {
+    public Optional<Provision> getProvisionByAnyType(final String anyType) {
         return getProvisions().stream().
                 filter(provision -> provision.getAnyType().equals(anyType)).findFirst();
     }
 
     @Override
-    public Optional<Provision> getProvision(final ObjectClass objectClass) {
+    public Optional<Provision> getProvisionByObjectClass(final String objectClass) {
         return getProvisions().stream().
-                filter(provision -> provision.getObjectClass().equals(objectClass.getObjectClassValue())).findFirst();
+                filter(provision -> provision.getObjectClass().equals(objectClass)).findFirst();
     }
 
     @Override
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
index d962da7141..1605e9c884 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnyTypeTest.java
@@ -116,6 +116,6 @@ public class AnyTypeTest extends AbstractTest {
 
     @Test
     public void deleteInvalid() {
-        assertThrows(IllegalArgumentException.class, () -> anyTypeDAO.delete(anyTypeDAO.findUser().getKey()));
+        assertThrows(IllegalArgumentException.class, () -> anyTypeDAO.delete(AnyTypeKind.USER.name()));
     }
 }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
index 6fa39397fb..190b55817a 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PolicyTest.java
@@ -33,6 +33,7 @@ import org.apache.syncope.common.lib.policy.DefaultAuthPolicyConf;
 import org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf;
 import org.apache.syncope.common.lib.policy.DefaultPullCorrelationRuleConf;
 import org.apache.syncope.common.lib.policy.DefaultPushCorrelationRuleConf;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.BackOffStrategy;
 import org.apache.syncope.common.lib.types.ConflictResolutionAction;
 import org.apache.syncope.common.lib.types.IdMImplementationType;
@@ -90,7 +91,7 @@ public class PolicyTest extends AbstractTest {
         PullPolicy pullPolicy = policyDAO.find("880f8553-069b-4aed-9930-2cd53873f544");
         assertNotNull(pullPolicy);
 
-        PullCorrelationRuleEntity pullCR = pullPolicy.getCorrelationRule(anyTypeDAO.findUser().getKey()).orElse(null);
+        PullCorrelationRuleEntity pullCR = pullPolicy.getCorrelationRule(AnyTypeKind.USER.name()).orElse(null);
         assertNotNull(pullCR);
         DefaultPullCorrelationRuleConf pullCRConf =
                 POJOHelper.deserialize(pullCR.getImplementation().getBody(), DefaultPullCorrelationRuleConf.class);
@@ -102,7 +103,7 @@ public class PolicyTest extends AbstractTest {
         PushPolicy pushPolicy = policyDAO.find("fb6530e5-892d-4f47-a46b-180c5b6c5c83");
         assertNotNull(pushPolicy);
 
-        PushCorrelationRuleEntity pushCR = pushPolicy.getCorrelationRule(anyTypeDAO.findUser().getKey()).orElse(null);
+        PushCorrelationRuleEntity pushCR = pushPolicy.getCorrelationRule(AnyTypeKind.USER.name()).orElse(null);
         assertNotNull(pushCR);
         DefaultPushCorrelationRuleConf pushCRConf =
                 POJOHelper.deserialize(pushCR.getImplementation().getBody(), DefaultPushCorrelationRuleConf.class);
@@ -214,9 +215,9 @@ public class PolicyTest extends AbstractTest {
 
         assertNotNull(pullPolicy);
         assertEquals(pullURuleName,
-                pullPolicy.getCorrelationRule(anyTypeDAO.findUser().getKey()).get().getImplementation().getKey());
+                pullPolicy.getCorrelationRule(AnyTypeKind.USER.name()).get().getImplementation().getKey());
         assertEquals(pullGRuleName,
-                pullPolicy.getCorrelationRule(anyTypeDAO.findGroup().getKey()).get().getImplementation().getKey());
+                pullPolicy.getCorrelationRule(AnyTypeKind.GROUP.name()).get().getImplementation().getKey());
     }
 
     @Test
@@ -258,9 +259,9 @@ public class PolicyTest extends AbstractTest {
 
         assertNotNull(pushPolicy);
         assertEquals(pushURuleName,
-                pushPolicy.getCorrelationRule(anyTypeDAO.findUser().getKey()).get().getImplementation().getKey());
+                pushPolicy.getCorrelationRule(AnyTypeKind.USER.name()).get().getImplementation().getKey());
         assertEquals(pushGRuleName,
-                pushPolicy.getCorrelationRule(anyTypeDAO.findGroup().getKey()).get().getImplementation().getKey());
+                pushPolicy.getCorrelationRule(AnyTypeKind.GROUP.name()).get().getImplementation().getKey());
     }
 
     @Test
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
index 8a9677e4ed..0cd2b02fdb 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
@@ -32,11 +32,11 @@ import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.Item;
 import org.apache.syncope.common.lib.to.Mapping;
 import org.apache.syncope.common.lib.to.Provision;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.common.lib.types.IdMEntitlement;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
@@ -58,9 +58,6 @@ public class ResourceTest extends AbstractTest {
     @Autowired
     private ExternalResourceDAO resourceDAO;
 
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
     @Test
     public void findById() {
         ExternalResource resource = resourceDAO.find("ws-target-resource-1");
@@ -71,7 +68,7 @@ public class ResourceTest extends AbstractTest {
         assertEquals("net.tirasa.connid.bundles.soap.WebServiceConnector", connector.getConnectorName());
         assertEquals("net.tirasa.connid.bundles.soap", connector.getBundleName());
 
-        Mapping mapping = resource.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping();
+        Mapping mapping = resource.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping();
         assertFalse(mapping.getItems().isEmpty());
 
         assertTrue(mapping.getItems().stream().
@@ -117,7 +114,7 @@ public class ResourceTest extends AbstractTest {
     public void getConnObjectKey() {
         ExternalResource resource = resourceDAO.find("ws-target-resource-2");
         assertNotNull(resource);
-        assertEquals("fullname", resource.getProvision(anyTypeDAO.findUser().getKey()).get().
+        assertEquals("fullname", resource.getProvisionByAnyType(AnyTypeKind.USER.name()).get().
                 getMapping().getConnObjectKeyItem().get().getIntAttrName());
     }
 
@@ -128,7 +125,7 @@ public class ResourceTest extends AbstractTest {
         resource.setPropagationPriority(2);
 
         Provision provision = new Provision();
-        provision.setAnyType(anyTypeDAO.findUser().getKey());
+        provision.setAnyType(AnyTypeKind.USER.name());
         provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
         resource.getProvisions().add(provision);
 
@@ -149,8 +146,10 @@ public class ResourceTest extends AbstractTest {
         entityManager().flush();
         assertNotNull(actual);
         assertNotNull(actual.getConnector());
-        assertNotNull(actual.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping());
-        assertFalse(actual.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().isEmpty());
+        assertNotNull(actual.getProvisionByAnyType(AnyTypeKind.USER.name()).
+                get().getMapping());
+        assertFalse(actual.getProvisionByAnyType(AnyTypeKind.USER.name()).
+                get().getMapping().getItems().isEmpty());
         assertEquals(Integer.valueOf(2), actual.getPropagationPriority());
     }
 
@@ -164,7 +163,7 @@ public class ResourceTest extends AbstractTest {
             resource.setConnector(connector);
 
             Provision provision = new Provision();
-            provision.setAnyType(anyTypeDAO.findUser().getKey());
+            provision.setAnyType(AnyTypeKind.USER.name());
             provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
             resource.getProvisions().add(provision);
 
@@ -190,7 +189,7 @@ public class ResourceTest extends AbstractTest {
             resource.setConnector(connector);
 
             Provision provision = new Provision();
-            provision.setAnyType(anyTypeDAO.findUser().getKey());
+            provision.setAnyType(AnyTypeKind.USER.name());
             provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
             resource.getProvisions().add(provision);
 
@@ -217,7 +216,7 @@ public class ResourceTest extends AbstractTest {
             resource.setKey("invalidProvision");
 
             Provision provision = new Provision();
-            provision.setAnyType(anyTypeDAO.findUser().getKey());
+            provision.setAnyType(AnyTypeKind.USER.name());
             provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
             resource.getProvisions().add(provision);
 
@@ -231,7 +230,7 @@ public class ResourceTest extends AbstractTest {
             mapping.setConnObjectKeyItem(connObjectKey);
 
             provision = new Provision();
-            provision.setAnyType(anyTypeDAO.findGroup().getKey());
+            provision.setAnyType(AnyTypeKind.GROUP.name());
             provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
             resource.getProvisions().add(provision);
 
@@ -250,7 +249,7 @@ public class ResourceTest extends AbstractTest {
         resource.setPropagationPriority(2);
 
         Provision provision = new Provision();
-        provision.setAnyType(anyTypeDAO.findUser().getKey());
+        provision.setAnyType(AnyTypeKind.USER.name());
         provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
         resource.getProvisions().add(provision);
 
@@ -284,7 +283,7 @@ public class ResourceTest extends AbstractTest {
         resource.setConnector(connector);
 
         Provision provision = new Provision();
-        provision.setAnyType(anyTypeDAO.findUser().getKey());
+        provision.setAnyType(AnyTypeKind.USER.name());
         provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
         resource.getProvisions().add(provision);
 
@@ -314,7 +313,8 @@ public class ResourceTest extends AbstractTest {
         entityManager().flush();
         assertNotNull(actual);
 
-        assertEquals(3, actual.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().size());
+        assertEquals(3, actual.getProvisionByAnyType(AnyTypeKind.USER.name()).
+                get().getMapping().getItems().size());
     }
 
     @Test
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
index c107d59093..388e4369cd 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
@@ -32,10 +32,10 @@ import java.util.stream.Stream;
 import javax.persistence.EntityExistsException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.Item;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.IdMEntitlement;
 import org.apache.syncope.common.lib.types.IdRepoEntitlement;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.PlainSchemaDAO;
@@ -59,9 +59,6 @@ import org.springframework.transaction.annotation.Transactional;
 @Transactional("Master")
 public class PlainSchemaTest extends AbstractTest {
 
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
     @Autowired
     private UserDAO userDAO;
 
@@ -123,7 +120,7 @@ public class PlainSchemaTest extends AbstractTest {
         // fullname is mapped as ConnObjectKey for ws-target-resource-2, need to swap it otherwise validation errors 
         // will be raised
         resourceDAO.find("ws-target-resource-2").
-                getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().
+                getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems().
                 forEach(item -> {
                     if ("fullname".equals(item.getIntAttrName())) {
                         item.setConnObjectKey(false);
@@ -192,12 +189,12 @@ public class PlainSchemaTest extends AbstractTest {
     @Test
     public void deleteFirstname() {
         int pre = resourceDAO.find("resource-db-pull").
-                getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().size();
+                getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems().size();
 
         plainSchemaDAO.delete("firstname");
         assertNull(plainSchemaDAO.find("firstname"));
 
         assertEquals(pre - 1, resourceDAO.find("resource-db-pull").
-                getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().size());
+                getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems().size());
     }
 }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
index dc7a929cbe..8b9dc51a0a 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
@@ -30,9 +30,9 @@ import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.to.Item;
 import org.apache.syncope.common.lib.to.Mapping;
 import org.apache.syncope.common.lib.to.Provision;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.TaskType;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.PolicyDAO;
@@ -58,9 +58,6 @@ public class ResourceTest extends AbstractTest {
     @Autowired
     private ConnInstanceDAO connInstanceDAO;
 
-    @Autowired
-    private AnyTypeDAO anyTypeDAO;
-
     @Autowired
     private UserDAO userDAO;
 
@@ -108,7 +105,7 @@ public class ResourceTest extends AbstractTest {
         resource.setConnector(connector);
 
         Provision provision = new Provision();
-        provision.setAnyType(anyTypeDAO.findUser().getKey());
+        provision.setAnyType(AnyTypeKind.USER.name());
         provision.setObjectClass(ObjectClass.ACCOUNT_NAME);
         resource.getProvisions().add(provision);
 
@@ -142,7 +139,7 @@ public class ResourceTest extends AbstractTest {
         ExternalResource actual = resourceDAO.save(resource);
         entityManager().flush();
         assertNotNull(actual);
-        assertNotNull(actual.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping());
+        assertNotNull(actual.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping());
 
         entityManager().flush();
         resourceDAO.detach(actual);
@@ -170,8 +167,8 @@ public class ResourceTest extends AbstractTest {
         assertTrue(resource.getConnector().equals(connector));
 
         // check mappings
-        List<Item> items = resource.getProvision(
-                anyTypeDAO.findUser().getKey()).get().getMapping().getItems();
+        List<Item> items = resource.getProvisionByAnyType(
+                AnyTypeKind.USER.name()).get().getMapping().getItems();
         assertNotNull(items);
         assertEquals(5, items.size());
 
@@ -240,13 +237,14 @@ public class ResourceTest extends AbstractTest {
         ExternalResource csv = resourceDAO.find("resource-csv");
         assertNotNull(csv);
 
-        int origMapItems = csv.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().size();
+        int origMapItems = csv.getProvisionByAnyType(
+                AnyTypeKind.USER.name()).get().getMapping().getItems().size();
 
         Item newMapItem = new Item();
         newMapItem.setIntAttrName("TEST");
         newMapItem.setExtAttrName("TEST");
         newMapItem.setPurpose(MappingPurpose.PROPAGATION);
-        csv.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().add(newMapItem);
+        csv.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().add(newMapItem);
 
         resourceDAO.save(csv);
         entityManager().flush();
@@ -255,6 +253,6 @@ public class ResourceTest extends AbstractTest {
         assertNotNull(csv);
         assertEquals(
                 origMapItems + 1,
-                csv.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().size());
+                csv.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems().size());
     }
 }
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
index 7fab7be0c3..ba1ecd9a5a 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
@@ -24,6 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.apache.syncope.common.lib.to.Item;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
@@ -51,7 +52,7 @@ public class VirSchemaTest extends AbstractTest {
         ExternalResource resource = resourceDAO.find("ws-target-resource-1");
         assertNotNull(resource);
         assertTrue(virSchemaDAO.find(resource).isEmpty());
-        assertTrue(virSchemaDAO.find(resource.getKey(), anyTypeDAO.findUser().getKey()).isEmpty());
+        assertTrue(virSchemaDAO.find(resource.getKey(), AnyTypeKind.USER.name()).isEmpty());
 
         VirSchema virSchema = entityFactory.newEntity(VirSchema.class);
         virSchema.setKey("vSchema");
@@ -71,8 +72,8 @@ public class VirSchemaTest extends AbstractTest {
         assertFalse(virSchemaDAO.find(resource).isEmpty());
         assertTrue(virSchemaDAO.find(resource).contains(virSchema.getKey()));
 
-        assertFalse(virSchemaDAO.find(resource.getKey(), anyTypeDAO.findUser().getKey()).isEmpty());
-        assertTrue(virSchemaDAO.find(resource.getKey(), anyTypeDAO.findUser().getKey()).contains(virSchema));
+        assertFalse(virSchemaDAO.find(resource.getKey(), AnyTypeKind.USER.name()).isEmpty());
+        assertTrue(virSchemaDAO.find(resource.getKey(), AnyTypeKind.USER.name()).contains(virSchema));
 
         Item item = virSchema.asLinkingMappingItem();
         assertNotNull(item);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java
index 41a7274ef8..35b54b32a2 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultMappingManager.java
@@ -736,10 +736,10 @@ public class DefaultMappingManager implements MappingManager {
 
                     case "userOwner":
                     case "groupOwner":
-                        Mapping uMappingTO = provision.getAnyType().equals(anyTypeDAO.findUser().getKey())
+                        Mapping uMappingTO = provision.getAnyType().equals(AnyTypeKind.USER.name())
                                 ? provision.getMapping()
                                 : null;
-                        Mapping gMappingTO = provision.getAnyType().equals(anyTypeDAO.findGroup().getKey())
+                        Mapping gMappingTO = provision.getAnyType().equals(AnyTypeKind.GROUP.name())
                                 ? provision.getMapping()
                                 : null;
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultVirAttrHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultVirAttrHandler.java
index bd578a9a1b..0bd8cc5b34 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultVirAttrHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultVirAttrHandler.java
@@ -113,7 +113,7 @@ public class DefaultVirAttrHandler implements VirAttrHandler {
                 LOG.debug("Found in cache: {}={}", cacheKey, cacheValue);
                 result.put(schema, cacheValue.getValues());
             } else if (schema.getAnyType().equals(any.getType())) {
-                schema.getResource().getProvision(schema.getAnyType().getKey()).ifPresent(provision -> {
+                schema.getResource().getProvisionByAnyType(schema.getAnyType().getKey()).ifPresent(provision -> {
                     Set<VirSchema> schemasToRead = toRead.get(Pair.of(schema.getResource(), provision));
                     if (schemasToRead == null) {
                         schemasToRead = new HashSet<>();
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
index 97ad8f378b..c8a89310f8 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
@@ -200,7 +200,7 @@ abstract class AbstractAnyDataBinder {
         Map<String, ConnObject> onResources = new HashMap<>();
 
         resources.stream().map(resourceDAO::find).filter(Objects::nonNull).forEach(resource -> {
-            resource.getProvision(any.getType().getKey()).
+            resource.getProvisionByAnyType(any.getType().getKey()).
                     ifPresent(provision -> MappingUtils.getConnObjectKeyItem(provision).ifPresent(keyItem -> {
 
                 Pair<String, Set<Attribute>> prepared = mappingManager.prepareAttrsFromAny(
@@ -319,7 +319,7 @@ abstract class AbstractAnyDataBinder {
         SyncopeClientException reqValMissing = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
         resources.forEach(resource -> {
-            Optional<Provision> provision = resource.getProvision(any.getType().getKey());
+            Optional<Provision> provision = resource.getProvisionByAnyType(any.getType().getKey());
             if (resource.isEnforceMandatoryCondition() && provision.isPresent()) {
                 List<String> missingAttrNames = evaluateMandatoryCondition(resource, provision.get(), any);
                 if (!missingAttrNames.isEmpty()) {
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index 0d76a4b79a..4927d4c5a0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -149,7 +149,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                 LOG.debug("Invalid {} specified {}, ignoring...",
                         AnyType.class.getSimpleName(), provisionTO.getAnyType());
             } else {
-                Provision provision = resource.getProvision(anyType.getKey()).orElse(null);
+                Provision provision = resource.getProvisionByAnyType(anyType.getKey()).orElse(null);
                 if (provision == null) {
                     provision = new Provision();
                     provision.setAnyType(anyType.getKey());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index 131ed2483d..89ceae71cc 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -356,7 +356,7 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             sce.getElements().add("AnyType " + schemaTO.getAnyType() + " not found");
             throw sce;
         }
-        Provision provision = resource.getProvision(anyType.getKey()).orElse(null);
+        Provision provision = resource.getProvisionByAnyType(anyType.getKey()).orElse(null);
         if (provision == null) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSchemaDefinition);
             sce.getElements().add("Provision for AnyType" + schemaTO.getAnyType()
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 a9c0c36faf..b61320990a 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
@@ -443,7 +443,7 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
     }
 
     protected boolean isPasswordMapped(final ExternalResource resource) {
-        return resource.getProvision(anyTypeDAO.findUser().getKey()).
+        return resource.getProvisionByAnyType(AnyTypeKind.USER.name()).
                 filter(provision -> provision.getMapping() != null).
                 map(provision -> provision.getMapping().getItems().stream().anyMatch(Item::isPassword)).
                 orElse(false);
@@ -747,7 +747,7 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
             propByRes.addAll(
                     ResourceOperation.UPDATE,
                     anyUtils.getAllResources(saved).stream().
-                            map(resource -> resource.getProvision(saved.getType().getKey()).
+                            map(resource -> resource.getProvisionByAnyType(saved.getType().getKey()).
                             filter(mappingManager::hasMustChangePassword).
                             map(provision -> resource.getKey()).
                             orElse(null)).
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
index c939275259..9bc0f66502 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
@@ -285,7 +285,7 @@ public class ReconciliationReportlet extends AbstractReportlet {
 
             AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
             anyUtils.getAllResources(any).forEach(resource -> {
-                Provision provision = resource.getProvision(any.getType().getKey()).orElse(null);
+                Provision provision = resource.getProvisionByAnyType(any.getType().getKey()).orElse(null);
                 Optional<Item> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
                 String connObjectKeyValue = connObjectKeyItem.isPresent()
                         ? mappingManager.getConnObjectKeyValue(any, resource, provision).get()
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 bd75358897..91be9326c3 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
@@ -197,7 +197,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
 
         Uid result = connector.create(taskInfo.getObjectClass(), attributes, null, propagationAttempted);
 
-        taskInfo.getResource().getProvision(taskInfo.getAnyType()).
+        taskInfo.getResource().getProvisionByAnyType(taskInfo.getAnyType()).
                 filter(provision -> provision.getUidOnCreate() != null).
                 ifPresent(provision -> anyUtilsFactory.getInstance(taskInfo.getAnyTypeKind()).addAttr(
                 validator,
@@ -511,7 +511,8 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
         Uid uid = null;
         Result result;
         try {
-            provision = taskInfo.getResource().getProvision(taskInfo.getObjectClass()).orElse(null);
+            provision = taskInfo.getResource().
+                    getProvisionByObjectClass(taskInfo.getObjectClass().getObjectClassValue()).orElse(null);
             orgUnit = taskInfo.getResource().getOrgUnit();
 
             if (taskInfo.getBeforeObj().isEmpty()) {
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationManager.java
index 6bb431bc78..bf367e3668 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationManager.java
@@ -468,7 +468,7 @@ public class DefaultPropagationManager implements PropagationManager {
         propByRes.asMap().forEach((resourceKey, operation) -> {
             ExternalResource resource = resourceDAO.find(resourceKey);
             Provision provision = Optional.ofNullable(resource).
-                    flatMap(externalResource -> externalResource.getProvision(any.getType().getKey())).orElse(null);
+                    flatMap(r -> r.getProvisionByAnyType(any.getType().getKey())).orElse(null);
             Stream<Item> mappingItems = provision == null
                     ? Stream.empty()
                     : MappingUtils.getPropagationItems(provision.getMapping().getItems().stream());
@@ -514,7 +514,7 @@ public class DefaultPropagationManager implements PropagationManager {
 
                 Provision provision = account == null || account.getResource() == null
                         ? null
-                        : account.getResource().getProvision(AnyTypeKind.USER.name()).orElse(null);
+                        : account.getResource().getProvisionByAnyType(AnyTypeKind.USER.name()).orElse(null);
                 Stream<Item> mappingItems = provision == null
                         ? Stream.empty()
                         : MappingUtils.getPropagationItems(provision.getMapping().getItems().stream());
@@ -621,7 +621,7 @@ public class DefaultPropagationManager implements PropagationManager {
         anyUtilsFactory.getInstance(kind).dao().findAllResourceKeys(key).stream().
                 map(resourceDAO::find).
                 filter(resource -> !excludedResources.contains(resource.getKey())
-                && resource.getProvision(any.getType().getKey()).isPresent()
+                && resource.getProvisionByAnyType(any.getType().getKey()).isPresent()
                 && resource.getPropagationPolicy() != null && resource.getPropagationPolicy().isUpdateDelta()).
                 forEach(resource -> {
                     Pair<String, Set<Attribute>> preparedAttrs = mappingManager.prepareAttrsFromAny(
@@ -630,7 +630,7 @@ public class DefaultPropagationManager implements PropagationManager {
                             changePwd,
                             enable,
                             resource,
-                            resource.getProvision(any.getType().getKey()).get());
+                            resource.getProvisionByAnyType(any.getType().getKey()).get());
                     attrs.put(
                             Pair.of(resource.getKey(), preparedAttrs.getLeft()),
                             preparedAttrs.getRight());
@@ -639,7 +639,7 @@ public class DefaultPropagationManager implements PropagationManager {
         if (any instanceof User) {
             ((User) any).getLinkedAccounts().stream().
                     filter(account -> !excludedResources.contains(account.getResource().getKey())
-                    && account.getResource().getProvision(any.getType().getKey()).isPresent()
+                    && account.getResource().getProvisionByAnyType(any.getType().getKey()).isPresent()
                     && account.getResource().getPropagationPolicy() != null
                     && account.getResource().getPropagationPolicy().isUpdateDelta()).
                     forEach(account -> {
@@ -648,7 +648,7 @@ public class DefaultPropagationManager implements PropagationManager {
                                 account,
                                 password,
                                 true,
-                                account.getResource().getProvision(any.getType().getKey()).get());
+                                account.getResource().getProvisionByAnyType(any.getType().getKey()).get());
                         attrs.put(
                                 Pair.of(account.getResource().getKey(), account.getConnObjectKeyValue()),
                                 preparedAttrs);
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
index 9cb4215b3f..2a0cd1297e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
@@ -110,7 +110,7 @@ public class LDAPMembershipPropagationActions implements PropagationActions {
             return;
         }
 
-        Optional<Provision> groupProvision = taskInfo.getResource().getProvision(AnyTypeKind.GROUP.name());
+        Optional<Provision> groupProvision = taskInfo.getResource().getProvisionByAnyType(AnyTypeKind.GROUP.name());
         if (groupProvision.isPresent() && groupProvision.get().getMapping() != null
                 && StringUtils.isNotBlank(groupProvision.get().getMapping().getConnObjectLink())) {
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
index 5b654a0c6a..7155fcfa56 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
@@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.Mapping;
 import org.apache.syncope.common.lib.to.Provision;
 import org.apache.syncope.common.lib.to.ProvisioningReport;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
@@ -404,11 +405,11 @@ public abstract class AbstractProvisioningJobDelegate<T extends ProvisioningTask
         }
 
         // Summary, also to be included for FAILURE and ALL, so create it anyway.
-        boolean includeUser = resource.getProvision(anyTypeDAO.findUser().getKey()).isPresent();
-        boolean includeGroup = resource.getProvision(anyTypeDAO.findGroup().getKey()).isPresent();
+        boolean includeUser = resource.getProvisionByAnyType(AnyTypeKind.USER.name()).isPresent();
+        boolean includeGroup = resource.getProvisionByAnyType(AnyTypeKind.GROUP.name()).isPresent();
         boolean includeAnyObject = resource.getProvisions().stream().anyMatch(
-                provision -> !provision.getAnyType().equals(anyTypeDAO.findUser().getKey())
-                && !provision.getAnyType().equals(anyTypeDAO.findGroup().getKey()));
+                provision -> !provision.getAnyType().equals(AnyTypeKind.USER.name())
+                && !provision.getAnyType().equals(AnyTypeKind.GROUP.name()));
         boolean includeRealm = resource.getOrgUnit() != null;
 
         if (includeUser) {
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index f9204488d5..440d0cfb18 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -132,7 +132,8 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
     public boolean handle(final SyncDelta delta) {
         Provision provision = null;
         try {
-            provision = profile.getTask().getResource().getProvision(delta.getObject().getObjectClass()).
+            provision = profile.getTask().getResource().
+                    getProvisionByObjectClass(delta.getObject().getObjectClass().getObjectClassValue()).
                     orElseThrow(() -> new JobExecutionException(
                     "No provision found on " + profile.getTask().getResource()
                     + " for " + delta.getObject().getObjectClass()));
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
index 7911d3529e..8069984a92 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
@@ -212,7 +212,8 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
         try {
             any = getAnyUtils().dao().authFind(anyKey);
 
-            Provision provision = profile.getTask().getResource().getProvision(any.getType().getKey()).orElse(null);
+            Provision provision = profile.getTask().getResource().
+                    getProvisionByAnyType(any.getType().getKey()).orElse(null);
             if (provision == null) {
                 throw new JobExecutionException("No provision found on " + profile.getTask().getResource() + " for "
                         + any.getType().getKey());
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/InboundMatcher.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/InboundMatcher.java
index 3ca42deca6..1dce092727 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/InboundMatcher.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/InboundMatcher.java
@@ -140,7 +140,7 @@ public class InboundMatcher {
             final ExternalResource resource,
             final Connector connector) {
 
-        Optional<Provision> provision = resource.getProvision(anyType.getKey());
+        Optional<Provision> provision = resource.getProvisionByAnyType(anyType.getKey());
         if (provision.isEmpty()) {
             return Optional.empty();
         }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
index 3815d16729..3bb5a9cc86 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
@@ -29,6 +29,7 @@ import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.Provision;
 import org.apache.syncope.common.lib.to.ProvisioningReport;
+import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.PullMatch;
@@ -165,7 +166,7 @@ public class LDAPMembershipPullActions extends SchedulingPullActions {
         }
 
         Optional<Provision> provision = profile.getTask().getResource().
-                getProvision(anyTypeDAO.findUser().getKey()).filter(p -> p.getMapping() != null);
+                getProvisionByAnyType(AnyTypeKind.USER.name()).filter(p -> p.getMapping() != null);
         if (provision.isEmpty()) {
             super.after(profile, delta, entity, result);
         }
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
index 5b74e44abc..055449838d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
@@ -336,6 +336,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
             handler.setProfile(profile);
             handler.setPullExecutor(this);
 
+            boolean setSyncTokens = false;
             try {
                 Set<String> moreAttrsToGet = new HashSet<>();
                 profile.getActions().forEach(a -> moreAttrsToGet.addAll(a.moreAttrsToGet(profile, provision)));
@@ -361,9 +362,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
                                 options);
 
                         if (!dryRun) {
-                            provision.setSyncToken(
-                                    ConnObjectUtils.toString(latestSyncTokens.get(provision.getObjectClass())));
-                            resourceDAO.save(pullTask.getResource());
+                            setSyncTokens = true;
                         }
                         break;
 
@@ -396,6 +395,14 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
                 }
             } catch (Throwable t) {
                 throw new JobExecutionException("While pulling from connector", t);
+            } finally {
+                if (setSyncTokens) {
+                    latestSyncTokens.forEach((objectClass, syncToken) -> {
+                        pullTask.getResource().getProvisionByObjectClass(objectClass).
+                                ifPresent(p -> p.setSyncToken(ConnObjectUtils.toString(syncToken)));
+                    });
+                    resourceDAO.save(pullTask.getResource());
+                }
             }
         }
         try {
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/DefaultMappingManagerTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/DefaultMappingManagerTest.java
index e15ed0c937..e6e6a0cb71 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/DefaultMappingManagerTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/DefaultMappingManagerTest.java
@@ -92,7 +92,7 @@ public class DefaultMappingManagerTest extends AbstractTest {
     public void prepareAttrsForUser() {
         User bellini = userDAO.findByUsername("bellini");
         ExternalResource ldap = resourceDAO.find("resource-ldap");
-        Provision provision = ldap.getProvision(AnyTypeKind.USER.name()).get();
+        Provision provision = ldap.getProvisionByAnyType(AnyTypeKind.USER.name()).get();
 
         assertNotEquals(CipherAlgorithm.AES, bellini.getCipherAlgorithm());
 
@@ -171,7 +171,7 @@ public class DefaultMappingManagerTest extends AbstractTest {
     public void prepareAttrsForLinkedAccount() {
         User vivaldi = userDAO.findByUsername("vivaldi");
         ExternalResource ldap = resourceDAO.find("resource-ldap");
-        Provision provision = ldap.getProvision(AnyTypeKind.USER.name()).get();
+        Provision provision = ldap.getProvisionByAnyType(AnyTypeKind.USER.name()).get();
 
         LinkedAccount account = entityFactory.newEntity(LinkedAccount.class);
         account.setConnObjectKeyValue("admin");
@@ -281,7 +281,7 @@ public class DefaultMappingManagerTest extends AbstractTest {
 
         // 3. check propagation attrs
         ExternalResource csv = resourceDAO.find("resource-csv");
-        Provision provision = csv.getProvision(AnyTypeKind.USER.name()).get();
+        Provision provision = csv.getProvisionByAnyType(AnyTypeKind.USER.name()).get();
         assertNotNull(provision);
 
         Pair<String, Set<Attribute>> attrs = mappingManager.prepareAttrsFromAny(
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java
index 14f08b61d3..b1866fd0ac 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderTest.java
@@ -91,10 +91,10 @@ public class ResourceDataBinderTest extends AbstractTest {
 
         Set<Item> beforeUserIdMappings = new HashSet<>();
         for (ExternalResource res : resourceDAO.findAll()) {
-            if (res.getProvision(anyTypeDAO.findUser().getKey()).isPresent()
-                    && res.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping() != null) {
+            if (res.getProvisionByAnyType(AnyTypeKind.USER.name()).isPresent()
+                    && res.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping() != null) {
 
-                for (Item mapItem : res.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems()) {
+                for (Item mapItem : res.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems()) {
                     if (userId.getKey().equals(mapItem.getIntAttrName())) {
                         beforeUserIdMappings.add(mapItem);
                     }
@@ -127,8 +127,8 @@ public class ResourceDataBinderTest extends AbstractTest {
         resource = resourceDAO.save(resource);
         entityManager().flush();
         assertNotNull(resource);
-        assertNotNull(resource.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping());
-        assertEquals(1, resource.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems().size());
+        assertNotNull(resource.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping());
+        assertEquals(1, resource.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems().size());
 
         ExternalResource actual = resourceDAO.find("resource-issue42");
         entityManager().flush();
@@ -139,10 +139,10 @@ public class ResourceDataBinderTest extends AbstractTest {
 
         Set<Item> afterUserIdMappings = new HashSet<>();
         for (ExternalResource res : resourceDAO.findAll()) {
-            if (res.getProvision(anyTypeDAO.findUser().getKey()).isPresent()
-                    && res.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping() != null) {
+            if (res.getProvisionByAnyType(AnyTypeKind.USER.name()).isPresent()
+                    && res.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping() != null) {
 
-                for (Item mapItem : res.getProvision(anyTypeDAO.findUser().getKey()).get().getMapping().getItems()) {
+                for (Item mapItem : res.getProvisionByAnyType(AnyTypeKind.USER.name()).get().getMapping().getItems()) {
                     if (userId.getKey().equals(mapItem.getIntAttrName())) {
                         afterUserIdMappings.add(mapItem);
                     }
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java
index 87ef0b5de8..a4d6ce0030 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActionsTest.java
@@ -197,7 +197,7 @@ public class LDAPMembershipPullActionsTest extends AbstractTest {
         entity = new GroupTO();
 
         when(connectorObj.getAttributeByName(anyString())).thenReturn(attribute);
-        when(externalResource.getProvision(anyString())).thenAnswer(ic -> Optional.of(mock(Provision.class)));
+        when(externalResource.getProvisionByAnyType(anyString())).thenAnswer(ic -> Optional.of(mock(Provision.class)));
 
         ldapMembershipPullActions.after(profile, syncDelta, entity, result);
 
@@ -212,7 +212,7 @@ public class LDAPMembershipPullActionsTest extends AbstractTest {
         List<String> expected = List.of(expectedUid);
 
         when(connectorObj.getAttributeByName(anyString())).thenReturn(attribute);
-        when(externalResource.getProvision(anyString())).thenAnswer(ic -> Optional.empty());
+        when(externalResource.getProvisionByAnyType(anyString())).thenAnswer(ic -> Optional.empty());
         when(inboundMatcher.match(any(AnyType.class), anyString(), any(ExternalResource.class), any(Connector.class))).
                 thenReturn(Optional.of(new PullMatch(MatchType.ANY, user)));
 
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
index 437a1abbc1..1ff38fbe5a 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
@@ -43,7 +43,6 @@ import org.apache.syncope.common.lib.types.IdRepoEntitlement;
 import org.apache.syncope.core.persistence.api.ImplementationLookup;
 import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
@@ -52,7 +51,6 @@ import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.search.AttrCond;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.AccessToken;
-import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Delegation;
 import org.apache.syncope.core.persistence.api.entity.DynRealm;
 import org.apache.syncope.core.persistence.api.entity.ExternalResource;
@@ -104,8 +102,6 @@ public class AuthDataAccessor {
 
     protected final GroupDAO groupDAO;
 
-    protected final AnyTypeDAO anyTypeDAO;
-
     protected final AnySearchDAO anySearchDAO;
 
     protected final AccessTokenDAO accessTokenDAO;
@@ -131,7 +127,6 @@ public class AuthDataAccessor {
             final RealmDAO realmDAO,
             final UserDAO userDAO,
             final GroupDAO groupDAO,
-            final AnyTypeDAO anyTypeDAO,
             final AnySearchDAO anySearchDAO,
             final AccessTokenDAO accessTokenDAO,
             final ConfParamOps confParamOps,
@@ -146,7 +141,6 @@ public class AuthDataAccessor {
         this.realmDAO = realmDAO;
         this.userDAO = userDAO;
         this.groupDAO = groupDAO;
-        this.anyTypeDAO = anyTypeDAO;
         this.anySearchDAO = anySearchDAO;
         this.accessTokenDAO = accessTokenDAO;
         this.confParamOps = confParamOps;
@@ -289,13 +283,12 @@ public class AuthDataAccessor {
             ExternalResource resource = itor.next();
             String connObjectKey = null;
             try {
-                AnyType userType = anyTypeDAO.findUser();
-                Provision provision = resource.getProvision(userType.getKey()).
+                Provision provision = resource.getProvisionByAnyType(AnyTypeKind.USER.name()).
                         orElseThrow(() -> new AccountNotFoundException(
-                        "Unable to locate provision for user type " + userType.getKey()));
+                        "Unable to locate provision for user type " + AnyTypeKind.USER.name()));
                 connObjectKey = mappingManager.getConnObjectKeyValue(user, resource, provision).
                         orElseThrow(() -> new AccountNotFoundException(
-                        "Unable to locate conn object key value for " + userType.getKey()));
+                        "Unable to locate conn object key value for " + AnyTypeKind.USER.name()));
                 Uid uid = connectorManager.getConnector(resource).authenticate(connObjectKey, password, null);
                 if (uid != null) {
                     authenticated = true;
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java
index e9ffb1b855..938a2b6709 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/WebSecurityContext.java
@@ -23,7 +23,6 @@ import org.apache.syncope.common.keymaster.client.api.DomainOps;
 import org.apache.syncope.core.persistence.api.ImplementationLookup;
 import org.apache.syncope.core.persistence.api.dao.AccessTokenDAO;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
-import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.DelegationDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
@@ -171,7 +170,6 @@ public class WebSecurityContext {
             final RealmDAO realmDAO,
             final UserDAO userDAO,
             final GroupDAO groupDAO,
-            final AnyTypeDAO anyTypeDAO,
             final AnySearchDAO anySearchDAO,
             final AccessTokenDAO accessTokenDAO,
             final ConfParamOps confParamOps,
@@ -187,7 +185,6 @@ public class WebSecurityContext {
                 realmDAO,
                 userDAO,
                 groupDAO,
-                anyTypeDAO,
                 anySearchDAO,
                 accessTokenDAO,
                 confParamOps,