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

[07/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-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/RealmUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/RealmUtils.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/RealmUtils.java
index a21e1de..c4de549 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/RealmUtils.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/RealmUtils.java
@@ -21,9 +21,8 @@ package org.apache.syncope.core.provisioning.api.utils;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
 public final class RealmUtils {
 
@@ -52,9 +51,7 @@ public final class RealmUtils {
     public static Set<String> normalize(final Collection<String> realms) {
         Set<String> normalized = new HashSet<>();
         if (realms != null) {
-            for (String realm : realms) {
-                normalizingAddTo(normalized, realm);
-            }
+            realms.forEach(realm -> normalizingAddTo(normalized, realm));
         }
 
         return normalized;
@@ -69,14 +66,8 @@ public final class RealmUtils {
         }
 
         @Override
-        public boolean evaluate(final String realm) {
-            return IterableUtils.matchesAny(targets, new Predicate<String>() {
-
-                @Override
-                public boolean evaluate(final String target) {
-                    return realm.startsWith(target);
-                }
-            });
+        public boolean test(final String realm) {
+            return targets.stream().anyMatch(target -> realm.startsWith(target));
         }
 
     }
@@ -84,7 +75,7 @@ public final class RealmUtils {
     public static class DynRealmsPredicate implements Predicate<String> {
 
         @Override
-        public boolean evaluate(final String realm) {
+        public boolean test(final String realm) {
             return !realm.startsWith("/");
         }
     }
@@ -95,11 +86,13 @@ public final class RealmUtils {
         requested.add(requestedRealm);
 
         Set<String> effective = new HashSet<>();
-        CollectionUtils.select(requested, new StartsWithPredicate(allowed), effective);
-        CollectionUtils.select(allowed, new StartsWithPredicate(requested), effective);
+        effective.addAll(requested.stream().filter(new StartsWithPredicate(allowed)).collect(Collectors.toSet()));
+        effective.addAll(allowed.stream().filter(new StartsWithPredicate(requested)).collect(Collectors.toSet()));
 
         // includes dynamic realms
-        CollectionUtils.select(allowedRealms, new DynRealmsPredicate(), effective);
+        if (allowedRealms != null) {
+            effective.addAll(allowedRealms.stream().filter(new DynRealmsPredicate()).collect(Collectors.toSet()));
+        }
 
         return effective;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
index 2b42e91..f1c463d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/ConnectorFacadeProxy.java
@@ -20,14 +20,11 @@ package org.apache.syncope.core.provisioning.java;
 
 import java.io.File;
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
-import org.apache.syncope.common.lib.types.ConnConfProperty;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
 import org.apache.syncope.core.provisioning.api.ConnIdBundleManager;
@@ -108,12 +105,12 @@ public class ConnectorFacadeProxy implements Connector {
 
         // set connector configuration according to conninstance's
         ConfigurationProperties properties = apiConfig.getConfigurationProperties();
-        for (ConnConfProperty property : connInstance.getConf()) {
-            if (property.getValues() != null && !property.getValues().isEmpty()) {
-                properties.setPropertyValue(property.getSchema().getName(),
-                        getPropertyValue(property.getSchema().getType(), property.getValues()));
-            }
-        }
+        connInstance.getConf().stream().
+                filter(property -> (property.getValues() != null && !property.getValues().isEmpty())).
+                forEachOrdered(property -> {
+                    properties.setPropertyValue(property.getSchema().getName(),
+                            getPropertyValue(property.getSchema().getType(), property.getValues()));
+                });
 
         // set pooling configuration (if supported) according to conninstance's
         if (connInstance.getPoolConf() != null) {
@@ -476,13 +473,9 @@ public class ConnectorFacadeProxy implements Connector {
         if (pagedResultsCookie != null) {
             builder.setPagedResultsCookie(pagedResultsCookie);
         }
-        builder.setSortKeys(CollectionUtils.collect(orderBy, new Transformer<OrderByClause, SortKey>() {
-
-            @Override
-            public SortKey transform(final OrderByClause clause) {
-                return new SortKey(clause.getField(), clause.getDirection() == OrderByClause.Direction.ASC);
-            }
-        }, new ArrayList<SortKey>(orderBy.size())));
+        builder.setSortKeys(orderBy.stream().map(clause
+                -> new SortKey(clause.getField(), clause.getDirection() == OrderByClause.Direction.ASC)).
+                collect(Collectors.toList()));
 
         builder.setAttributesToGet(options.getAttributesToGet());
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
index 9b23633..0113ebf 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultAnyObjectProvisioningManager.java
@@ -22,8 +22,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.to.PropagationStatus;
@@ -84,7 +83,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(created.getResult(), propagationReporter.getStatuses());
+        return Pair.of(created.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -111,7 +110,7 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(updated.getResult(), propagationReporter.getStatuses());
+        return Pair.of(updated.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -189,7 +188,9 @@ public class DefaultAnyObjectProvisioningManager implements AnyObjectProvisionin
                 AnyTypeKind.ANY_OBJECT,
                 key,
                 propByRes,
-                CollectionUtils.removeAll(anyObjectDAO.findAllResourceKeys(key), resources));
+                anyObjectDAO.findAllResourceKeys(key).stream().
+                        filter(resource -> !resources.contains(resource)).
+                        collect(Collectors.toList()));
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
         return propagationReporter.getStatuses();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
index 31a2833..141561b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultGroupProvisioningManager.java
@@ -23,11 +23,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -81,7 +81,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                 Collections.<String>emptySet());
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(created.getResult(), propagationReporter.getStatuses());
+        return Pair.of(created.getResult(), propagationReporter.getStatuses());
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW)
@@ -95,9 +95,9 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
         WorkflowResult<String> created = gwfAdapter.create(groupTO);
 
         // see ConnObjectUtils#getAnyTOFromConnObject for GroupOwnerSchema
-        AttrTO groupOwner = groupTO.getPlainAttr(StringUtils.EMPTY);
-        if (groupOwner != null) {
-            groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next());
+        Optional<AttrTO> groupOwner = groupTO.getPlainAttr(StringUtils.EMPTY);
+        if (groupOwner.isPresent()) {
+            groupOwnerMap.put(created.getResult(), groupOwner.get().getValues().iterator().next());
         }
 
         List<PropagationTask> tasks = propagationManager.getCreateTasks(
@@ -108,7 +108,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(created.getResult(), propagationReporter.getStatuses());
+        return Pair.of(created.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -133,7 +133,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(updated.getResult(), propagationReporter.getStatuses());
+        return Pair.of(updated.getResult(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -150,24 +150,22 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
 
         // Generate propagation tasks for deleting users and any objects from group resources, 
         // if they are on those resources only because of the reason being deleted (see SYNCOPE-357)
-        for (Map.Entry<String, PropagationByResource> entry
-                : groupDataBinder.findUsersWithTransitiveResources(key).entrySet()) {
-
-            tasks.addAll(propagationManager.getDeleteTasks(
-                    AnyTypeKind.USER,
-                    entry.getKey(),
-                    entry.getValue(),
-                    excludedResources));
-        }
-        for (Map.Entry<String, PropagationByResource> entry
-                : groupDataBinder.findAnyObjectsWithTransitiveResources(key).entrySet()) {
-
-            tasks.addAll(propagationManager.getDeleteTasks(
-                    AnyTypeKind.ANY_OBJECT,
-                    entry.getKey(),
-                    entry.getValue(),
-                    excludedResources));
-        }
+        groupDataBinder.findUsersWithTransitiveResources(key).entrySet().
+                forEach(entry -> {
+                    tasks.addAll(propagationManager.getDeleteTasks(
+                            AnyTypeKind.USER,
+                            entry.getKey(),
+                            entry.getValue(),
+                            excludedResources));
+                });
+        groupDataBinder.findAnyObjectsWithTransitiveResources(key).entrySet().
+                forEach(entry -> {
+                    tasks.addAll(propagationManager.getDeleteTasks(
+                            AnyTypeKind.ANY_OBJECT,
+                            entry.getKey(),
+                            entry.getValue(),
+                            excludedResources));
+                });
 
         // Generate propagation tasks for deleting this group from resources
         tasks.addAll(propagationManager.getDeleteTasks(
@@ -220,7 +218,9 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
                 AnyTypeKind.GROUP,
                 key,
                 propByRes,
-                CollectionUtils.removeAll(groupDAO.findAllResourceKeys(key), resources));
+                groupDAO.findAllResourceKeys(key).stream().
+                        filter(resource -> !resources.contains(resource)).
+                        collect(Collectors.toList()));
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
         return propagationReporter.getStatuses();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
index d59af7b..eda96c4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/DefaultUserProvisioningManager.java
@@ -23,8 +23,7 @@ import java.util.Collections;
 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.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
@@ -109,7 +108,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
                 excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(created.getResult().getLeft(), propagationReporter.getStatuses());
+        return Pair.of(created.getResult().getLeft(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -119,7 +118,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
         List<PropagationTask> tasks = propagationManager.getUserUpdateTasks(updated);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(updated.getResult().getLeft().getKey(), propagationReporter.getStatuses());
+        return Pair.of(updated.getResult().getLeft().getKey(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -148,9 +147,9 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
             result.setStatus(ProvisioningReport.Status.FAILURE);
             result.setMessage("Update failed, trying to pull status anyway (if configured)\n" + e.getMessage());
 
-            updated = new WorkflowResult<Pair<UserPatch, Boolean>>(
-                    new ImmutablePair<>(userPatch, false), new PropagationByResource(),
-                    new HashSet<String>());
+            updated = new WorkflowResult<>(
+                    Pair.of(userPatch, false), new PropagationByResource(),
+                    new HashSet<>());
         }
 
         if (enabled != null) {
@@ -178,7 +177,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
                 updated, updated.getResult().getLeft().getPassword() != null, excludedResources);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
-        return new ImmutablePair<>(updated.getResult().getLeft().getKey(), propagationReporter.getStatuses());
+        return Pair.of(updated.getResult().getLeft().getKey(), propagationReporter.getStatuses());
     }
 
     @Override
@@ -234,7 +233,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
                 ? uwfAdapter.activate(statusPatch.getKey(), statusPatch.getToken())
                 : new WorkflowResult<>(statusPatch.getKey(), null, statusPatch.getType().name().toLowerCase());
 
-        return new ImmutablePair<>(updated.getResult(), propagateStatus(statusPatch, nullPriorityAsync));
+        return Pair.of(updated.getResult(), propagateStatus(statusPatch, nullPriorityAsync));
     }
 
     @Override
@@ -245,7 +244,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
                 ? uwfAdapter.reactivate(statusPatch.getKey())
                 : new WorkflowResult<>(statusPatch.getKey(), null, statusPatch.getType().name().toLowerCase());
 
-        return new ImmutablePair<>(updated.getResult(), propagateStatus(statusPatch, nullPriorityAsync));
+        return Pair.of(updated.getResult(), propagateStatus(statusPatch, nullPriorityAsync));
     }
 
     @Override
@@ -256,7 +255,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
                 ? uwfAdapter.suspend(statusPatch.getKey())
                 : new WorkflowResult<>(statusPatch.getKey(), null, statusPatch.getType().name().toLowerCase());
 
-        return new ImmutablePair<>(updated.getResult(), propagateStatus(statusPatch, nullPriorityAsync));
+        return Pair.of(updated.getResult(), propagateStatus(statusPatch, nullPriorityAsync));
     }
 
     protected List<PropagationStatus> propagateStatus(
@@ -288,7 +287,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
 
             List<PropagationTask> tasks = propagationManager.getUserUpdateTasks(
                     new WorkflowResult<Pair<UserPatch, Boolean>>(
-                            new ImmutablePair<>(userPatch, Boolean.FALSE),
+                            Pair.of(userPatch, Boolean.FALSE),
                             updated.getLeft().getPropByRes(), updated.getLeft().getPerformedTasks()));
             taskExecutor.execute(tasks, false);
         }
@@ -304,14 +303,9 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(key);
-        userPatch.getResources().addAll(CollectionUtils.collect(resources,
-                new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String input) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(input).build();
-            }
-        }, new HashSet<StringPatchItem>()));
+        userPatch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toSet()));
 
         if (changePwd) {
             PasswordPatch passwordPatch = new PasswordPatch();
@@ -324,7 +318,7 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
         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 = propagationManager.getUserUpdateTasks(wfResult, changePwd, null);
@@ -344,7 +338,9 @@ public class DefaultUserProvisioningManager implements UserProvisioningManager {
                 AnyTypeKind.USER,
                 key,
                 propByRes,
-                CollectionUtils.removeAll(userDAO.findAllResourceKeys(key), resources));
+                userDAO.findAllResourceKeys(key).stream().
+                        filter(resource -> !resources.contains(resource)).
+                        collect(Collectors.toList()));
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, nullPriorityAsync);
 
         return propagationReporter.getStatuses();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
index 54ada98..1597b11 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/MappingManagerImpl.java
@@ -22,9 +22,8 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -159,26 +158,26 @@ public class MappingManagerImpl implements MappingManager {
             try {
                 Pair<String, Attribute> preparedAttr = prepareAttr(provision, mapItem, any, password);
                 if (preparedAttr != null) {
-                    if (preparedAttr.getKey() != null) {
-                        connObjectKey = preparedAttr.getKey();
+                    if (preparedAttr.getLeft() != null) {
+                        connObjectKey = preparedAttr.getLeft();
                     }
 
-                    if (preparedAttr.getValue() != null) {
-                        Attribute alreadyAdded = AttributeUtil.find(preparedAttr.getValue().getName(), attributes);
+                    if (preparedAttr.getRight() != null) {
+                        Attribute alreadyAdded = AttributeUtil.find(preparedAttr.getRight().getName(), attributes);
 
                         if (alreadyAdded == null) {
-                            attributes.add(preparedAttr.getValue());
+                            attributes.add(preparedAttr.getRight());
                         } else {
                             attributes.remove(alreadyAdded);
 
                             Set<Object> values = new HashSet<>();
-                            if (CollectionUtils.isNotEmpty(alreadyAdded.getValue())) {
+                            if (alreadyAdded.getValue() != null && !alreadyAdded.getValue().isEmpty()) {
                                 values.addAll(alreadyAdded.getValue());
                             }
 
-                            values.addAll(preparedAttr.getValue().getValue());
+                            values.addAll(preparedAttr.getRight().getValue());
 
-                            attributes.add(AttributeBuilder.build(preparedAttr.getValue().getName(), values));
+                            attributes.add(AttributeBuilder.build(preparedAttr.getRight().getName(), values));
                         }
                     }
                 }
@@ -188,11 +187,11 @@ public class MappingManagerImpl implements MappingManager {
         }
 
         Attribute connObjectKeyExtAttr =
-                AttributeUtil.find(MappingUtils.getConnObjectKeyItem(provision).getExtAttrName(), attributes);
+                AttributeUtil.find(MappingUtils.getConnObjectKeyItem(provision).get().getExtAttrName(), attributes);
         if (connObjectKeyExtAttr != null) {
             attributes.remove(connObjectKeyExtAttr);
             attributes.add(AttributeBuilder.build(
-                    MappingUtils.getConnObjectKeyItem(provision).getExtAttrName(), connObjectKey));
+                    MappingUtils.getConnObjectKeyItem(provision).get().getExtAttrName(), connObjectKey));
         }
         attributes.add(MappingUtils.evaluateNAME(any, provision, connObjectKey));
 
@@ -257,7 +256,7 @@ public class MappingManagerImpl implements MappingManager {
                 attributes.remove(alreadyAdded);
 
                 Set<Object> values = new HashSet<>();
-                if (CollectionUtils.isNotEmpty(alreadyAdded.getValue())) {
+                if (alreadyAdded.getValue() != null && !alreadyAdded.getValue().isEmpty()) {
                     values.addAll(alreadyAdded.getValue());
                 }
                 values.add(value);
@@ -267,10 +266,11 @@ public class MappingManagerImpl implements MappingManager {
         }
 
         Attribute connObjectKeyExtAttr =
-                AttributeUtil.find(orgUnit.getConnObjectKeyItem().getExtAttrName(), attributes);
+                AttributeUtil.find(orgUnit.getConnObjectKeyItem().get().getExtAttrName(), attributes);
         if (connObjectKeyExtAttr != null) {
             attributes.remove(connObjectKeyExtAttr);
-            attributes.add(AttributeBuilder.build(orgUnit.getConnObjectKeyItem().getExtAttrName(), connObjectKey));
+            attributes.add(
+                    AttributeBuilder.build(orgUnit.getConnObjectKeyItem().get().getExtAttrName(), connObjectKey));
         }
         attributes.add(MappingUtils.evaluateNAME(realm, orgUnit, connObjectKey));
 
@@ -412,7 +412,7 @@ public class MappingManagerImpl implements MappingManager {
                 }
             } else if (intAttrName.getMembershipOfGroup() != null) {
                 Group group = groupDAO.findByName(intAttrName.getMembershipOfGroup());
-                membership = groupableRelatable.getMembership(group.getKey());
+                membership = groupableRelatable.getMembership(group.getKey()).orElse(null);
             }
         }
         if (reference == null) {
@@ -498,18 +498,16 @@ public class MappingManagerImpl implements MappingManager {
                 case PLAIN:
                     PlainAttr<?> attr;
                     if (membership == null) {
-                        attr = reference.getPlainAttr(intAttrName.getSchemaName());
+                        attr = reference.getPlainAttr(intAttrName.getSchemaName()).orElse(null);
                     } else {
                         attr = ((GroupableRelatable<?, ?, ?, ?, ?>) reference).getPlainAttr(
-                                intAttrName.getSchemaName(), membership);
+                                intAttrName.getSchemaName(), membership).orElse(null);
                     }
                     if (attr != null) {
                         if (attr.getUniqueValue() != null) {
                             values.add(anyUtils.clonePlainAttrValue(attr.getUniqueValue()));
                         } else if (attr.getValues() != null) {
-                            for (PlainAttrValue value : attr.getValues()) {
-                                values.add(anyUtils.clonePlainAttrValue(value));
-                            }
+                            attr.getValues().forEach(value -> values.add(anyUtils.clonePlainAttrValue(value)));
                         }
                     }
                     break;
@@ -541,11 +539,13 @@ public class MappingManagerImpl implements MappingManager {
                         List<String> virValues = membership == null
                                 ? virAttrHandler.getValues(reference, virSchema)
                                 : virAttrHandler.getValues(reference, membership, virSchema);
-                        for (String value : virValues) {
-                            PlainAttrValue attrValue = anyUtils.newPlainAttrValue();
-                            attrValue.setStringValue(value);
-                            values.add(attrValue);
-                        }
+                        virValues.stream().
+                                map(value -> {
+                                    PlainAttrValue attrValue = anyUtils.newPlainAttrValue();
+                                    attrValue.setStringValue(value);
+                                    return attrValue;
+                                }).
+                                forEachOrdered(attrValue -> values.add(attrValue));
                     }
                     break;
 
@@ -570,7 +570,7 @@ public class MappingManagerImpl implements MappingManager {
 
     private String getGroupOwnerValue(final Provision provision, final Any<?> any) {
         Pair<String, Attribute> preparedAttr =
-                prepareAttr(provision, MappingUtils.getConnObjectKeyItem(provision), any, null);
+                prepareAttr(provision, MappingUtils.getConnObjectKeyItem(provision).get(), any, null);
         String connObjectKey = preparedAttr.getKey();
 
         return MappingUtils.evaluateNAME(any, provision, connObjectKey).getNameValue();
@@ -578,22 +578,22 @@ public class MappingManagerImpl implements MappingManager {
 
     @Transactional(readOnly = true)
     @Override
-    public String getConnObjectKeyValue(final Any<?> any, final Provision provision) {
-        MappingItem mapItem = provision.getMapping().getConnObjectKeyItem();
+    public Optional<String> getConnObjectKeyValue(final Any<?> any, final Provision provision) {
+        MappingItem mapItem = provision.getMapping().getConnObjectKeyItem().get();
         List<PlainAttrValue> values = getIntValues(
                 provision,
                 mapItem,
                 intAttrNameParser.parse(mapItem.getIntAttrName(), provision.getAnyType().getKind()),
                 any);
-        return values.isEmpty()
+        return Optional.ofNullable(values.isEmpty()
                 ? null
-                : values.get(0).getValueAsString();
+                : values.get(0).getValueAsString());
     }
 
     @Transactional(readOnly = true)
     @Override
     public String getConnObjectKeyValue(final Realm realm, final OrgUnit orgUnit) {
-        OrgUnitItem orgUnitItem = orgUnit.getConnObjectKeyItem();
+        OrgUnitItem orgUnitItem = orgUnit.getConnObjectKeyItem().get();
 
         return getIntValue(realm, orgUnitItem);
     }
@@ -610,7 +610,7 @@ public class MappingManagerImpl implements MappingManager {
                 values = transformer.beforePull(mapItem, anyTO, values);
             }
         }
-        values = ListUtils.emptyIfNull(values);
+        values = values == null ? Collections.emptyList() : values;
 
         IntAttrName intAttrName =
                 intAttrNameParser.parse(mapItem.getIntAttrName(), anyUtils.getAnyTypeKind());
@@ -707,12 +707,13 @@ public class MappingManagerImpl implements MappingManager {
                     if (groupableTO == null || group == null) {
                         anyTO.getPlainAttrs().add(attrTO);
                     } else {
-                        MembershipTO membership = groupableTO.getMembership(group.getKey());
-                        if (membership == null) {
-                            membership = new MembershipTO.Builder().group(group.getKey(), group.getName()).build();
-                            groupableTO.getMemberships().add(membership);
+                        Optional<MembershipTO> membership = groupableTO.getMembership(group.getKey());
+                        if (!membership.isPresent()) {
+                            membership = Optional.of(
+                                    new MembershipTO.Builder().group(group.getKey(), group.getName()).build());
+                            groupableTO.getMemberships().add(membership.get());
                         }
-                        membership.getPlainAttrs().add(attrTO);
+                        membership.get().getPlainAttrs().add(attrTO);
                     }
                     break;
 
@@ -722,12 +723,13 @@ public class MappingManagerImpl implements MappingManager {
                     if (groupableTO == null || group == null) {
                         anyTO.getDerAttrs().add(attrTO);
                     } else {
-                        MembershipTO membership = groupableTO.getMembership(group.getKey());
-                        if (membership == null) {
-                            membership = new MembershipTO.Builder().group(group.getKey(), group.getName()).build();
-                            groupableTO.getMemberships().add(membership);
+                        Optional<MembershipTO> membership = groupableTO.getMembership(group.getKey());
+                        if (!membership.isPresent()) {
+                            membership = Optional.of(
+                                    new MembershipTO.Builder().group(group.getKey(), group.getName()).build());
+                            groupableTO.getMemberships().add(membership.get());
                         }
-                        membership.getDerAttrs().add(attrTO);
+                        membership.get().getDerAttrs().add(attrTO);
                     }
                     break;
 
@@ -736,23 +738,22 @@ public class MappingManagerImpl implements MappingManager {
                     attrTO.setSchema(intAttrName.getSchemaName());
 
                     // virtual attributes don't get transformed, iterate over original attr.getValue()
-                    for (Object value : (attr == null || attr.getValue() == null)
-                            ? Collections.emptyList() : attr.getValue()) {
-
-                        if (value != null) {
-                            attrTO.getValues().add(value.toString());
-                        }
+                    if (attr != null && attr.getValue() != null && !attr.getValue().isEmpty()) {
+                        attr.getValue().stream().
+                                filter(value -> value != null).
+                                forEachOrdered(value -> attrTO.getValues().add(value.toString()));
                     }
 
                     if (groupableTO == null || group == null) {
                         anyTO.getVirAttrs().add(attrTO);
                     } else {
-                        MembershipTO membership = groupableTO.getMembership(group.getKey());
-                        if (membership == null) {
-                            membership = new MembershipTO.Builder().group(group.getKey(), group.getName()).build();
-                            groupableTO.getMemberships().add(membership);
+                        Optional<MembershipTO> membership = groupableTO.getMembership(group.getKey());
+                        if (!membership.isPresent()) {
+                            membership = Optional.of(
+                                    new MembershipTO.Builder().group(group.getKey(), group.getName()).build());
+                            groupableTO.getMemberships().add(membership.get());
                         }
-                        membership.getVirAttrs().add(attrTO);
+                        membership.get().getVirAttrs().add(attrTO);
                     }
                     break;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
index a074848..2caac56 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/VirAttrHandlerImpl.java
@@ -23,8 +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.ListUtils;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.Membership;
@@ -98,15 +98,15 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
         for (Map.Entry<Provision, Set<VirSchema>> entry : toRead.entrySet()) {
             LOG.debug("About to read from {}: {}", entry.getKey(), entry.getValue());
 
-            MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(entry.getKey());
-            String connObjectKeyValue = connObjectKeyItem == null
-                    ? null
-                    : mappingManager.getConnObjectKeyValue(any, entry.getKey());
-            if (connObjectKeyItem == null) {
+            Optional<MappingItem> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(entry.getKey());
+            String connObjectKeyValue = connObjectKeyItem.isPresent()
+                    ? mappingManager.getConnObjectKeyValue(any, entry.getKey()).orElse(null)
+                    : null;
+            if (!connObjectKeyItem.isPresent()) {
                 LOG.error("No ConnObjectKey found for {}, ignoring...", entry.getKey());
             } else {
                 Set<MappingItem> linkingMappingItems = new HashSet<>();
-                linkingMappingItems.add(connObjectKeyItem);
+                linkingMappingItems.add(connObjectKeyItem.get());
                 for (VirSchema schema : entry.getValue()) {
                     linkingMappingItems.add(schema.asLinkingMappingItem());
                 }
@@ -115,14 +115,14 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
                 try {
                     ConnectorObject connectorObject = connector.getObject(
                             entry.getKey().getObjectClass(),
-                            AttributeBuilder.build(connObjectKeyItem.getExtAttrName(), connObjectKeyValue),
+                            AttributeBuilder.build(connObjectKeyItem.get().getExtAttrName(), connObjectKeyValue),
                             MappingUtils.buildOperationOptions(linkingMappingItems.iterator()));
 
                     if (connectorObject == null) {
                         LOG.debug("No read from {} with filter '{} == {}'",
-                                entry.getKey(), connObjectKeyItem.getExtAttrName(), connObjectKeyValue);
+                                entry.getKey(), connObjectKeyItem.get().getExtAttrName(), connObjectKeyValue);
                     } else {
-                        for (VirSchema schema : entry.getValue()) {
+                        entry.getValue().forEach(schema -> {
                             Attribute attr = connectorObject.getAttributeByName(schema.getExtAttrName());
                             if (attr != null) {
                                 VirAttrCacheValue virAttrCacheValue = new VirAttrCacheValue();
@@ -134,7 +134,7 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
 
                                 result.put(schema, virAttrCacheValue.getValues());
                             }
-                        }
+                        });
                     }
                 } catch (Exception e) {
                     LOG.error("Error reading from {}", entry.getKey(), e);
@@ -154,7 +154,8 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
             return Collections.emptyList();
         }
 
-        return ListUtils.emptyIfNull(getValues(any, Collections.singleton(schema)).get(schema));
+        List<String> result = getValues(any, Collections.singleton(schema)).get(schema);
+        return result == null ? Collections.emptyList() : result;
     }
 
     @Override
@@ -166,7 +167,8 @@ public class VirAttrHandlerImpl implements VirAttrHandler {
             return Collections.emptyList();
         }
 
-        return ListUtils.emptyIfNull(getValues(any, Collections.singleton(schema)).get(schema));
+        List<String> result = getValues(any, Collections.singleton(schema)).get(schema);
+        return result == null ? Collections.emptyList() : result;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
index c950a6f..dbf992b 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
@@ -24,8 +24,9 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -81,7 +82,6 @@ import org.apache.syncope.core.provisioning.api.MappingManager;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.core.provisioning.api.VirAttrHandler;
 import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
-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.provisioning.java.utils.MappingUtils;
@@ -193,7 +193,7 @@ abstract class AbstractAnyDataBinder {
                 ? Collections.<String>emptyList()
                 : Collections.singletonList(values.iterator().next()));
 
-        for (String value : valuesProvided) {
+        valuesProvided.forEach(value -> {
             if (StringUtils.isBlank(value)) {
                 LOG.debug("Null value for {}, ignoring", schema.getKey());
             } else {
@@ -205,22 +205,22 @@ abstract class AbstractAnyDataBinder {
                     invalidValues.getElements().add(schema.getKey() + ": " + value + " - " + e.getMessage());
                 }
             }
-        }
+        });
     }
 
     private List<String> evaluateMandatoryCondition(final Provision provision, final Any<?> any) {
         List<String> missingAttrNames = new ArrayList<>();
 
-        for (MappingItem mapItem : MappingUtils.getPropagationItems(provision)) {
-            IntAttrName intAttrName =
-                    intAttrNameParser.parse(mapItem.getIntAttrName(), provision.getAnyType().getKind());
+        MappingUtils.getPropagationItems(provision).forEach(mapItem -> {
+            IntAttrName intAttrName = intAttrNameParser.
+                    parse(mapItem.getIntAttrName(), provision.getAnyType().getKind());
             if (intAttrName.getSchemaType() != null) {
                 List<PlainAttrValue> values = mappingManager.getIntValues(provision, mapItem, intAttrName, any);
                 if (values.isEmpty() && JexlUtils.evaluateMandatoryCondition(mapItem.getMandatoryCondition(), any)) {
                     missingAttrNames.add(mapItem.getIntAttrName());
                 }
             }
-        }
+        });
 
         return missingAttrNames;
     }
@@ -228,17 +228,17 @@ abstract class AbstractAnyDataBinder {
     private SyncopeClientException checkMandatoryOnResources(final Any<?> any, final Set<ExternalResource> resources) {
         SyncopeClientException reqValMissing = SyncopeClientException.build(ClientExceptionType.RequiredValuesMissing);
 
-        for (ExternalResource resource : resources) {
-            Provision provision = resource.getProvision(any.getType());
-            if (resource.isEnforceMandatoryCondition() && provision != null) {
-                List<String> missingAttrNames = evaluateMandatoryCondition(provision, any);
+        resources.forEach(resource -> {
+            Optional<? extends Provision> provision = resource.getProvision(any.getType());
+            if (resource.isEnforceMandatoryCondition() && provision.isPresent()) {
+                List<String> missingAttrNames = evaluateMandatoryCondition(provision.get(), any);
                 if (!missingAttrNames.isEmpty()) {
                     LOG.error("Mandatory schemas {} not provided with values", missingAttrNames);
 
                     reqValMissing.getElements().addAll(missingAttrNames);
                 }
             }
-        }
+        });
 
         return reqValMissing;
     }
@@ -264,18 +264,20 @@ abstract class AbstractAnyDataBinder {
 
         // Check if there is some mandatory schema defined for which no value has been provided
         AllowedSchemas<PlainSchema> allowedPlainSchemas = anyUtils.getAllowedSchemas(any, PlainSchema.class);
-        for (PlainSchema schema : allowedPlainSchemas.getForSelf()) {
-            checkMandatory(schema, any.getPlainAttr(schema.getKey()), any, reqValMissing);
-        }
-        for (Map.Entry<Group, Set<PlainSchema>> entry : allowedPlainSchemas.getForMemberships().entrySet()) {
-            if (any instanceof GroupableRelatable) {
-                GroupableRelatable<?, ?, ?, ?, ?> groupable = GroupableRelatable.class.cast(any);
-                Membership<?> membership = groupable.getMembership(entry.getKey().getKey());
-                for (PlainSchema schema : entry.getValue()) {
-                    checkMandatory(schema, groupable.getPlainAttr(schema.getKey(), membership), any, reqValMissing);
-                }
-            }
-        }
+        allowedPlainSchemas.getForSelf().
+                forEach(schema -> {
+                    checkMandatory(schema, any.getPlainAttr(schema.getKey()).orElse(null), any, reqValMissing);
+                });
+        allowedPlainSchemas.getForMemberships().entrySet().stream().
+                filter(entry -> any instanceof GroupableRelatable).
+                forEachOrdered(entry -> {
+                    GroupableRelatable<?, ?, ?, ?, ?> groupable = GroupableRelatable.class.cast(any);
+                    Membership<?> membership = groupable.getMembership(entry.getKey().getKey()).orElse(null);
+                    entry.getValue().forEach(schema -> {
+                        checkMandatory(schema, groupable.getPlainAttr(schema.getKey(), membership).orElse(null),
+                                any, reqValMissing);
+                    });
+                });
 
         return reqValMissing;
     }
@@ -302,11 +304,11 @@ abstract class AbstractAnyDataBinder {
                         plainAttrValueDAO.delete(attr.getUniqueValue().getKey(), anyUtils.plainAttrUniqueValueClass());
                     }
                 } else {
-                    Collection<String> valuesToBeRemoved =
-                            CollectionUtils.collect(attr.getValues(), EntityUtils.keyTransformer());
-                    for (String attrValueKey : valuesToBeRemoved) {
+                    Collection<String> valuesToBeRemoved = attr.getValues().stream().
+                            map(value -> value.getKey()).collect(Collectors.toSet());
+                    valuesToBeRemoved.forEach(attrValueKey -> {
                         plainAttrValueDAO.delete(attrValueKey, anyUtils.plainAttrValueClass());
-                    }
+                    });
                 }
 
                 // 1.2 add values
@@ -330,17 +332,16 @@ abstract class AbstractAnyDataBinder {
                 plainAttrDAO.delete(attr.getKey(), anyUtils.plainAttrClass());
         }
 
-        for (ExternalResource resource : resources) {
-            for (MappingItem item : MappingUtils.getPropagationItems(resource.getProvision(any.getType()))) {
-                if (schema.getKey().equals(item.getIntAttrName())) {
-                    propByRes.add(ResourceOperation.UPDATE, resource.getKey());
-
-                    if (item.isConnObjectKey() && !attr.getValuesAsStrings().isEmpty()) {
-                        propByRes.addOldConnObjectKey(resource.getKey(), attr.getValuesAsStrings().get(0));
-                    }
-                }
-            }
-        }
+        resources.forEach(resource -> {
+            MappingUtils.getPropagationItems(resource.getProvision(any.getType()).get()).stream().
+                    filter(item -> (schema.getKey().equals(item.getIntAttrName()))).
+                    forEachOrdered(item -> {
+                        propByRes.add(ResourceOperation.UPDATE, resource.getKey());
+                        if (item.isConnObjectKey() && !attr.getValuesAsStrings().isEmpty()) {
+                            propByRes.addOldConnObjectKey(resource.getKey(), attr.getValuesAsStrings().get(0));
+                        }
+                    });
+        });
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
@@ -394,31 +395,30 @@ abstract class AbstractAnyDataBinder {
         SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
         // 3. plain attributes
-        for (AttrPatch patch : anyPatch.getPlainAttrs()) {
-            if (patch.getAttrTO() != null) {
-                PlainSchema schema = getPlainSchema(patch.getAttrTO().getSchema());
-                if (schema == null) {
-                    LOG.debug("Invalid " + PlainSchema.class.getSimpleName()
-                            + "{}, ignoring...", patch.getAttrTO().getSchema());
-                } else {
-                    PlainAttr<?> attr = any.getPlainAttr(schema.getKey());
-                    if (attr == null) {
-                        LOG.debug("No plain attribute found for schema {}", schema);
+        anyPatch.getPlainAttrs().stream().
+                filter(patch -> patch.getAttrTO() != null).forEach(patch -> {
+            PlainSchema schema = getPlainSchema(patch.getAttrTO().getSchema());
+            if (schema == null) {
+                LOG.debug("Invalid " + PlainSchema.class.getSimpleName()
+                        + "{}, ignoring...", patch.getAttrTO().getSchema());
+            } else {
+                PlainAttr<?> attr = (PlainAttr<?>) any.getPlainAttr(schema.getKey()).orElse(null);
+                if (attr == null) {
+                    LOG.debug("No plain attribute found for schema {}", schema);
 
-                        if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
-                            attr = anyUtils.newPlainAttr();
-                            ((PlainAttr) attr).setOwner(any);
-                            attr.setSchema(schema);
-                            any.add(attr);
+                    if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
+                        attr = anyUtils.newPlainAttr();
+                        ((PlainAttr) attr).setOwner(any);
+                        attr.setSchema(schema);
+                        any.add(attr);
 
-                        }
-                    }
-                    if (attr != null) {
-                        processAttrPatch(any, patch, schema, attr, anyUtils, resources, propByRes, invalidValues);
                     }
                 }
+                if (attr != null) {
+                    processAttrPatch(any, patch, schema, attr, anyUtils, resources, propByRes, invalidValues);
+                }
             }
-        }
+        });
         if (!invalidValues.isEmpty()) {
             scce.addException(invalidValues);
         }
@@ -444,39 +444,39 @@ abstract class AbstractAnyDataBinder {
 
         // 0. aux classes
         any.getAuxClasses().clear();
-        for (String className : anyTO.getAuxClasses()) {
-            AnyTypeClass auxClass = anyTypeClassDAO.find(className);
-            if (auxClass == null) {
-                LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + "{}, ignoring...", auxClass);
-            } else {
-                any.add(auxClass);
-            }
-        }
+        anyTO.getAuxClasses().stream().
+                map(className -> anyTypeClassDAO.find(className)).
+                forEachOrdered(auxClass -> {
+                    if (auxClass == null) {
+                        LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + "{}, ignoring...", auxClass);
+                    } else {
+                        any.add(auxClass);
+                    }
+                });
 
         // 1. attributes
         SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
-        for (AttrTO attrTO : anyTO.getPlainAttrs()) {
-            // Only consider attributeTO with values
-            if (!attrTO.getValues().isEmpty()) {
-                PlainSchema schema = getPlainSchema(attrTO.getSchema());
-                if (schema != null) {
-                    PlainAttr attr = any.getPlainAttr(schema.getKey());
-                    if (attr == null) {
-                        attr = anyUtils.newPlainAttr();
-                        attr.setOwner(any);
-                        attr.setSchema(schema);
-                    }
-                    fillAttr(attrTO.getValues(), anyUtils, schema, attr, invalidValues);
+        anyTO.getPlainAttrs().stream().
+                filter(attrTO -> !attrTO.getValues().isEmpty()).
+                forEach(attrTO -> {
+                    PlainSchema schema = getPlainSchema(attrTO.getSchema());
+                    if (schema != null) {
+                        PlainAttr<?> attr = (PlainAttr<?>) any.getPlainAttr(schema.getKey()).orElse(null);
+                        if (attr == null) {
+                            attr = anyUtils.newPlainAttr();
+                            ((PlainAttr) attr).setOwner(any);
+                            attr.setSchema(schema);
+                        }
+                        fillAttr(attrTO.getValues(), anyUtils, schema, attr, invalidValues);
 
-                    if (attr.getValuesAsStrings().isEmpty()) {
-                        attr.setOwner(null);
-                    } else {
-                        any.add(attr);
+                        if (attr.getValuesAsStrings().isEmpty()) {
+                            attr.setOwner(null);
+                        } else {
+                            any.add(attr);
+                        }
                     }
-                }
-            }
-        }
+                });
 
         if (!invalidValues.isEmpty()) {
             scce.addException(invalidValues);
@@ -488,14 +488,14 @@ abstract class AbstractAnyDataBinder {
         }
 
         // 2. resources
-        for (String resourceKey : anyTO.getResources()) {
+        anyTO.getResources().forEach(resourceKey -> {
             ExternalResource resource = resourceDAO.find(resourceKey);
             if (resource == null) {
                 LOG.debug("Invalid " + ExternalResource.class.getSimpleName() + "{}, ignoring...", resourceKey);
             } else {
                 any.add(resource);
             }
-        }
+        });
 
         requiredValuesMissing = checkMandatoryOnResources(any, anyUtils.getAllResources(any));
         if (!requiredValuesMissing.isEmpty()) {
@@ -513,28 +513,28 @@ abstract class AbstractAnyDataBinder {
 
         SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
-        for (AttrTO attrTO : membershipTO.getPlainAttrs()) {
-            if (!attrTO.getValues().isEmpty()) {
-                PlainSchema schema = getPlainSchema(attrTO.getSchema());
-                if (schema != null) {
-                    GroupablePlainAttr attr = GroupableRelatable.class.cast(any).
-                            getPlainAttr(schema.getKey(), membership);
-                    if (attr == null) {
-                        attr = anyUtils.newPlainAttr();
-                        attr.setOwner(any);
-                        attr.setMembership(membership);
-                        attr.setSchema(schema);
-                    }
-                    fillAttr(attrTO.getValues(), anyUtils, schema, attr, invalidValues);
+        membershipTO.getPlainAttrs().stream().
+                filter(attrTO -> !attrTO.getValues().isEmpty()).
+                forEach(attrTO -> {
+                    PlainSchema schema = getPlainSchema(attrTO.getSchema());
+                    if (schema != null) {
+                        GroupablePlainAttr attr = (GroupablePlainAttr) GroupableRelatable.class.cast(any).
+                                getPlainAttr(schema.getKey(), membership).orElse(null);
+                        if (attr == null) {
+                            attr = anyUtils.newPlainAttr();
+                            attr.setOwner(any);
+                            attr.setMembership(membership);
+                            attr.setSchema(schema);
+                        }
+                        fillAttr(attrTO.getValues(), anyUtils, schema, attr, invalidValues);
 
-                    if (attr.getValuesAsStrings().isEmpty()) {
-                        attr.setOwner(null);
-                    } else {
-                        any.add(attr);
+                        if (attr.getValuesAsStrings().isEmpty()) {
+                            attr.setOwner(null);
+                        } else {
+                            any.add(attr);
+                        }
                     }
-                }
-            }
-        }
+                });
 
         if (!invalidValues.isEmpty()) {
             scce.addException(invalidValues);
@@ -553,41 +553,47 @@ abstract class AbstractAnyDataBinder {
 
         anyTO.setRealm(realmFullPath);
 
-        CollectionUtils.collect(auxClasses, EntityUtils.<AnyTypeClass>keyTransformer(), anyTO.getAuxClasses());
+        anyTO.getAuxClasses().addAll(auxClasses.stream().map(cls -> cls.getKey()).collect(Collectors.toList()));
 
-        for (PlainAttr<?> plainAttr : plainAttrs) {
+        plainAttrs.stream().map(plainAttr -> {
             AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(plainAttr.getSchema().getKey()).
                     values(plainAttr.getValuesAsStrings());
             if (details) {
                 attrTOBuilder.schemaInfo(schemaDataBinder.getPlainSchemaTO(plainAttr.getSchema()));
             }
+            return attrTOBuilder;
+        }).forEachOrdered(attrTOBuilder -> {
             anyTO.getPlainAttrs().add(attrTOBuilder.build());
-        }
+        });
 
-        for (Map.Entry<DerSchema, String> entry : derAttrs.entrySet()) {
+        derAttrs.entrySet().stream().map(entry -> {
             AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     value(entry.getValue());
             if (details) {
                 attrTOBuilder.schemaInfo(schemaDataBinder.getDerSchemaTO(entry.getKey()));
             }
+            return attrTOBuilder;
+        }).forEachOrdered(attrTOBuilder -> {
             anyTO.getDerAttrs().add(attrTOBuilder.build());
-        }
+        });
 
-        for (Map.Entry<VirSchema, List<String>> entry : virAttrs.entrySet()) {
+        virAttrs.entrySet().stream().map(entry -> {
             AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     values(entry.getValue());
             if (details) {
                 attrTOBuilder.schemaInfo(schemaDataBinder.getVirSchemaTO(entry.getKey()));
             }
+            return attrTOBuilder;
+        }).forEachOrdered(attrTOBuilder -> {
             anyTO.getVirAttrs().add(attrTOBuilder.build());
-        }
+        });
 
-        for (ExternalResource resource : resources) {
+        resources.forEach(resource -> {
             anyTO.getResources().add(resource.getKey());
-        }
+        });
     }
 
     protected RelationshipTO getRelationshipTO(final Relationship<? extends Any<?>, AnyObject> relationship) {
@@ -607,29 +613,29 @@ abstract class AbstractAnyDataBinder {
                 group(membership.getRightEnd().getKey(), membership.getRightEnd().getName()).
                 build();
 
-        for (PlainAttr<?> plainAttr : plainAttrs) {
+        plainAttrs.forEach(plainAttr -> {
             membershipTO.getPlainAttrs().add(new AttrTO.Builder().
                     schema(plainAttr.getSchema().getKey()).
                     values(plainAttr.getValuesAsStrings()).
                     schemaInfo(schemaDataBinder.getPlainSchemaTO(plainAttr.getSchema())).
                     build());
-        }
+        });
 
-        for (Map.Entry<DerSchema, String> entry : derAttrs.entrySet()) {
+        derAttrs.entrySet().forEach(entry -> {
             membershipTO.getDerAttrs().add(new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     value(entry.getValue()).
                     schemaInfo(schemaDataBinder.getDerSchemaTO(entry.getKey())).
                     build());
-        }
+        });
 
-        for (Map.Entry<VirSchema, List<String>> entry : virAttrs.entrySet()) {
+        virAttrs.entrySet().forEach(entry -> {
             membershipTO.getVirAttrs().add(new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     values(entry.getValue()).
                     schemaInfo(schemaDataBinder.getVirSchemaTO(entry.getKey())).
                     build());
-        }
+        });
 
         return membershipTO;
     }
@@ -643,18 +649,18 @@ abstract class AbstractAnyDataBinder {
                         ? anyObjectDAO.findAllResources((AnyObject) any)
                         : ((Group) any).getResources();
         for (ExternalResource resource : iterable) {
-            Provision provision = resource.getProvision(any.getType());
-            if (provision != null && provision.getMapping() != null) {
-                MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
-                if (connObjectKeyItem == null) {
+            Optional<? extends Provision> provision = resource.getProvision(any.getType());
+            if (provision.isPresent() && provision.get().getMapping() != null) {
+                Optional<MappingItem> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision.get());
+                if (!connObjectKeyItem.isPresent()) {
                     throw new NotFoundException(
                             "ConnObjectKey mapping for " + any.getType().getKey() + " " + any.getKey()
                             + " on resource '" + resource.getKey() + "'");
                 }
 
-                String connObjectKey = mappingManager.getConnObjectKeyValue(any, provision);
-                if (connObjectKey != null) {
-                    connObjectKeys.put(resource.getKey(), connObjectKey);
+                Optional<String> connObjectKey = mappingManager.getConnObjectKeyValue(any, provision.get());
+                if (connObjectKey.isPresent()) {
+                    connObjectKeys.put(resource.getKey(), connObjectKey.get());
                 }
             }
         }