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 2016/07/04 14:08:54 UTC

[1/2] syncope git commit: Upgrading Spring

Repository: syncope
Updated Branches:
  refs/heads/master b4bfa361c -> df7613e50


Upgrading Spring


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

Branch: refs/heads/master
Commit: 5a3b09ca1912970130aa07961f7bcace3abb317c
Parents: b4bfa36
Author: Francesco Chicchiricc� <il...@apache.org>
Authored: Mon Jul 4 16:08:31 2016 +0200
Committer: Francesco Chicchiricc� <il...@apache.org>
Committed: Mon Jul 4 16:08:31 2016 +0200

----------------------------------------------------------------------
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/5a3b09ca/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0914f4c..84cfb94 100644
--- a/pom.xml
+++ b/pom.xml
@@ -343,7 +343,7 @@ under the License.
 
     <jackson.version>2.7.5</jackson.version>
 
-    <spring.version>4.3.0.RELEASE</spring.version>
+    <spring.version>4.3.1.RELEASE</spring.version>
     <spring-security.version>4.1.0.RELEASE</spring-security.version>
 
     <openjpa.version>2.4.1</openjpa.version>


[2/2] syncope git commit: Moving PropagationByResource in a more appropriate module

Posted by il...@apache.org.
Moving PropagationByResource in a more appropriate module


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

Branch: refs/heads/master
Commit: df7613e50c2c31074463ee9236fd71ea869fa928
Parents: 5a3b09c
Author: Francesco Chicchiricc� <il...@apache.org>
Authored: Mon Jul 4 16:08:43 2016 +0200
Committer: Francesco Chicchiricc� <il...@apache.org>
Committed: Mon Jul 4 16:08:43 2016 +0200

----------------------------------------------------------------------
 .../common/lib/types/PropagationByResource.java | 375 ------------------
 .../apache/syncope/core/logic/RealmLogic.java   |   2 +-
 .../core/persistence/api/dao/GroupDAO.java      |  19 -
 .../core/persistence/jpa/dao/JPAGroupDAO.java   |  47 ---
 .../provisioning/api/PropagationByResource.java | 376 +++++++++++++++++++
 .../core/provisioning/api/WorkflowResult.java   |   1 -
 .../api/data/AnyObjectDataBinder.java           |   2 +-
 .../provisioning/api/data/GroupDataBinder.java  |  20 +-
 .../provisioning/api/data/RealmDataBinder.java  |   2 +-
 .../provisioning/api/data/UserDataBinder.java   |   2 +-
 .../api/propagation/PropagationManager.java     |   2 +-
 .../DefaultAnyObjectProvisioningManager.java    |   2 +-
 .../java/DefaultGroupProvisioningManager.java   |  10 +-
 .../java/DefaultUserProvisioningManager.java    |   2 +-
 .../java/data/AbstractAnyDataBinder.java        |   2 +-
 .../java/data/AnyObjectDataBinderImpl.java      |   2 +-
 .../java/data/GroupDataBinderImpl.java          |  50 ++-
 .../java/data/RealmDataBinderImpl.java          |   2 +-
 .../java/data/UserDataBinderImpl.java           |   2 +-
 .../propagation/PropagationManagerImpl.java     |   2 +-
 .../pushpull/AbstractPullResultHandler.java     |   2 +-
 .../pushpull/AbstractPushResultHandler.java     |   2 +-
 .../pushpull/RealmPullResultHandlerImpl.java    |   2 +-
 .../pushpull/RealmPushResultHandlerImpl.java    |   2 +-
 .../pushpull/UserPushResultHandlerImpl.java     |   2 +-
 .../activiti/ActivitiUserWorkflowAdapter.java   |   2 +-
 .../workflow/activiti/task/PasswordReset.java   |   2 +-
 .../core/workflow/activiti/task/Update.java     |   2 +-
 .../java/DefaultAnyObjectWorkflowAdapter.java   |   2 +-
 .../java/DefaultGroupWorkflowAdapter.java       |   2 +-
 .../java/DefaultUserWorkflowAdapter.java        |   2 +-
 .../camel/CamelUserProvisioningManager.java     |   2 +-
 .../AnyObjectDeprovisionProcessor.java          |   2 +-
 .../processor/AnyObjectProvisionProcessor.java  |   2 +-
 .../camel/processor/GroupDeleteProcessor.java   |  10 +-
 .../processor/GroupDeprovisionProcessor.java    |   2 +-
 .../processor/GroupProvisionProcessor.java      |   2 +-
 .../camel/processor/UserDeleteProcessor.java    |   2 +-
 .../processor/UserDeprovisionProcessor.java     |   2 +-
 .../camel/processor/UserProvisionProcessor.java |   2 +-
 .../UserStatusPropagationProcessor.java         |   2 +-
 41 files changed, 488 insertions(+), 484 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/common/lib/src/main/java/org/apache/syncope/common/lib/types/PropagationByResource.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/PropagationByResource.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/PropagationByResource.java
deleted file mode 100644
index d172054..0000000
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/PropagationByResource.java
+++ /dev/null
@@ -1,375 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.common.lib.types;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Utility class for encapsulating operations to be performed on various resources.
- */
-public class PropagationByResource implements Serializable {
-
-    private static final long serialVersionUID = -5699740428104336636L;
-
-    /**
-     * Resources for creation.
-     */
-    private final Set<String> toBeCreated;
-
-    /**
-     * Resources for update.
-     */
-    private final Set<String> toBeUpdated;
-
-    /**
-     * Resources for deletion.
-     */
-    private final Set<String> toBeDeleted;
-
-    /**
-     * Mapping target resource names to old ConnObjectKeys (when applicable).
-     */
-    private final Map<String, String> oldConnObjectKeys;
-
-    /**
-     * Default constructor.
-     */
-    public PropagationByResource() {
-        toBeCreated = new HashSet<>();
-        toBeUpdated = new HashSet<>();
-        toBeDeleted = new HashSet<>();
-
-        oldConnObjectKeys = new HashMap<>();
-    }
-
-    /**
-     * Avoid potential conflicts by not doing create or update on any resource for which a delete is requested, and by
-     * not doing any create on any resource for which an update is requested.
-     */
-    public final void purge() {
-        toBeCreated.removeAll(toBeDeleted);
-        toBeCreated.removeAll(toBeUpdated);
-
-        toBeUpdated.removeAll(toBeDeleted);
-    }
-
-    /**
-     * Add an element.
-     *
-     * @param type resource operation type
-     * @param resourceKey target resource
-     * @return whether the operation was successful or not
-     */
-    public final boolean add(final ResourceOperation type, final String resourceKey) {
-        Set<String> set;
-        switch (type) {
-            case CREATE:
-                set = toBeCreated;
-                break;
-
-            case UPDATE:
-                set = toBeUpdated;
-                break;
-
-            case DELETE:
-            default:
-                set = toBeDeleted;
-                break;
-        }
-
-        return set.add(resourceKey);
-    }
-
-    /**
-     * Add some elements.
-     *
-     * @param type resource operation type
-     * @param resourceKeys target resources
-     * @return whether the operation was successful or not
-     */
-    public boolean addAll(final ResourceOperation type, final Collection<String> resourceKeys) {
-        Set<String> set;
-        switch (type) {
-            case CREATE:
-                set = toBeCreated;
-                break;
-
-            case UPDATE:
-                set = toBeUpdated;
-                break;
-
-            case DELETE:
-            default:
-                set = toBeDeleted;
-                break;
-        }
-
-        return set.addAll(resourceKeys);
-    }
-
-    /**
-     * Remove an element.
-     *
-     * @param type resource operation type
-     * @param resourceKey target resource
-     * @return whether the operation was successful or not
-     */
-    public final boolean remove(final ResourceOperation type, final String resourceKey) {
-        boolean result = false;
-
-        switch (type) {
-            case CREATE:
-                result = toBeCreated.remove(resourceKey);
-                break;
-
-            case UPDATE:
-                result = toBeUpdated.remove(resourceKey);
-                break;
-
-            case DELETE:
-                result = toBeDeleted.remove(resourceKey);
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    /**
-     * Remove some elements.
-     *
-     * @param type resource operation type
-     * @param resourceKeys target resources
-     * @return whether the operation was successful or not
-     */
-    public boolean removeAll(final ResourceOperation type, final Set<String> resourceKeys) {
-        Set<String> set;
-        switch (type) {
-            case CREATE:
-                set = toBeCreated;
-                break;
-
-            case UPDATE:
-                set = toBeUpdated;
-                break;
-
-            case DELETE:
-            default:
-                set = toBeDeleted;
-                break;
-        }
-
-        return set.removeAll(resourceKeys);
-    }
-
-    /**
-     * Removes only the resource names in the underlying resource name sets that are contained in the specified
-     * collection.
-     *
-     * @param resourceKeys collection containing resource names to be retained in the underlying resource name sets
-     * @return <tt>true</tt> if the underlying resource name sets changed as a result of the call
-     * @see Collection#removeAll(java.util.Collection)
-     */
-    public boolean removeAll(final Collection<String> resourceKeys) {
-        return toBeCreated.removeAll(resourceKeys)
-                | toBeUpdated.removeAll(resourceKeys)
-                | toBeDeleted.removeAll(resourceKeys);
-    }
-
-    /**
-     * Retains only the resource names in the underlying resource name sets that are contained in the specified
-     * collection.
-     *
-     * @param resourceKeys collection containing resource names to be retained in the underlying resource name sets
-     * @return <tt>true</tt> if the underlying resource name sets changed as a result of the call
-     * @see Collection#retainAll(java.util.Collection)
-     */
-    public boolean retainAll(final Collection<String> resourceKeys) {
-        return toBeCreated.retainAll(resourceKeys)
-                | toBeUpdated.retainAll(resourceKeys)
-                | toBeDeleted.retainAll(resourceKeys);
-    }
-
-    public boolean contains(final ResourceOperation type, final String resourceKey) {
-        boolean result = false;
-
-        switch (type) {
-            case CREATE:
-                result = toBeCreated.contains(resourceKey);
-                break;
-
-            case UPDATE:
-                result = toBeUpdated.contains(resourceKey);
-                break;
-
-            case DELETE:
-                result = toBeDeleted.contains(resourceKey);
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    /**
-     * Get resources for a given resource operation type.
-     *
-     * @param type resource operation type
-     * @return resource matching the given type
-     */
-    public final Set<String> get(final ResourceOperation type) {
-        Set<String> result = Collections.<String>emptySet();
-
-        switch (type) {
-            case CREATE:
-                result = toBeCreated;
-                break;
-
-            case UPDATE:
-                result = toBeUpdated;
-                break;
-
-            case DELETE:
-                result = toBeDeleted;
-                break;
-
-            default:
-        }
-
-        return result;
-    }
-
-    public Map<String, ResourceOperation> asMap() {
-        Map<String, ResourceOperation> result = new HashMap<>();
-        for (ResourceOperation operation : ResourceOperation.values()) {
-            for (String resourceKey : get(operation)) {
-                result.put(resourceKey, operation);
-            }
-        }
-
-        return result;
-    }
-
-    /**
-     * Set resources for a given resource operation type.
-     *
-     * @param type resource operation type
-     * @param resourceKeys to be set
-     */
-    public final void set(final ResourceOperation type, final Collection<String> resourceKeys) {
-
-        switch (type) {
-            case CREATE:
-                toBeCreated.clear();
-                toBeCreated.addAll(resourceKeys);
-                break;
-
-            case UPDATE:
-                toBeUpdated.clear();
-                toBeUpdated.addAll(resourceKeys);
-                break;
-
-            case DELETE:
-                toBeDeleted.clear();
-                toBeDeleted.addAll(resourceKeys);
-                break;
-
-            default:
-        }
-    }
-
-    /**
-     * Merge another resource operation instance into this instance.
-     *
-     * @param propByRes to be merged
-     */
-    public final void merge(final PropagationByResource propByRes) {
-        if (propByRes != null) {
-            toBeCreated.addAll(propByRes.get(ResourceOperation.CREATE));
-            toBeUpdated.addAll(propByRes.get(ResourceOperation.UPDATE));
-            toBeDeleted.addAll(propByRes.get(ResourceOperation.DELETE));
-            oldConnObjectKeys.putAll(propByRes.getOldConnObjectKeys());
-        }
-    }
-
-    /**
-     * Removes all of the operations.
-     */
-    public void clear() {
-        toBeCreated.clear();
-        toBeUpdated.clear();
-        toBeDeleted.clear();
-    }
-
-    /**
-     * Whether no operations are present.
-     *
-     * @return true if no operations (create / update / delete) and no old connObjectKeys are present
-     */
-    public final boolean isEmpty() {
-        return toBeCreated.isEmpty() && toBeUpdated.isEmpty() && toBeDeleted.isEmpty() && oldConnObjectKeys.isEmpty();
-    }
-
-    /**
-     * Fetch all old connObjectKeys.
-     *
-     * @return old connObjectKeys; can be empty
-     */
-    public Map<String, String> getOldConnObjectKeys() {
-        return oldConnObjectKeys;
-    }
-
-    /**
-     * Fetch old connObjectKey for given resource name.
-     *
-     * @param resourceKey resource name
-     * @return old connObjectKey; can be null
-     */
-    public String getOldConnObjectKey(final String resourceKey) {
-        return oldConnObjectKeys.get(resourceKey);
-    }
-
-    /**
-     * Add old ConnObjectKey for a given resource name.
-     *
-     * @param resourceKey resourceKey resource name
-     * @param oldConnObjectKey old ConnObjectKey
-     */
-    public void addOldConnObjectKey(final String resourceKey, final String oldConnObjectKey) {
-        if (resourceKey != null && oldConnObjectKey != null) {
-            oldConnObjectKeys.put(resourceKey, oldConnObjectKey);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return "To be Created: " + toBeCreated + ";\n"
-                + "To be Updated: " + toBeUpdated + ";\n"
-                + "To be Deleted: " + toBeDeleted + ";\n"
-                + "Old connObjectKeys: " + oldConnObjectKeys;
-    }
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
index 47e0448..985bd02 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
@@ -32,7 +32,7 @@ import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index f0a5b08..aa30108 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -20,7 +20,6 @@ package org.apache.syncope.core.persistence.api.dao;
 
 import java.util.List;
 import java.util.Map;
-import org.apache.syncope.common.lib.types.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
@@ -47,24 +46,6 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     List<UMembership> findUMemberships(Group group);
 
-    /**
-     * Finds any objects having resources assigned exclusively because of memberships of the given group.
-     *
-     * @param groupKey group key
-     * @return map containing pairs with any object key and operations to be performed on those resources (DELETE,
-     * typically).
-     */
-    Map<String, PropagationByResource> findAnyObjectsWithTransitiveResources(String groupKey);
-
-    /**
-     * Finds users having resources assigned exclusively because of memberships of the given group.
-     *
-     * @param groupKey group key
-     * @return map containing pairs with user key and operations to be performed on those resources (DELETE,
-     * typically).
-     */
-    Map<String, PropagationByResource> findUsersWithTransitiveResources(String groupKey);
-
     List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass);
 
     void refreshDynMemberships(AnyObject anyObject);

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index af5220f..1785672 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -29,14 +29,11 @@ import javax.persistence.TypedQuery;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup;
-import org.apache.syncope.common.lib.types.PropagationByResource;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.provisioning.api.utils.RealmUtils;
 import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
@@ -47,7 +44,6 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO;
 import org.apache.syncope.core.persistence.api.dao.search.AssignableCond;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
-import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.Realm;
@@ -277,49 +273,6 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         entityManager().remove(group);
     }
 
-    private void populateTransitiveResources(
-            final Group group, final Any<?> any, final Map<String, PropagationByResource> result) {
-
-        PropagationByResource propByRes = new PropagationByResource();
-        for (ExternalResource resource : group.getResources()) {
-            if (!any.getResources().contains(resource)) {
-                propByRes.add(ResourceOperation.DELETE, resource.getKey());
-            }
-
-            if (!propByRes.isEmpty()) {
-                result.put(any.getKey(), propByRes);
-            }
-        }
-    }
-
-    @Transactional(readOnly = true)
-    @Override
-    public Map<String, PropagationByResource> findAnyObjectsWithTransitiveResources(final String groupKey) {
-        Group group = authFind(groupKey);
-
-        Map<String, PropagationByResource> result = new HashMap<>();
-
-        for (AMembership membership : findAMemberships(group)) {
-            populateTransitiveResources(group, membership.getLeftEnd(), result);
-        }
-
-        return result;
-    }
-
-    @Transactional(readOnly = true)
-    @Override
-    public Map<String, PropagationByResource> findUsersWithTransitiveResources(final String groupKey) {
-        Group group = authFind(groupKey);
-
-        Map<String, PropagationByResource> result = new HashMap<>();
-
-        for (UMembership membership : findUMemberships(group)) {
-            populateTransitiveResources(group, membership.getLeftEnd(), result);
-        }
-
-        return result;
-    }
-
     @Override
     public List<TypeExtension> findTypeExtensions(final AnyTypeClass anyTypeClass) {
         TypedQuery<TypeExtension> query = entityManager().createQuery(

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/PropagationByResource.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/PropagationByResource.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/PropagationByResource.java
new file mode 100644
index 0000000..e7b8bfc
--- /dev/null
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/PropagationByResource.java
@@ -0,0 +1,376 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.core.provisioning.api;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.apache.syncope.common.lib.types.ResourceOperation;
+
+/**
+ * Encapsulates operations to be performed on various resources.
+ */
+public class PropagationByResource implements Serializable {
+
+    private static final long serialVersionUID = -5699740428104336636L;
+
+    /**
+     * Resources for creation.
+     */
+    private final Set<String> toBeCreated;
+
+    /**
+     * Resources for update.
+     */
+    private final Set<String> toBeUpdated;
+
+    /**
+     * Resources for deletion.
+     */
+    private final Set<String> toBeDeleted;
+
+    /**
+     * Mapping target resource names to old ConnObjectKeys (when applicable).
+     */
+    private final Map<String, String> oldConnObjectKeys;
+
+    /**
+     * Default constructor.
+     */
+    public PropagationByResource() {
+        toBeCreated = new HashSet<>();
+        toBeUpdated = new HashSet<>();
+        toBeDeleted = new HashSet<>();
+
+        oldConnObjectKeys = new HashMap<>();
+    }
+
+    /**
+     * Avoid potential conflicts by not doing create or update on any resource for which a delete is requested, and by
+     * not doing any create on any resource for which an update is requested.
+     */
+    public final void purge() {
+        toBeCreated.removeAll(toBeDeleted);
+        toBeCreated.removeAll(toBeUpdated);
+
+        toBeUpdated.removeAll(toBeDeleted);
+    }
+
+    /**
+     * Add an element.
+     *
+     * @param type resource operation type
+     * @param resourceKey target resource
+     * @return whether the operation was successful or not
+     */
+    public final boolean add(final ResourceOperation type, final String resourceKey) {
+        Set<String> set;
+        switch (type) {
+            case CREATE:
+                set = toBeCreated;
+                break;
+
+            case UPDATE:
+                set = toBeUpdated;
+                break;
+
+            case DELETE:
+            default:
+                set = toBeDeleted;
+                break;
+        }
+
+        return set.add(resourceKey);
+    }
+
+    /**
+     * Add some elements.
+     *
+     * @param type resource operation type
+     * @param resourceKeys target resources
+     * @return whether the operation was successful or not
+     */
+    public boolean addAll(final ResourceOperation type, final Collection<String> resourceKeys) {
+        Set<String> set;
+        switch (type) {
+            case CREATE:
+                set = toBeCreated;
+                break;
+
+            case UPDATE:
+                set = toBeUpdated;
+                break;
+
+            case DELETE:
+            default:
+                set = toBeDeleted;
+                break;
+        }
+
+        return set.addAll(resourceKeys);
+    }
+
+    /**
+     * Remove an element.
+     *
+     * @param type resource operation type
+     * @param resourceKey target resource
+     * @return whether the operation was successful or not
+     */
+    public final boolean remove(final ResourceOperation type, final String resourceKey) {
+        boolean result = false;
+
+        switch (type) {
+            case CREATE:
+                result = toBeCreated.remove(resourceKey);
+                break;
+
+            case UPDATE:
+                result = toBeUpdated.remove(resourceKey);
+                break;
+
+            case DELETE:
+                result = toBeDeleted.remove(resourceKey);
+                break;
+
+            default:
+        }
+
+        return result;
+    }
+
+    /**
+     * Remove some elements.
+     *
+     * @param type resource operation type
+     * @param resourceKeys target resources
+     * @return whether the operation was successful or not
+     */
+    public boolean removeAll(final ResourceOperation type, final Set<String> resourceKeys) {
+        Set<String> set;
+        switch (type) {
+            case CREATE:
+                set = toBeCreated;
+                break;
+
+            case UPDATE:
+                set = toBeUpdated;
+                break;
+
+            case DELETE:
+            default:
+                set = toBeDeleted;
+                break;
+        }
+
+        return set.removeAll(resourceKeys);
+    }
+
+    /**
+     * Removes only the resource names in the underlying resource name sets that are contained in the specified
+     * collection.
+     *
+     * @param resourceKeys collection containing resource names to be retained in the underlying resource name sets
+     * @return <tt>true</tt> if the underlying resource name sets changed as a result of the call
+     * @see Collection#removeAll(java.util.Collection)
+     */
+    public boolean removeAll(final Collection<String> resourceKeys) {
+        return toBeCreated.removeAll(resourceKeys)
+                | toBeUpdated.removeAll(resourceKeys)
+                | toBeDeleted.removeAll(resourceKeys);
+    }
+
+    /**
+     * Retains only the resource names in the underlying resource name sets that are contained in the specified
+     * collection.
+     *
+     * @param resourceKeys collection containing resource names to be retained in the underlying resource name sets
+     * @return <tt>true</tt> if the underlying resource name sets changed as a result of the call
+     * @see Collection#retainAll(java.util.Collection)
+     */
+    public boolean retainAll(final Collection<String> resourceKeys) {
+        return toBeCreated.retainAll(resourceKeys)
+                | toBeUpdated.retainAll(resourceKeys)
+                | toBeDeleted.retainAll(resourceKeys);
+    }
+
+    public boolean contains(final ResourceOperation type, final String resourceKey) {
+        boolean result = false;
+
+        switch (type) {
+            case CREATE:
+                result = toBeCreated.contains(resourceKey);
+                break;
+
+            case UPDATE:
+                result = toBeUpdated.contains(resourceKey);
+                break;
+
+            case DELETE:
+                result = toBeDeleted.contains(resourceKey);
+                break;
+
+            default:
+        }
+
+        return result;
+    }
+
+    /**
+     * Get resources for a given resource operation type.
+     *
+     * @param type resource operation type
+     * @return resource matching the given type
+     */
+    public final Set<String> get(final ResourceOperation type) {
+        Set<String> result = Collections.<String>emptySet();
+
+        switch (type) {
+            case CREATE:
+                result = toBeCreated;
+                break;
+
+            case UPDATE:
+                result = toBeUpdated;
+                break;
+
+            case DELETE:
+                result = toBeDeleted;
+                break;
+
+            default:
+        }
+
+        return result;
+    }
+
+    public Map<String, ResourceOperation> asMap() {
+        Map<String, ResourceOperation> result = new HashMap<>();
+        for (ResourceOperation operation : ResourceOperation.values()) {
+            for (String resourceKey : get(operation)) {
+                result.put(resourceKey, operation);
+            }
+        }
+
+        return result;
+    }
+
+    /**
+     * Set resources for a given resource operation type.
+     *
+     * @param type resource operation type
+     * @param resourceKeys to be set
+     */
+    public final void set(final ResourceOperation type, final Collection<String> resourceKeys) {
+
+        switch (type) {
+            case CREATE:
+                toBeCreated.clear();
+                toBeCreated.addAll(resourceKeys);
+                break;
+
+            case UPDATE:
+                toBeUpdated.clear();
+                toBeUpdated.addAll(resourceKeys);
+                break;
+
+            case DELETE:
+                toBeDeleted.clear();
+                toBeDeleted.addAll(resourceKeys);
+                break;
+
+            default:
+        }
+    }
+
+    /**
+     * Merge another resource operation instance into this instance.
+     *
+     * @param propByRes to be merged
+     */
+    public final void merge(final PropagationByResource propByRes) {
+        if (propByRes != null) {
+            toBeCreated.addAll(propByRes.get(ResourceOperation.CREATE));
+            toBeUpdated.addAll(propByRes.get(ResourceOperation.UPDATE));
+            toBeDeleted.addAll(propByRes.get(ResourceOperation.DELETE));
+            oldConnObjectKeys.putAll(propByRes.getOldConnObjectKeys());
+        }
+    }
+
+    /**
+     * Removes all of the operations.
+     */
+    public void clear() {
+        toBeCreated.clear();
+        toBeUpdated.clear();
+        toBeDeleted.clear();
+    }
+
+    /**
+     * Whether no operations are present.
+     *
+     * @return true if no operations (create / update / delete) and no old connObjectKeys are present
+     */
+    public final boolean isEmpty() {
+        return toBeCreated.isEmpty() && toBeUpdated.isEmpty() && toBeDeleted.isEmpty() && oldConnObjectKeys.isEmpty();
+    }
+
+    /**
+     * Fetch all old connObjectKeys.
+     *
+     * @return old connObjectKeys; can be empty
+     */
+    public Map<String, String> getOldConnObjectKeys() {
+        return oldConnObjectKeys;
+    }
+
+    /**
+     * Fetch old connObjectKey for given resource name.
+     *
+     * @param resourceKey resource name
+     * @return old connObjectKey; can be null
+     */
+    public String getOldConnObjectKey(final String resourceKey) {
+        return oldConnObjectKeys.get(resourceKey);
+    }
+
+    /**
+     * Add old ConnObjectKey for a given resource name.
+     *
+     * @param resourceKey resourceKey resource name
+     * @param oldConnObjectKey old ConnObjectKey
+     */
+    public void addOldConnObjectKey(final String resourceKey, final String oldConnObjectKey) {
+        if (resourceKey != null && oldConnObjectKey != null) {
+            oldConnObjectKeys.put(resourceKey, oldConnObjectKey);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return "To be Created: " + toBeCreated + ";\n"
+                + "To be Updated: " + toBeUpdated + ";\n"
+                + "To be Deleted: " + toBeDeleted + ";\n"
+                + "Old connObjectKeys: " + oldConnObjectKeys;
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/WorkflowResult.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/WorkflowResult.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/WorkflowResult.java
index 1b3f2ab..c1902eb 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/WorkflowResult.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/WorkflowResult.java
@@ -24,7 +24,6 @@ import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.syncope.common.lib.types.PropagationByResource;
 
 public class WorkflowResult<T> {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AnyObjectDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AnyObjectDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AnyObjectDataBinder.java
index 92fc48b..41e0674 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AnyObjectDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/AnyObjectDataBinder.java
@@ -20,7 +20,7 @@ package org.apache.syncope.core.provisioning.api.data;
 
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 
 public interface AnyObjectDataBinder {

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/GroupDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/GroupDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/GroupDataBinder.java
index 6cb0a5b..087a271 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/GroupDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/GroupDataBinder.java
@@ -18,9 +18,10 @@
  */
 package org.apache.syncope.core.provisioning.api.data;
 
+import java.util.Map;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.GroupTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 
 public interface GroupDataBinder {
@@ -33,4 +34,21 @@ public interface GroupDataBinder {
 
     PropagationByResource update(Group group, GroupPatch groupPatch);
 
+    /**
+     * Finds any objects having resources assigned exclusively because of memberships of the given group.
+     *
+     * @param groupKey group key
+     * @return map containing pairs with any object key and operations to be performed on those resources (DELETE,
+     * typically).
+     */
+    Map<String, PropagationByResource> findAnyObjectsWithTransitiveResources(String groupKey);
+
+    /**
+     * Finds users having resources assigned exclusively because of memberships of the given group.
+     *
+     * @param groupKey group key
+     * @return map containing pairs with user key and operations to be performed on those resources (DELETE,
+     * typically).
+     */
+    Map<String, PropagationByResource> findUsersWithTransitiveResources(String groupKey);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
index 8ac5fc8..380cb30 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RealmDataBinder.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.core.provisioning.api.data;
 
 import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 
 public interface RealmDataBinder {

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/UserDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/UserDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/UserDataBinder.java
index 79bfd4d..3b0c449 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/UserDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/UserDataBinder.java
@@ -20,7 +20,7 @@ package org.apache.syncope.core.provisioning.api.data;
 
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 
 public interface UserDataBinder {

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/propagation/PropagationManager.java
----------------------------------------------------------------------
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 5159088..caadb5b 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
@@ -24,7 +24,7 @@ import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
index 7b82d1b..b403bc1 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
@@ -29,7 +29,7 @@ import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
index 8d32726..7711238 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
@@ -34,17 +34,18 @@ import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.provisioning.api.VirAttrHandler;
+import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
 
 public class DefaultGroupProvisioningManager implements GroupProvisioningManager {
@@ -59,6 +60,9 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
     protected PropagationTaskExecutor taskExecutor;
 
     @Autowired
+    protected GroupDataBinder groupDataBinder;
+
+    @Autowired
     protected GroupDAO groupDAO;
 
     @Autowired
@@ -156,7 +160,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
         // Generate propagation tasks for deleting users and any objects from group resources, 
         // if they are on those resources only because of the reason being deleted (see SYNCOPE-357)
         for (Map.Entry<String, PropagationByResource> entry
-                : groupDAO.findUsersWithTransitiveResources(key).entrySet()) {
+                : groupDataBinder.findUsersWithTransitiveResources(key).entrySet()) {
 
             tasks.addAll(propagationManager.getDeleteTasks(
                     AnyTypeKind.USER,
@@ -165,7 +169,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                     excludedResources));
         }
         for (Map.Entry<String, PropagationByResource> entry
-                : groupDAO.findAnyObjectsWithTransitiveResources(key).entrySet()) {
+                : groupDataBinder.findAnyObjectsWithTransitiveResources(key).entrySet()) {
 
             tasks.addAll(propagationManager.getDeleteTasks(
                     AnyTypeKind.ANY_OBJECT,

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
----------------------------------------------------------------------
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 55128c1..85d55cd 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
@@ -40,7 +40,7 @@ import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.StatusPatchType;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationException;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
----------------------------------------------------------------------
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 f1e4270..167ced4 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
@@ -55,7 +55,7 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.dao.AllowedSchemas;
 import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
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 74bf7e0..75d817f 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
@@ -40,7 +40,7 @@ import org.apache.syncope.common.lib.to.RelationshipTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.PatchOperation;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.BeanUtils;
 import org.apache.syncope.core.provisioning.api.utils.EntityUtils;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index 2306cdc..c7ab1b1 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.provisioning.java.data;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -36,11 +37,12 @@ import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
 import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
+import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
@@ -48,8 +50,11 @@ import org.apache.syncope.core.persistence.api.entity.DynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
+import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
+import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
+import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -361,4 +366,47 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
                 ? getGroupTO(groupDAO.authFind(key), true)
                 : getGroupTO(groupDAO.authFindByName(key), true);
     }
+
+    private void populateTransitiveResources(
+            final Group group, final Any<?> any, final Map<String, PropagationByResource> result) {
+
+        PropagationByResource propByRes = new PropagationByResource();
+        for (ExternalResource resource : group.getResources()) {
+            if (!any.getResources().contains(resource)) {
+                propByRes.add(ResourceOperation.DELETE, resource.getKey());
+            }
+
+            if (!propByRes.isEmpty()) {
+                result.put(any.getKey(), propByRes);
+            }
+        }
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public Map<String, PropagationByResource> findAnyObjectsWithTransitiveResources(final String groupKey) {
+        Group group = groupDAO.authFind(groupKey);
+
+        Map<String, PropagationByResource> result = new HashMap<>();
+
+        for (AMembership membership : groupDAO.findAMemberships(group)) {
+            populateTransitiveResources(group, membership.getLeftEnd(), result);
+        }
+
+        return result;
+    }
+
+    @Transactional(readOnly = true)
+    @Override
+    public Map<String, PropagationByResource> findUsersWithTransitiveResources(final String groupKey) {
+        Group group = groupDAO.authFind(groupKey);
+
+        Map<String, PropagationByResource> result = new HashMap<>();
+
+        for (UMembership membership : groupDAO.findUMemberships(group)) {
+            populateTransitiveResources(group, membership.getLeftEnd(), result);
+        }
+
+        return result;
+    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
index f8f6334..015612e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
@@ -25,7 +25,7 @@ import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.provisioning.java.utils.TemplateUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
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 ff485ed..998514a 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
@@ -53,7 +53,7 @@ import org.apache.syncope.core.persistence.api.dao.SecurityQuestionDAO;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
 import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.Encryptor;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
----------------------------------------------------------------------
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 57a4894..b3035a1 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,7 +36,7 @@ import org.apache.syncope.common.lib.patch.StringPatchItem;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 8beab31..2528308 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
@@ -30,7 +30,7 @@ import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 import org.apache.syncope.common.lib.types.MatchingRule;
 import org.apache.syncope.common.lib.types.PatchOperation;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.PullMode;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.UnmatchingRule;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
----------------------------------------------------------------------
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 6227718..a93c239 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
@@ -31,7 +31,7 @@ import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 import org.apache.syncope.common.lib.types.MatchingRule;
 import org.apache.syncope.common.lib.types.PatchOperation;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.UnmatchingRule;
 import org.apache.syncope.core.persistence.api.entity.task.PushTask;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
index dc70c4c..bb0ec6d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPullResultHandlerImpl.java
@@ -34,7 +34,7 @@ import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.MatchingRule;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.PullMode;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.UnmatchingRule;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
index 334bd64..e823b45 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
@@ -25,7 +25,7 @@ import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.AuditElements;
 import org.apache.syncope.common.lib.types.AuditElements.Result;
 import org.apache.syncope.common.lib.types.MatchingRule;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.UnmatchingRule;
 import org.apache.syncope.core.persistence.api.entity.Realm;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
index 5175215..255f317 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/UserPushResultHandlerImpl.java
@@ -25,7 +25,7 @@ import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
index ef1e732..e74aade 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUserWorkflowAdapter.java
@@ -61,7 +61,7 @@ import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.to.WorkflowFormPropertyTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.WorkflowFormPropertyType;
 import org.apache.syncope.core.spring.security.AuthContextUtils;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/PasswordReset.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/PasswordReset.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/PasswordReset.java
index 997fd3b..d3caac6 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/PasswordReset.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/PasswordReset.java
@@ -21,7 +21,7 @@ package org.apache.syncope.core.workflow.activiti.task;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
index 4448938..163cf1c 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/task/Update.java
@@ -19,7 +19,7 @@
 package org.apache.syncope.core.workflow.activiti.task;
 
 import org.apache.syncope.common.lib.patch.UserPatch;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.workflow.activiti.ActivitiUserWorkflowAdapter;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
index 3c8466d..6aae0ef 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultAnyObjectWorkflowAdapter.java
@@ -24,7 +24,7 @@ import java.util.List;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
index 2a9e1c8..c60844c 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultGroupWorkflowAdapter.java
@@ -24,7 +24,7 @@ import java.util.List;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
----------------------------------------------------------------------
diff --git a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
index 46367e2..2df0b77 100644
--- a/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
+++ b/core/workflow-java/src/main/java/org/apache/syncope/core/workflow/java/DefaultUserWorkflowAdapter.java
@@ -28,7 +28,7 @@ import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.to.WorkflowFormTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.entity.user.User;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
index 5dd41ab..a9f17c8 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/CamelUserProvisioningManager.java
@@ -33,7 +33,7 @@ import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.UserTO;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.WorkflowResult;
 import org.apache.syncope.core.provisioning.api.pushpull.ProvisioningReport;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectDeprovisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectDeprovisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectDeprovisionProcessor.java
index 8831559..4c83fe5 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectDeprovisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectDeprovisionProcessor.java
@@ -23,7 +23,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectProvisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectProvisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectProvisionProcessor.java
index d81c8fd..2c5bb45 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectProvisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/AnyObjectProvisionProcessor.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
index 83b8578..0ad4d77 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeleteProcessor.java
@@ -25,10 +25,10 @@ import java.util.Set;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
-import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationManager;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationReporter;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationTaskExecutor;
@@ -49,7 +49,7 @@ public class GroupDeleteProcessor implements Processor {
     protected PropagationTaskExecutor taskExecutor;
 
     @Autowired
-    protected GroupDAO groupDAO;
+    protected GroupDataBinder groupDataBinder;
 
     @Override
     public void process(final Exchange exchange) throws Exception {
@@ -63,7 +63,7 @@ public class GroupDeleteProcessor implements Processor {
         // Generate propagation tasks for deleting users from group resources, if they are on those resources only
         // because of the reason being deleted (see SYNCOPE-357)
         for (Map.Entry<String, PropagationByResource> entry
-                : groupDAO.findUsersWithTransitiveResources(key).entrySet()) {
+                : groupDataBinder.findUsersWithTransitiveResources(key).entrySet()) {
 
             tasks.addAll(propagationManager.getDeleteTasks(
                     AnyTypeKind.USER,
@@ -72,7 +72,7 @@ public class GroupDeleteProcessor implements Processor {
                     excludedResources));
         }
         for (Map.Entry<String, PropagationByResource> entry
-                : groupDAO.findAnyObjectsWithTransitiveResources(key).entrySet()) {
+                : groupDataBinder.findAnyObjectsWithTransitiveResources(key).entrySet()) {
 
             tasks.addAll(propagationManager.getDeleteTasks(
                     AnyTypeKind.ANY_OBJECT,

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
index 89a6f79..d8e94f0 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupDeprovisionProcessor.java
@@ -23,7 +23,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
index fc6aaa6..61c5833 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/GroupProvisionProcessor.java
@@ -22,7 +22,7 @@ import java.util.List;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
index 22195e3..0fe993c 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeleteProcessor.java
@@ -23,7 +23,7 @@ import java.util.Set;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
index b0eab15..38e2a21 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserDeprovisionProcessor.java
@@ -23,7 +23,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
index 7e76bf3..632c188 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserProvisionProcessor.java
@@ -29,7 +29,7 @@ import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.StringPatchItem;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.types.PatchOperation;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/df7613e5/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
index b8f09ab..fcd59e3 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/processor/UserStatusPropagationProcessor.java
@@ -24,7 +24,7 @@ import org.apache.camel.Processor;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.syncope.common.lib.patch.StatusPatch;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
-import org.apache.syncope.common.lib.types.PropagationByResource;
+import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.common.lib.types.StatusPatchType;
 import org.apache.syncope.core.spring.ApplicationContextProvider;