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 2017/08/22 15:09:13 UTC

[09/16] syncope git commit: [SYNCOPE-938] Switching from commons-collections to Java 8 features

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConfDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConfDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConfDAO.java
index 3f11fea..29d161e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConfDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConfDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.conf.Conf;
@@ -45,35 +46,35 @@ public class JPAConfDAO extends AbstractDAO<Conf> implements ConfDAO {
 
     @Transactional(readOnly = true)
     @Override
-    public CPlainAttr find(final String key) {
+    public Optional<? extends CPlainAttr> find(final String key) {
         return get().getPlainAttr(key);
     }
 
     @Transactional(readOnly = true)
     @Override
     public <T> T find(final String key, final T defaultValue) {
-        CPlainAttr result = find(key);
-        if (result == null) {
+        Optional<? extends CPlainAttr> result = find(key);
+        if (!result.isPresent()) {
             return defaultValue;
         }
 
-        return result.getUniqueValue() == null
-                ? result.getValues().isEmpty()
+        return result.get().getUniqueValue() == null
+                ? result.get().getValues().isEmpty()
                 ? null
-                : result.getValues().get(0).<T>getValue()
-                : result.getUniqueValue().<T>getValue();
+                : result.get().getValues().get(0).<T>getValue()
+                : result.get().getUniqueValue().<T>getValue();
     }
 
     @Override
     public Conf save(final CPlainAttr attr) {
         Conf instance = get();
 
-        CPlainAttr old = instance.getPlainAttr(attr.getSchema().getKey());
-        if (old != null && (!attr.getSchema().isUniqueConstraint()
-                || (!attr.getUniqueValue().getStringValue().equals(old.getUniqueValue().getStringValue())))) {
+        Optional<? extends CPlainAttr> old = instance.getPlainAttr(attr.getSchema().getKey());
+        if (old.isPresent() && (!attr.getSchema().isUniqueConstraint()
+                || (!attr.getUniqueValue().getStringValue().equals(old.get().getUniqueValue().getStringValue())))) {
 
-            old.setOwner(null);
-            instance.remove(old);
+            old.get().setOwner(null);
+            instance.remove(old.get());
         }
 
         instance.add(attr);
@@ -85,10 +86,10 @@ public class JPAConfDAO extends AbstractDAO<Conf> implements ConfDAO {
     @Override
     public Conf delete(final String key) {
         Conf instance = get();
-        CPlainAttr attr = instance.getPlainAttr(key);
-        if (attr != null) {
-            attr.setOwner(null);
-            instance.remove(attr);
+        Optional<? extends CPlainAttr> attr = instance.getPlainAttr(key);
+        if (attr.isPresent()) {
+            attr.get().setOwner(null);
+            instance.remove(attr.get());
 
             instance = entityManager().merge(instance);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
index 7d4c0c8..88af802 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAConnInstanceDAO.java
@@ -18,23 +18,18 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceHistoryConfDAO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.JPAConnInstance;
 import org.apache.syncope.core.provisioning.api.ConnectorRegistry;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -61,20 +56,15 @@ public class JPAConnInstanceDAO extends AbstractDAO<ConnInstance> implements Con
 
     @Override
     public ConnInstance authFind(final String key) {
-        final ConnInstance connInstance = find(key);
+        ConnInstance connInstance = find(key);
         if (connInstance == null) {
             return null;
         }
 
-        final Set<String> authRealms = AuthContextUtils.getAuthorizations().get(StandardEntitlement.CONNECTOR_READ);
+        Set<String> authRealms = AuthContextUtils.getAuthorizations().get(StandardEntitlement.CONNECTOR_READ);
         if (authRealms == null || authRealms.isEmpty()
-                || !IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-                    @Override
-                    public boolean evaluate(final String realm) {
-                        return connInstance.getAdminRealm().getFullPath().startsWith(realm);
-                    }
-                })) {
+                || !authRealms.stream().anyMatch(
+                        realm -> connInstance.getAdminRealm().getFullPath().startsWith(realm))) {
 
             throw new DelegatedAdministrationException(
                     connInstance.getAdminRealm().getFullPath(),
@@ -95,32 +85,22 @@ public class JPAConnInstanceDAO extends AbstractDAO<ConnInstance> implements Con
         TypedQuery<ConnInstance> query = entityManager().createQuery(
                 "SELECT e FROM " + JPAConnInstance.class.getSimpleName() + " e", ConnInstance.class);
 
-        return CollectionUtils.select(query.getResultList(), new Predicate<ConnInstance>() {
-
-            @Override
-            public boolean evaluate(final ConnInstance connInstance) {
-                return IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-                    @Override
-                    public boolean evaluate(final String realm) {
-                        return connInstance.getAdminRealm().getFullPath().startsWith(realm);
-                    }
-                });
-            }
-        }, new ArrayList<ConnInstance>());
+        return query.getResultList().stream().filter(connInstance -> authRealms.stream().
+                anyMatch(realm -> connInstance.getAdminRealm().getFullPath().startsWith(realm))).
+                collect(Collectors.toList());
     }
 
     @Override
     public ConnInstance save(final ConnInstance connector) {
         final ConnInstance merged = entityManager().merge(connector);
 
-        for (ExternalResource resource : merged.getResources()) {
+        merged.getResources().forEach(resource -> {
             try {
                 connRegistry.registerConnector(resource);
             } catch (NotFoundException e) {
                 LOG.error("While registering connector for resource", e);
             }
-        }
+        });
 
         return merged;
     }
@@ -132,14 +112,9 @@ public class JPAConnInstanceDAO extends AbstractDAO<ConnInstance> implements Con
             return;
         }
 
-        IterableUtils.forEach(new CopyOnWriteArrayList<>(connInstance.getResources()), new Closure<ExternalResource>() {
-
-            @Override
-            public void execute(final ExternalResource input) {
-                resourceDAO.delete(input.getKey());
-            }
-
-        });
+        connInstance.getResources().stream().
+                map(Entity::getKey).collect(Collectors.toList()).
+                forEach(resource -> resourceDAO.delete(resource));
 
         connInstanceHistoryConfDAO.deleteByEntity(connInstance);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
index 43b36d5..5822a6e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAExternalResourceDAO.java
@@ -18,16 +18,13 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -45,14 +42,9 @@ import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.Policy;
-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.AnyObject;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
-import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMappingItem;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAMapping;
@@ -174,21 +166,15 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
 
     @Override
     public ExternalResource authFind(final String key) {
-        final ExternalResource resource = find(key);
+        ExternalResource resource = find(key);
         if (resource == null) {
             return null;
         }
 
-        final Set<String> authRealms = AuthContextUtils.getAuthorizations().get(StandardEntitlement.RESOURCE_READ);
+        Set<String> authRealms = AuthContextUtils.getAuthorizations().get(StandardEntitlement.RESOURCE_READ);
         if (authRealms == null || authRealms.isEmpty()
-                || !IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-                    @Override
-                    public boolean evaluate(final String realm) {
-                        return resource.getConnector() != null
-                                && resource.getConnector().getAdminRealm().getFullPath().startsWith(realm);
-                    }
-                })) {
+                || !authRealms.stream().anyMatch(realm -> resource.getConnector() != null
+                && resource.getConnector().getAdminRealm().getFullPath().startsWith(realm))) {
 
             throw new DelegatedAdministrationException(
                     resource.getConnector().getAdminRealm().getFullPath(),
@@ -243,20 +229,10 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
         TypedQuery<ExternalResource> query = entityManager().createQuery(
                 "SELECT e FROM  " + JPAExternalResource.class.getSimpleName() + " e", ExternalResource.class);
 
-        return CollectionUtils.select(query.getResultList(), new Predicate<ExternalResource>() {
-
-            @Override
-            public boolean evaluate(final ExternalResource resource) {
-                return IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-                    @Override
-                    public boolean evaluate(final String realm) {
-                        return resource.getConnector() != null
-                                && resource.getConnector().getAdminRealm().getFullPath().startsWith(realm);
-                    }
-                });
-            }
-        }, new ArrayList<ExternalResource>());
+        return query.getResultList().stream().filter(resource -> authRealms.stream().
+                anyMatch(realm -> resource.getConnector() != null
+                && resource.getConnector().getAdminRealm().getFullPath().startsWith(realm))).
+                collect(Collectors.toList());
     }
 
     @Override
@@ -280,18 +256,15 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
         query.setParameter("intAttrName", intAttrName);
 
         Set<String> itemKeys = new HashSet<>();
-        for (MappingItem item : query.getResultList()) {
-            itemKeys.add(item.getKey());
-        }
-        for (String itemKey : itemKeys) {
-            MappingItem item = entityManager().find(JPAMappingItem.class, itemKey);
-            if (item != null) {
-                item.getMapping().getItems().remove(item);
-                item.setMapping(null);
-
-                entityManager().remove(item);
-            }
-        }
+        query.getResultList().forEach(item -> itemKeys.add(item.getKey()));
+        itemKeys.stream().map(itemKey -> entityManager().find(JPAMappingItem.class, itemKey)).
+                filter(item -> item != null).map(item -> {
+            item.getMapping().getItems().remove(item);
+            return item;
+        }).map(item -> {
+            item.setMapping(null);
+            return item;
+        }).forEachOrdered(item -> entityManager().remove(item));
 
         // Make empty query cache for *MappingItem and related *Mapping
         entityManager().getEntityManagerFactory().getCache().evict(JPAMappingItem.class);
@@ -309,34 +282,27 @@ public class JPAExternalResourceDAO extends AbstractDAO<ExternalResource> implem
         taskDAO().deleteAll(resource, TaskType.PULL);
         taskDAO().deleteAll(resource, TaskType.PUSH);
 
-        for (Realm realm : realmDAO().findByResource(resource)) {
-            realm.getResources().remove(resource);
-        }
-        for (AnyObject anyObject : anyObjectDAO().findByResource(resource)) {
-            anyObject.getResources().remove(resource);
-        }
-        for (User user : userDAO().findByResource(resource)) {
-            user.getResources().remove(resource);
-        }
-        for (Group group : groupDAO().findByResource(resource)) {
-            group.getResources().remove(resource);
-        }
-        for (AccountPolicy policy : policyDAO().findByResource(resource)) {
-            policy.getResources().remove(resource);
-        }
-
-        for (Provision provision : resource.getProvisions()) {
-            for (MappingItem item : provision.getMapping().getItems()) {
-                item.setMapping(null);
-            }
+        realmDAO().findByResource(resource).
+                forEach(realm -> realm.getResources().remove(resource));
+        anyObjectDAO().findByResource(resource).
+                forEach(anyObject -> anyObject.getResources().remove(resource));
+        userDAO().findByResource(resource).
+                forEach(user -> user.getResources().remove(resource));
+        groupDAO().findByResource(resource).
+                forEach(group -> group.getResources().remove(resource));
+        policyDAO().findByResource(resource).
+                forEach(policy -> policy.getResources().remove(resource));
+
+        resource.getProvisions().stream().map(provision -> {
+            provision.getMapping().getItems().forEach(item -> item.setMapping(null));
+            return provision;
+        }).map(provision -> {
             provision.getMapping().getItems().clear();
             provision.setMapping(null);
             provision.setResource(null);
-
-            for (VirSchema schema : virSchemaDAO().findByProvision(provision)) {
-                virSchemaDAO().delete(schema.getKey());
-            }
-        }
+            return provision;
+        }).forEachOrdered(provision -> virSchemaDAO().findByProvision(provision).
+                forEach(schema -> virSchemaDAO().delete(schema.getKey())));
 
         externalResourceHistoryConfDAO().deleteByEntity(resource);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/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 dca8d69..170915c 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
@@ -26,13 +26,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.NoResultException;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.SetUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
@@ -52,15 +49,14 @@ import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 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.AnyUtils;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 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.anyobject.APlainAttr;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
 import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
-import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADynGroupMembership;
 import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAMembership;
@@ -69,7 +65,6 @@ import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembershi
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUMembership;
 import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent;
 import org.apache.syncope.core.provisioning.api.event.AnyDeletedEvent;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.springframework.aop.support.AopUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -177,20 +172,18 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
 
     @Override
     protected void securityChecks(final Group group) {
-        Set<String> authRealms = SetUtils.emptyIfNull(
-                AuthContextUtils.getAuthorizations().get(StandardEntitlement.GROUP_READ));
-        boolean authorized = IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String realm) {
-                return group.getRealm().getFullPath().startsWith(realm)
-                        || realm.equals(RealmUtils.getGroupOwnerRealm(group.getRealm().getFullPath(), group.getKey()));
-            }
-        });
+        Map<String, Set<String>> authorizations = AuthContextUtils.getAuthorizations();
+        Set<String> authRealms = authorizations.containsKey(StandardEntitlement.GROUP_READ)
+                ? authorizations.get(StandardEntitlement.GROUP_READ)
+                : Collections.emptySet();
+
+        boolean authorized = authRealms.stream().anyMatch(realm -> group.getRealm().getFullPath().startsWith(realm)
+                || realm.equals(RealmUtils.getGroupOwnerRealm(group.getRealm().getFullPath(), group.getKey())));
         if (!authorized) {
-            authorized = !CollectionUtils.intersection(findDynRealms(group.getKey()), authRealms).isEmpty();
+            authorized = findDynRealms(group.getKey()).stream().
+                    filter(dynRealm -> authRealms.contains(dynRealm)).
+                    count() > 0;
         }
-
         if (authRealms.isEmpty() || !authorized) {
             throw new DelegatedAdministrationException(
                     group.getRealm().getFullPath(), AnyTypeKind.GROUP.name(), group.getKey());
@@ -299,32 +292,32 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
 
             clearUDynMembers(merged);
 
-            for (User user : matching) {
+            matching.forEach(user -> {
                 Query insert = entityManager().createNativeQuery("INSERT INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)");
                 insert.setParameter(1, user.getKey());
                 insert.setParameter(2, merged.getKey());
                 insert.executeUpdate();
 
                 publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user, AuthContextUtils.getDomain()));
-            }
+            });
         }
-        for (ADynGroupMembership memb : merged.getADynMemberships()) {
-            List<AnyObject> matching = searchDAO().search(
-                    buildDynMembershipCond(memb.getFIQLCond(), merged.getRealm()),
-                    AnyTypeKind.ANY_OBJECT);
-
+        merged.getADynMemberships().stream().map(memb -> searchDAO().search(
+                buildDynMembershipCond(memb.getFIQLCond(), merged.getRealm()),
+                AnyTypeKind.ANY_OBJECT)).forEachOrdered(matching -> {
             clearADynMembers(merged);
 
-            for (AnyObject anyObject : matching) {
-                Query insert = entityManager().createNativeQuery("INSERT INTO " + ADYNMEMB_TABLE + " VALUES(?, ?, ?)");
+            matching.forEach(anyObject -> {
+                Query insert = entityManager().createNativeQuery("INSERT INTO " + ADYNMEMB_TABLE
+                        + " VALUES(?, ?, ?)");
                 insert.setParameter(1, anyObject.getType().getKey());
                 insert.setParameter(2, anyObject.getKey());
                 insert.setParameter(3, merged.getKey());
                 insert.executeUpdate();
 
-                publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, anyObject, AuthContextUtils.getDomain()));
-            }
-        }
+                publisher.publishEvent(
+                        new AnyCreatedUpdatedEvent<>(this, anyObject, AuthContextUtils.getDomain()));
+            });
+        });
 
         dynRealmDAO().refreshDynMemberships(merged);
 
@@ -335,34 +328,35 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     public void delete(final Group group) {
         dynRealmDAO().removeDynMemberships(group.getKey());
 
-        for (AMembership membership : findAMemberships(group)) {
+        findAMemberships(group).forEach(membership -> {
             AnyObject leftEnd = membership.getLeftEnd();
             leftEnd.getMemberships().remove(membership);
             membership.setRightEnd(null);
-            for (APlainAttr attr : leftEnd.getPlainAttrs(membership)) {
+            leftEnd.getPlainAttrs(membership).stream().map(attr -> {
                 leftEnd.remove(attr);
                 attr.setOwner(null);
                 attr.setMembership(null);
-                plainAttrDAO.delete(attr);
-            }
+                return attr;
+            }).forEachOrdered(attr -> plainAttrDAO.delete(attr));
 
             anyObjectDAO().save(leftEnd);
             publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, leftEnd, AuthContextUtils.getDomain()));
-        }
-        for (UMembership membership : findUMemberships(group)) {
+        });
+
+        findUMemberships(group).forEach(membership -> {
             User leftEnd = membership.getLeftEnd();
             leftEnd.getMemberships().remove(membership);
             membership.setRightEnd(null);
-            for (UPlainAttr attr : leftEnd.getPlainAttrs(membership)) {
+            leftEnd.getPlainAttrs(membership).stream().map(attr -> {
                 leftEnd.remove(attr);
                 attr.setOwner(null);
                 attr.setMembership(null);
-                plainAttrDAO.delete(attr);
-            }
+                return attr;
+            }).forEachOrdered(attr -> plainAttrDAO.delete(attr));
 
             userDAO().save(leftEnd);
             publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, leftEnd, AuthContextUtils.getDomain()));
-        }
+        });
 
         clearUDynMembers(group);
         clearADynMembers(group);
@@ -383,22 +377,22 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findADynMembers(final Group group) {
         List<String> result = new ArrayList<>();
-        for (ADynGroupMembership memb : group.getADynMemberships()) {
+        group.getADynMemberships().stream().map(memb -> {
             Query query = entityManager().createNativeQuery(
                     "SELECT any_id FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND anyType_id=?");
             query.setParameter(1, group.getKey());
             query.setParameter(2, memb.getAnyType().getKey());
+            return query;
+        }).forEachOrdered((query) -> {
+            query.getResultList().stream().map(key -> key instanceof Object[]
+                    ? (String) ((Object[]) key)[0]
+                    : ((String) key)).
+                    forEachOrdered(actualKey -> result.add(actualKey.toString()));
+        });
 
-            for (Object key : query.getResultList()) {
-                String actualKey = key instanceof Object[]
-                        ? (String) ((Object[]) key)[0]
-                        : ((String) key);
-
-                result.add(actualKey);
-            }
-        }
         return result;
     }
 
@@ -420,13 +414,12 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Transactional
     @Override
     public void refreshDynMemberships(final AnyObject anyObject) {
-        for (ADynGroupMembership memb : findWithADynMemberships(anyObject.getType())) {
+        findWithADynMemberships(anyObject.getType()).stream().map(memb -> {
             Query delete = entityManager().createNativeQuery(
                     "DELETE FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND any_id=?");
             delete.setParameter(1, memb.getGroup().getKey());
             delete.setParameter(2, anyObject.getKey());
             delete.executeUpdate();
-
             if (jpaAnySearchDAO().matches(
                     anyObject,
                     buildDynMembershipCond(memb.getFIQLCond(), memb.getGroup().getRealm()))) {
@@ -438,9 +431,9 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                 insert.setParameter(3, memb.getGroup().getKey());
                 insert.executeUpdate();
             }
-
-            publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, memb.getGroup(), AuthContextUtils.getDomain()));
-        }
+            return memb;
+        }).forEachOrdered(memb -> publisher.publishEvent(
+                new AnyCreatedUpdatedEvent<>(this, memb.getGroup(), AuthContextUtils.getDomain())));
     }
 
     @Override
@@ -451,12 +444,13 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         delete.setParameter(1, anyObject.getKey());
         delete.executeUpdate();
 
-        for (Group group : dynGroups) {
+        dynGroups.forEach(group -> {
             publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group, AuthContextUtils.getDomain()));
-        }
+        });
     }
 
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findUDynMembers(final Group group) {
         if (group.getUDynMembership() == null) {
             return Collections.emptyList();
@@ -467,13 +461,9 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         query.setParameter(1, group.getKey());
 
         List<String> result = new ArrayList<>();
-        for (Object key : query.getResultList()) {
-            String actualKey = key instanceof Object[]
-                    ? (String) ((Object[]) key)[0]
-                    : ((String) key);
-
-            result.add(actualKey);
-        }
+        query.getResultList().stream().map(key -> key instanceof Object[]
+                ? (String) ((Object[]) key)[0]
+                : ((String) key)).forEachOrdered(actualKey -> result.add(actualKey.toString()));
         return result;
     }
 
@@ -495,13 +485,12 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
     @Transactional
     @Override
     public void refreshDynMemberships(final User user) {
-        for (UDynGroupMembership memb : findWithUDynMemberships()) {
+        findWithUDynMemberships().stream().map(memb -> {
             Query delete = entityManager().createNativeQuery(
                     "DELETE FROM " + UDYNMEMB_TABLE + " WHERE group_id=? AND any_id=?");
             delete.setParameter(1, memb.getGroup().getKey());
             delete.setParameter(2, user.getKey());
             delete.executeUpdate();
-
             if (jpaAnySearchDAO().matches(
                     user,
                     buildDynMembershipCond(memb.getFIQLCond(), memb.getGroup().getRealm()))) {
@@ -512,9 +501,9 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
                 insert.setParameter(2, memb.getGroup().getKey());
                 insert.executeUpdate();
             }
-
-            publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, memb.getGroup(), AuthContextUtils.getDomain()));
-        }
+            return memb;
+        }).forEachOrdered(memb -> publisher.publishEvent(
+                new AnyCreatedUpdatedEvent<>(this, memb.getGroup(), AuthContextUtils.getDomain())));
     }
 
     @Override
@@ -525,14 +514,14 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         delete.setParameter(1, user.getKey());
         delete.executeUpdate();
 
-        for (Group group : dynGroups) {
+        dynGroups.forEach(group -> {
             publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group, AuthContextUtils.getDomain()));
-        }
+        });
     }
 
     @Transactional(readOnly = true)
     @Override
     public Collection<String> findAllResourceKeys(final String key) {
-        return CollectionUtils.collect(find(key).getResources(), EntityUtils.keyTransformer());
+        return find(key).getResources().stream().map(Entity::getKey).collect(Collectors.toList());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPANotificationDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPANotificationDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPANotificationDAO.java
index f9cf72e..ca5f0c4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPANotificationDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPANotificationDAO.java
@@ -21,15 +21,13 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.Collections;
 import java.util.List;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.IterableUtils;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.MailTemplate;
 import org.apache.syncope.core.persistence.api.entity.Notification;
-import org.apache.syncope.core.persistence.api.entity.task.Task;
 import org.apache.syncope.core.persistence.jpa.entity.JPANotification;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
@@ -77,15 +75,9 @@ public class JPANotificationDAO extends AbstractDAO<Notification> implements Not
             return;
         }
 
-        IterableUtils.forEach(taskDAO.findAll(
-                TaskType.NOTIFICATION, null, notification, null, null, -1, -1, Collections.<OrderByClause>emptyList()),
-                new Closure<Task>() {
-
-            @Override
-            public void execute(final Task input) {
-                delete(input.getKey());
-            }
-        });
+        taskDAO.findAll(
+                TaskType.NOTIFICATION, null, notification, null, null, -1, -1, Collections.<OrderByClause>emptyList()).
+                stream().map(Entity::getKey).forEach(task -> delete(task));
 
         entityManager().remove(notification);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
index 0f4cb62..a03451f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARealmDAO.java
@@ -21,10 +21,9 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.NoResultException;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.core.persistence.api.dao.MalformedPathException;
@@ -33,7 +32,6 @@ import org.apache.syncope.core.persistence.api.dao.RoleDAO;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.Policy;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -87,14 +85,11 @@ public class JPARealmDAO extends AbstractDAO<Realm> implements RealmDAO {
 
         Realm current = root;
         for (final String pathElement : fullPath.substring(1).split("/")) {
-            current = IterableUtils.find(findChildren(current), new Predicate<Realm>() {
-
-                @Override
-                public boolean evaluate(final Realm realm) {
-                    return pathElement.equals(realm.getName());
-                }
-            });
-            if (current == null) {
+            Optional<Realm> first = findChildren(current).stream().
+                    filter(realm -> pathElement.equals(realm.getName())).findFirst();
+            if (first.isPresent()) {
+                current = first.get();
+            } else {
                 return null;
             }
         }
@@ -148,10 +143,11 @@ public class JPARealmDAO extends AbstractDAO<Realm> implements RealmDAO {
         query.setParameter("policy", policy);
 
         List<Realm> result = new ArrayList<>();
-        for (Realm realm : query.getResultList()) {
+        query.getResultList().stream().map(realm -> {
             result.add(realm);
-            result.addAll(findSamePolicyChildren(realm, policy));
-        }
+            return realm;
+        }).forEachOrdered(realm -> result.addAll(findSamePolicyChildren(realm, policy)));
+
         return result;
     }
 
@@ -209,15 +205,13 @@ public class JPARealmDAO extends AbstractDAO<Realm> implements RealmDAO {
 
     @Override
     public void delete(final Realm realm) {
-        for (Realm toBeDeleted : findDescendants(realm)) {
-            for (Role role : roleDAO.findByRealm(toBeDeleted)) {
-                role.getRealms().remove(toBeDeleted);
-            }
-
+        findDescendants(realm).stream().map(toBeDeleted -> {
+            roleDAO.findByRealm(toBeDeleted).forEach(role -> role.getRealms().remove(toBeDeleted));
+            return toBeDeleted;
+        }).map(toBeDeleted -> {
             toBeDeleted.setParent(null);
-
-            entityManager().remove(toBeDeleted);
-        }
+            return toBeDeleted;
+        }).forEachOrdered(toBeDeleted -> entityManager().remove(toBeDeleted));
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARelationshipTypeDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARelationshipTypeDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARelationshipTypeDAO.java
index 4af6c98..fd1f731 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARelationshipTypeDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARelationshipTypeDAO.java
@@ -18,10 +18,10 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.core.persistence.api.dao.RelationshipTypeDAO;
 import org.apache.syncope.core.persistence.api.entity.Relationship;
 import org.apache.syncope.core.persistence.api.entity.RelationshipType;
@@ -64,7 +64,11 @@ public class JPARelationshipTypeDAO extends AbstractDAO<RelationshipType> implem
                 URelationship.class);
         uquery.setParameter("type", type);
 
-        return CollectionUtils.union(aquery.getResultList(), uquery.getResultList());
+        List<Relationship<?, ?>> result = new ArrayList<>();
+        result.addAll(aquery.getResultList());
+        result.addAll(uquery.getResultList());
+
+        return result;
     }
 
     @Override
@@ -74,7 +78,7 @@ public class JPARelationshipTypeDAO extends AbstractDAO<RelationshipType> implem
             return;
         }
 
-        for (Relationship<?, ?> relationship : findRelationshipsByType(type)) {
+        findRelationshipsByType(type).stream().map(relationship -> {
             if (relationship instanceof URelationship) {
                 ((URelationship) relationship).getLeftEnd().getRelationships().remove((URelationship) relationship);
             } else if (relationship instanceof UMembership) {
@@ -84,10 +88,9 @@ public class JPARelationshipTypeDAO extends AbstractDAO<RelationshipType> implem
             } else if (relationship instanceof AMembership) {
                 ((AMembership) relationship).getLeftEnd().getMemberships().remove((AMembership) relationship);
             }
-
             relationship.setLeftEnd(null);
-            entityManager().remove(relationship);
-        }
+            return relationship;
+        }).forEachOrdered(relationship -> entityManager().remove(relationship));
 
         entityManager().remove(type);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
index dfb7536..55ca241 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPATaskDAO.java
@@ -21,13 +21,12 @@ package org.apache.syncope.core.persistence.jpa.dao;
 import java.util.Collections;
 import java.util.List;
 import javax.persistence.Query;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.Notification;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.task.Task;
@@ -164,12 +163,12 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
 
         StringBuilder statement = new StringBuilder();
 
-        for (OrderByClause clause : orderByClauses) {
+        orderByClauses.forEach(clause -> {
             String field = clause.getField().trim();
             if (ReflectionUtils.findField(beanClass, field) != null) {
                 statement.append("t.").append(field).append(' ').append(clause.getDirection().name());
             }
-        }
+        });
 
         if (statement.length() == 0) {
             statement.append("ORDER BY t.id DESC");
@@ -264,14 +263,7 @@ public class JPATaskDAO extends AbstractDAO<Task> implements TaskDAO {
 
     @Override
     public void deleteAll(final ExternalResource resource, final TaskType type) {
-        IterableUtils.forEach(
-                findAll(type, resource, null, null, null, -1, -1, Collections.<OrderByClause>emptyList()),
-                new Closure<Task>() {
-
-            @Override
-            public void execute(final Task input) {
-                delete(input.getKey());
-            }
-        });
+        findAll(type, resource, null, null, null, -1, -1, Collections.<OrderByClause>emptyList()).
+                stream().map(Entity::getKey).forEach(task -> delete(task));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
index e1bfaf1..02281fa 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java
@@ -28,20 +28,14 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import javax.persistence.NoResultException;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.SetUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.policy.AccountRuleConf;
-import org.apache.syncope.common.lib.policy.PasswordRuleConf;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -61,6 +55,7 @@ import org.apache.syncope.core.persistence.api.dao.RoleDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.AccessToken;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
@@ -68,13 +63,11 @@ import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent;
 import org.apache.syncope.core.provisioning.api.event.AnyDeletedEvent;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.support.AbstractBeanDefinition;
 import org.springframework.stereotype.Repository;
@@ -185,17 +178,16 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
         if (!AuthContextUtils.getUsername().equals(anonymousUser)
                 && !AuthContextUtils.getUsername().equals(user.getUsername())) {
 
-            Set<String> authRealms = SetUtils.emptyIfNull(
-                    AuthContextUtils.getAuthorizations().get(StandardEntitlement.USER_READ));
-            boolean authorized = IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-                @Override
-                public boolean evaluate(final String realm) {
-                    return user.getRealm().getFullPath().startsWith(realm);
-                }
-            });
+            Map<String, Set<String>> authorizations = AuthContextUtils.getAuthorizations();
+            Set<String> authRealms = authorizations.containsKey(StandardEntitlement.USER_READ)
+                    ? authorizations.get(StandardEntitlement.USER_READ)
+                    : Collections.emptySet();
+            boolean authorized = authRealms.stream().
+                    anyMatch(realm -> user.getRealm().getFullPath().startsWith(realm));
             if (!authorized) {
-                authorized = !CollectionUtils.intersection(findDynRealms(user.getKey()), authRealms).isEmpty();
+                authorized = findDynRealms(user.getKey()).stream().
+                        filter(dynRealm -> authRealms.contains(dynRealm)).
+                        count() > 0;
             }
             if (authRealms.isEmpty() || !authorized) {
                 throw new DelegatedAdministrationException(
@@ -282,21 +274,17 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     private List<AccountPolicy> getAccountPolicies(final User user) {
         List<AccountPolicy> policies = new ArrayList<>();
 
-        // add resource policies        
-        for (ExternalResource resource : findAllResources(user)) {
-            AccountPolicy policy = resource.getAccountPolicy();
-            if (policy != null) {
-                policies.add(policy);
-            }
-        }
+        // add resource policies
+        findAllResources(user).stream().
+                map(resource -> resource.getAccountPolicy()).
+                filter(policy -> policy != null).
+                forEachOrdered(policy -> policies.add(policy));
 
         // add realm policies
-        for (Realm realm : realmDAO().findAncestors(user.getRealm())) {
-            AccountPolicy policy = realm.getAccountPolicy();
-            if (policy != null) {
-                policies.add(policy);
-            }
-        }
+        realmDAO().findAncestors(user.getRealm()).stream().
+                map(realm -> realm.getAccountPolicy()).
+                filter(policy -> policy != null).
+                forEachOrdered(policy -> policies.add(policy));
 
         return policies;
     }
@@ -316,7 +304,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
                     throw new PasswordPolicyException("Password mandatory");
                 }
 
-                for (PasswordRuleConf ruleConf : policy.getRuleConfs()) {
+                policy.getRuleConfs().forEach(ruleConf -> {
                     Class<? extends PasswordRule> ruleClass =
                             implementationLookup.getPasswordRuleClass(ruleConf.getClass());
                     if (ruleClass == null) {
@@ -337,7 +325,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
                         // enforce rule
                         rule.enforce(ruleConf, user);
                     }
-                }
+                });
 
                 if (user.verifyPasswordHistory(user.getClearPassword(), policy.getHistoryLength())) {
                     throw new PasswordPolicyException("Password value was used in the past: not allowed");
@@ -384,7 +372,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
             }
 
             for (AccountPolicy policy : getAccountPolicies(user)) {
-                for (AccountRuleConf ruleConf : policy.getRuleConfs()) {
+                policy.getRuleConfs().forEach(ruleConf -> {
                     Class<? extends AccountRule> ruleClass =
                             implementationLookup.getAccountRuleClass(ruleConf.getClass());
                     if (ruleClass == null) {
@@ -405,7 +393,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
                         // enforce rule
                         rule.enforce(ruleConf, user);
                     }
-                }
+                });
 
                 suspend |= user.getFailedLogins() != null && policy.getMaxAuthenticationAttempts() > 0
                         && user.getFailedLogins() > policy.getMaxAuthenticationAttempts() && !user.isSuspended();
@@ -467,85 +455,82 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
     public Collection<Role> findAllRoles(final User user) {
-        return CollectionUtils.union(user.getRoles(), findDynRoles(user.getKey()));
+        Set<Role> result = new HashSet<>();
+        result.addAll(user.getRoles());
+        result.addAll(findDynRoles(user.getKey()));
+
+        return result;
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
+    @SuppressWarnings("unchecked")
     public List<Role> findDynRoles(final String key) {
         Query query = entityManager().createNativeQuery(
                 "SELECT role_id FROM " + JPARoleDAO.DYNMEMB_TABLE + " WHERE any_id=?");
         query.setParameter(1, key);
 
         List<Role> result = new ArrayList<>();
-        for (Object resultKey : query.getResultList()) {
-            String actualKey = resultKey instanceof Object[]
-                    ? (String) ((Object[]) resultKey)[0]
-                    : ((String) resultKey);
-
-            Role role = roleDAO.find(actualKey);
-            if (role == null) {
-                LOG.error("Could not find role with id {}, even though returned by the native query", actualKey);
-            } else if (!result.contains(role)) {
-                result.add(role);
-            }
-        }
+        query.getResultList().stream().map(resultKey -> resultKey instanceof Object[]
+                ? (String) ((Object[]) resultKey)[0]
+                : ((String) resultKey)).
+                forEachOrdered(actualKey -> {
+                    Role role = roleDAO.find(actualKey.toString());
+                    if (role == null) {
+                        LOG.error("Could not find role with id {}, even though returned by the native query",
+                                actualKey);
+                    } else if (!result.contains(role)) {
+                        result.add(role);
+                    }
+                });
         return result;
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
+    @SuppressWarnings("unchecked")
     public List<Group> findDynGroups(final String key) {
         Query query = entityManager().createNativeQuery(
                 "SELECT group_id FROM " + JPAGroupDAO.UDYNMEMB_TABLE + " WHERE any_id=?");
         query.setParameter(1, key);
 
         List<Group> result = new ArrayList<>();
-        for (Object resultKey : query.getResultList()) {
-            String actualKey = resultKey instanceof Object[]
-                    ? (String) ((Object[]) resultKey)[0]
-                    : ((String) resultKey);
-
-            Group group = groupDAO().find(actualKey);
-            if (group == null) {
-                LOG.error("Could not find group with id {}, even though returned by the native query", actualKey);
-            } else if (!result.contains(group)) {
-                result.add(group);
-            }
-        }
+        query.getResultList().stream().map(resultKey -> resultKey instanceof Object[]
+                ? (String) ((Object[]) resultKey)[0]
+                : ((String) resultKey)).
+                forEachOrdered(actualKey -> {
+                    Group group = groupDAO().find(actualKey.toString());
+                    if (group == null) {
+                        LOG.error("Could not find group with id {}, even though returned by the native query",
+                                actualKey);
+                    } else if (!result.contains(group)) {
+                        result.add(group);
+                    }
+                });
         return result;
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
     public Collection<Group> findAllGroups(final User user) {
-        return CollectionUtils.union(
-                CollectionUtils.collect(user.getMemberships(), new Transformer<UMembership, Group>() {
+        Set<Group> result = new HashSet<>();
+        result.addAll(user.getMemberships().stream().
+                map(membership -> membership.getRightEnd()).collect(Collectors.toSet()));
+        result.addAll(findDynGroups(user.getKey()));
 
-                    @Override
-                    public Group transform(final UMembership input) {
-                        return input.getRightEnd();
-                    }
-                }, new ArrayList<Group>()),
-                findDynGroups(user.getKey()));
+        return result;
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
     public Collection<String> findAllGroupKeys(final User user) {
-        return CollectionUtils.collect(findAllGroups(user), EntityUtils.<Group>keyTransformer());
+        return findAllGroups(user).stream().map(Entity::getKey).collect(Collectors.toList());
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
     public Collection<String> findAllGroupNames(final User user) {
-        return CollectionUtils.collect(findAllGroups(user), new Transformer<Group, String>() {
-
-            @Override
-            public String transform(final Group input) {
-                return input.getName();
-            }
-        });
+        return findAllGroups(user).stream().map(Group::getName).collect(Collectors.toList());
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
@@ -553,9 +538,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     public Collection<ExternalResource> findAllResources(final User user) {
         Set<ExternalResource> result = new HashSet<>();
         result.addAll(user.getResources());
-        for (Group group : findAllGroups(user)) {
-            result.addAll(group.getResources());
-        }
+        findAllGroups(user).forEach(group -> result.addAll(group.getResources()));
 
         return result;
     }
@@ -563,7 +546,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO {
     @Transactional(readOnly = true)
     @Override
     public Collection<String> findAllResourceKeys(final String key) {
-        return CollectionUtils.collect(findAllResources(authFind(key)), EntityUtils.keyTransformer());
+        return findAllResources(authFind(key)).stream().map(resource -> resource.getKey()).collect(Collectors.toList());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
index a2a41fa..4fe46e6 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractGroupableRelatable.java
@@ -18,12 +18,10 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.GroupablePlainAttr;
 import org.apache.syncope.core.persistence.api.entity.Membership;
@@ -49,110 +47,68 @@ public abstract class AbstractGroupableRelatable<
     }
 
     @Override
-    public P getPlainAttr(final String plainSchemaName) {
-        return IterableUtils.find(internalGetPlainAttrs(), new Predicate<P>() {
-
-            @Override
-            public boolean evaluate(final P plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && plainAttr.getMembership() == null
-                        && plainSchemaName.equals(plainAttr.getSchema().getKey());
-            }
-        });
+    public Optional<? extends P> getPlainAttr(final String plainSchema) {
+        return internalGetPlainAttrs().stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null && plainAttr.getMembership() == null
+                && plainSchema.equals(plainAttr.getSchema().getKey())).findFirst();
     }
 
     @Override
-    public P getPlainAttr(final String plainSchemaName, final Membership<?> membership) {
-        return IterableUtils.find(internalGetPlainAttrs(), new Predicate<P>() {
-
-            @Override
-            public boolean evaluate(final P plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && plainAttr.getMembership() != null && plainAttr.getMembership().equals(membership)
-                        && plainSchemaName.equals(plainAttr.getSchema().getKey());
-            }
-        });
+    public Optional<? extends P> getPlainAttr(final String plainSchema, final Membership<?> membership) {
+        return internalGetPlainAttrs().stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null
+                && plainAttr.getMembership() != null && plainAttr.getMembership().equals(membership)
+                && plainSchema.equals(plainAttr.getSchema().getKey())).findFirst();
     }
 
     @Override
     public List<? extends P> getPlainAttrs() {
-        return CollectionUtils.select(internalGetPlainAttrs(), new Predicate<P>() {
-
-            @Override
-            public boolean evaluate(final P plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && plainAttr.getMembership() == null;
-            }
-        }, new ArrayList<P>());
+        return internalGetPlainAttrs().stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null && plainAttr.getMembership() == null).
+                collect(Collectors.toList());
     }
 
     @Override
-    public Collection<? extends P> getPlainAttrs(final String plainSchemaName) {
-        return CollectionUtils.select(internalGetPlainAttrs(), new Predicate<P>() {
-
-            @Override
-            public boolean evaluate(final P plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && plainSchemaName.equals(plainAttr.getSchema().getKey());
-            }
-        });
+    public Collection<? extends P> getPlainAttrs(final String plainSchema) {
+        return internalGetPlainAttrs().stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null
+                && plainSchema.equals(plainAttr.getSchema().getKey())).
+                collect(Collectors.toList());
     }
 
     @Override
     public Collection<? extends P> getPlainAttrs(final Membership<?> membership) {
-        return CollectionUtils.select(internalGetPlainAttrs(), new Predicate<P>() {
-
-            @Override
-            public boolean evaluate(final P plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && membership.equals(plainAttr.getMembership());
-            }
-        });
+        return internalGetPlainAttrs().stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null
+                && membership.equals(plainAttr.getMembership())).
+                collect(Collectors.toList());
     }
 
     @Override
-    public M getMembership(final String groupKey) {
-        return IterableUtils.find(getMemberships(), new Predicate<M>() {
-
-            @Override
-            public boolean evaluate(final M membership) {
-                return groupKey != null && groupKey.equals(membership.getRightEnd().getKey());
-            }
-        });
+    public Optional<? extends M> getMembership(final String groupKey) {
+        return getMemberships().stream().filter(membership
+                -> groupKey != null && groupKey.equals(membership.getRightEnd().getKey())).findFirst();
     }
 
     @Override
-    public REL getRelationship(final RelationshipType relationshipType, final String otherEndKey) {
-        return IterableUtils.find(getRelationships(), new Predicate<REL>() {
-
-            @Override
-            public boolean evaluate(final REL relationship) {
-                return otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey())
-                        && ((relationshipType == null && relationship.getType() == null)
-                        || (relationshipType != null && relationshipType.equals(relationship.getType())));
-            }
-        });
+    public Optional<? extends REL> getRelationship(final RelationshipType relationshipType, final String otherEndKey) {
+        return getRelationships().stream().filter(relationship
+                -> otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey())
+                && ((relationshipType == null && relationship.getType() == null)
+                || (relationshipType != null && relationshipType.equals(relationship.getType())))).findFirst();
     }
 
     @Override
     public Collection<? extends REL> getRelationships(final RelationshipType relationshipType) {
-        return CollectionUtils.select(getRelationships(), new Predicate<REL>() {
-
-            @Override
-            public boolean evaluate(final REL relationship) {
-                return relationshipType != null && relationshipType.equals(relationship.getType());
-            }
-        });
+        return getRelationships().stream().filter(relationship
+                -> relationshipType != null && relationshipType.equals(relationship.getType())).
+                collect(Collectors.toList());
     }
 
     @Override
     public Collection<? extends REL> getRelationships(final String otherEndKey) {
-        return CollectionUtils.select(getRelationships(), new Predicate<REL>() {
-
-            @Override
-            public boolean evaluate(final REL relationship) {
-                return otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey());
-            }
-        });
+        return getRelationships().stream().filter(relationship
+                -> otherEndKey != null && otherEndKey.equals(relationship.getRightEnd().getKey())).
+                collect(Collectors.toList());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
index cf210e8..0070fde 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/AbstractPlainAttr.java
@@ -18,17 +18,15 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.persistence.Column;
 import javax.persistence.EntityListeners;
 import javax.persistence.FetchType;
 import javax.persistence.ManyToOne;
 import javax.persistence.MappedSuperclass;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.PlainAttr;
@@ -104,13 +102,7 @@ public abstract class AbstractPlainAttr<O extends Any<?>> extends AbstractGenera
     public List<String> getValuesAsStrings() {
         List<String> result;
         if (getUniqueValue() == null) {
-            result = CollectionUtils.collect(getValues(), new Transformer<PlainAttrValue, String>() {
-
-                @Override
-                public String transform(final PlainAttrValue input) {
-                    return input.getValueAsString();
-                }
-            }, new ArrayList<String>());
+            result = getValues().stream().map(value -> value.getValueAsString()).collect(Collectors.toList());
         } else {
             result = Collections.singletonList(getUniqueValue().getValueAsString());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
index fb5b88e..8feb82d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAConnInstance.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -37,7 +38,6 @@ import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
@@ -185,7 +185,7 @@ public class JPAConnInstance extends AbstractGeneratedKeyEntity implements ConnI
     public Set<ConnConfProperty> getConf() {
         Set<ConnConfProperty> configuration = new HashSet<>();
         if (!StringUtils.isBlank(jsonConf)) {
-            CollectionUtils.addAll(configuration, POJOHelper.deserialize(jsonConf, ConnConfProperty[].class));
+            configuration.addAll(Arrays.asList(POJOHelper.deserialize(jsonConf, ConnConfProperty[].class)));
         }
 
         return configuration;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
index 0c2d9f8..bd9a148 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPANotification.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.CollectionTable;
@@ -36,8 +37,6 @@ import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.entity.AnyAbout;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
@@ -153,14 +152,8 @@ public class JPANotification extends AbstractGeneratedKeyEntity implements Notif
     }
 
     @Override
-    public AnyAbout getAbout(final AnyType anyType) {
-        return IterableUtils.find(abouts, new Predicate<AnyAbout>() {
-
-            @Override
-            public boolean evaluate(final AnyAbout about) {
-                return anyType != null && anyType.equals(about.getAnyType());
-            }
-        });
+    public Optional<? extends AnyAbout> getAbout(final AnyType anyType) {
+        return abouts.stream().filter(about -> anyType != null && anyType.equals(about.getAnyType())).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
index 5bcb6fe..e919910 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPARealm.java
@@ -21,7 +21,9 @@ package org.apache.syncope.core.persistence.jpa.entity;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.CollectionTable;
@@ -37,12 +39,8 @@ import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.UniqueConstraint;
 import javax.validation.constraints.Size;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.core.persistence.api.entity.AnyTemplate;
 import org.apache.syncope.core.persistence.api.entity.AnyTemplateRealm;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
@@ -53,7 +51,6 @@ import org.apache.syncope.core.persistence.jpa.entity.policy.JPAAccountPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.policy.JPAPasswordPolicy;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
 import org.apache.syncope.core.persistence.jpa.validation.entity.RealmCheck;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 
 @Entity
 @Table(name = JPARealm.TABLE, uniqueConstraints =
@@ -157,14 +154,10 @@ public class JPARealm extends AbstractGeneratedKeyEntity implements Realm {
     }
 
     @Override
-    public AnyTemplateRealm getTemplate(final AnyType anyType) {
-        return IterableUtils.find(templates, new Predicate<AnyTemplate>() {
-
-            @Override
-            public boolean evaluate(final AnyTemplate template) {
-                return anyType != null && anyType.equals(template.getAnyType());
-            }
-        });
+    public Optional<? extends AnyTemplateRealm> getTemplate(final AnyType anyType) {
+        return templates.stream().
+                filter(template -> anyType != null && anyType.equals(template.getAnyType())).
+                findFirst();
     }
 
     @Override
@@ -180,8 +173,7 @@ public class JPARealm extends AbstractGeneratedKeyEntity implements Realm {
 
     @Override
     public List<String> getResourceKeys() {
-        return CollectionUtils.collect(
-                getResources(), EntityUtils.<ExternalResource>keyTransformer(), new ArrayList<String>());
+        return getResources().stream().map(resource -> resource.getKey()).collect(Collectors.toList());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
index 73606cc..a048ef4 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPAReport.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
@@ -32,8 +33,6 @@ import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.report.ReportletConf;
 import org.apache.syncope.core.persistence.api.entity.Report;
 import org.apache.syncope.core.persistence.api.entity.ReportExec;
@@ -111,13 +110,7 @@ public class JPAReport extends AbstractGeneratedKeyEntity implements Report {
 
     @Override
     public List<ReportletConf> getReportletConfs() {
-        return CollectionUtils.collect(reportletConfs, new Transformer<JPAReportletConfInstance, ReportletConf>() {
-
-            @Override
-            public ReportletConf transform(final JPAReportletConfInstance input) {
-                return input.getInstance();
-            }
-        }, new ArrayList<ReportletConf>());
+        return reportletConfs.stream().map(input -> input.getInstance()).collect(Collectors.toList());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
index d592394..b84330b 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/conf/JPAConf.java
@@ -22,14 +22,13 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.Valid;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 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.Realm;
@@ -64,15 +63,10 @@ public class JPAConf extends AbstractProvidedKeyEntity implements Conf {
     }
 
     @Override
-    public CPlainAttr getPlainAttr(final String plainSchemaName) {
-        return IterableUtils.find(plainAttrs, new Predicate<CPlainAttr>() {
-
-            @Override
-            public boolean evaluate(final CPlainAttr plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && plainSchemaName.equals(plainAttr.getSchema().getKey());
-            }
-        });
+    public Optional<? extends CPlainAttr> getPlainAttr(final String plainSchema) {
+        return plainAttrs.stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null
+                && plainSchema.equals(plainAttr.getSchema().getKey())).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
index fc4fc13..2bddf1c 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/group/JPAGroup.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity.group;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.Column;
@@ -34,8 +35,6 @@ import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.Valid;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
@@ -169,15 +168,10 @@ public class JPAGroup extends AbstractAny<GPlainAttr> implements Group {
     }
 
     @Override
-    public GPlainAttr getPlainAttr(final String plainSchemaName) {
-        return IterableUtils.find(getPlainAttrs(), new Predicate<GPlainAttr>() {
-
-            @Override
-            public boolean evaluate(final GPlainAttr plainAttr) {
-                return plainAttr != null && plainAttr.getSchema() != null
-                        && plainSchemaName.equals(plainAttr.getSchema().getKey());
-            }
-        });
+    public Optional<? extends GPlainAttr> getPlainAttr(final String plainSchema) {
+        return getPlainAttrs().stream().filter(plainAttr
+                -> plainAttr != null && plainAttr.getSchema() != null
+                && plainSchema.equals(plainAttr.getSchema().getKey())).findFirst();
     }
 
     @Override
@@ -214,14 +208,9 @@ public class JPAGroup extends AbstractAny<GPlainAttr> implements Group {
     }
 
     @Override
-    public ADynGroupMembership getADynMembership(final AnyType anyType) {
-        return IterableUtils.find(aDynMemberships, new Predicate<ADynGroupMembership>() {
-
-            @Override
-            public boolean evaluate(final ADynGroupMembership dynGroupMembership) {
-                return anyType != null && anyType.equals(dynGroupMembership.getAnyType());
-            }
-        });
+    public Optional<? extends ADynGroupMembership> getADynMembership(final AnyType anyType) {
+        return aDynMemberships.stream().filter(dynGroupMembership
+                -> anyType != null && anyType.equals(dynGroupMembership.getAnyType())).findFirst();
     }
 
     @Override
@@ -236,14 +225,9 @@ public class JPAGroup extends AbstractAny<GPlainAttr> implements Group {
     }
 
     @Override
-    public TypeExtension getTypeExtension(final AnyType anyType) {
-        return IterableUtils.find(typeExtensions, new Predicate<TypeExtension>() {
-
-            @Override
-            public boolean evaluate(final TypeExtension typeExtension) {
-                return typeExtension.getAnyType().equals(anyType);
-            }
-        });
+    public Optional<? extends TypeExtension> getTypeExtension(final AnyType anyType) {
+        return typeExtensions.stream().filter(typeExtension
+                -> typeExtension.getAnyType().equals(anyType)).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
index ef0aeb7..200716d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAAccountPolicy.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
@@ -33,10 +34,7 @@ import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.policy.AccountRuleConf;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.jpa.entity.resource.JPAExternalResource;
@@ -109,13 +107,7 @@ public class JPAAccountPolicy extends AbstractPolicy implements AccountPolicy {
 
     @Override
     public List<AccountRuleConf> getRuleConfs() {
-        return CollectionUtils.collect(ruleConfs, new Transformer<JPAAccountRuleConfInstance, AccountRuleConf>() {
-
-            @Override
-            public AccountRuleConf transform(final JPAAccountRuleConfInstance input) {
-                return input.getInstance();
-            }
-        }, new ArrayList<AccountRuleConf>());
+        return ruleConfs.stream().map(input -> input.getInstance()).collect(Collectors.toList());
     }
 
     @Override
@@ -130,8 +122,7 @@ public class JPAAccountPolicy extends AbstractPolicy implements AccountPolicy {
     }
 
     @Override
-    public Set<String> getResourceNames() {
-        return CollectionUtils.collect(
-                getResources(), EntityUtils.<ExternalResource>keyTransformer(), new HashSet<String>());
+    public Set<String> getResourceKeys() {
+        return getResources().stream().map(resource -> resource.getKey()).collect(Collectors.toSet());
     }
 }