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

[04/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/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
index fdeb848..14a8d5f 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PropagationManagerImpl.java
@@ -26,11 +26,9 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 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.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
-import org.apache.syncope.common.lib.patch.StringPatchItem;
 import org.apache.syncope.common.lib.patch.UserPatch;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -228,13 +226,8 @@ public class PropagationManagerImpl implements PropagationManager {
             pwdWFResult.getPropByRes().addAll(ResourceOperation.UPDATE, pwdResourceNames);
             if (!pwdWFResult.getPropByRes().isEmpty()) {
                 Set<String> toBeExcluded = new HashSet<>(allResourceNames);
-                CollectionUtils.collect(userPatch.getResources(), new Transformer<StringPatchItem, String>() {
-
-                    @Override
-                    public String transform(final StringPatchItem input) {
-                        return input.getValue();
-                    }
-                }, toBeExcluded);
+                toBeExcluded.addAll(userPatch.getResources().stream().
+                        map(patchItem -> patchItem.getValue()).collect(Collectors.toList()));
                 toBeExcluded.removeAll(pwdResourceNames);
 
                 tasks.addAll(getUserUpdateTasks(pwdWFResult, true, toBeExcluded));
@@ -339,27 +332,29 @@ public class PropagationManagerImpl implements PropagationManager {
         virtualResources.addAll(dao(any.getType().getKind()).findAllResourceKeys(any.getKey()));
 
         Map<String, Set<Attribute>> vAttrMap = new HashMap<>();
-        for (AttrTO vAttr : CollectionUtils.emptyIfNull(vAttrs)) {
-            VirSchema schema = virSchemaDAO.find(vAttr.getSchema());
-            if (schema == null) {
-                LOG.warn("Ignoring invalid {} {}", VirSchema.class.getSimpleName(), vAttr.getSchema());
-            } else if (schema.isReadonly()) {
-                LOG.warn("Ignoring read-only {} {}", VirSchema.class.getSimpleName(), vAttr.getSchema());
-            } else if (anyUtilsFactory.getInstance(any).getAllowedSchemas(any, VirSchema.class).contains(schema)
-                    && virtualResources.contains(schema.getProvision().getResource().getKey())) {
-
-                Set<Attribute> values = vAttrMap.get(schema.getProvision().getResource().getKey());
-                if (values == null) {
-                    values = new HashSet<>();
-                    vAttrMap.put(schema.getProvision().getResource().getKey(), values);
-                }
-                values.add(AttributeBuilder.build(schema.getExtAttrName(), vAttr.getValues()));
+        if (vAttrs != null) {
+            vAttrs.forEach(vAttr -> {
+                VirSchema schema = virSchemaDAO.find(vAttr.getSchema());
+                if (schema == null) {
+                    LOG.warn("Ignoring invalid {} {}", VirSchema.class.getSimpleName(), vAttr.getSchema());
+                } else if (schema.isReadonly()) {
+                    LOG.warn("Ignoring read-only {} {}", VirSchema.class.getSimpleName(), vAttr.getSchema());
+                } else if (anyUtilsFactory.getInstance(any).getAllowedSchemas(any, VirSchema.class).contains(schema)
+                        && virtualResources.contains(schema.getProvision().getResource().getKey())) {
+
+                    Set<Attribute> values = vAttrMap.get(schema.getProvision().getResource().getKey());
+                    if (values == null) {
+                        values = new HashSet<>();
+                        vAttrMap.put(schema.getProvision().getResource().getKey(), values);
+                    }
+                    values.add(AttributeBuilder.build(schema.getExtAttrName(), vAttr.getValues()));
 
-                propByRes.add(ResourceOperation.UPDATE, schema.getProvision().getResource().getKey());
-            } else {
-                LOG.warn("{} not owned by or {} not allowed for {}",
-                        schema.getProvision().getResource(), schema, any);
-            }
+                    propByRes.add(ResourceOperation.UPDATE, schema.getProvision().getResource().getKey());
+                } else {
+                    LOG.warn("{} not owned by or {} not allowed for {}",
+                            schema.getProvision().getResource(), schema, any);
+                }
+            });
         }
         LOG.debug("With virtual attributes {}:\n{}\n{}", any, propByRes, vAttrMap);
 
@@ -367,7 +362,7 @@ public class PropagationManagerImpl implements PropagationManager {
 
         for (Map.Entry<String, ResourceOperation> entry : propByRes.asMap().entrySet()) {
             ExternalResource resource = resourceDAO.find(entry.getKey());
-            Provision provision = resource == null ? null : resource.getProvision(any.getType());
+            Provision provision = resource == null ? null : resource.getProvision(any.getType()).orElse(null);
             List<? extends MappingItem> mappingItems = provision == null
                     ? Collections.<MappingItem>emptyList()
                     : MappingUtils.getPropagationItems(provision);
@@ -400,18 +395,16 @@ public class PropagationManagerImpl implements PropagationManager {
                 // if so, add special attributes that will be evaluated by PropagationTaskExecutor
                 List<String> mandatoryMissing = new ArrayList<>();
                 List<String> mandatoryNullOrEmpty = new ArrayList<>();
-                for (MappingItem item : mappingItems) {
-                    if (!item.isConnObjectKey()
-                            && JexlUtils.evaluateMandatoryCondition(item.getMandatoryCondition(), any)) {
-
-                        Attribute attr = AttributeUtil.find(item.getExtAttrName(), preparedAttrs.getValue());
-                        if (attr == null) {
-                            mandatoryMissing.add(item.getExtAttrName());
-                        } else if (attr.getValue() == null || attr.getValue().isEmpty()) {
-                            mandatoryNullOrEmpty.add(item.getExtAttrName());
-                        }
-                    }
-                }
+                mappingItems.stream().filter(item -> (!item.isConnObjectKey()
+                        && JexlUtils.evaluateMandatoryCondition(item.getMandatoryCondition(), any))).
+                        forEachOrdered(item -> {
+                            Attribute attr = AttributeUtil.find(item.getExtAttrName(), preparedAttrs.getValue());
+                            if (attr == null) {
+                                mandatoryMissing.add(item.getExtAttrName());
+                            } else if (attr.getValue() == null || attr.getValue().isEmpty()) {
+                                mandatoryNullOrEmpty.add(item.getExtAttrName());
+                            }
+                        });
                 if (!mandatoryMissing.isEmpty()) {
                     preparedAttrs.getValue().add(AttributeBuilder.build(
                             PropagationTaskExecutor.MANDATORY_MISSING_ATTR_NAME, mandatoryMissing));
@@ -454,7 +447,7 @@ public class PropagationManagerImpl implements PropagationManager {
 
         List<PropagationTask> tasks = new ArrayList<>();
 
-        for (Map.Entry<String, ResourceOperation> entry : propByRes.asMap().entrySet()) {
+        propByRes.asMap().entrySet().forEach(entry -> {
             ExternalResource resource = resourceDAO.find(entry.getKey());
             OrgUnit orgUnit = resource == null ? null : resource.getOrgUnit();
 
@@ -481,7 +474,7 @@ public class PropagationManagerImpl implements PropagationManager {
 
                 LOG.debug("PropagationTask created: {}", task);
             }
-        }
+        });
 
         return tasks;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
index 64d8776..e611e34 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractProvisioningJobDelegate.java
@@ -23,8 +23,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.TraceLevel;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
@@ -311,13 +309,8 @@ public abstract class AbstractProvisioningJobDelegate<T extends ProvisioningTask
         // Summary, also to be included for FAILURE and ALL, so create it anyway.
         boolean includeUser = resource.getProvision(anyTypeDAO.findUser()) != null;
         boolean includeGroup = resource.getProvision(anyTypeDAO.findGroup()) != null;
-        boolean includeAnyObject = IterableUtils.matchesAny(resource.getProvisions(), new Predicate<Provision>() {
-
-            @Override
-            public boolean evaluate(final Provision object) {
-                return object.getAnyType().getKind() == AnyTypeKind.ANY_OBJECT;
-            }
-        });
+        boolean includeAnyObject = resource.getProvisions().stream().anyMatch(
+                provision -> provision.getAnyType().getKind() == AnyTypeKind.ANY_OBJECT);
         boolean includeRealm = resource.getOrgUnit() != null;
 
         if (includeUser) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
index 1e93b92..74928d9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPullResultHandler.java
@@ -122,7 +122,7 @@ public abstract class AbstractPullResultHandler extends AbstractSyncopeResultHan
     public boolean handle(final SyncDelta delta) {
         Provision provision = null;
         try {
-            provision = profile.getTask().getResource().getProvision(delta.getObject().getObjectClass());
+            provision = profile.getTask().getResource().getProvision(delta.getObject().getObjectClass()).orElse(null);
             if (provision == null) {
                 throw new JobExecutionException("No provision found on " + profile.getTask().getResource() + " for "
                         + delta.getObject().getObjectClass());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
index 7095739..395ec3e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/AbstractPushResultHandler.java
@@ -24,6 +24,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.StringPatchItem;
@@ -261,15 +262,15 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
         Result resultStatus = null;
 
         // Try to read remote object BEFORE any actual operation
-        Provision provision = profile.getTask().getResource().getProvision(any.getType());
-        MappingItem connObjectKey = MappingUtils.getConnObjectKeyItem(provision);
-        String connObjecKeyValue = mappingManager.getConnObjectKeyValue(any, provision);
+        Optional<? extends Provision> provision = profile.getTask().getResource().getProvision(any.getType());
+        Optional<MappingItem> connObjectKey = MappingUtils.getConnObjectKeyItem(provision.get());
+        Optional<String> connObjecKeyValue = mappingManager.getConnObjectKeyValue(any, provision.get());
 
         ConnectorObject beforeObj = getRemoteObject(
-                provision.getObjectClass(),
-                connObjectKey.getExtAttrName(),
-                connObjecKeyValue,
-                provision.getMapping().getItems().iterator());
+                provision.get().getObjectClass(),
+                connObjectKey.get().getExtAttrName(),
+                connObjecKeyValue.get(),
+                provision.get().getMapping().getItems().iterator());
 
         Boolean status = profile.getTask().isSyncStatus() ? enabled : null;
 
@@ -435,10 +436,10 @@ public abstract class AbstractPushResultHandler extends AbstractSyncopeResultHan
                 }
                 resultStatus = AuditElements.Result.SUCCESS;
                 output = getRemoteObject(
-                        provision.getObjectClass(),
-                        connObjectKey.getExtAttrName(),
-                        connObjecKeyValue,
-                        provision.getMapping().getItems().iterator());
+                        provision.get().getObjectClass(),
+                        connObjectKey.get().getExtAttrName(),
+                        connObjecKeyValue.get(),
+                        provision.get().getMapping().getItems().iterator());
             } catch (IgnoreProvisionException e) {
                 throw e;
             } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DBPasswordPullActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DBPasswordPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DBPasswordPullActions.java
index 36b33f7..c0a7eb4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DBPasswordPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/DBPasswordPullActions.java
@@ -18,8 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.pushpull;
 
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
 import org.apache.syncope.common.lib.patch.UserPatch;
@@ -108,19 +107,13 @@ public class DBPasswordPullActions implements PullActions {
     }
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
-        ConnConfProperty cipherAlgorithm =
-                IterableUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
-
-                    @Override
-                    public boolean evaluate(final ConnConfProperty property) {
-                        return "cipherAlgorithm".equals(property.getSchema().getName())
-                                && property.getValues() != null && !property.getValues().isEmpty();
-                    }
-                });
-
-        return cipherAlgorithm == null
-                ? CLEARTEXT
-                : (String) cipherAlgorithm.getValues().get(0);
+        Optional<ConnConfProperty> cipherAlgorithm = connInstance.getConf().stream().
+                filter(property -> "cipherAlgorithm".equals(property.getSchema().getName())
+                && property.getValues() != null && !property.getValues().isEmpty()).findFirst();
+
+        return cipherAlgorithm.isPresent()
+                ? (String) cipherAlgorithm.get().getValues().get(0)
+                : CLEARTEXT;
     }
 
     @Transactional

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
index 98ce3b9..5261926 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/LDAPMembershipPullActions.java
@@ -23,9 +23,8 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
@@ -78,19 +77,13 @@ public class LDAPMembershipPullActions extends SchedulingPullActions {
      * @return the name of the attribute used to keep track of group memberships
      */
     protected String getGroupMembershipAttrName(final Connector connector) {
-        ConnConfProperty groupMembership = IterableUtils.find(connector.getConnInstance().getConf(),
-                new Predicate<ConnConfProperty>() {
+        Optional<ConnConfProperty> groupMembership = connector.getConnInstance().getConf().stream().
+                filter(property -> "groupMemberAttribute".equals(property.getSchema().getName())
+                && property.getValues() != null && !property.getValues().isEmpty()).findFirst();
 
-            @Override
-            public boolean evaluate(final ConnConfProperty property) {
-                return "groupMemberAttribute".equals(property.getSchema().getName())
-                        && property.getValues() != null && !property.getValues().isEmpty();
-            }
-        });
-
-        return groupMembership == null
-                ? "uniquemember"
-                : (String) groupMembership.getValues().get(0);
+        return groupMembership.isPresent()
+                ? (String) groupMembership.get().getValues().get(0)
+                : "uniquemember";
     }
 
     /**
@@ -139,14 +132,16 @@ public class LDAPMembershipPullActions extends SchedulingPullActions {
             throws JobExecutionException {
 
         Connector connector = profile.getConnector();
-        for (Object membValue : getMembAttrValues(delta, connector)) {
+        getMembAttrValues(delta, connector).stream().map(membValue -> {
             Set<String> memb = memberships.get(membValue.toString());
             if (memb == null) {
                 memb = new HashSet<>();
                 memberships.put(membValue.toString(), memb);
             }
+            return memb;
+        }).forEachOrdered(memb -> {
             memb.add(groupTO.getKey());
-        }
+        });
     }
 
     /**
@@ -165,8 +160,8 @@ public class LDAPMembershipPullActions extends SchedulingPullActions {
         }
 
         if (!(entity instanceof GroupTO)
-                || profile.getTask().getResource().getProvision(anyTypeDAO.findUser()) == null
-                || profile.getTask().getResource().getProvision(anyTypeDAO.findUser()).getMapping() == null) {
+                || !profile.getTask().getResource().getProvision(anyTypeDAO.findUser()).isPresent()
+                || profile.getTask().getResource().getProvision(anyTypeDAO.findUser()).get().getMapping() == null) {
 
             super.after(profile, delta, entity, result);
         } else {
@@ -177,18 +172,18 @@ public class LDAPMembershipPullActions extends SchedulingPullActions {
     @Override
     public void afterAll(final ProvisioningProfile<?, ?> profile) throws JobExecutionException {
         Map<String, Set<String>> resolvedMemberships = new HashMap<>();
-        for (Map.Entry<String, Set<String>> entry : this.memberships.entrySet()) {
-            String userKey = pullUtils.findMatchingAnyKey(
+        this.memberships.entrySet().forEach(entry -> {
+            Optional<String> userKey = pullUtils.findMatchingAnyKey(
                     anyTypeDAO.findUser(),
                     entry.getKey(),
                     profile.getTask().getResource(),
                     profile.getConnector());
-            if (userKey == null) {
-                LOG.warn("Could not find matching user for {}", entry.getKey());
+            if (userKey.isPresent()) {
+                resolvedMemberships.put(userKey.get(), entry.getValue());
             } else {
-                resolvedMemberships.put(userKey, entry.getValue());
+                LOG.warn("Could not find matching user for {}", entry.getKey());
             }
-        }
+        });
 
         Map<String, Object> jobMap = new HashMap<>();
         jobMap.put(SetUMembershipsJob.MEMBERSHIPS_KEY, resolvedMemberships);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
index 3520db0..eb94ba9 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullJobDelegate.java
@@ -24,16 +24,16 @@ 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 org.apache.commons.collections4.IteratorUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.collections.IteratorChain;
 import org.apache.syncope.common.lib.policy.PullPolicySpec;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
@@ -79,39 +79,39 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
     }
 
     private void setGroupOwners(final GroupPullResultHandler ghandler) {
-        for (Map.Entry<String, String> entry : ghandler.getGroupOwnerMap().entrySet()) {
+        ghandler.getGroupOwnerMap().entrySet().stream().map(entry -> {
             Group group = groupDAO.find(entry.getKey());
             if (group == null) {
                 throw new NotFoundException("Group " + entry.getKey());
             }
-
             if (StringUtils.isBlank(entry.getValue())) {
                 group.setGroupOwner(null);
                 group.setUserOwner(null);
             } else {
-                String userKey = pullUtils.findMatchingAnyKey(
+                Optional<String> userKey = pullUtils.findMatchingAnyKey(
                         anyTypeDAO.findUser(),
                         entry.getValue(),
                         ghandler.getProfile().getTask().getResource(),
                         ghandler.getProfile().getConnector());
 
-                if (userKey == null) {
-                    String groupKey = pullUtils.findMatchingAnyKey(
+                if (userKey.isPresent()) {
+                    group.setUserOwner(userDAO.find(userKey.get()));
+                } else {
+                    Optional<String> groupKey = pullUtils.findMatchingAnyKey(
                             anyTypeDAO.findGroup(),
                             entry.getValue(),
                             ghandler.getProfile().getTask().getResource(),
                             ghandler.getProfile().getConnector());
 
-                    if (groupKey != null) {
-                        group.setGroupOwner(groupDAO.find(groupKey));
+                    if (groupKey.isPresent()) {
+                        group.setGroupOwner(groupDAO.find(groupKey.get()));
                     }
-                } else {
-                    group.setUserOwner(userDAO.find(userKey));
                 }
             }
-
+            return group;
+        }).forEachOrdered(group -> {
             groupDAO.save(group);
-        }
+        });
     }
 
     @Override
@@ -123,7 +123,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
         LOG.debug("Executing pull on {}", pullTask.getResource());
 
         List<PullActions> actions = new ArrayList<>();
-        for (String className : pullTask.getActionsClassNames()) {
+        pullTask.getActionsClassNames().forEach(className -> {
             try {
                 Class<?> actionsClass = Class.forName(className);
                 PullActions pullActions = (PullActions) ApplicationContextProvider.getBeanFactory().
@@ -133,7 +133,7 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
             } catch (Exception e) {
                 LOG.warn("Class '{}' not found", className, e);
             }
-        }
+        });
 
         ProvisioningProfile<PullTask, PullActions> profile = new ProvisioningProfile<>(connector, pullTask);
         profile.getActions().addAll(actions);
@@ -236,10 +236,10 @@ public class PullJobDelegate extends AbstractProvisioningJobDelegate<PullTask> i
 
                 try {
                     Set<MappingItem> linkinMappingItems = new HashSet<>();
-                    for (VirSchema virSchema : virSchemaDAO.findByProvision(provision)) {
+                    virSchemaDAO.findByProvision(provision).forEach(virSchema -> {
                         linkinMappingItems.add(virSchema.asLinkingMappingItem());
-                    }
-                    Iterator<MappingItem> mapItems = IteratorUtils.chainedIterator(
+                    });
+                    Iterator<MappingItem> mapItems = new IteratorChain<>(
                             provision.getMapping().getItems().iterator(),
                             linkinMappingItems.iterator());
                     OperationOptions options = MappingUtils.buildOperationOptions(mapItems);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
index 7dee306..ad431bf 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PullUtils.java
@@ -21,7 +21,8 @@ package org.apache.syncope.core.provisioning.java.pushpull;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.policy.PullPolicySpec;
@@ -58,7 +59,6 @@ import org.identityconnectors.framework.common.objects.AttributeUtil;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.identityconnectors.framework.common.objects.Name;
 import org.identityconnectors.framework.common.objects.OperationalAttributes;
-import org.identityconnectors.framework.common.objects.ResultsHandler;
 import org.identityconnectors.framework.common.objects.filter.EqualsFilter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -66,7 +66,6 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import org.apache.syncope.core.provisioning.api.pushpull.PullCorrelationRule;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 import org.apache.syncope.core.provisioning.api.data.ItemTransformer;
 
@@ -115,43 +114,37 @@ public class PullUtils {
     @Autowired
     private IntAttrNameParser intAttrNameParser;
 
-    public String findMatchingAnyKey(
+    public Optional<String> findMatchingAnyKey(
             final AnyType anyType,
             final String name,
             final ExternalResource resource,
             final Connector connector) {
 
-        Provision provision = resource.getProvision(anyType);
-        if (provision == null) {
-            return null;
+        Optional<? extends Provision> provision = resource.getProvision(anyType);
+        if (!provision.isPresent()) {
+            return Optional.empty();
         }
 
-        String result = null;
+        Optional<String> result = Optional.empty();
 
         AnyUtils anyUtils = anyUtilsFactory.getInstance(anyType.getKind());
 
         final List<ConnectorObject> found = new ArrayList<>();
-        connector.search(provision.getObjectClass(),
-                new EqualsFilter(new Name(name)),
-                new ResultsHandler() {
-
-            @Override
-            public boolean handle(final ConnectorObject obj) {
-                return found.add(obj);
-            }
-        }, MappingUtils.buildOperationOptions(MappingUtils.getPullItems(provision).iterator()));
+        connector.search(provision.get().getObjectClass(),
+                new EqualsFilter(new Name(name)), obj -> found.add(obj),
+                MappingUtils.buildOperationOptions(MappingUtils.getPullItems(provision.get()).iterator()));
 
         if (found.isEmpty()) {
-            LOG.debug("No {} found on {} with __NAME__ {}", provision.getObjectClass(), resource, name);
+            LOG.debug("No {} found on {} with __NAME__ {}", provision.get().getObjectClass(), resource, name);
         } else {
             if (found.size() > 1) {
                 LOG.warn("More than one {} found on {} with __NAME__ {} - taking first only",
-                        provision.getObjectClass(), resource, name);
+                        provision.get().getObjectClass(), resource, name);
             }
 
             ConnectorObject connObj = found.iterator().next();
             try {
-                List<String> anyKeys = findExisting(connObj.getUid().getUidValue(), connObj, provision, anyUtils);
+                List<String> anyKeys = findExisting(connObj.getUid().getUidValue(), connObj, provision.get(), anyUtils);
                 if (anyKeys.isEmpty()) {
                     LOG.debug("No matching {} found for {}, aborting", anyUtils.getAnyTypeKind(), connObj);
                 } else {
@@ -159,7 +152,7 @@ public class PullUtils {
                         LOG.warn("More than one {} found {} - taking first only", anyUtils.getAnyTypeKind(), anyKeys);
                     }
 
-                    result = anyKeys.iterator().next();
+                    result = Optional.ofNullable(anyKeys.iterator().next());
                 }
             } catch (IllegalArgumentException e) {
                 LOG.warn(e.getMessage());
@@ -180,12 +173,12 @@ public class PullUtils {
     private List<String> findByConnObjectKeyItem(
             final String uid, final Provision provision, final AnyUtils anyUtils) {
 
-        MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
+        Optional<MappingItem> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
 
         String transfUid = uid;
-        for (ItemTransformer transformer : MappingUtils.getItemTransformers(connObjectKeyItem)) {
+        for (ItemTransformer transformer : MappingUtils.getItemTransformers(connObjectKeyItem.get())) {
             List<Object> output = transformer.beforePull(
-                    connObjectKeyItem,
+                    connObjectKeyItem.get(),
                     null,
                     Collections.<Object>singletonList(transfUid));
             if (output != null && !output.isEmpty()) {
@@ -196,7 +189,7 @@ public class PullUtils {
         List<String> result = new ArrayList<>();
 
         IntAttrName intAttrName = intAttrNameParser.parse(
-                connObjectKeyItem.getIntAttrName(),
+                connObjectKeyItem.get().getIntAttrName(),
                 provision.getAnyType().getKind());
 
         if (intAttrName.getField() != null) {
@@ -247,17 +240,17 @@ public class PullUtils {
 
                     List<? extends Any<?>> anys = getAnyDAO(provision.getAnyType().getKind()).
                             findByPlainAttrValue(intAttrName.getSchemaName(), value);
-                    for (Any<?> any : anys) {
+                    anys.forEach(any -> {
                         result.add(any.getKey());
-                    }
+                    });
                     break;
 
                 case DERIVED:
                     anys = getAnyDAO(provision.getAnyType().getKind()).
                             findByDerAttrValue(intAttrName.getSchemaName(), transfUid);
-                    for (Any<?> any : anys) {
+                    anys.forEach(any -> {
                         result.add(any.getKey());
-                    }
+                    });
                     break;
 
                 default:
@@ -271,9 +264,9 @@ public class PullUtils {
             final ConnectorObject connObj, final PullCorrelationRule rule, final AnyTypeKind type) {
 
         List<String> result = new ArrayList<>();
-        for (Any<?> any : searchDAO.search(rule.getSearchCond(connObj), type)) {
+        searchDAO.search(rule.getSearchCond(connObj), type).forEach(any -> {
             result.add(any.getKey());
-        }
+        });
 
         return result;
     }
@@ -337,12 +330,12 @@ public class PullUtils {
             final ConnectorObject connObj,
             final OrgUnit orgUnit) {
 
-        OrgUnitItem connObjectKeyItem = orgUnit.getConnObjectKeyItem();
+        Optional<? extends OrgUnitItem> connObjectKeyItem = orgUnit.getConnObjectKeyItem();
 
         String transfUid = uid;
-        for (ItemTransformer transformer : MappingUtils.getItemTransformers(connObjectKeyItem)) {
+        for (ItemTransformer transformer : MappingUtils.getItemTransformers(connObjectKeyItem.get())) {
             List<Object> output = transformer.beforePull(
-                    connObjectKeyItem,
+                    connObjectKeyItem.get(),
                     null,
                     Collections.<Object>singletonList(transfUid));
             if (output != null && !output.isEmpty()) {
@@ -353,7 +346,7 @@ public class PullUtils {
         List<String> result = new ArrayList<>();
 
         Realm realm;
-        switch (connObjectKeyItem.getIntAttrName()) {
+        switch (connObjectKeyItem.get().getIntAttrName()) {
             case "key":
                 realm = realmDAO.find(transfUid);
                 if (realm != null) {
@@ -362,7 +355,8 @@ public class PullUtils {
                 break;
 
             case "name":
-                CollectionUtils.collect(realmDAO.findByName(transfUid), EntityUtils.keyTransformer(), result);
+                result.addAll(realmDAO.findByName(transfUid).stream().
+                        map(r -> r.getKey()).collect(Collectors.toList()));
                 break;
 
             case "fullpath":

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
index 8a4a036..996ccad 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/PushJobDelegate.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.provisioning.java.pushpull;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.search.SearchCondConverter;
@@ -38,6 +39,7 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.api.entity.task.PushTask;
+import org.apache.syncope.core.persistence.api.entity.task.PushTaskAnyFilter;
 import org.apache.syncope.core.provisioning.api.Connector;
 import org.apache.syncope.core.provisioning.api.pushpull.AnyObjectPushResultHandler;
 import org.apache.syncope.core.provisioning.api.pushpull.GroupPushResultHandler;
@@ -119,7 +121,7 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
         LOG.debug("Executing push on {}", pushTask.getResource());
 
         List<PushActions> actions = new ArrayList<>();
-        for (String className : pushTask.getActionsClassNames()) {
+        pushTask.getActionsClassNames().forEach(className -> {
             try {
                 Class<?> actionsClass = Class.forName(className);
 
@@ -129,7 +131,7 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
             } catch (Exception e) {
                 LOG.info("Class '{}' not found", className, e);
             }
-        }
+        });
 
         ProvisioningProfile<PushTask, PushActions> profile = new ProvisioningProfile<>(connector, pushTask);
         profile.getActions().addAll(actions);
@@ -195,9 +197,10 @@ public class PushJobDelegate extends AbstractProvisioningJobDelegate<PushTask> {
                         handler = ahandler;
                 }
 
-                String filter = pushTask.getFilter(provision.getAnyType()) == null
-                        ? null
-                        : pushTask.getFilter(provision.getAnyType()).getFIQLCond();
+                Optional<? extends PushTaskAnyFilter> anyFilter = pushTask.getFilter(provision.getAnyType());
+                String filter = anyFilter.isPresent()
+                        ? anyFilter.get().getFIQLCond()
+                        : null;
                 SearchCond cond = StringUtils.isBlank(filter)
                         ? anyDAO.getAllMatchingCond()
                         : SearchCondConverter.convert(filter);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
index 4becdad..655f0c5 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/pushpull/RealmPushResultHandlerImpl.java
@@ -23,6 +23,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.AuditElements;
@@ -195,12 +196,12 @@ public class RealmPushResultHandlerImpl
 
         // Try to read remote object BEFORE any actual operation
         OrgUnit orgUnit = profile.getTask().getResource().getOrgUnit();
-        OrgUnitItem connObjectKey = orgUnit.getConnObjectKeyItem();
+        Optional<? extends OrgUnitItem> connObjectKey = orgUnit.getConnObjectKeyItem();
         String connObjecKeyValue = mappingManager.getConnObjectKeyValue(realm, orgUnit);
 
         ConnectorObject beforeObj = getRemoteObject(
                 orgUnit.getObjectClass(),
-                connObjectKey.getExtAttrName(),
+                connObjectKey.get().getExtAttrName(),
                 connObjecKeyValue,
                 orgUnit.getItems().iterator());
 
@@ -374,7 +375,7 @@ public class RealmPushResultHandlerImpl
                 resultStatus = AuditElements.Result.SUCCESS;
                 output = getRemoteObject(
                         orgUnit.getObjectClass(),
-                        connObjectKey.getExtAttrName(),
+                        connObjectKey.get().getExtAttrName(),
                         connObjecKeyValue,
                         orgUnit.getItems().iterator());
             } catch (IgnoreProvisionException e) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
index 249e488..ca98f76 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/ConnObjectUtils.java
@@ -34,8 +34,6 @@ import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
-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.user.User;
 import org.apache.syncope.core.spring.security.Encryptor;
 import org.apache.syncope.core.spring.security.PasswordGenerator;
@@ -43,7 +41,6 @@ import org.apache.syncope.core.spring.security.SecureRandomUtils;
 import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
-import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.api.entity.task.PullTask;
 import org.apache.syncope.core.provisioning.api.MappingManager;
@@ -52,7 +49,6 @@ import org.identityconnectors.common.Base64;
 import org.identityconnectors.common.security.GuardedByteArray;
 import org.identityconnectors.common.security.GuardedString;
 import org.identityconnectors.common.security.SecurityUtil;
-import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -134,19 +130,18 @@ public class ConnObjectUtils {
 
             Realm realm = realmDAO.findByFullPath(userTO.getRealm());
             if (realm != null) {
-                for (Realm ancestor : realmDAO.findAncestors(realm)) {
-                    if (ancestor.getPasswordPolicy() != null) {
-                        ruleConfs.addAll(ancestor.getPasswordPolicy().getRuleConfs());
-                    }
-                }
+                realmDAO.findAncestors(realm).stream().
+                        filter(ancestor -> (ancestor.getPasswordPolicy() != null)).
+                        forEachOrdered(ancestor -> {
+                            ruleConfs.addAll(ancestor.getPasswordPolicy().getRuleConfs());
+                        });
             }
 
-            for (String resName : userTO.getResources()) {
-                ExternalResource resource = resourceDAO.find(resName);
-                if (resource != null && resource.getPasswordPolicy() != null) {
-                    ruleConfs.addAll(resource.getPasswordPolicy().getRuleConfs());
-                }
-            }
+            userTO.getResources().stream().map(resName -> resourceDAO.find(resName)).
+                    filter(resource -> (resource != null && resource.getPasswordPolicy() != null)).
+                    forEachOrdered(resource -> {
+                        ruleConfs.addAll(resource.getPasswordPolicy().getRuleConfs());
+                    });
 
             String password;
             try {
@@ -165,9 +160,9 @@ public class ConnObjectUtils {
     public RealmTO getRealmTO(final ConnectorObject obj, final PullTask task, final OrgUnit orgUnit) {
         RealmTO realmTO = new RealmTO();
 
-        for (OrgUnitItem item : MappingUtils.getPullItems(orgUnit)) {
+        MappingUtils.getPullItems(orgUnit).forEach(item -> {
             mappingManager.setIntValues(item, obj.getAttributeByName(item.getExtAttrName()), realmTO);
-        }
+        });
 
         return realmTO;
     }
@@ -268,9 +263,9 @@ public class ConnObjectUtils {
 
         // 1. fill with data from connector object
         anyTO.setRealm(pullTask.getDestinatioRealm().getFullPath());
-        for (MappingItem item : MappingUtils.getPullItems(provision)) {
+        MappingUtils.getPullItems(provision).forEach(item -> {
             mappingManager.setIntValues(item, obj.getAttributeByName(item.getExtAttrName()), anyTO, anyUtils);
-        }
+        });
 
         // 2. add data from defined template (if any)
         templateUtils.apply(anyTO, pullTask.getTemplate(provision.getAnyType()));
@@ -288,26 +283,24 @@ public class ConnObjectUtils {
         final ConnObjectTO connObjectTO = new ConnObjectTO();
 
         if (connObject != null) {
-            for (Attribute attr : connObject.getAttributes()) {
+            connObject.getAttributes().stream().map(attr -> {
                 AttrTO attrTO = new AttrTO();
                 attrTO.setSchema(attr.getName());
-
                 if (attr.getValue() != null) {
-                    for (Object value : attr.getValue()) {
-                        if (value != null) {
-                            if (value instanceof GuardedString || value instanceof GuardedByteArray) {
-                                attrTO.getValues().add(getPassword(value));
-                            } else if (value instanceof byte[]) {
-                                attrTO.getValues().add(Base64.encode((byte[]) value));
-                            } else {
-                                attrTO.getValues().add(value.toString());
-                            }
+                    attr.getValue().stream().filter(value -> value != null).forEachOrdered(value -> {
+                        if (value instanceof GuardedString || value instanceof GuardedByteArray) {
+                            attrTO.getValues().add(getPassword(value));
+                        } else if (value instanceof byte[]) {
+                            attrTO.getValues().add(Base64.encode((byte[]) value));
+                        } else {
+                            attrTO.getValues().add(value.toString());
                         }
-                    }
+                    });
                 }
-
+                return attrTO;
+            }).forEachOrdered((attrTO) -> {
                 connObjectTO.getAttrs().add(attrTO);
-            }
+            });
         }
 
         return connObjectTO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
index ce794af..ebe4e2b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/MappingUtils.java
@@ -19,12 +19,13 @@
 package org.apache.syncope.core.provisioning.java.utils;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.jexl3.JexlContext;
 import org.apache.commons.jexl3.MapContext;
 import org.apache.commons.lang3.ClassUtils;
@@ -57,55 +58,43 @@ public final class MappingUtils {
 
     private static final Logger LOG = LoggerFactory.getLogger(MappingUtils.class);
 
-    public static MappingItem getConnObjectKeyItem(final Provision provision) {
+    public static Optional<MappingItem> getConnObjectKeyItem(final Provision provision) {
         Mapping mapping = null;
         if (provision != null) {
             mapping = provision.getMapping();
         }
 
-        return mapping == null
+        return Optional.ofNullable(mapping == null
                 ? null
-                : mapping.getConnObjectKeyItem();
+                : mapping.getConnObjectKeyItem().get());
     }
 
     public static List<? extends MappingItem> getPropagationItems(final Provision provision) {
-        return ListUtils.select(provision.getMapping().getItems(), new Predicate<MappingItem>() {
-
-            @Override
-            public boolean evaluate(final MappingItem item) {
-                return item.getPurpose() == MappingPurpose.PROPAGATION || item.getPurpose() == MappingPurpose.BOTH;
-            }
-        });
+        return provision == null
+                ? Collections.emptyList()
+                : provision.getMapping().getItems().stream().
+                        filter(item -> item.getPurpose() == MappingPurpose.PROPAGATION
+                        || item.getPurpose() == MappingPurpose.BOTH).collect(Collectors.toList());
     }
 
     public static List<? extends MappingItem> getPullItems(final Provision provision) {
-        return ListUtils.select(provision.getMapping().getItems(), new Predicate<MappingItem>() {
-
-            @Override
-            public boolean evaluate(final MappingItem item) {
-                return item.getPurpose() == MappingPurpose.PULL || item.getPurpose() == MappingPurpose.BOTH;
-            }
-        });
+        return provision == null
+                ? Collections.emptyList()
+                : provision.getMapping().getItems().stream().
+                        filter(item -> item.getPurpose() == MappingPurpose.PULL
+                        || item.getPurpose() == MappingPurpose.BOTH).collect(Collectors.toList());
     }
 
     public static List<? extends OrgUnitItem> getPropagationItems(final OrgUnit orgUnit) {
-        return ListUtils.select(orgUnit.getItems(), new Predicate<OrgUnitItem>() {
-
-            @Override
-            public boolean evaluate(final OrgUnitItem item) {
-                return item.getPurpose() == MappingPurpose.PROPAGATION || item.getPurpose() == MappingPurpose.BOTH;
-            }
-        });
+        return orgUnit.getItems().stream().
+                filter(item -> item.getPurpose() == MappingPurpose.PROPAGATION
+                || item.getPurpose() == MappingPurpose.BOTH).collect(Collectors.toList());
     }
 
     public static List<? extends OrgUnitItem> getPullItems(final OrgUnit orgUnit) {
-        return ListUtils.select(orgUnit.getItems(), new Predicate<OrgUnitItem>() {
-
-            @Override
-            public boolean evaluate(final OrgUnitItem item) {
-                return item.getPurpose() == MappingPurpose.PULL || item.getPurpose() == MappingPurpose.BOTH;
-            }
-        });
+        return orgUnit.getItems().stream().
+                filter(item -> item.getPurpose() == MappingPurpose.PULL
+                || item.getPurpose() == MappingPurpose.BOTH).collect(Collectors.toList());
     }
 
     private static Name evaluateNAME(final String evalConnObjectLink, final String connObjectKey) {
@@ -209,7 +198,7 @@ public final class MappingUtils {
         }
 
         // Then other custom tranaformers
-        for (String className : mappingItemTransformerClassNames) {
+        mappingItemTransformerClassNames.forEach(className -> {
             try {
                 Class<?> transformerClass = ClassUtils.getClass(className);
 
@@ -218,7 +207,7 @@ public final class MappingUtils {
             } catch (Exception e) {
                 LOG.error("Could not instantiate {}, ignoring...", className, e);
             }
-        }
+        });
 
         return result;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
index ef47ef1..0994252 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/utils/TemplateUtils.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.provisioning.java.utils;
 
 import java.util.Map;
+import java.util.Optional;
 import org.apache.commons.jexl3.MapContext;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.EntityTOUtils;
@@ -28,8 +29,6 @@ import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
-import org.apache.syncope.common.lib.to.MembershipTO;
-import org.apache.syncope.common.lib.to.RelationshipTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.provisioning.java.jexl.JexlUtils;
@@ -56,12 +55,12 @@ public class TemplateUtils {
         result.setSchema(template.getSchema());
 
         if (template.getValues() != null && !template.getValues().isEmpty()) {
-            for (String value : template.getValues()) {
+            template.getValues().forEach(value -> {
                 String evaluated = JexlUtils.evaluate(value, anyTO, new MapContext());
                 if (StringUtils.isNotBlank(evaluated)) {
                     result.getValues().add(evaluated);
                 }
-            }
+            });
         }
 
         return result;
@@ -108,25 +107,26 @@ public class TemplateUtils {
     }
 
     private void fillRelationships(final GroupableRelatableTO any, final GroupableRelatableTO template) {
-        for (RelationshipTO relationship : template.getRelationships()) {
-            if (any.getRelationship(relationship.getRightKey(), relationship.getRightKey()) == null) {
-                any.getRelationships().add(relationship);
-            }
-        }
+        template.getRelationships().stream().
+                filter(relationship
+                        -> !any.getRelationship(relationship.getRightKey(), relationship.getRightKey()).isPresent()).
+                forEachOrdered(relationship -> {
+                    any.getRelationships().add(relationship);
+                });
     }
 
     private void fillMemberships(final GroupableRelatableTO any, final GroupableRelatableTO template) {
-        for (MembershipTO membership : template.getMemberships()) {
-            if (any.getMembership(membership.getGroupKey()) == null) {
-                any.getMemberships().add(membership);
-            }
-        }
+        template.getMemberships().stream().
+                filter(membership -> !any.getMembership(membership.getGroupKey()).isPresent()).
+                forEachOrdered(membership -> {
+                    any.getMemberships().add(membership);
+                });
     }
 
     @Transactional(readOnly = true)
-    public <T extends AnyTO> void apply(final T anyTO, final AnyTemplate anyTemplate) {
-        if (anyTemplate != null) {
-            apply(anyTO, anyTemplate.get());
+    public <T extends AnyTO> void apply(final T anyTO, final Optional<? extends AnyTemplate> anyTemplate) {
+        if (anyTemplate.isPresent()) {
+            apply(anyTO, anyTemplate.get().get());
         }
     }
 
@@ -180,18 +180,20 @@ public class TemplateUtils {
     public void check(final Map<String, AnyTO> templates, final ClientExceptionType clientExceptionType) {
         SyncopeClientException sce = SyncopeClientException.build(clientExceptionType);
 
-        for (Map.Entry<String, AnyTO> entry : templates.entrySet()) {
-            for (AttrTO attrTO : entry.getValue().getPlainAttrs()) {
-                if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) {
-                    sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
-                }
-            }
-
-            for (AttrTO attrTO : entry.getValue().getVirAttrs()) {
-                if (!attrTO.getValues().isEmpty() && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))) {
-                    sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
-                }
-            }
+        templates.entrySet().forEach(entry -> {
+            entry.getValue().getPlainAttrs().stream().
+                    filter(attrTO -> !attrTO.getValues().isEmpty()
+                    && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))).
+                    forEachOrdered(attrTO -> {
+                        sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
+                    });
+
+            entry.getValue().getVirAttrs().stream().
+                    filter(attrTO -> !attrTO.getValues().isEmpty()
+                    && !JexlUtils.isExpressionValid(attrTO.getValues().get(0))).
+                    forEachOrdered((attrTO) -> {
+                        sce.getElements().add("Invalid JEXL: " + attrTO.getValues().get(0));
+                    });
 
             if (entry.getValue() instanceof UserTO) {
                 UserTO template = (UserTO) entry.getValue();
@@ -213,7 +215,7 @@ public class TemplateUtils {
                     sce.getElements().add("Invalid JEXL: " + template.getName());
                 }
             }
-        }
+        });
 
         if (!sce.isEmpty()) {
             throw sce;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
index 0434619..ebf1807 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ConnectorManagerTest.java
@@ -20,10 +20,7 @@ package org.apache.syncope.core.provisioning.java;
 
 import static org.junit.Assert.assertEquals;
 
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
 import org.apache.syncope.core.provisioning.api.Connector;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
@@ -59,13 +56,8 @@ public class ConnectorManagerTest extends AbstractTest {
         connManager.load();
 
         // only consider local connector bundles
-        long expected = IterableUtils.countMatches(resourceDAO.findAll(), new Predicate<ExternalResource>() {
-
-            @Override
-            public boolean evaluate(final ExternalResource resource) {
-                return resource.getConnector().getLocation().startsWith("file");
-            }
-        });
+        long expected = resourceDAO.findAll().stream().
+                filter(resource -> resource.getConnector().getLocation().startsWith("file")).count();
 
         assertEquals(expected,
                 ApplicationContextProvider.getBeanFactory().

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MailTemplateTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MailTemplateTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MailTemplateTest.java
index cb9177a..8e3fa9b 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MailTemplateTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MailTemplateTest.java
@@ -59,7 +59,7 @@ public class MailTemplateTest extends AbstractTest {
     public void confirmPasswordReset() throws IOException {
         String htmlBody = evaluate(
                 mailTemplateDAO.find("confirmPasswordReset").getHTMLTemplate(),
-                new HashMap<String, Object>());
+                new HashMap<>());
 
         assertNotNull(htmlBody);
     }
@@ -111,7 +111,7 @@ public class MailTemplateTest extends AbstractTest {
         ctx.put("input", input);
 
         UserTO recipient = SerializationUtils.clone(user);
-        recipient.getPlainAttr("email").getValues().set(0, "another@syncope.apache.org");
+        recipient.getPlainAttr("email").get().getValues().set(0, "another@syncope.apache.org");
         ctx.put("recipients", Collections.singletonList(recipient));
 
         String htmlBody = evaluate(

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
index 16e8ddf..8e6887a 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/MappingTest.java
@@ -58,7 +58,7 @@ public class MappingTest extends AbstractTest {
         ExternalResource ldap = resourceDAO.find("resource-ldap");
         assertNotNull(ldap);
 
-        Provision provision = ldap.getProvision(anyTypeDAO.findUser());
+        Provision provision = ldap.getProvision(anyTypeDAO.findUser()).get();
         assertNotNull(provision);
         assertNotNull(provision.getMapping());
         assertNotNull(provision.getMapping().getConnObjectLink());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
index bc7329a..af4247c 100644
--- a/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
+++ b/core/provisioning-java/src/test/java/org/apache/syncope/core/provisioning/java/ResourceDataBinderTest.java
@@ -21,12 +21,10 @@ package org.apache.syncope.core.provisioning.java;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
-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.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
@@ -71,14 +69,9 @@ public class ResourceDataBinderTest extends AbstractTest {
 
     @BeforeClass
     public static void setAuthContext() {
-        List<GrantedAuthority> authorities = CollectionUtils.collect(StandardEntitlement.values(),
-                new Transformer<String, GrantedAuthority>() {
-
-            @Override
-            public GrantedAuthority transform(final String entitlement) {
-                return new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM);
-            }
-        }, new ArrayList<GrantedAuthority>());
+        List<GrantedAuthority> authorities = StandardEntitlement.values().stream().
+                map(entitlement -> new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM)).
+                collect(Collectors.toList());
 
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
                 new org.springframework.security.core.userdetails.User(
@@ -98,10 +91,10 @@ public class ResourceDataBinderTest extends AbstractTest {
 
         Set<MappingItem> beforeUserIdMappings = new HashSet<>();
         for (ExternalResource res : resourceDAO.findAll()) {
-            if (res.getProvision(anyTypeDAO.findUser()) != null
-                    && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+            if (res.getProvision(anyTypeDAO.findUser()).isPresent()
+                    && res.getProvision(anyTypeDAO.findUser()).get().getMapping() != null) {
 
-                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems()) {
                     if (userId.getKey().equals(mapItem.getIntAttrName())) {
                         beforeUserIdMappings.add(mapItem);
                     }
@@ -133,8 +126,8 @@ public class ResourceDataBinderTest extends AbstractTest {
         ExternalResource resource = resourceDataBinder.create(resourceTO);
         resource = resourceDAO.save(resource);
         assertNotNull(resource);
-        assertNotNull(resource.getProvision(anyTypeDAO.findUser()).getMapping());
-        assertEquals(1, resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+        assertNotNull(resource.getProvision(anyTypeDAO.findUser()).get().getMapping());
+        assertEquals(1, resource.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().size());
 
         resourceDAO.flush();
 
@@ -146,10 +139,10 @@ public class ResourceDataBinderTest extends AbstractTest {
 
         Set<MappingItem> afterUserIdMappings = new HashSet<>();
         for (ExternalResource res : resourceDAO.findAll()) {
-            if (res.getProvision(anyTypeDAO.findUser()) != null
-                    && res.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+            if (res.getProvision(anyTypeDAO.findUser()).isPresent()
+                    && res.getProvision(anyTypeDAO.findUser()).get().getMapping() != null) {
 
-                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                for (MappingItem mapItem : res.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems()) {
                     if (userId.getKey().equals(mapItem.getIntAttrName())) {
                         afterUserIdMappings.add(mapItem);
                     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java
index 8595293..e2a1858 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/WadlGenerator.java
@@ -24,10 +24,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import javax.ws.rs.Path;
 import javax.ws.rs.container.ContainerRequestContext;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.cxf.BusFactory;
 import org.apache.cxf.common.util.ClasspathScanner;
 import org.apache.cxf.jaxrs.model.ClassResourceInfo;
@@ -84,27 +83,22 @@ public class WadlGenerator extends org.apache.cxf.jaxrs.model.wadl.WadlGenerator
 
                 List<ClassResourceInfo> classResourceInfos = new ArrayList<>();
                 for (final Class<?> beanClass : resourceClasses) {
-                    ClassResourceInfo cri = IterableUtils.find(classResourceInfos, new Predicate<ClassResourceInfo>() {
-
-                        @Override
-                        public boolean evaluate(final ClassResourceInfo cri) {
-                            return cri.isCreatedFromModel() && cri.isRoot()
-                                    && cri.getServiceClass().isAssignableFrom(beanClass);
-                        }
-                    });
-                    if (cri != null) {
-                        if (!InjectionUtils.isConcreteClass(cri.getServiceClass())) {
-                            cri = new ClassResourceInfo(cri);
-                            classResourceInfos.add(cri);
+                    Optional<ClassResourceInfo> cri = classResourceInfos.stream().filter(c
+                            -> c.isCreatedFromModel() && c.isRoot() && c.getServiceClass().isAssignableFrom(beanClass)).
+                            findFirst();
+                    if (cri.isPresent()) {
+                        if (!InjectionUtils.isConcreteClass(cri.get().getServiceClass())) {
+                            cri = Optional.of(new ClassResourceInfo(cri.get()));
+                            classResourceInfos.add(cri.get());
                         }
-                        cri.setResourceClass(beanClass);
+                        cri.get().setResourceClass(beanClass);
                         continue;
                     }
 
-                    cri = ResourceUtils.createClassResourceInfo(
-                            beanClass, beanClass, true, true, BusFactory.getDefaultBus());
-                    if (cri != null) {
-                        classResourceInfos.add(cri);
+                    cri = Optional.ofNullable(ResourceUtils.createClassResourceInfo(
+                            beanClass, beanClass, true, true, BusFactory.getDefaultBus()));
+                    if (cri.isPresent()) {
+                        classResourceInfos.add(cri.get());
                     }
                 }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
----------------------------------------------------------------------
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
index 1b7e7f2..ed0f2dd 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.rest.cxf.service;
 
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.core.Response;
@@ -40,7 +41,6 @@ import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.BulkAction;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.PagedResult;
-import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.common.lib.types.ResourceAssociationAction;
@@ -101,7 +101,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
     @Override
     public AttrTO read(final String key, final SchemaType schemaType, final String schema) {
         TO any = read(key);
-        AttrTO result;
+        Optional<AttrTO> result;
         switch (schemaType) {
             case DERIVED:
                 result = any.getDerAttr(schema);
@@ -116,11 +116,11 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                 result = any.getPlainAttr(schema);
         }
 
-        if (result == null) {
+        if (!result.isPresent()) {
             throw new NotFoundException("Attribute for type " + schemaType + " and schema " + schema);
         }
 
-        return result;
+        return result.get();
     }
 
     @Override
@@ -267,17 +267,18 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         BulkActionResult result = new BulkActionResult();
 
         if (patch.getAction() == ResourceDeassociationAction.UNLINK) {
-            for (String resource : patch.getResources()) {
-                result.getResults().put(resource,
+            patch.getResources().forEach(resource -> {
+                result.getResults().put(
+                        resource,
                         updated.getEntity().getResources().contains(resource)
                         ? BulkActionResult.Status.FAILURE
                         : BulkActionResult.Status.SUCCESS);
-            }
+            });
         } else {
-            for (PropagationStatus propagationStatusTO : updated.getPropagationStatuses()) {
-                result.getResults().put(propagationStatusTO.getResource(),
-                        BulkActionResult.Status.valueOf(propagationStatusTO.getStatus().toString()));
-            }
+            updated.getPropagationStatuses().forEach(propagationStatusTO
+                    -> result.getResults().put(
+                            propagationStatusTO.getResource(),
+                            BulkActionResult.Status.valueOf(propagationStatusTO.getStatus().toString())));
         }
 
         return modificationResponse(result);
@@ -323,17 +324,18 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         BulkActionResult result = new BulkActionResult();
 
         if (patch.getAction() == ResourceAssociationAction.LINK) {
-            for (String resource : patch.getResources()) {
-                result.getResults().put(resource,
+            patch.getResources().forEach(resource -> {
+                result.getResults().put(
+                        resource,
                         updated.getEntity().getResources().contains(resource)
                         ? BulkActionResult.Status.SUCCESS
                         : BulkActionResult.Status.FAILURE);
-            }
+            });
         } else {
-            for (PropagationStatus propagationStatusTO : updated.getPropagationStatuses()) {
-                result.getResults().put(propagationStatusTO.getResource(),
-                        BulkActionResult.Status.valueOf(propagationStatusTO.getStatus().toString()));
-            }
+            updated.getPropagationStatuses().forEach(propagationStatusTO
+                    -> result.getResults().put(
+                            propagationStatusTO.getResource(),
+                            BulkActionResult.Status.valueOf(propagationStatusTO.getStatus().toString())));
         }
 
         return modificationResponse(result);
@@ -348,7 +350,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         switch (bulkAction.getType()) {
             case MUSTCHANGEPASSWORD:
                 if (logic instanceof UserLogic) {
-                    for (String key : bulkAction.getTargets()) {
+                    bulkAction.getTargets().forEach(key -> {
                         try {
                             final UserPatch userPatch = new UserPatch();
                             userPatch.setKey(key);
@@ -361,14 +363,14 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                             LOG.error("Error performing delete for user {}", key, e);
                             result.getResults().put(key, BulkActionResult.Status.FAILURE);
                         }
-                    }
+                    });
                 } else {
                     throw new BadRequestException();
                 }
                 break;
 
             case DELETE:
-                for (String key : bulkAction.getTargets()) {
+                bulkAction.getTargets().forEach(key -> {
                     try {
                         result.getResults().put(
                                 logic.delete(key, isNullPriorityAsync()).getEntity().getKey(),
@@ -377,12 +379,12 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                         LOG.error("Error performing delete for user {}", key, e);
                         result.getResults().put(key, BulkActionResult.Status.FAILURE);
                     }
-                }
+                });
                 break;
 
             case SUSPEND:
                 if (logic instanceof UserLogic) {
-                    for (String key : bulkAction.getTargets()) {
+                    bulkAction.getTargets().forEach(key -> {
                         StatusPatch statusPatch = new StatusPatch();
                         statusPatch.setKey(key);
                         statusPatch.setType(StatusPatchType.SUSPEND);
@@ -397,7 +399,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                             LOG.error("Error performing suspend for user {}", key, e);
                             result.getResults().put(key, BulkActionResult.Status.FAILURE);
                         }
-                    }
+                    });
                 } else {
                     throw new BadRequestException();
                 }
@@ -405,7 +407,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
 
             case REACTIVATE:
                 if (logic instanceof UserLogic) {
-                    for (String key : bulkAction.getTargets()) {
+                    bulkAction.getTargets().forEach(key -> {
                         StatusPatch statusPatch = new StatusPatch();
                         statusPatch.setKey(key);
                         statusPatch.setType(StatusPatchType.REACTIVATE);
@@ -420,7 +422,7 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                             LOG.error("Error performing reactivate for user {}", key, e);
                             result.getResults().put(key, BulkActionResult.Status.FAILURE);
                         }
-                    }
+                    });
                 } else {
                     throw new BadRequestException();
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
----------------------------------------------------------------------
diff --git a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
index cc0b4fd..8080676 100644
--- a/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
+++ b/core/spring/src/main/java/org/apache/syncope/core/spring/security/AuthContextUtils.java
@@ -18,16 +18,13 @@
  */
 package org.apache.syncope.core.spring.security;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.core.provisioning.api.EntitlementsHolder;
@@ -69,11 +66,9 @@ public final class AuthContextUtils {
         SecurityContext ctx = SecurityContextHolder.getContext();
         if (ctx != null && ctx.getAuthentication() != null && ctx.getAuthentication().getAuthorities() != null) {
             Set<SyncopeGrantedAuthority> result = new HashSet<>();
-            for (GrantedAuthority authority : ctx.getAuthentication().getAuthorities()) {
-                if (authority instanceof SyncopeGrantedAuthority) {
-                    result.add(SyncopeGrantedAuthority.class.cast(authority));
-                }
-            }
+            ctx.getAuthentication().getAuthorities().stream().
+                    filter(authority -> (authority instanceof SyncopeGrantedAuthority)).
+                    forEachOrdered(authority -> result.add(SyncopeGrantedAuthority.class.cast(authority)));
 
             return result;
         }
@@ -96,7 +91,7 @@ public final class AuthContextUtils {
             }
         }
 
-        return MapUtils.emptyIfNull(result);
+        return result == null ? Collections.emptyMap() : result;
     }
 
     public static String getDomain() {
@@ -113,14 +108,9 @@ public final class AuthContextUtils {
     }
 
     private static void setFakeAuth(final String domain) {
-        List<GrantedAuthority> authorities = CollectionUtils.collect(EntitlementsHolder.getInstance().getValues(),
-                new Transformer<String, GrantedAuthority>() {
-
-            @Override
-            public GrantedAuthority transform(final String entitlement) {
-                return new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM);
-            }
-        }, new ArrayList<GrantedAuthority>());
+        List<GrantedAuthority> authorities = EntitlementsHolder.getInstance().getValues().stream().
+                map(entitlement -> new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM)).
+                collect(Collectors.toList());
 
         UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(
                 new User(ApplicationContextProvider.getBeanFactory().getBean("adminUser", String.class),