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:07 UTC

[03/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/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
----------------------------------------------------------------------
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
index 63e1cf1..3a5ee7b 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthDataAccessor.java
@@ -25,11 +25,10 @@ import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.SetUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
@@ -52,16 +51,13 @@ import org.apache.syncope.core.persistence.api.dao.search.SearchCond;
 import org.apache.syncope.core.persistence.api.entity.AccessToken;
 import org.apache.syncope.core.persistence.api.entity.Domain;
 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.conf.CPlainAttr;
-import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.provisioning.api.AuditManager;
 import org.apache.syncope.core.provisioning.api.ConnectorFactory;
 import org.apache.syncope.core.provisioning.api.EntitlementsHolder;
 import org.apache.syncope.core.provisioning.api.MappingManager;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.identityconnectors.framework.common.objects.Uid;
 import org.slf4j.Logger;
@@ -144,11 +140,12 @@ public class AuthDataAccessor {
             if (jwtSSOProviders == null) {
                 jwtSSOProviders = new HashMap<>();
 
-                for (Class<?> clazz : implementationLookup.getJWTSSOProviderClasses()) {
-                    JWTSSOProvider jwtSSOProvider = (JWTSSOProvider) ApplicationContextProvider.getBeanFactory().
-                            createBean(clazz, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true);
-                    jwtSSOProviders.put(jwtSSOProvider.getIssuer(), jwtSSOProvider);
-                }
+                implementationLookup.getJWTSSOProviderClasses().stream().
+                        map((clazz) -> (JWTSSOProvider) ApplicationContextProvider.getBeanFactory().
+                        createBean(clazz, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true)).
+                        forEachOrdered(jwtSSOProvider -> {
+                            jwtSSOProviders.put(jwtSSOProvider.getIssuer(), jwtSSOProvider);
+                        });
             }
         }
 
@@ -184,10 +181,10 @@ public class AuthDataAccessor {
     public Pair<User, Boolean> authenticate(final Authentication authentication) {
         User user = null;
 
-        CPlainAttr authAttrs = confDAO.find("authentication.attributes");
-        List<String> authAttrValues = authAttrs == null
-                ? Collections.singletonList("username")
-                : authAttrs.getValuesAsStrings();
+        Optional<? extends CPlainAttr> authAttrs = confDAO.find("authentication.attributes");
+        List<String> authAttrValues = authAttrs.isPresent()
+                ? authAttrs.get().getValuesAsStrings()
+                : Collections.singletonList("username");
         for (int i = 0; user == null && i < authAttrValues.size(); i++) {
             if ("username".equals(authAttrValues.get(i))) {
                 user = userDAO.findByUsername(authentication.getName());
@@ -213,8 +210,8 @@ public class AuthDataAccessor {
                 throw new DisabledException("User " + user.getUsername() + " is suspended");
             }
 
-            CPlainAttr authStatuses = confDAO.find("authentication.statuses");
-            if (authStatuses != null && !authStatuses.getValuesAsStrings().contains(user.getStatus())) {
+            Optional<? extends CPlainAttr> authStatuses = confDAO.find("authentication.statuses");
+            if (authStatuses.isPresent() && !authStatuses.get().getValuesAsStrings().contains(user.getStatus())) {
                 throw new DisabledException("User " + user.getUsername() + " not allowed to authenticate");
             }
 
@@ -255,7 +252,7 @@ public class AuthDataAccessor {
             String connObjectKey = null;
             try {
                 connObjectKey = mappingManager.getConnObjectKeyValue(
-                        user, resource.getProvision(anyTypeDAO.findUser()));
+                        user, resource.getProvision(anyTypeDAO.findUser()).get()).get();
                 Uid uid = connFactory.getConnector(resource).authenticate(connObjectKey, password, null);
                 if (uid != null) {
                     authenticated = true;
@@ -295,18 +292,13 @@ public class AuthDataAccessor {
             }
         }
 
-        return SetUtils.emptyIfNull(result);
+        return result == null ? Collections.emptySet() : result;
     }
 
     protected Set<SyncopeGrantedAuthority> getAdminAuthorities() {
-        return CollectionUtils.collect(EntitlementsHolder.getInstance().getValues(),
-                new Transformer<String, SyncopeGrantedAuthority>() {
-
-            @Override
-            public SyncopeGrantedAuthority transform(final String entitlement) {
-                return new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM);
-            }
-        }, new HashSet<SyncopeGrantedAuthority>());
+        return EntitlementsHolder.getInstance().getValues().stream().
+                map(entitlement -> new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM)).
+                collect(Collectors.toSet());
     }
 
     protected Set<SyncopeGrantedAuthority> getUserAuthorities(final User user) {
@@ -319,30 +311,23 @@ public class AuthDataAccessor {
 
             // Give entitlements as assigned by roles (with static or dynamic realms, where applicable) - assigned
             // either statically and dynamically
-            for (Role role : userDAO.findAllRoles(user)) {
-                for (String entitlement : role.getEntitlements()) {
+            userDAO.findAllRoles(user).forEach(role -> {
+                role.getEntitlements().forEach(entitlement -> {
                     Set<String> realms = entForRealms.get(entitlement);
                     if (realms == null) {
                         realms = new HashSet<>();
                         entForRealms.put(entitlement, realms);
                     }
-
-                    CollectionUtils.collect(role.getRealms(), new Transformer<Realm, String>() {
-
-                        @Override
-                        public String transform(final Realm realm) {
-                            return realm.getFullPath();
-                        }
-                    }, realms);
-
+                    realms.addAll(role.getRealms().stream().
+                            map(realm -> realm.getFullPath()).collect(Collectors.toSet()));
                     if (!entitlement.endsWith("_CREATE") && !entitlement.endsWith("_DELETE")) {
-                        CollectionUtils.collect(role.getDynRealms(), EntityUtils.keyTransformer(), realms);
+                        realms.addAll(role.getDynRealms().stream().map(r -> r.getKey()).collect(Collectors.toList()));
                     }
-                }
-            }
+                });
+            });
 
             // Give group entitlements for owned groups
-            for (Group group : groupDAO.findOwnedByUser(user.getKey())) {
+            groupDAO.findOwnedByUser(user.getKey()).forEach((group) -> {
                 for (String entitlement : GROUP_OWNER_ENTITLEMENTS) {
                     Set<String> realms = entForRealms.get(entitlement);
                     if (realms == null) {
@@ -352,14 +337,14 @@ public class AuthDataAccessor {
 
                     realms.add(RealmUtils.getGroupOwnerRealm(group.getRealm().getFullPath(), group.getKey()));
                 }
-            }
+            });
 
             // Finally normalize realms for each given entitlement and generate authorities
-            for (Map.Entry<String, Set<String>> entry : entForRealms.entrySet()) {
+            entForRealms.entrySet().stream().map(entry -> {
                 SyncopeGrantedAuthority authority = new SyncopeGrantedAuthority(entry.getKey());
                 authority.addRealms(RealmUtils.normalize(entry.getValue()));
-                authorities.add(authority);
-            }
+                return authority;
+            }).forEachOrdered(authority -> authorities.add(authority));
         }
 
         return authorities;
@@ -410,7 +395,7 @@ public class AuthDataAccessor {
 
             User user = resolved.getLeft();
             username = user.getUsername();
-            authorities = SetUtils.emptyIfNull(resolved.getRight());
+            authorities = resolved.getRight() == null ? Collections.emptySet() : resolved.getRight();
             LOG.debug("JWT {} issued by {} resolved to User {} with authorities {}",
                     authentication.getClaims().getTokenId(),
                     authentication.getClaims().getIssuer(),
@@ -420,8 +405,8 @@ public class AuthDataAccessor {
                 throw new DisabledException("User " + username + " is suspended");
             }
 
-            CPlainAttr authStatuses = confDAO.find("authentication.statuses");
-            if (authStatuses != null && !authStatuses.getValuesAsStrings().contains(user.getStatus())) {
+            Optional<? extends CPlainAttr> authStatuses = confDAO.find("authentication.statuses");
+            if (authStatuses.isPresent() && !authStatuses.get().getValuesAsStrings().contains(user.getStatus())) {
                 throw new DisabledException("User " + username + " not allowed to authenticate");
             }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/spring/src/main/java/org/apache/syncope/core/spring/security/MustChangePasswordFilter.java
----------------------------------------------------------------------
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/MustChangePasswordFilter.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/MustChangePasswordFilter.java
index f9939dd..c901c0b 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/MustChangePasswordFilter.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/MustChangePasswordFilter.java
@@ -25,12 +25,9 @@ import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper;
 
@@ -55,15 +52,9 @@ public class MustChangePasswordFilter implements Filter {
             throws IOException, ServletException {
 
         if (request instanceof SecurityContextHolderAwareRequestWrapper) {
-            boolean isMustChangePassword = IterableUtils.matchesAny(
-                    SecurityContextHolder.getContext().getAuthentication().getAuthorities(),
-                    new Predicate<GrantedAuthority>() {
-
-                @Override
-                public boolean evaluate(final GrantedAuthority authority) {
-                    return StandardEntitlement.MUST_CHANGE_PASSWORD.equals(authority.getAuthority());
-                }
-            });
+            boolean isMustChangePassword =
+                    SecurityContextHolder.getContext().getAuthentication().getAuthorities().stream().anyMatch(
+                            authority -> StandardEntitlement.MUST_CHANGE_PASSWORD.equals(authority.getAuthority()));
 
             SecurityContextHolderAwareRequestWrapper wrapper =
                     SecurityContextHolderAwareRequestWrapper.class.cast(request);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SyncopeGrantedAuthority.java
----------------------------------------------------------------------
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SyncopeGrantedAuthority.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/SyncopeGrantedAuthority.java
index 578dd35..bca6990 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/SyncopeGrantedAuthority.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/SyncopeGrantedAuthority.java
@@ -23,11 +23,8 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.Set;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.SetUtils;
+import java.util.TreeSet;
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.commons.lang3.builder.HashCodeBuilder;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
@@ -42,7 +39,7 @@ public class SyncopeGrantedAuthority implements GrantedAuthority {
     @JsonProperty
     private final String entitlement;
 
-    private final Set<String> realms = SetUtils.orderedSet(new HashSet<String>());
+    private final Set<String> realms = new TreeSet<>();
 
     @JsonCreator
     public SyncopeGrantedAuthority(@JsonProperty("entitlement") final String entitlement) {
@@ -59,13 +56,7 @@ public class SyncopeGrantedAuthority implements GrantedAuthority {
     }
 
     public void addRealms(final Collection<String> newRealms) {
-        IterableUtils.forEach(newRealms, new Closure<String>() {
-
-            @Override
-            public void execute(final String newRealm) {
-                addRealm(newRealm);
-            }
-        });
+        newRealms.forEach(newRealm -> addRealm(newRealm));
     }
 
     public Set<String> getRealms() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/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 ad8229e..bf5a18f 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
@@ -31,6 +31,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
 import org.activiti.bpmn.converter.BpmnXMLConverter;
 import org.activiti.bpmn.model.BpmnModel;
@@ -41,7 +42,6 @@ import org.activiti.engine.form.FormProperty;
 import org.activiti.engine.form.FormType;
 import org.activiti.engine.form.TaskFormData;
 import org.activiti.engine.history.HistoricActivityInstance;
-import org.activiti.engine.history.HistoricDetail;
 import org.activiti.engine.history.HistoricTaskInstance;
 import org.activiti.engine.impl.persistence.entity.HistoricFormPropertyEntity;
 import org.activiti.engine.query.Query;
@@ -50,8 +50,6 @@ import org.activiti.engine.repository.Model;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -182,11 +180,9 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
     protected Set<String> getPerformedTasks(final User user) {
         final Set<String> result = new HashSet<>();
 
-        for (HistoricActivityInstance task : engine.getHistoryService().createHistoricActivityInstanceQuery().
-                executionId(user.getWorkflowId()).list()) {
-
-            result.add(task.getActivityId());
-        }
+        engine.getHistoryService().createHistoricActivityInstanceQuery().
+                executionId(user.getWorkflowId()).list().
+                forEach(task -> result.add(task.getActivityId()));
 
         return result;
     }
@@ -263,8 +259,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         Set<String> tasks = getPerformedTasks(user);
 
-        return new WorkflowResult<Pair<String, Boolean>>(
-                new ImmutablePair<>(user.getKey(), propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(new ImmutablePair<>(user.getKey(), propagateEnable), propByRes, tasks);
     }
 
     protected Set<String> doExecuteTask(final User user, final String task, final Map<String, Object> moreVariables) {
@@ -333,8 +328,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                new ImmutablePair<>(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(new ImmutablePair<>(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override
@@ -403,8 +397,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         Boolean propagateEnable = engine.getRuntimeService().getVariable(
                 user.getWorkflowId(), PROPAGATE_ENABLE, Boolean.class);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                new ImmutablePair<>(updatedPatch, propagateEnable), propByRes, tasks);
+        return new WorkflowResult<>(new ImmutablePair<>(updatedPatch, propagateEnable), propByRes, tasks);
     }
 
     @Override
@@ -483,13 +476,9 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
     protected WorkflowFormTO getFormTO(final HistoricTaskInstance task) {
         final List<HistoricFormPropertyEntity> props = new ArrayList<>();
 
-        for (HistoricDetail historicDetail
-                : engine.getHistoryService().createHistoricDetailQuery().taskId(task.getId()).list()) {
-
-            if (historicDetail instanceof HistoricFormPropertyEntity) {
-                props.add((HistoricFormPropertyEntity) historicDetail);
-            }
-        }
+        engine.getHistoryService().createHistoricDetailQuery().taskId(task.getId()).list().stream().
+                filter(historicDetail -> (historicDetail instanceof HistoricFormPropertyEntity)).
+                forEachOrdered(historicDetail -> props.add((HistoricFormPropertyEntity) historicDetail));
 
         WorkflowFormTO formTO = getHistoricFormTO(
                 task.getProcessInstanceId(), task.getId(), task.getFormKey(), props);
@@ -527,13 +516,13 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         formTO.setUserTO(engine.getRuntimeService().getVariable(processInstanceId, USER_TO, UserTO.class));
         formTO.setUserPatch(engine.getRuntimeService().getVariable(processInstanceId, USER_PATCH, UserPatch.class));
 
-        for (HistoricFormPropertyEntity prop : props) {
+        props.stream().map(prop -> {
             WorkflowFormPropertyTO propertyTO = new WorkflowFormPropertyTO();
             propertyTO.setId(prop.getPropertyId());
             propertyTO.setName(prop.getPropertyId());
             propertyTO.setValue(prop.getPropertyValue());
-            formTO.getProperties().add(propertyTO);
-        }
+            return propertyTO;
+        }).forEachOrdered(propertyTO -> formTO.getProperties().add(propertyTO));
 
         return formTO;
     }
@@ -559,20 +548,18 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         formTO.setUserTO(engine.getRuntimeService().getVariable(processInstanceId, USER_TO, UserTO.class));
         formTO.setUserPatch(engine.getRuntimeService().getVariable(processInstanceId, USER_PATCH, UserPatch.class));
 
-        for (FormProperty fProp : properties) {
+        properties.stream().map(fProp -> {
             WorkflowFormPropertyTO propertyTO = new WorkflowFormPropertyTO();
             BeanUtils.copyProperties(fProp, propertyTO, PROPERTY_IGNORE_PROPS);
             propertyTO.setType(fromActivitiFormType(fProp.getType()));
-
             if (propertyTO.getType() == WorkflowFormPropertyType.Date) {
                 propertyTO.setDatePattern((String) fProp.getType().getInformation("datePattern"));
             }
             if (propertyTO.getType() == WorkflowFormPropertyType.Enum) {
                 propertyTO.getEnumValues().putAll((Map<String, String>) fProp.getType().getInformation("values"));
             }
-
-            formTO.getProperties().add(propertyTO);
-        }
+            return propertyTO;
+        }).forEachOrdered(propertyTO -> formTO.getProperties().add(propertyTO));
 
         return formTO;
     }
@@ -597,9 +584,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
                     taskCandidateOrAssigned(user.getKey())));
 
             List<String> candidateGroups = new ArrayList<>();
-            for (String groupName : userDAO.findAllGroupNames(user)) {
-                candidateGroups.add(groupName);
-            }
+            userDAO.findAllGroupNames(user).forEach(groupName -> candidateGroups.add(groupName));
             if (!candidateGroups.isEmpty()) {
                 forms.addAll(getForms(engine.getTaskService().createTaskQuery().
                         taskVariableValueEquals(TASK_IS_FORM, Boolean.TRUE).
@@ -613,7 +598,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
     protected <T extends Query<?, ?>, U extends Object> List<WorkflowFormTO> getForms(final Query<T, U> query) {
         List<WorkflowFormTO> forms = new ArrayList<>();
 
-        for (U obj : query.list()) {
+        query.list().forEach(obj -> {
             try {
                 if (obj instanceof HistoricTaskInstance) {
                     forms.add(getFormTO((HistoricTaskInstance) obj));
@@ -626,7 +611,7 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
             } catch (ActivitiException e) {
                 LOG.debug("No form found for task {}", obj, e);
             }
-        }
+        });
 
         return forms;
     }
@@ -711,11 +696,9 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
     private Map<String, String> getPropertiesForSubmit(final WorkflowFormTO form) {
         Map<String, String> props = new HashMap<>();
-        for (WorkflowFormPropertyTO prop : form.getProperties()) {
-            if (prop.isWritable()) {
-                props.put(prop.getId(), prop.getValue());
-            }
-        }
+        form.getProperties().stream().
+                filter(prop -> (prop.isWritable())).
+                forEachOrdered(prop -> props.put(prop.getId(), prop.getValue()));
 
         return Collections.unmodifiableMap(props);
     }
@@ -794,27 +777,22 @@ public class ActivitiUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
     @Override
     public List<WorkflowDefinitionTO> getDefinitions() {
         try {
-            return CollectionUtils.collect(
-                    engine.getRepositoryService().createProcessDefinitionQuery().latestVersion().list(),
-                    new Transformer<ProcessDefinition, WorkflowDefinitionTO>() {
-
-                @Override
-                public WorkflowDefinitionTO transform(final ProcessDefinition procDef) {
-                    WorkflowDefinitionTO defTO = new WorkflowDefinitionTO();
-                    defTO.setKey(procDef.getKey());
-                    defTO.setName(procDef.getName());
-
-                    try {
-                        defTO.setModelId(getModel(procDef).getId());
-                    } catch (NotFoundException e) {
-                        LOG.warn("No model found for definition {}, ignoring", procDef.getDeploymentId(), e);
-                    }
-
-                    defTO.setMain(WF_PROCESS_ID.equals(procDef.getKey()));
-
-                    return defTO;
-                }
-            }, new ArrayList<WorkflowDefinitionTO>());
+            return engine.getRepositoryService().createProcessDefinitionQuery().latestVersion().list().stream().
+                    map(procDef -> {
+                        WorkflowDefinitionTO defTO = new WorkflowDefinitionTO();
+                        defTO.setKey(procDef.getKey());
+                        defTO.setName(procDef.getName());
+
+                        try {
+                            defTO.setModelId(getModel(procDef).getId());
+                        } catch (NotFoundException e) {
+                            LOG.warn("No model found for definition {}, ignoring", procDef.getDeploymentId(), e);
+                        }
+
+                        defTO.setMain(WF_PROCESS_ID.equals(procDef.getKey()));
+
+                        return defTO;
+                    }).collect(Collectors.toList());
         } catch (ActivitiException e) {
             throw new WorkflowException("While listing available process definitions", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUtils.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUtils.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUtils.java
index a259bc8..31eb7bc 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUtils.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/ActivitiUtils.java
@@ -18,9 +18,6 @@
  */
 package org.apache.syncope.core.workflow.activiti;
 
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -28,12 +25,7 @@ public class ActivitiUtils {
 
     @Transactional(readOnly = true)
     public boolean isUserIngroup(final User user, final String groupName) {
-        return IterableUtils.matchesAny(user.getMemberships(), new Predicate<UMembership>() {
-
-            @Override
-            public boolean evaluate(final UMembership membership) {
-                return groupName != null && groupName.equals(membership.getRightEnd().getName());
-            }
-        });
+        return user.getMemberships().stream().
+                anyMatch(membership -> groupName != null && groupName.equals(membership.getRightEnd().getName()));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
index 992e3d1..500ef84 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeGroupQueryImpl.java
@@ -21,12 +21,11 @@ package org.apache.syncope.core.workflow.activiti;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 import org.activiti.engine.ActivitiException;
 import org.activiti.engine.identity.Group;
 import org.activiti.engine.identity.GroupQuery;
 import org.activiti.engine.impl.persistence.entity.GroupEntity;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.core.persistence.api.dao.AnyDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 
@@ -114,14 +113,8 @@ public class SyncopeGroupQueryImpl implements GroupQuery {
         if (result == null) {
             result = new ArrayList<>();
             for (int page = 1; page <= (groupDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                CollectionUtils.collect(groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE),
-                        new Transformer<org.apache.syncope.core.persistence.api.entity.group.Group, Group>() {
-
-                    @Override
-                    public Group transform(final org.apache.syncope.core.persistence.api.entity.group.Group group) {
-                        return fromSyncopeGroup(group);
-                    }
-                }, result);
+                result.addAll(groupDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE).stream().
+                        map(group -> fromSyncopeGroup(group)).collect(Collectors.toList()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
----------------------------------------------------------------------
diff --git a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
index b7fa2e9..cb9e541 100644
--- a/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
+++ b/core/workflow-activiti/src/main/java/org/apache/syncope/core/workflow/activiti/SyncopeUserQueryImpl.java
@@ -21,12 +21,11 @@ package org.apache.syncope.core.workflow.activiti;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 import org.activiti.engine.ActivitiException;
 import org.activiti.engine.identity.User;
 import org.activiti.engine.identity.UserQuery;
 import org.activiti.engine.impl.persistence.entity.UserEntity;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.core.persistence.api.dao.AnyDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
@@ -147,26 +146,19 @@ public class SyncopeUserQueryImpl implements UserQuery {
             } else {
                 result = new ArrayList<>();
                 List<UMembership> memberships = groupDAO.findUMemberships(group);
-                for (UMembership membership : memberships) {
-                    User user = fromSyncopeUser(membership.getLeftEnd());
-                    if (!result.contains(user)) {
-                        result.add(user);
-                    }
-                }
+                memberships.stream().map(membership -> fromSyncopeUser(membership.getLeftEnd())).
+                        filter((user) -> (!result.contains(user))).
+                        forEachOrdered((user) -> {
+                            result.add(user);
+                        });
             }
         }
         // THIS CAN BE *VERY* DANGEROUS
         if (result == null) {
             result = new ArrayList<>();
             for (int page = 1; page <= (userDAO.count() / AnyDAO.DEFAULT_PAGE_SIZE) + 1; page++) {
-                CollectionUtils.collect(userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE),
-                        new Transformer<org.apache.syncope.core.persistence.api.entity.user.User, User>() {
-
-                    @Override
-                    public User transform(final org.apache.syncope.core.persistence.api.entity.user.User user) {
-                        return fromSyncopeUser(user);
-                    }
-                }, result);
+                result.addAll(userDAO.findAll(page, AnyDAO.DEFAULT_PAGE_SIZE).stream().
+                        map(user -> fromSyncopeUser(user)).collect(Collectors.toList()));
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/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 f4d8a81..c027431 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
@@ -79,8 +79,7 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
         PropagationByResource propByRes = new PropagationByResource();
         propByRes.set(ResourceOperation.CREATE, userDAO.findAllResourceKeys(user.getKey()));
 
-        return new WorkflowResult<Pair<String, Boolean>>(
-                new ImmutablePair<>(user.getKey(), propagateEnable), propByRes, "create");
+        return new WorkflowResult<>(new ImmutablePair<>(user.getKey(), propagateEnable), propByRes, "create");
     }
 
     @Override
@@ -102,8 +101,7 @@ public class DefaultUserWorkflowAdapter extends AbstractUserWorkflowAdapter {
 
         userDAO.save(user);
 
-        return new WorkflowResult<Pair<UserPatch, Boolean>>(
-                new ImmutablePair<>(userPatch, !user.isSuspended()), propByRes, "update");
+        return new WorkflowResult<>(new ImmutablePair<>(userPatch, !user.isSuspended()), propByRes, "update");
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelRouteLogic.java
----------------------------------------------------------------------
diff --git a/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelRouteLogic.java b/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelRouteLogic.java
index 2856daf..c691a6c 100644
--- a/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelRouteLogic.java
+++ b/ext/camel/logic/src/main/java/org/apache/syncope/core/logic/CamelRouteLogic.java
@@ -27,7 +27,6 @@ import java.util.Comparator;
 import java.util.List;
 import org.apache.camel.component.metrics.routepolicy.MetricsRegistryService;
 import java.util.Map;
-import org.apache.commons.collections4.ComparatorUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.CamelMetrics;
@@ -122,14 +121,9 @@ public class CamelRouteLogic extends AbstractTransactionalLogic<CamelRouteTO> {
                 metrics.getResponseMeanRates().add(meanRate);
             }
 
-            Collections.sort(metrics.getResponseMeanRates(), new Comparator<CamelMetrics.MeanRate>() {
-
-                @Override
-                public int compare(final CamelMetrics.MeanRate o1, final CamelMetrics.MeanRate o2) {
-                    return ComparatorUtils.reversedComparator(ComparatorUtils.<Double>naturalComparator()).
-                            compare(o1.getValue(), o2.getValue());
-                }
-            });
+            Collections.sort(metrics.getResponseMeanRates(),
+                    (o1, o2) -> Collections.reverseOrder(Comparator.<Double>naturalOrder()).
+                            compare(o1.getValue(), o2.getValue()));
         }
 
         return metrics;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/SyncopeCamelContext.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/SyncopeCamelContext.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/SyncopeCamelContext.java
index ca09718..222f547 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/SyncopeCamelContext.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/SyncopeCamelContext.java
@@ -24,14 +24,13 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.xml.bind.JAXBContext;
 import javax.xml.bind.Unmarshaller;
 import org.apache.camel.component.metrics.routepolicy.MetricsRoutePolicyFactory;
 import org.apache.camel.model.Constants;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.spring.SpringCamelContext;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.io.IOUtils;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.CamelRouteDAO;
@@ -71,13 +70,7 @@ public class SyncopeCamelContext {
         if (camelContext.getRouteDefinitions().isEmpty()) {
             List<CamelRoute> routes = routeDAO.findAll();
             LOG.debug("{} route(s) are going to be loaded ", routes.size());
-            loadContext(CollectionUtils.collect(routes, new Transformer<CamelRoute, String>() {
-
-                @Override
-                public String transform(final CamelRoute input) {
-                    return input.getContent();
-                }
-            }));
+            loadContext(routes.stream().map(input -> input.getContent()).collect(Collectors.toList()));
             try {
                 camelContext.start();
             } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
index 612844b..6782330 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/CreateProducer.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.provisioning.camel.producer;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 
 import org.apache.camel.Endpoint;
@@ -72,9 +73,9 @@ public class CreateProducer extends AbstractProducer {
 
                 if (actual instanceof GroupTO && isPull()) {
                     Map<String, String> groupOwnerMap = exchange.getProperty("groupOwnerMap", Map.class);
-                    AttrTO groupOwner = ((GroupTO) actual).getPlainAttr(StringUtils.EMPTY);
-                    if (groupOwner != null) {
-                        groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next());
+                    Optional<AttrTO> groupOwner = ((GroupTO) actual).getPlainAttr(StringUtils.EMPTY);
+                    if (groupOwner.isPresent()) {
+                        groupOwnerMap.put(created.getResult(), groupOwner.get().getValues().iterator().next());
                     }
 
                     List<PropagationTask> tasks = getPropagationManager().getCreateTasks(

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
index 8d99fdb..50f2713 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/DeprovisionProducer.java
@@ -19,10 +19,10 @@
 package org.apache.syncope.core.provisioning.camel.producer;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -71,7 +71,8 @@ public class DeprovisionProducer extends AbstractProducer {
                             AnyTypeKind.USER,
                             key,
                             propByRes,
-                            CollectionUtils.removeAll(userDAO.findAllResourceKeys(key), resources));
+                            userDAO.findAllResourceKeys(key).stream().
+                                    filter(resource -> !resources.contains(resource)).collect(Collectors.toList()));
                     propagationReporter = getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
                     exchange.getOut().setBody(propagationReporter.getStatuses());
                     break;
@@ -82,7 +83,8 @@ public class DeprovisionProducer extends AbstractProducer {
                             AnyTypeKind.GROUP,
                             key,
                             propByRes,
-                            CollectionUtils.removeAll(groupDAO.findAllResourceKeys(key), resources));
+                            groupDAO.findAllResourceKeys(key).stream().
+                                    filter(resource -> !resources.contains(resource)).collect(Collectors.toList()));
                     propagationReporter = getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
                     exchange.getOut().setBody(propagationReporter.getStatuses());
                     break;
@@ -93,7 +95,8 @@ public class DeprovisionProducer extends AbstractProducer {
                             AnyTypeKind.ANY_OBJECT,
                             key,
                             propByRes,
-                            CollectionUtils.removeAll(anyObjectDAO.findAllResourceKeys(key), resources));
+                            anyObjectDAO.findAllResourceKeys(key).stream().
+                                    filter(resource -> !resources.contains(resource)).collect(Collectors.toList()));
                     propagationReporter = getPropagationTaskExecutor().execute(tasks, nullPriorityAsync);
                     exchange.getOut().setBody(propagationReporter.getStatuses());
                     break;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/ProvisionProducer.java
----------------------------------------------------------------------
diff --git a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/ProvisionProducer.java b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/ProvisionProducer.java
index bd58a36..2377d4b 100644
--- a/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/ProvisionProducer.java
+++ b/ext/camel/provisioning-camel/src/main/java/org/apache/syncope/core/provisioning/camel/producer/ProvisionProducer.java
@@ -19,11 +19,10 @@
 package org.apache.syncope.core.provisioning.camel.producer;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
-import org.apache.commons.collections4.CollectionUtils;
-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.patch.PasswordPatch;
@@ -56,14 +55,9 @@ public class ProvisionProducer extends AbstractProducer {
 
             UserPatch userPatch = new UserPatch();
             userPatch.setKey(key);
-            userPatch.getResources().addAll(CollectionUtils.collect(resources,
-                    new Transformer<String, StringPatchItem>() {
-
-                @Override
-                public StringPatchItem transform(final String resource) {
-                    return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-                }
-            }));
+            userPatch.getResources().addAll(resources.stream().map(resource
+                    -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                    collect(Collectors.toList()));
 
             if (changePwd) {
                 userPatch.setPassword(
@@ -73,7 +67,7 @@ public class ProvisionProducer extends AbstractProducer {
             PropagationByResource propByRes = new PropagationByResource();
             propByRes.addAll(ResourceOperation.UPDATE, resources);
 
-            WorkflowResult<Pair<UserPatch, Boolean>> wfResult = new WorkflowResult<Pair<UserPatch, Boolean>>(
+            WorkflowResult<Pair<UserPatch, Boolean>> wfResult = new WorkflowResult<>(
                     ImmutablePair.of(userPatch, (Boolean) null), propByRes, "update");
 
             List<PropagationTask> tasks = getPropagationManager().getUserUpdateTasks(wfResult, changePwd, null);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
index 9bcea18..3612c5d 100644
--- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
+++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java
@@ -23,23 +23,15 @@ import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 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.Any;
 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.Role;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
-import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
 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.user.UMembership;
-import org.apache.syncope.core.persistence.api.entity.user.URelationship;
 import org.apache.syncope.core.persistence.api.entity.user.User;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.elasticsearch.common.xcontent.XContentBuilder;
 import org.elasticsearch.common.xcontent.XContentFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -115,15 +107,18 @@ public class ElasticsearchUtils {
             AnyObject anyObject = ((AnyObject) any);
             builder = builder.field("name", anyObject.getName());
 
-            List<Object> memberships = new ArrayList<Object>(anyObjectDAO.findAllGroupKeys(anyObject));
+            List<Object> memberships = new ArrayList<>(anyObjectDAO.findAllGroupKeys(anyObject));
             builder = builder.field("memberships", memberships);
 
             List<Object> relationships = new ArrayList<>();
             List<Object> relationshipTypes = new ArrayList<>();
-            for (ARelationship relationship : anyObjectDAO.findAllRelationships(anyObject)) {
-                relationships.add(relationship.getRightEnd().getKey());
+            anyObjectDAO.findAllRelationships(anyObject).stream().
+                    map(relationship -> {
+                        relationships.add(relationship.getRightEnd().getKey());
+                        return relationship;
+                    }).forEachOrdered(relationship -> {
                 relationshipTypes.add(relationship.getType().getKey());
-            }
+            });
             builder = builder.field("relationships", relationships);
             builder = builder.field("relationshipTypes", relationshipTypes);
         } else if (any instanceof Group) {
@@ -136,23 +131,11 @@ public class ElasticsearchUtils {
                 builder = builder.field("groupOwner", group.getGroupOwner().getKey());
             }
 
-            List<Object> members = CollectionUtils.collect(groupDAO.findUMemberships(group),
-                    new Transformer<UMembership, Object>() {
-
-                @Override
-                public Object transform(final UMembership input) {
-                    return input.getLeftEnd().getKey();
-                }
-            }, new ArrayList<>());
+            List<Object> members = groupDAO.findUMemberships(group).stream().
+                    map(membership -> membership.getLeftEnd().getKey()).collect(Collectors.toList());
             members.add(groupDAO.findUDynMembers(group));
-            CollectionUtils.collect(groupDAO.findAMemberships(group),
-                    new Transformer<AMembership, Object>() {
-
-                @Override
-                public Object transform(final AMembership input) {
-                    return input.getLeftEnd().getKey();
-                }
-            }, members);
+            members.addAll(groupDAO.findAMemberships(group).stream().
+                    map(membership -> membership.getLeftEnd().getKey()).collect(Collectors.toList()));
             members.add(groupDAO.findADynMembers(group));
             builder = builder.field("members", members);
         } else if (any instanceof User) {
@@ -163,33 +146,30 @@ public class ElasticsearchUtils {
                     field("lastRecertification", user.getLastRecertification()).
                     field("lastRecertificator", user.getLastRecertificator());
 
-            List<Object> roles = CollectionUtils.collect(userDAO.findAllRoles(user),
-                    EntityUtils.<Role>keyTransformer(), new ArrayList<>());
+            List<Object> roles = userDAO.findAllRoles(user).stream().
+                    map(r -> r.getKey()).collect(Collectors.toList());
             builder = builder.field("roles", roles);
 
-            List<Object> memberships = new ArrayList<Object>(userDAO.findAllGroupKeys(user));
+            List<Object> memberships = new ArrayList<>(userDAO.findAllGroupKeys(user));
             builder = builder.field("memberships", memberships);
 
             List<Object> relationships = new ArrayList<>();
             Set<Object> relationshipTypes = new HashSet<>();
-            for (URelationship relationship : user.getRelationships()) {
+            user.getRelationships().stream().map(relationship -> {
                 relationships.add(relationship.getRightEnd().getKey());
+                return relationship;
+            }).forEachOrdered(relationship -> {
                 relationshipTypes.add(relationship.getType().getKey());
-            }
+            });
             builder = builder.field("relationships", relationships);
             builder = builder.field("relationshipTypes", relationshipTypes);
         }
 
         if (any.getPlainAttrs() != null) {
             for (PlainAttr<?> plainAttr : any.getPlainAttrs()) {
-                List<Object> values = CollectionUtils.collect(plainAttr.getValues(),
-                        new Transformer<PlainAttrValue, Object>() {
-
-                    @Override
-                    public Object transform(final PlainAttrValue input) {
-                        return input.getValue();
-                    }
-                }, new ArrayList<>(plainAttr.getValues().size()));
+                List<Object> values = plainAttr.getValues().stream().
+                        map(value -> value.getValue()).collect(Collectors.toList());
+
                 if (plainAttr.getUniqueValue() != null) {
                     values.add(plainAttr.getUniqueValue().getValue());
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
----------------------------------------------------------------------
diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
index 3bcc8ed..b8a2d58 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
@@ -19,13 +19,11 @@
 package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -62,7 +60,6 @@ import org.elasticsearch.index.query.DisMaxQueryBuilder;
 import org.elasticsearch.index.query.MatchNoneQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
-import org.elasticsearch.search.SearchHit;
 import org.elasticsearch.search.sort.SortOrder;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.ReflectionUtils;
@@ -84,7 +81,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
         DisMaxQueryBuilder builder = QueryBuilders.disMaxQuery();
 
         Set<String> dynRealmKeys = new HashSet<>();
-        for (String realmPath : RealmUtils.normalize(adminRealms)) {
+        RealmUtils.normalize(adminRealms).forEach(realmPath -> {
             if (realmPath.startsWith("/")) {
                 Realm realm = realmDAO.findByFullPath(realmPath);
                 if (realm == null) {
@@ -92,9 +89,9 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                     noRealm.getElements().add("Invalid realm specified: " + realmPath);
                     throw noRealm;
                 } else {
-                    for (Realm descendant : realmDAO.findDescendants(realm)) {
+                    realmDAO.findDescendants(realm).forEach(descendant -> {
                         builder.add(QueryBuilders.termQuery("realm", descendant.getFullPath()));
-                    }
+                    });
                 }
             } else {
                 DynRealm dynRealm = dynRealmDAO.find(realmPath);
@@ -105,11 +102,11 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                     builder.add(QueryBuilders.termQuery("dynRealm", dynRealm.getKey()));
                 }
             }
-        }
+        });
         if (!dynRealmKeys.isEmpty()) {
-            for (Realm descendant : realmDAO.findAll()) {
+            realmDAO.findAll().forEach(descendant -> {
                 builder.add(QueryBuilders.termQuery("realm", descendant.getFullPath()));
-            }
+            });
         }
 
         return Pair.of(builder, dynRealmKeys);
@@ -147,7 +144,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
 
         AnyUtils attrUtils = anyUtilsFactory.getInstance(kind);
 
-        for (OrderByClause clause : orderBy) {
+        orderBy.forEach(clause -> {
             String sortName = null;
 
             // Manage difference among external key attribute and internal JPA @Id
@@ -168,7 +165,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
             } else {
                 builder.addSort(sortName, SortOrder.valueOf(clause.getDirection().name()));
             }
-        }
+        });
     }
 
     @Override
@@ -185,15 +182,8 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                 setSize(itemsPerPage < 0 ? elasticsearchUtils.getIndexMaxResultWindow() : itemsPerPage);
         addSort(builder, kind, orderBy);
 
-        return buildResult(
-                CollectionUtils.collect(Arrays.asList(builder.get().getHits().getHits()),
-                        new Transformer<SearchHit, Object>() {
-
-                    @Override
-                    public Object transform(final SearchHit input) {
-                        return input.getId();
-                    }
-                }, new ArrayList<>()),
+        return buildResult(Stream.of(builder.get().getHits().getHits()).
+                map(hit -> hit.getId()).collect(Collectors.toList()),
                 kind);
     }
 
@@ -304,9 +294,9 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
             }
             builder.add(QueryBuilders.termQuery("realm", realmDAO.getRoot().getFullPath()));
         } else {
-            for (Realm current : realmDAO.findDescendants(realm)) {
+            realmDAO.findDescendants(realm).forEach(current -> {
                 builder.add(QueryBuilders.termQuery("realm", current.getFullPath()));
-            }
+            });
         }
 
         return builder;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
index 022267d..7b8b241 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2IdPTO.java
@@ -28,8 +28,6 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
 
@@ -148,13 +146,7 @@ public class SAML2IdPTO extends AbstractBaseBean implements EntityTO, ItemContai
 
     @Override
     public ItemTO getConnObjectKeyItem() {
-        return IterableUtils.find(getItems(), new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO item) {
-                return item.isConnObjectKey();
-            }
-        });
+        return getItems().stream().filter(item -> item.isConnObjectKey()).findFirst().get();
     }
 
     protected boolean addConnObjectKeyItem(final ItemTO connObjectItem) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
index 2b02eb4..9eaca74 100644
--- a/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
+++ b/ext/saml2sp/common-lib/src/main/java/org/apache/syncope/common/lib/to/SAML2LoginResponseTO.java
@@ -22,13 +22,12 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.Date;
 import java.util.HashSet;
+import java.util.Optional;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "saml2LoginResponse")
@@ -128,14 +127,8 @@ public class SAML2LoginResponseTO extends AbstractBaseBean {
     }
 
     @JsonIgnore
-    public AttrTO getAttr(final String schema) {
-        return IterableUtils.find(attrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getAttr(final String schema) {
+        return attrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
     @XmlElementWrapper(name = "attrs")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
index ae3f075..170aff9 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2IdPLogic.java
@@ -27,8 +27,7 @@ import java.util.ArrayList;
 import java.util.Base64;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ItemTO;
@@ -100,13 +99,7 @@ public class SAML2IdPLogic extends AbstractSAML2Logic<SAML2IdPTO> {
     @PreAuthorize("isAuthenticated()")
     @Transactional(readOnly = true)
     public List<SAML2IdPTO> list() {
-        return CollectionUtils.collect(idpDAO.findAll(), new Transformer<SAML2IdP, SAML2IdPTO>() {
-
-            @Override
-            public SAML2IdPTO transform(final SAML2IdP input) {
-                return complete(input, binder.getIdPTO(input));
-            }
-        }, new ArrayList<SAML2IdPTO>());
+        return idpDAO.findAll().stream().map(idp -> complete(idp, binder.getIdPTO(idp))).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + SAML2SPEntitlement.IDP_READ + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
index 0da3f45..80a3ce6 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/SAML2SPLogic.java
@@ -472,14 +472,8 @@ public class SAML2SPLogic extends AbstractSAML2Logic<AbstractBaseBean> {
             if (idp.isCreateUnmatching()) {
                 LOG.debug("No user matching NameID {}, about to create", nameID.getValue());
 
-                username = AuthContextUtils.execWithAuthContext(
-                        AuthContextUtils.getDomain(), new AuthContextUtils.Executable<String>() {
-
-                    @Override
-                    public String exec() {
-                        return userManager.create(idp, responseTO, nameIDValue);
-                    }
-                });
+                username = AuthContextUtils.execWithAuthContext(AuthContextUtils.getDomain(), ()
+                        -> userManager.create(idp, responseTO, nameIDValue));
             } else {
                 throw new NotFoundException("User matching the provided NameID value " + nameID.getValue());
             }
@@ -489,14 +483,8 @@ public class SAML2SPLogic extends AbstractSAML2Logic<AbstractBaseBean> {
             if (idp.isUpdateMatching()) {
                 LOG.debug("About to update {} for NameID {}", matchingUsers.get(0), nameID.getValue());
 
-                username = AuthContextUtils.execWithAuthContext(
-                        AuthContextUtils.getDomain(), new AuthContextUtils.Executable<String>() {
-
-                    @Override
-                    public String exec() {
-                        return userManager.update(matchingUsers.get(0), idp, responseTO);
-                    }
-                });
+                username = AuthContextUtils.execWithAuthContext(AuthContextUtils.getDomain(), ()
+                        -> userManager.update(matchingUsers.get(0), idp, responseTO));
             } else {
                 username = matchingUsers.get(0);
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
index 0798939..e0001b1 100644
--- a/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
+++ b/ext/saml2sp/logic/src/main/java/org/apache/syncope/core/logic/saml2/SAML2UserManager.java
@@ -21,8 +21,8 @@ package org.apache.syncope.core.logic.saml2;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.AnyOperations;
@@ -137,27 +137,13 @@ public class SAML2UserManager {
                         }
                     }
 
-                    CollectionUtils.collect(
-                            userDAO.findByPlainAttrValue(intAttrName.getSchemaName(), value),
-                            new Transformer<User, String>() {
-
-                        @Override
-                        public String transform(final User input) {
-                            return input.getUsername();
-                        }
-                    }, result);
+                    result.addAll(userDAO.findByPlainAttrValue(intAttrName.getSchemaName(), value).stream().
+                            map(user -> user.getUsername()).collect(Collectors.toList()));
                     break;
 
                 case DERIVED:
-                    CollectionUtils.collect(
-                            userDAO.findByDerAttrValue(intAttrName.getSchemaName(), transformed),
-                            new Transformer<User, String>() {
-
-                        @Override
-                        public String transform(final User input) {
-                            return input.getUsername();
-                        }
-                    }, result);
+                    result.addAll(userDAO.findByDerAttrValue(intAttrName.getSchemaName(), transformed).stream().
+                            map(user -> user.getUsername()).collect(Collectors.toList()));
                     break;
 
                 default:
@@ -170,7 +156,7 @@ public class SAML2UserManager {
     private List<SAML2IdPActions> getActions(final SAML2IdPEntity idp) {
         List<SAML2IdPActions> actions = new ArrayList<>();
 
-        for (String className : idp.getActionsClassNames()) {
+        idp.getActionsClassNames().forEach((className) -> {
             try {
                 Class<?> actionsClass = Class.forName(className);
                 SAML2IdPActions idpActions = (SAML2IdPActions) ApplicationContextProvider.getBeanFactory().
@@ -180,7 +166,7 @@ public class SAML2UserManager {
             } catch (Exception e) {
                 LOG.warn("Class '{}' not found", className, e);
             }
-        }
+        });
 
         return actions;
     }
@@ -190,11 +176,11 @@ public class SAML2UserManager {
             IntAttrName intAttrName = intAttrNameParser.parse(item.getIntAttrName(), AnyTypeKind.USER);
 
             List<String> values = Collections.emptyList();
-            AttrTO samlAttr = responseTO.getAttr(item.getExtAttrName());
-            if (samlAttr != null && !samlAttr.getValues().isEmpty()) {
-                values = samlAttr.getValues();
+            Optional<AttrTO> samlAttr = responseTO.getAttr(item.getExtAttrName());
+            if (samlAttr.isPresent() && !samlAttr.get().getValues().isEmpty()) {
+                values = samlAttr.get().getValues();
 
-                List<Object> transformed = new ArrayList<Object>(values);
+                List<Object> transformed = new ArrayList<>(values);
                 for (ItemTransformer transformer : MappingUtils.getItemTransformers(item)) {
                     transformed = transformer.beforePull(null, userTO, transformed);
                 }
@@ -218,13 +204,14 @@ public class SAML2UserManager {
             } else if (intAttrName.getSchemaType() != null) {
                 switch (intAttrName.getSchemaType()) {
                     case PLAIN:
-                        AttrTO attr = userTO.getPlainAttr(intAttrName.getSchemaName());
-                        if (attr == null) {
-                            attr = new AttrTO.Builder().schema(intAttrName.getSchemaName()).build();
-                            userTO.getPlainAttrs().add(attr);
+                        Optional<AttrTO> attr = userTO.getPlainAttr(intAttrName.getSchemaName());
+                        if (!attr.isPresent()) {
+                            attr = Optional.of(new AttrTO.Builder().schema(intAttrName.getSchemaName()).build());
+                            userTO.getPlainAttrs().add(attr.get());
+                        } else {
+                            attr.get().getValues().clear();
                         }
-                        attr.getValues().clear();
-                        attr.getValues().addAll(values);
+                        attr.get().getValues().addAll(values);
                         break;
 
                     default:

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java b/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
index 5588334..1aa1116 100644
--- a/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
+++ b/ext/saml2sp/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/SAML2IdP.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
 
@@ -56,7 +57,7 @@ public interface SAML2IdP extends Entity {
 
     void setUserTemplate(SAML2UserTemplate userTemplate);
 
-    SAML2IdPItem getConnObjectKeyItem();
+    Optional<? extends SAML2IdPItem> getConnObjectKeyItem();
 
     void setConnObjectKeyItem(SAML2IdPItem item);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
index d6df04d..8b3943f 100644
--- a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
+++ b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/JPASAML2IdP.java
@@ -21,6 +21,7 @@ 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 javax.persistence.Basic;
 import javax.persistence.Cacheable;
@@ -37,8 +38,6 @@ import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.types.SAML2BindingType;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
@@ -190,14 +189,8 @@ public class JPASAML2IdP extends AbstractGeneratedKeyEntity implements SAML2IdP
     }
 
     @Override
-    public SAML2IdPItem getConnObjectKeyItem() {
-        return IterableUtils.find(getItems(), new Predicate<SAML2IdPItem>() {
-
-            @Override
-            public boolean evaluate(final SAML2IdPItem item) {
-                return item.isConnObjectKey();
-            }
-        });
+    public Optional<? extends SAML2IdPItem> getConnObjectKeyItem() {
+        return getItems().stream().filter(item -> item.isConnObjectKey()).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java
index 225c6d1..f3b91e9 100644
--- a/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java
+++ b/ext/saml2sp/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/SAML2IdPValidator.java
@@ -19,8 +19,6 @@
 package org.apache.syncope.core.persistence.jpa.validation.entity;
 
 import javax.validation.ConstraintValidatorContext;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdPItem;
@@ -30,13 +28,7 @@ public class SAML2IdPValidator extends AbstractValidator<SAML2IdPCheck, SAML2IdP
 
     @Override
     public boolean isValid(final SAML2IdP value, final ConstraintValidatorContext context) {
-        long connObjectKeys = IterableUtils.countMatches(value.getItems(), new Predicate<SAML2IdPItem>() {
-
-            @Override
-            public boolean evaluate(final SAML2IdPItem item) {
-                return item.isConnObjectKey();
-            }
-        });
+        long connObjectKeys = value.getItems().stream().filter(item -> item.isConnObjectKey()).count();
         if (!value.getItems().isEmpty() && connObjectKeys != 1) {
             context.buildConstraintViolationWithTemplate(
                     getTemplate(EntityViolationType.InvalidMapping, "Single ConnObjectKey mapping is required")).
@@ -46,13 +38,7 @@ public class SAML2IdPValidator extends AbstractValidator<SAML2IdPCheck, SAML2IdP
 
         boolean isValid = true;
 
-        long passwords = IterableUtils.countMatches(value.getItems(), new Predicate<SAML2IdPItem>() {
-
-            @Override
-            public boolean evaluate(final SAML2IdPItem item) {
-                return item.isPassword();
-            }
-        });
+        long passwords = value.getItems().stream().filter(item -> item.isPassword()).count();
         if (passwords > 0) {
             context.buildConstraintViolationWithTemplate(
                     getTemplate(EntityViolationType.InvalidMapping, "No password mapping is allowed")).

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
index 2f2f9d0..bf7d409 100644
--- a/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
+++ b/ext/saml2sp/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SAML2IdPDataBinderImpl.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -32,16 +32,12 @@ import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.SAML2IdPDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.SAML2EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdP;
 import org.apache.syncope.core.persistence.api.entity.SAML2IdPItem;
 import org.apache.syncope.core.persistence.api.entity.SAML2UserTemplate;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.provisioning.api.IntAttrName;
 import org.apache.syncope.core.provisioning.api.data.SAML2IdPDataBinder;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
 import org.apache.syncope.core.spring.BeanUtils;
@@ -191,15 +187,12 @@ public class SAML2IdPDataBinderImpl implements SAML2IdPDataBinder {
         idp.getItems().clear();
         AnyTypeClassTO allowedSchemas = new AnyTypeClassTO();
         for (AnyTypeClass anyTypeClass : anyTypeDAO.findUser().getClasses()) {
-            allowedSchemas.getPlainSchemas().addAll(
-                    CollectionUtils.collect(anyTypeClass.getPlainSchemas(),
-                            EntityUtils.<PlainSchema>keyTransformer()));
-            allowedSchemas.getDerSchemas().addAll(
-                    CollectionUtils.collect(anyTypeClass.getDerSchemas(),
-                            EntityUtils.<DerSchema>keyTransformer()));
-            allowedSchemas.getVirSchemas().addAll(
-                    CollectionUtils.collect(anyTypeClass.getVirSchemas(),
-                            EntityUtils.<VirSchema>keyTransformer()));
+            allowedSchemas.getPlainSchemas().addAll(anyTypeClass.getPlainSchemas().stream().
+                    map(s -> s.getKey()).collect(Collectors.toList()));
+            allowedSchemas.getDerSchemas().addAll(anyTypeClass.getDerSchemas().stream().
+                    map(s -> s.getKey()).collect(Collectors.toList()));
+            allowedSchemas.getVirSchemas().addAll(anyTypeClass.getVirSchemas().stream().
+                    map(s -> s.getKey()).collect(Collectors.toList()));
         }
         populateItems(idpTO, idp, allowedSchemas);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestPullActions.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestPullActions.java b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestPullActions.java
index fb48c9b..a32a1be 100644
--- a/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestPullActions.java
+++ b/fit/core-reference/src/main/java/org/apache/syncope/fit/core/reference/TestPullActions.java
@@ -18,7 +18,7 @@
  */
 package org.apache.syncope.fit.core.reference;
 
-import org.apache.commons.collections4.IterableUtils;
+import java.util.Optional;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.AttrPatch;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -47,20 +47,14 @@ public class TestPullActions implements PullActions {
         if (entity instanceof AnyTO) {
             AnyTO any = (AnyTO) entity;
 
-            AttrTO attrTO = null;
-            for (int i = 0; i < any.getPlainAttrs().size(); i++) {
-                AttrTO plainAttr = IterableUtils.get(any.getPlainAttrs(), i);
-                if ("fullname".equals(plainAttr.getSchema())) {
-                    attrTO = plainAttr;
-                }
+            Optional<AttrTO> attrTO = any.getPlainAttr("fullname");
+            if (!attrTO.isPresent()) {
+                attrTO = Optional.of(new AttrTO());
+                attrTO.get().setSchema("fullname");
+                any.getPlainAttrs().add(attrTO.get());
             }
-            if (attrTO == null) {
-                attrTO = new AttrTO();
-                attrTO.setSchema("fullname");
-                any.getPlainAttrs().add(attrTO);
-            }
-            attrTO.getValues().clear();
-            attrTO.getValues().add(String.valueOf(counter++));
+            attrTO.get().getValues().clear();
+            attrTO.get().getValues().add(String.valueOf(counter++));
         }
 
         return delta;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
index 9c77fd5..f29786d 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/AbstractITCase.java
@@ -24,6 +24,7 @@ import static org.junit.Assert.fail;
 
 import java.io.InputStream;
 import java.net.URI;
+import java.util.Arrays;
 import java.util.Locale;
 import java.util.Properties;
 import java.util.UUID;
@@ -37,7 +38,6 @@ import javax.naming.directory.ModificationItem;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -388,7 +388,7 @@ public abstract class AbstractITCase {
         notification.setSelfAsRecipient(true);
         notification.setRecipientAttrName("email");
         if (staticRecipients != null) {
-            CollectionUtils.addAll(notification.getStaticRecipients(), staticRecipients);
+            notification.getStaticRecipients().addAll(Arrays.asList(staticRecipients));
         }
 
         notification.setSender(sender);
@@ -517,13 +517,13 @@ public abstract class AbstractITCase {
 
         Properties env = new Properties();
         env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
-        env.put(Context.PROVIDER_URL, "ldap://" + ldapConn.getConf("host").getValues().get(0)
-                + ":" + ldapConn.getConf("port").getValues().get(0) + "/");
+        env.put(Context.PROVIDER_URL, "ldap://" + ldapConn.getConf("host").get().getValues().get(0)
+                + ":" + ldapConn.getConf("port").get().getValues().get(0) + "/");
         env.put(Context.SECURITY_AUTHENTICATION, "simple");
         env.put(Context.SECURITY_PRINCIPAL,
-                bindDn == null ? ldapConn.getConf("principal").getValues().get(0) : bindDn);
+                bindDn == null ? ldapConn.getConf("principal").get().getValues().get(0) : bindDn);
         env.put(Context.SECURITY_CREDENTIALS,
-                bindPwd == null ? ldapConn.getConf("credentials").getValues().get(0) : bindPwd);
+                bindPwd == null ? ldapConn.getConf("credentials").get().getValues().get(0) : bindPwd);
 
         return new InitialDirContext(env);
     }