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

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

Repository: syncope
Updated Branches:
  refs/heads/master fa093b39c -> 74ee038a4


http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
index bbe9ac5..cdf8ffc 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/RealmITCase.java
@@ -26,10 +26,9 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.List;
+import java.util.Optional;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.policy.AccountPolicyTO;
@@ -44,14 +43,8 @@ import org.junit.Test;
 
 public class RealmITCase extends AbstractITCase {
 
-    private RealmTO getRealm(final String fullPath) {
-        return IterableUtils.find(realmService.list(fullPath), new Predicate<RealmTO>() {
-
-            @Override
-            public boolean evaluate(final RealmTO object) {
-                return fullPath.equals(object.getFullPath());
-            }
-        });
+    private Optional<RealmTO> getRealm(final String fullPath) {
+        return realmService.list(fullPath).stream().filter(realm -> fullPath.equals(realm.getFullPath())).findFirst();
     }
 
     @Test
@@ -59,9 +52,9 @@ public class RealmITCase extends AbstractITCase {
         List<RealmTO> realms = realmService.list();
         assertNotNull(realms);
         assertFalse(realms.isEmpty());
-        for (RealmTO realm : realms) {
+        realms.forEach(realm -> {
             assertNotNull(realm);
-        }
+        });
 
         try {
             realmService.list("a name");
@@ -85,7 +78,7 @@ public class RealmITCase extends AbstractITCase {
         assertNotNull(actual.getKey());
         assertEquals("last", actual.getName());
         assertEquals("/even/two/last", actual.getFullPath());
-        assertEquals(actual.getParent(), getRealm("/even/two").getKey());
+        assertEquals(actual.getParent(), getRealm("/even/two").get().getKey());
         assertNull(realm.getAccountPolicy());
         assertNull(realm.getPasswordPolicy());
 
@@ -94,25 +87,20 @@ public class RealmITCase extends AbstractITCase {
         actual.setPasswordPolicy("986d1236-3ac5-4a19-810c-5ab21d79cba1");
         realmService.update(actual);
 
-        actual = getRealm(actual.getFullPath());
+        actual = getRealm(actual.getFullPath()).get();
         assertNotNull(actual.getAccountPolicy());
         assertNotNull(actual.getPasswordPolicy());
 
         // 3. update changing parent
-        actual.setParent(getRealm("/odd").getKey());
+        actual.setParent(getRealm("/odd").get().getKey());
         realmService.update(actual);
 
-        actual = getRealm("/odd/last");
+        actual = getRealm("/odd/last").get();
         assertNotNull(actual);
         assertEquals("/odd/last", actual.getFullPath());
 
-        assertEquals(1, IterableUtils.countMatches(realmService.list(), new Predicate<RealmTO>() {
-
-            @Override
-            public boolean evaluate(final RealmTO object) {
-                return realm.getName().equals(object.getName());
-            }
-        }));
+        assertEquals(1, realmService.list().stream().
+                filter(object -> realm.getName().equals(object.getName())).count());
 
         // 4. create under invalid path
         try {
@@ -161,7 +149,7 @@ public class RealmITCase extends AbstractITCase {
         policyService.delete(policy.getKey());
 
         // 4. verify
-        actual = getRealm(actual.getFullPath());
+        actual = getRealm(actual.getFullPath()).get();
         assertNull(actual.getAccountPolicy());
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
index bfa5d80..1537553 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ResourceITCase.java
@@ -31,16 +31,15 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
@@ -218,14 +217,14 @@ public class ResourceITCase extends AbstractITCase {
         ResourceTO actual = getObject(response.getLocation(), ResourceService.class, ResourceTO.class);
 
         assertNotNull(actual);
-        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).getMapping());
-        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).getMapping().getItems());
-        assertNotNull(actual.getProvision(AnyTypeKind.GROUP.name()).getMapping());
-        assertNotNull(actual.getProvision(AnyTypeKind.GROUP.name()).getMapping().getItems());
+        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).get().getMapping());
+        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).get().getMapping().getItems());
+        assertNotNull(actual.getProvision(AnyTypeKind.GROUP.name()).get().getMapping());
+        assertNotNull(actual.getProvision(AnyTypeKind.GROUP.name()).get().getMapping().getItems());
         assertEquals(MappingPurpose.PULL,
-                actual.getProvision(AnyTypeKind.GROUP.name()).getMapping().getConnObjectKeyItem().getPurpose());
+                actual.getProvision(AnyTypeKind.GROUP.name()).get().getMapping().getConnObjectKeyItem().getPurpose());
         assertEquals(MappingPurpose.PROPAGATION,
-                actual.getProvision(AnyTypeKind.USER.name()).getMapping().getConnObjectKeyItem().getPurpose());
+                actual.getProvision(AnyTypeKind.USER.name()).get().getMapping().getConnObjectKeyItem().getPurpose());
     }
 
     @Test
@@ -382,7 +381,7 @@ public class ResourceITCase extends AbstractITCase {
         assertNotNull(actual);
 
         // check for existence
-        Collection<ItemTO> mapItems = actual.getProvision(AnyTypeKind.USER.name()).getMapping().getItems();
+        Collection<ItemTO> mapItems = actual.getProvision(AnyTypeKind.USER.name()).get().getMapping().getItems();
         assertNotNull(mapItems);
         assertEquals(4, mapItems.size());
     }
@@ -408,7 +407,7 @@ public class ResourceITCase extends AbstractITCase {
         try {
             // create a new resource
             resource = createResource(resource);
-            assertNull(resource.getProvision("PRINTER").getSyncToken());
+            assertNull(resource.getProvision("PRINTER").get().getSyncToken());
 
             // create some object on the new resource
             anyObject = createAnyObject(anyObject).getEntity();
@@ -417,13 +416,13 @@ public class ResourceITCase extends AbstractITCase {
             resourceService.setLatestSyncToken(resource.getKey(), "PRINTER");
 
             resource = resourceService.read(resource.getKey());
-            assertNotNull(resource.getProvision("PRINTER").getSyncToken());
+            assertNotNull(resource.getProvision("PRINTER").get().getSyncToken());
 
             // remove sync token
             resourceService.removeSyncToken(resource.getKey(), "PRINTER");
 
             resource = resourceService.read(resource.getKey());
-            assertNull(resource.getProvision("PRINTER").getSyncToken());
+            assertNull(resource.getProvision("PRINTER").get().getSyncToken());
         } finally {
             if (anyObject.getKey() != null) {
                 anyObjectService.delete(anyObject.getKey());
@@ -495,9 +494,7 @@ public class ResourceITCase extends AbstractITCase {
         List<ResourceTO> actuals = resourceService.list();
         assertNotNull(actuals);
         assertFalse(actuals.isEmpty());
-        for (ResourceTO resourceTO : actuals) {
-            assertNotNull(resourceTO);
-        }
+        actuals.forEach(resourceTO -> assertNotNull(resourceTO));
     }
 
     @Test
@@ -505,10 +502,10 @@ public class ResourceITCase extends AbstractITCase {
         ResourceTO resource = resourceService.read(RESOURCE_NAME_DBVIRATTR);
         assertNotNull(resource);
 
-        ProvisionTO provision = resource.getProvision(AnyTypeKind.USER.name());
-        assertNotNull(provision);
-        assertFalse(provision.getMapping().getItems().isEmpty());
-        assertFalse(provision.getMapping().getLinkingItems().isEmpty());
+        Optional<ProvisionTO> provision = resource.getProvision(AnyTypeKind.USER.name());
+        assertTrue(provision.isPresent());
+        assertFalse(provision.get().getMapping().getItems().isEmpty());
+        assertFalse(provision.get().getMapping().getLinkingItems().isEmpty());
     }
 
     @Test
@@ -545,13 +542,9 @@ public class ResourceITCase extends AbstractITCase {
                 assertNotNull(list);
 
                 totalRead += list.getResult().size();
-                CollectionUtils.collect(list.getResult(), new Transformer<ConnObjectTO, String>() {
-
-                    @Override
-                    public String transform(final ConnObjectTO input) {
-                        return input.getAttr(ConnIdSpecialName.NAME).getValues().get(0);
-                    }
-                }, read);
+                read.addAll(list.getResult().stream().
+                        map(input -> input.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0)).
+                        collect(Collectors.toList()));
 
                 if (list.getPagedResultsCookie() != null) {
                     builder.pagedResultsCookie(list.getPagedResultsCookie());
@@ -561,9 +554,9 @@ public class ResourceITCase extends AbstractITCase {
             assertEquals(totalRead, read.size());
             assertTrue(totalRead >= 10);
         } finally {
-            for (String key : groupKeys) {
+            groupKeys.forEach(key -> {
                 groupService.delete(key);
-            }
+            });
         }
     }
 
@@ -576,20 +569,20 @@ public class ResourceITCase extends AbstractITCase {
         ResourceTO ldap = resourceService.read(RESOURCE_NAME_LDAP);
         TraceLevel originalTraceLevel = SerializationUtils.clone(ldap.getUpdateTraceLevel());
         assertEquals(TraceLevel.ALL, originalTraceLevel);
-        ProvisionTO originalProvision = SerializationUtils.clone(ldap.getProvision(AnyTypeKind.USER.name()));
+        ProvisionTO originalProvision = SerializationUtils.clone(ldap.getProvision(AnyTypeKind.USER.name()).get());
         assertEquals(ObjectClass.ACCOUNT_NAME, originalProvision.getObjectClass());
         boolean originalFlag = ldap.isRandomPwdIfNotProvided();
         assertTrue(originalFlag);
 
         ldap.setUpdateTraceLevel(TraceLevel.FAILURES);
-        ldap.getProvision(AnyTypeKind.USER.name()).setObjectClass("ANOTHER");
+        ldap.getProvision(AnyTypeKind.USER.name()).get().setObjectClass("ANOTHER");
         ldap.setRandomPwdIfNotProvided(false);
         resourceService.update(ldap);
 
         ldap = resourceService.read(RESOURCE_NAME_LDAP);
         assertNotEquals(originalTraceLevel, ldap.getUpdateTraceLevel());
         assertNotEquals(
-                originalProvision.getObjectClass(), ldap.getProvision(AnyTypeKind.USER.name()).getObjectClass());
+                originalProvision.getObjectClass(), ldap.getProvision(AnyTypeKind.USER.name()).get().getObjectClass());
         assertNotEquals(originalFlag, ldap.isRandomPwdIfNotProvided());
 
         history = resourceHistoryService.list(RESOURCE_NAME_LDAP);
@@ -599,7 +592,9 @@ public class ResourceITCase extends AbstractITCase {
 
         ldap = resourceService.read(RESOURCE_NAME_LDAP);
         assertEquals(originalTraceLevel, ldap.getUpdateTraceLevel());
-        assertEquals(originalProvision.getObjectClass(), ldap.getProvision(AnyTypeKind.USER.name()).getObjectClass());
+        assertEquals(
+                originalProvision.getObjectClass(),
+                ldap.getProvision(AnyTypeKind.USER.name()).get().getObjectClass());
         assertEquals(originalFlag, ldap.isRandomPwdIfNotProvided());
     }
 
@@ -663,14 +658,14 @@ public class ResourceITCase extends AbstractITCase {
 
         ResourceTO resource = resourceService.read(name);
         assertNotNull(resource);
-        assertNotNull(resource.getProvision(AnyTypeKind.USER.name()).getMapping());
+        assertNotNull(resource.getProvision(AnyTypeKind.USER.name()).get().getMapping());
 
-        resource.getProvision(AnyTypeKind.USER.name()).setMapping(null);
+        resource.getProvision(AnyTypeKind.USER.name()).get().setMapping(null);
         resourceService.update(resource);
 
         resource = resourceService.read(name);
         assertNotNull(resource);
-        assertNull(resource.getProvision(AnyTypeKind.USER.name()).getMapping());
+        assertNull(resource.getProvision(AnyTypeKind.USER.name()).get().getMapping());
     }
 
     @Test
@@ -704,7 +699,7 @@ public class ResourceITCase extends AbstractITCase {
 
         resourceTO = createResource(resourceTO);
         assertNotNull(resourceTO);
-        assertEquals(2, resourceTO.getProvision(AnyTypeKind.GROUP.name()).getMapping().getItems().size());
+        assertEquals(2, resourceTO.getProvision(AnyTypeKind.GROUP.name()).get().getMapping().getItems().size());
     }
 
     @Test
@@ -753,15 +748,13 @@ public class ResourceITCase extends AbstractITCase {
         ResourceTO actual = getObject(response.getLocation(), ResourceService.class, ResourceTO.class);
 
         assertNotNull(actual);
-        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).getMapping());
-        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).getMapping().getItems());
+        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).get().getMapping());
+        assertNotNull(actual.getProvision(AnyTypeKind.USER.name()).get().getMapping().getItems());
         assertEquals(MappingPurpose.PROPAGATION,
-                actual.getProvision(AnyTypeKind.USER.name()).getMapping().getConnObjectKeyItem().getPurpose());
-        for (ItemTO itemTO : actual.getProvision(AnyTypeKind.USER.name()).getMapping().getItems()) {
-            if ("gender".equals(itemTO.getIntAttrName())) {
-                assertEquals(MappingPurpose.NONE, itemTO.getPurpose());
-            }
-        }
+                actual.getProvision(AnyTypeKind.USER.name()).get().getMapping().getConnObjectKeyItem().getPurpose());
+        actual.getProvision(AnyTypeKind.USER.name()).get().getMapping().getItems().stream().
+                filter(itemTO -> ("gender".equals(itemTO.getIntAttrName()))).
+                forEach(itemTO -> assertEquals(MappingPurpose.NONE, itemTO.getPurpose()));
     }
 
     public void issueSYNCOPE645() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
index c155831..88e6c27 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SchedTaskITCase.java
@@ -28,11 +28,9 @@ import static org.junit.Assert.fail;
 import java.util.Date;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.time.DateUtils;
-import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.JobTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.PushTaskTO;
@@ -62,11 +60,11 @@ public class SchedTaskITCase extends AbstractTaskITCase {
         PagedResult<SchedTaskTO> tasks =
                 taskService.list(new TaskQuery.Builder(TaskType.SCHEDULED).build());
         assertFalse(tasks.getResult().isEmpty());
-        for (AbstractTaskTO task : tasks.getResult()) {
-            if (!(task instanceof SchedTaskTO) || task instanceof PullTaskTO || task instanceof PushTaskTO) {
-                fail();
-            }
-        }
+        tasks.getResult().stream().filter(
+                task -> !(task instanceof SchedTaskTO) || task instanceof PullTaskTO || task instanceof PushTaskTO).
+                forEachOrdered(item -> {
+                    fail();
+                });
     }
 
     @Test
@@ -183,14 +181,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
                 // ignore
             }
 
-            jobs = taskService.listJobs();
-            CollectionUtils.filter(jobs, new Predicate<JobTO>() {
-
-                @Override
-                public boolean evaluate(final JobTO job) {
-                    return job.isRunning();
-                }
-            });
+            jobs = taskService.listJobs().stream().filter(job -> job.isRunning()).collect(Collectors.toList());
             i++;
         } while (jobs.size() < 1 && i < maxit);
 
@@ -208,14 +199,7 @@ public class SchedTaskITCase extends AbstractTaskITCase {
                 // ignore
             }
 
-            jobs = taskService.listJobs();
-            CollectionUtils.filter(jobs, new Predicate<JobTO>() {
-
-                @Override
-                public boolean evaluate(final JobTO job) {
-                    return job.isRunning();
-                }
-            });
+            jobs = taskService.listJobs().stream().filter(job -> job.isRunning()).collect(Collectors.toList());
             i++;
         } while (jobs.size() >= 1 && i < maxit);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
index a0a37b2..e565362 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
@@ -24,11 +24,7 @@ import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-import java.util.Collection;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
@@ -69,15 +65,10 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
 
-        Collection<UserTO> found = CollectionUtils.select(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey())
-                        || "b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee".equals(user.getKey());
-            }
-        });
-        assertEquals(2, found.size());
+        assertEquals(2, matchingUsers.getResult().stream().filter(user -> {
+            return "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey())
+                    || "b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee".equals(user.getKey());
+        }).count());
     }
 
     @Test
@@ -133,13 +124,8 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
 
-        assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "1417acbe-cbf6-4277-9372-e75e04f97000".equals(user.getKey());
-            }
-        }));
+        assertTrue(matchingUsers.getResult().stream().
+                anyMatch(user -> "1417acbe-cbf6-4277-9372-e75e04f97000".equals(user.getKey())));
     }
 
     @Test
@@ -164,13 +150,8 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
 
-        assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
-            }
-        }));
+        assertTrue(matchingUsers.getResult().stream().
+                anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
     }
 
     @Test
@@ -182,13 +163,8 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
 
-        assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "1417acbe-cbf6-4277-9372-e75e04f97000".equals(user.getKey());
-            }
-        }));
+        assertTrue(matchingUsers.getResult().stream().
+                anyMatch(user -> "1417acbe-cbf6-4277-9372-e75e04f97000".equals(user.getKey())));
     }
 
     @Test
@@ -214,13 +190,8 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
 
-        assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
-            }
-        }));
+        assertTrue(matchingUsers.getResult().stream().
+                anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
     }
 
     @Test
@@ -232,13 +203,8 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
 
-        assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey());
-            }
-        }));
+        assertTrue(matchingUsers.getResult().stream().
+                anyMatch(user -> "74cd8ece-715a-44a4-a736-e17b46c4e7e6".equals(user.getKey())));
     }
 
     @Test
@@ -315,9 +281,9 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
 
         assertFalse(matchingUsers.getResult().isEmpty());
-        for (UserTO user : matchingUsers.getResult()) {
+        matchingUsers.getResult().forEach(user -> {
             assertNotNull(user);
-        }
+        });
     }
 
     @Test
@@ -347,25 +313,15 @@ public class SearchITCase extends AbstractITCase {
                         inRelationships("Canon MF 8030cn").query()).
                 build());
         assertNotNull(anyObjects);
-        assertTrue(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
-
-            @Override
-            public boolean evaluate(final AnyObjectTO anyObject) {
-                return "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey());
-            }
-        }));
+        assertTrue(anyObjects.getResult().stream().
+                anyMatch(anyObject -> "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey())));
 
         PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
                 fiql(SyncopeClient.getUserSearchConditionBuilder().inRelationships("HP LJ 1300n").query()).
                 build());
         assertNotNull(users);
-        assertTrue(IterableUtils.matchesAny(users.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
-            }
-        }));
+        assertTrue(users.getResult().stream().
+                anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
     }
 
     @Test
@@ -376,32 +332,17 @@ public class SearchITCase extends AbstractITCase {
                         inRelationshipTypes("neighborhood").query()).
                 build());
         assertNotNull(anyObjects);
-        assertTrue(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
-
-            @Override
-            public boolean evaluate(final AnyObjectTO anyObject) {
-                return "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey());
-            }
-        }));
-        assertTrue(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
-
-            @Override
-            public boolean evaluate(final AnyObjectTO anyObject) {
-                return "8559d14d-58c2-46eb-a2d4-a7d35161e8f8".equals(anyObject.getKey());
-            }
-        }));
+        assertTrue(anyObjects.getResult().stream().
+                anyMatch(anyObject -> "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(anyObject.getKey())));
+        assertTrue(anyObjects.getResult().stream().
+                anyMatch(anyObject -> "8559d14d-58c2-46eb-a2d4-a7d35161e8f8".equals(anyObject.getKey())));
 
         PagedResult<UserTO> users = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
                 fiql(SyncopeClient.getUserSearchConditionBuilder().inRelationshipTypes("neighborhood").query()).
                 build());
         assertNotNull(users);
-        assertTrue(IterableUtils.matchesAny(users.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO user) {
-                return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
-            }
-        }));
+        assertTrue(users.getResult().stream().
+                anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
     }
 
     @Test
@@ -411,33 +352,18 @@ public class SearchITCase extends AbstractITCase {
                         and("name").equalTo("*").query()).
                 build());
         assertNotNull(groups);
-        assertTrue(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
-
-            @Override
-            public boolean evaluate(final GroupTO group) {
-                return "034740a9-fa10-453b-af37-dc7897e98fb1".equals(group.getKey());
-            }
-        }));
-        assertFalse(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
-
-            @Override
-            public boolean evaluate(final GroupTO group) {
-                return "e7ff94e8-19c9-4f0a-b8b7-28327edbf6ed".equals(group.getKey());
-            }
-        }));
+        assertTrue(groups.getResult().stream().
+                anyMatch(group -> "034740a9-fa10-453b-af37-dc7897e98fb1".equals(group.getKey())));
+        assertFalse(groups.getResult().stream().
+                anyMatch(group -> "e7ff94e8-19c9-4f0a-b8b7-28327edbf6ed".equals(group.getKey())));
 
         PagedResult<AnyObjectTO> anyObjects = anyObjectService.search(new AnyQuery.Builder().realm("/odd").
                 fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").isAssignable().
                         and("name").equalTo("*").query()).
                 build());
         assertNotNull(anyObjects);
-        assertFalse(IterableUtils.matchesAny(anyObjects.getResult(), new Predicate<AnyObjectTO>() {
-
-            @Override
-            public boolean evaluate(final AnyObjectTO anyObject) {
-                return "9e1d130c-d6a3-48b1-98b3-182477ed0688".equals(anyObject.getKey());
-            }
-        }));
+        assertFalse(anyObjects.getResult().stream().
+                anyMatch(anyObject -> "9e1d130c-d6a3-48b1-98b3-182477ed0688".equals(anyObject.getKey())));
     }
 
     @Test
@@ -447,20 +373,8 @@ public class SearchITCase extends AbstractITCase {
                 build());
         assertNotNull(groups);
 
-        assertTrue(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
-
-            @Override
-            public boolean evaluate(final GroupTO group) {
-                return "root".equals(group.getName());
-            }
-        }));
-        assertTrue(IterableUtils.matchesAny(groups.getResult(), new Predicate<GroupTO>() {
-
-            @Override
-            public boolean evaluate(final GroupTO group) {
-                return "otherchild".equals(group.getName());
-            }
-        }));
+        assertTrue(groups.getResult().stream().anyMatch(group -> "root".equals(group.getName())));
+        assertTrue(groups.getResult().stream().anyMatch(group -> "otherchild".equals(group.getName())));
     }
 
     @Test
@@ -505,9 +419,9 @@ public class SearchITCase extends AbstractITCase {
         assertNotNull(matchingUsers);
 
         assertFalse(matchingUsers.getResult().isEmpty());
-        for (UserTO user : matchingUsers.getResult()) {
+        matchingUsers.getResult().forEach(user -> {
             assertTrue(user.getUsername().startsWith("bellini"));
-        }
+        });
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
index 3b2aa3b..f10e60c 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserITCase.java
@@ -36,8 +36,6 @@ import java.util.UUID;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.MapUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.time.DateFormatUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
@@ -91,7 +89,7 @@ import org.junit.Test;
 public class UserITCase extends AbstractITCase {
 
     private boolean getBooleanAttribute(final ConnObjectTO connObjectTO, final String attrName) {
-        return Boolean.parseBoolean(connObjectTO.getAttr(attrName).getValues().get(0));
+        return Boolean.parseBoolean(connObjectTO.getAttr(attrName).get().getValues().get(0));
     }
 
     public static UserTO getUniqueSampleTO(final String email) {
@@ -333,7 +331,7 @@ public class UserITCase extends AbstractITCase {
 
         // 4. try (and fail) to create another user with same (unique) values
         userTO = getSampleTO(userTO.getUsername());
-        AttrTO userIdAttr = userTO.getPlainAttr("userId");
+        AttrTO userIdAttr = userTO.getPlainAttr("userId").get();
         userIdAttr.getValues().clear();
         userIdAttr.getValues().add("a.b@c.com");
 
@@ -349,7 +347,7 @@ public class UserITCase extends AbstractITCase {
     public void createWithRequiredValueMissing() {
         UserTO userTO = getUniqueSampleTO("a.b@c.it");
 
-        AttrTO type = userTO.getPlainAttr("ctype");
+        AttrTO type = userTO.getPlainAttr("ctype").get();
         userTO.getPlainAttrs().remove(type);
 
         userTO.getMemberships().add(new MembershipTO.Builder().
@@ -365,7 +363,7 @@ public class UserITCase extends AbstractITCase {
 
         userTO.getPlainAttrs().add(attrTO("ctype", "F"));
 
-        AttrTO surname = userTO.getPlainAttr("surname");
+        AttrTO surname = userTO.getPlainAttr("surname").get();
         userTO.getPlainAttrs().remove(surname);
 
         // 2. create user without surname (mandatory when type == 'F')
@@ -491,7 +489,7 @@ public class UserITCase extends AbstractITCase {
         userTO = updateUser(userPatch).getEntity();
 
         assertNotNull(userTO);
-        assertNull(userTO.getPlainAttr("ctype"));
+        assertFalse(userTO.getPlainAttr("ctype").isPresent());
     }
 
     @Test(expected = SyncopeClientException.class)
@@ -563,10 +561,10 @@ public class UserITCase extends AbstractITCase {
         assertEquals(1, userTO.getMemberships().size());
         assertFalse(userTO.getDerAttrs().isEmpty());
 
-        AttrTO userIdAttr = userTO.getPlainAttr("userId");
+        AttrTO userIdAttr = userTO.getPlainAttr("userId").get();
         assertEquals(Collections.singletonList(newUserId), userIdAttr.getValues());
 
-        AttrTO fullNameAttr = userTO.getPlainAttr("fullname");
+        AttrTO fullNameAttr = userTO.getPlainAttr("fullname").get();
         assertEquals(Collections.singletonList(newFullName), fullNameAttr.getValues());
 
         // update by username
@@ -825,7 +823,7 @@ public class UserITCase extends AbstractITCase {
         userTO = createUser(userTO).getEntity();
         assertNotNull(userTO);
 
-        AttrTO loginDate = userTO.getPlainAttr("loginDate");
+        AttrTO loginDate = userTO.getPlainAttr("loginDate").get();
         assertNotNull(loginDate);
         assertEquals(1, loginDate.getValues().size());
 
@@ -839,7 +837,7 @@ public class UserITCase extends AbstractITCase {
         userTO = updateUser(userPatch).getEntity();
         assertNotNull(userTO);
 
-        loginDate = userTO.getPlainAttr("loginDate");
+        loginDate = userTO.getPlainAttr("loginDate").get();
         assertNotNull(loginDate);
         assertEquals(2, loginDate.getValues().size());
     }
@@ -848,12 +846,8 @@ public class UserITCase extends AbstractITCase {
         assertEquals(3, statuses.size());
 
         Map<String, PropagationStatus> byResource = new HashMap<>(3);
-        MapUtils.populateMap(byResource, statuses, new Transformer<PropagationStatus, String>() {
-
-            @Override
-            public String transform(final PropagationStatus status) {
-                return status.getResource();
-            }
+        statuses.forEach(status -> {
+            byResource.put(status.getResource(), status);
         });
         assertEquals(PropagationTaskExecStatus.SUCCESS, byResource.get(RESOURCE_NAME_LDAP).getStatus());
         assertTrue(byResource.get(RESOURCE_NAME_TESTDB).getStatus() == PropagationTaskExecStatus.CREATED
@@ -918,7 +912,7 @@ public class UserITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_CSV, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("sx-dx", connObjectTO.getAttr("THEIRGROUP").getValues().get(0));
+        assertEquals("sx-dx", connObjectTO.getAttr("THEIRGROUP").get().getValues().get(0));
     }
 
     @Test
@@ -994,7 +988,7 @@ public class UserITCase extends AbstractITCase {
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_CSV, AnyTypeKind.USER.name(), userTO.getKey());
-        assertNull(connObjectTO.getAttr("email"));
+        assertFalse(connObjectTO.getAttr("email").isPresent());
     }
 
     @Test
@@ -1288,7 +1282,7 @@ public class UserITCase extends AbstractITCase {
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(PropagationTaskExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals("rest-target-resource", result.getPropagationStatuses().get(0).getResource());
-        assertEquals("surname", userTO.getPlainAttr("surname").getValues().get(0));
+        assertEquals("surname", userTO.getPlainAttr("surname").get().getValues().get(0));
 
         // verify user exists on the backend REST service
         WebClient webClient = WebClient.create(
@@ -1308,7 +1302,7 @@ public class UserITCase extends AbstractITCase {
         assertEquals(1, result.getPropagationStatuses().size());
         assertEquals(PropagationTaskExecStatus.SUCCESS, result.getPropagationStatuses().get(0).getStatus());
         assertEquals("rest-target-resource", result.getPropagationStatuses().get(0).getResource());
-        assertEquals("surname2", result.getEntity().getPlainAttr("surname").getValues().get(0));
+        assertEquals("surname2", result.getEntity().getPlainAttr("surname").get().getValues().get(0));
 
         // verify user still exists on the backend REST service
         response = webClient.get();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
index f60c4a6..4a1c445 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserIssuesITCase.java
@@ -405,7 +405,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_DBVIRATTR, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("virtualvalue", connObjectTO.getAttr("USERNAME").getValues().get(0));
+        assertEquals("virtualvalue", connObjectTO.getAttr("USERNAME").get().getValues().get(0));
         // ----------------------------------
 
         userTO = userService.read(userTO.getKey());
@@ -463,7 +463,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         ConnObjectTO userOnDb = resourceService.readConnObject(
                 RESOURCE_NAME_TESTDB, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDbAttr = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDbAttr = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME).get();
         assertNotNull(pwdOnTestDbAttr);
         assertNotNull(pwdOnTestDbAttr.getValues());
         assertFalse(pwdOnTestDbAttr.getValues().isEmpty());
@@ -471,7 +471,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         ConnObjectTO userOnDb2 = resourceService.readConnObject(
                 RESOURCE_NAME_TESTDB2, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDb2Attr = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDb2Attr = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME).get();
         assertNotNull(pwdOnTestDb2Attr);
         assertNotNull(pwdOnTestDb2Attr.getValues());
         assertFalse(pwdOnTestDb2Attr.getValues().isEmpty());
@@ -496,7 +496,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 3c. verify that password *has* changed on testdb
         userOnDb = resourceService.readConnObject(RESOURCE_NAME_TESTDB, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDbAttrAfter = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDbAttrAfter = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME).get();
         assertNotNull(pwdOnTestDbAttrAfter);
         assertNotNull(pwdOnTestDbAttrAfter.getValues());
         assertFalse(pwdOnTestDbAttrAfter.getValues().isEmpty());
@@ -504,7 +504,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 3d. verify that password hasn't changed on testdb2
         userOnDb2 = resourceService.readConnObject(RESOURCE_NAME_TESTDB2, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDb2AttrAfter = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDb2AttrAfter = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME).get();
         assertNotNull(pwdOnTestDb2AttrAfter);
         assertNotNull(pwdOnTestDb2AttrAfter.getValues());
         assertFalse(pwdOnTestDb2AttrAfter.getValues().isEmpty());
@@ -603,7 +603,7 @@ public class UserIssuesITCase extends AbstractITCase {
             userPatch.setKey(userKey);
             userPatch.getPlainAttrs().add(attrAddReplacePatch("ctype", "a type"));
             UserTO userTO = updateUser(userPatch).getEntity();
-            assertEquals("a type", userTO.getPlainAttr("ctype").getValues().get(0));
+            assertEquals("a type", userTO.getPlainAttr("ctype").get().getValues().get(0));
         }
     }
 
@@ -611,7 +611,7 @@ public class UserIssuesITCase extends AbstractITCase {
     public void issueSYNCOPE354() {
         // change resource-ldap group mapping for including uniqueMember (need for assertions below)
         ResourceTO ldap = resourceService.read(RESOURCE_NAME_LDAP);
-        for (ItemTO item : ldap.getProvision(AnyTypeKind.GROUP.name()).getMapping().getItems()) {
+        for (ItemTO item : ldap.getProvision(AnyTypeKind.GROUP.name()).get().getMapping().getItems()) {
             if ("description".equals(item.getExtAttrName())) {
                 item.setExtAttrName("uniqueMember");
             }
@@ -639,7 +639,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObj = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), groupTO.getKey());
         assertNotNull(connObj);
-        assertTrue(connObj.getAttr("uniqueMember").getValues().
+        assertTrue(connObj.getAttr("uniqueMember").get().getValues().
                 contains("uid=" + userTO.getUsername() + ",ou=people,o=isp"));
 
         // 4. remove membership
@@ -654,11 +654,11 @@ public class UserIssuesITCase extends AbstractITCase {
         // 5. read group on resource, check that user DN was removed from uniqueMember
         connObj = resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), groupTO.getKey());
         assertNotNull(connObj);
-        assertFalse(connObj.getAttr("uniqueMember").getValues().
+        assertFalse(connObj.getAttr("uniqueMember").get().getValues().
                 contains("uid=" + userTO.getUsername() + ",ou=people,o=isp"));
 
         // 6. restore original resource-ldap group mapping
-        for (ItemTO item : ldap.getProvision(AnyTypeKind.GROUP.name()).getMapping().getItems()) {
+        for (ItemTO item : ldap.getProvision(AnyTypeKind.GROUP.name()).get().getMapping().getItems()) {
             if ("uniqueMember".equals(item.getExtAttrName())) {
                 item.setExtAttrName("description");
             }
@@ -693,12 +693,12 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObj = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(connObj);
-        AttrTO registeredAddress = connObj.getAttr("registeredAddress");
+        AttrTO registeredAddress = connObj.getAttr("registeredAddress").get();
         assertNotNull(registeredAddress);
-        assertEquals(userTO.getPlainAttr("obscure").getValues(), registeredAddress.getValues());
-        AttrTO jpegPhoto = connObj.getAttr("jpegPhoto");
+        assertEquals(userTO.getPlainAttr("obscure").get().getValues(), registeredAddress.getValues());
+        AttrTO jpegPhoto = connObj.getAttr("jpegPhoto").get();
         assertNotNull(jpegPhoto);
-        assertEquals(userTO.getPlainAttr("photo").getValues(), jpegPhoto.getValues());
+        assertEquals(userTO.getPlainAttr("photo").get().getValues(), jpegPhoto.getValues());
 
         // 4. remove group
         groupService.delete(groupTO.getKey());
@@ -802,14 +802,14 @@ public class UserIssuesITCase extends AbstractITCase {
         userTO.getPlainAttrs().add(attrTO("makeItDouble", "3"));
 
         userTO = createUser(userTO).getEntity();
-        assertEquals("6", userTO.getPlainAttr("makeItDouble").getValues().get(0));
+        assertEquals("6", userTO.getPlainAttr("makeItDouble").get().getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(userTO.getKey());
         userPatch.getPlainAttrs().add(attrAddReplacePatch("makeItDouble", "7"));
 
         userTO = updateUser(userPatch).getEntity();
-        assertEquals("14", userTO.getPlainAttr("makeItDouble").getValues().get(0));
+        assertEquals("14", userTO.getPlainAttr("makeItDouble").get().getValues().get(0));
     }
 
     @Test
@@ -863,9 +863,9 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 3. try (and succeed) to perform simple LDAP binding with provided password ('password123')
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttr(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).get().getValues().get(0),
                 "password123",
-                connObject.getAttr(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).get().getValues().get(0)));
 
         // 4. update user without any password change request
         UserPatch userPatch = new UserPatch();
@@ -877,9 +877,9 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 5. try (and succeed again) to perform simple LDAP binding: password has not changed
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttr(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).get().getValues().get(0),
                 "password123",
-                connObject.getAttr(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).get().getValues().get(0)));
     }
 
     @Test
@@ -897,13 +897,13 @@ public class UserIssuesITCase extends AbstractITCase {
                 resourceService.readConnObject(RESOURCE_NAME_WS1, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(actual);
         // check if mapping attribute with purpose NONE really hasn't been propagated
-        assertNull(actual.getAttr("NAME"));
+        assertFalse(actual.getAttr("NAME").isPresent());
 
         // 2.  update resource ws-target-resource-1
         ResourceTO ws1 = resourceService.read(RESOURCE_NAME_WS1);
         assertNotNull(ws1);
 
-        MappingTO ws1NewUMapping = ws1.getProvision(AnyTypeKind.USER.name()).getMapping();
+        MappingTO ws1NewUMapping = ws1.getProvision(AnyTypeKind.USER.name()).get().getMapping();
         // change purpose from NONE to BOTH
         for (ItemTO itemTO : ws1NewUMapping.getItems()) {
             if ("firstname".equals(itemTO.getIntAttrName())) {
@@ -911,14 +911,14 @@ public class UserIssuesITCase extends AbstractITCase {
             }
         }
 
-        ws1.getProvision(AnyTypeKind.USER.name()).setMapping(ws1NewUMapping);
+        ws1.getProvision(AnyTypeKind.USER.name()).get().setMapping(ws1NewUMapping);
 
         resourceService.update(ws1);
         ResourceTO newWs1 = resourceService.read(ws1.getKey());
         assertNotNull(newWs1);
 
         // check for existence
-        Collection<ItemTO> mapItems = newWs1.getProvision(AnyTypeKind.USER.name()).getMapping().getItems();
+        Collection<ItemTO> mapItems = newWs1.getProvision(AnyTypeKind.USER.name()).get().getMapping().getItems();
         assertNotNull(mapItems);
         assertEquals(7, mapItems.size());
 
@@ -938,10 +938,10 @@ public class UserIssuesITCase extends AbstractITCase {
                 resourceService.readConnObject(RESOURCE_NAME_WS1, AnyTypeKind.USER.name(), userTO.getKey());
 
         assertNotNull(newUser.getAttr("NAME"));
-        assertEquals("firstnameNew", newUser.getAttr("NAME").getValues().get(0));
+        assertEquals("firstnameNew", newUser.getAttr("NAME").get().getValues().get(0));
 
         // 4.  restore resource ws-target-resource-1 mapping
-        ws1NewUMapping = newWs1.getProvision(AnyTypeKind.USER.name()).getMapping();
+        ws1NewUMapping = newWs1.getProvision(AnyTypeKind.USER.name()).get().getMapping();
         // restore purpose from BOTH to NONE
         for (ItemTO itemTO : ws1NewUMapping.getItems()) {
             if ("firstname".equals(itemTO.getIntAttrName())) {
@@ -949,7 +949,7 @@ public class UserIssuesITCase extends AbstractITCase {
             }
         }
 
-        newWs1.getProvision(AnyTypeKind.USER.name()).setMapping(ws1NewUMapping);
+        newWs1.getProvision(AnyTypeKind.USER.name()).get().setMapping(ws1NewUMapping);
 
         resourceService.update(newWs1);
     }
@@ -1027,9 +1027,9 @@ public class UserIssuesITCase extends AbstractITCase {
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
 
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttr(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).get().getValues().get(0),
                 "security123",
-                connObject.getAttr(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).get().getValues().get(0)));
 
         // 5. Remove LDAPPasswordPropagationActions
         resourceTO = resourceService.read(RESOURCE_NAME_LDAP);
@@ -1071,7 +1071,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has not changed
-        assertEquals("password0", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("password0", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).get().getValues().get(0));
         assertNull(userTO.getPassword());
 
         // 3. create user with not null password and propagate onto resource-csv, specify not to save password on
@@ -1090,7 +1090,9 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has been propagated and that saved userTO's password is null
-        assertEquals("passwordTESTNULL1", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals(
+                "passwordTESTNULL1",
+                connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).get().getValues().get(0));
         assertNull(userTO.getPassword());
 
         // 4. create user and propagate password on resource-csv and on Syncope local storage
@@ -1108,7 +1110,9 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has been correctly propagated on Syncope and resource-csv as usual
-        assertEquals("passwordTESTNULL1", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals(
+                "passwordTESTNULL1",
+                connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).get().getValues().get(0));
         Pair<Map<String, Set<String>>, UserTO> self =
                 clientFactory.create(userTO.getUsername(), "passwordTESTNULL1").self();
         assertNotNull(self);
@@ -1160,7 +1164,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("postalAddress", connObjectTO.getAttr("postalAddress").getValues().get(0));
+        assertEquals("postalAddress", connObjectTO.getAttr("postalAddress").get().getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(actual.getKey());
@@ -1170,7 +1174,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("newPostalAddress", connObjectTO.getAttr("postalAddress").getValues().get(0));
+        assertEquals("newPostalAddress", connObjectTO.getAttr("postalAddress").get().getValues().get(0));
     }
 
     @Test
@@ -1317,7 +1321,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObject =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
         assertNotNull(connObject);
-        AttrTO userDn = connObject.getAttr(Name.NAME);
+        AttrTO userDn = connObject.getAttr(Name.NAME).get();
         assertNotNull(userDn);
         assertEquals(1, userDn.getValues().size());
         assertNotNull(getLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD, userDn.getValues().get(0)));
@@ -1342,7 +1346,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 2. create user matching the condition above
         UserTO user = UserITCase.getUniqueSampleTO("syncope1099U@apache.org");
-        user.getPlainAttr("firstname").getValues().set(0, "issueSYNCOPE1099");
+        user.getPlainAttr("firstname").get().getValues().set(0, "issueSYNCOPE1099");
 
         ProvisioningResult<UserTO> created = createUser(user);
         assertNotNull(created);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
index aba92ef..425ec7a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
@@ -126,7 +126,7 @@ public class UserSelfITCase extends AbstractITCase {
         // now approve and verify that propagation has happened
         WorkflowFormTO form = userWorkflowService.getFormForUser(userTO.getKey());
         form = userWorkflowService.claimForm(form.getTaskId());
-        form.getProperty("approve").setValue(Boolean.TRUE.toString());
+        form.getProperty("approve").get().setValue(Boolean.TRUE.toString());
         userTO = userWorkflowService.submitForm(form);
         assertNotNull(userTO);
         assertEquals("active", userTO.getStatus());
@@ -152,7 +152,7 @@ public class UserSelfITCase extends AbstractITCase {
     public void authenticateByPlainAttribute() {
         UserTO rossini = userService.read("rossini");
         assertNotNull(rossini);
-        String userId = rossini.getPlainAttr("userId").getValues().get(0);
+        String userId = rossini.getPlainAttr("userId").get().getValues().get(0);
         assertNotNull(userId);
 
         Pair<Map<String, Set<String>>, UserTO> self = clientFactory.create(userId, ADMIN_PWD).self();
@@ -224,7 +224,7 @@ public class UserSelfITCase extends AbstractITCase {
         // 3. approve self-update as admin
         WorkflowFormTO form = userWorkflowService.getFormForUser(updated.getKey());
         form = userWorkflowService.claimForm(form.getTaskId());
-        form.getProperty("approve").setValue(Boolean.TRUE.toString());
+        form.getProperty("approve").get().setValue(Boolean.TRUE.toString());
         updated = userWorkflowService.submitForm(form);
         assertNotNull(updated);
         assertEquals("active", updated.getStatus());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
index e21929e..4d20d2a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserWorkflowITCase.java
@@ -118,8 +118,8 @@ public class UserWorkflowITCase extends AbstractITCase {
         assertNotNull(form.getOwner());
 
         // 5. reject user
-        form.getProperty("approve").setValue(Boolean.FALSE.toString());
-        form.getProperty("rejectReason").setValue("I don't like him.");
+        form.getProperty("approve").get().setValue(Boolean.FALSE.toString());
+        form.getProperty("rejectReason").get().setValue("I don't like him.");
         userTO = userService3.submitForm(form);
         assertNotNull(userTO);
         assertEquals("rejected", userTO.getStatus());
@@ -191,7 +191,7 @@ public class UserWorkflowITCase extends AbstractITCase {
         assertNotNull(form.getOwner());
 
         // 5. approve user (and verify that propagation occurred)
-        form.getProperty("approve").setValue(Boolean.TRUE.toString());
+        form.getProperty("approve").get().setValue(Boolean.TRUE.toString());
         userTO = userWorkflowService.submitForm(form);
         assertNotNull(userTO);
         assertEquals("active", userTO.getStatus());
@@ -292,7 +292,7 @@ public class UserWorkflowITCase extends AbstractITCase {
         assertNotNull(form);
 
         // 5. approve user
-        form.getProperty("approve").setValue(Boolean.TRUE.toString());
+        form.getProperty("approve").get().setValue(Boolean.TRUE.toString());
 
         // 6. submit approve
         userTO = userWorkflowService.submitForm(form);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
index 5297257..452fc11 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/VirAttrITCase.java
@@ -23,13 +23,14 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import javax.sql.DataSource;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
@@ -89,7 +90,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 2. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
         assertNotNull(userTO);
-        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").get().getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(userTO.getKey());
@@ -102,14 +103,14 @@ public class VirAttrITCase extends AbstractITCase {
         // 4. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
         assertNotNull(userTO);
-        assertEquals("virtualupdated", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virtualupdated", userTO.getVirAttr("virtualdata").get().getValues().get(0));
     }
 
     @Test
     public void issueSYNCOPE260() {
         // create new virtual schema for the resource below
         ResourceTO ws2 = resourceService.read(RESOURCE_NAME_WS2);
-        ProvisionTO provision = ws2.getProvision(AnyTypeKind.USER.name());
+        ProvisionTO provision = ws2.getProvision(AnyTypeKind.USER.name()).get();
         assertNotNull(provision);
 
         VirSchemaTO virSchema = new VirSchemaTO();
@@ -144,7 +145,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue", connObjectTO.getAttr("COMPANYNAME").get().getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -162,7 +163,7 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = result.getEntity();
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").get().getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -176,7 +177,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertEquals("suspended", userTO.getStatus());
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").get().getValues().get(0));
 
         statusPatch = new StatusPatch();
         statusPatch.setKey(userTO.getKey());
@@ -186,7 +187,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertEquals("active", userTO.getStatus());
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").get().getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -204,11 +205,11 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = result.getEntity();
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("Surname2", connObjectTO.getAttr("SURNAME").getValues().get(0));
+        assertEquals("Surname2", connObjectTO.getAttr("SURNAME").get().getValues().get(0));
 
         // virtual attribute value did not change
-        assertFalse(connObjectTO.getAttr("COMPANYNAME").getValues().isEmpty());
-        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
+        assertFalse(connObjectTO.getAttr("COMPANYNAME").get().getValues().isEmpty());
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").get().getValues().get(0));
         // ----------------------------------
     }
 
@@ -232,7 +233,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 2. check for virtual attribute value
         actual = userService.read(actual.getKey());
-        assertEquals("virattrcache", actual.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", actual.getVirAttr("virtualdata").get().getValues().get(0));
 
         // 3. update virtual attribute directly
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
@@ -248,7 +249,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 4. check for cached attribute value
         actual = userService.read(actual.getKey());
-        assertEquals("virattrcache", actual.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", actual.getVirAttr("virtualdata").get().getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(actual.getKey());
@@ -261,7 +262,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 6. check for virtual attribute value
         actual = userService.read(actual.getKey());
         assertNotNull(actual);
-        assertEquals("virtualupdated", actual.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virtualupdated", actual.getVirAttr("virtualdata").get().getValues().get(0));
     }
 
     @Test
@@ -272,21 +273,18 @@ public class VirAttrITCase extends AbstractITCase {
         MappingTO origMapping = SerializationUtils.clone(csv.getProvisions().get(0).getMapping());
         try {
             // remove this mapping
-            CollectionUtils.filterInverse(csv.getProvisions().get(0).getMapping().getItems(),
-                    new Predicate<ItemTO>() {
-
-                @Override
-                public boolean evaluate(final ItemTO item) {
-                    return "email".equals(item.getIntAttrName());
-                }
-            });
+            Optional<ItemTO> email = csv.getProvisions().get(0).getMapping().getItems().stream().
+                    filter(item -> "email".equals(item.getIntAttrName())).findFirst();
+            if (email.isPresent()) {
+                csv.getProvisions().get(0).getMapping().getItems().remove(email.get());
+            }
 
             resourceService.update(csv);
             csv = resourceService.read(RESOURCE_NAME_CSV);
             assertNotNull(csv.getProvisions().get(0).getMapping());
 
             // create new virtual schema for the resource below
-            ProvisionTO provision = csv.getProvision(AnyTypeKind.USER.name());
+            ProvisionTO provision = csv.getProvision(AnyTypeKind.USER.name()).get();
             assertNotNull(provision);
 
             VirSchemaTO virSchema = new VirSchemaTO();
@@ -373,7 +371,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 2. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").get().getValues().get(0));
 
         // ----------------------------------------
         // 3. change connector URL so that we are sure that any provided value will come from virtual cache
@@ -408,7 +406,7 @@ public class VirAttrITCase extends AbstractITCase {
         // ----------------------------------------
 
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").get().getValues().get(0));
 
         // ----------------------------------------
         // 5. restore connector URL, values can be read again from external resource
@@ -425,7 +423,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // cached value still in place...
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").get().getValues().get(0));
 
         // force cache update by adding a resource which has virtualdata mapped for propagation
         UserPatch userPatch = new UserPatch();
@@ -436,7 +434,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache2", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virattrcache2", userTO.getVirAttr("virtualdata").get().getValues().get(0));
     }
 
     @Test
@@ -448,7 +446,7 @@ public class VirAttrITCase extends AbstractITCase {
         userTO.getVirAttrs().add(attrTO("virtualReadOnly", "readOnly"));
         userTO = createUser(userTO).getEntity();
         // finding no values because the virtual attribute is readonly 
-        assertTrue(userTO.getVirAttr("virtualReadOnly").getValues().isEmpty());
+        assertTrue(userTO.getVirAttr("virtualReadOnly").get().getValues().isEmpty());
     }
 
     @Test
@@ -560,9 +558,9 @@ public class VirAttrITCase extends AbstractITCase {
 
             Map<String, Object> actuals = jdbcTemplate.queryForMap(
                     "SELECT id, surname, email FROM testpull WHERE id=?",
-                    new Object[] { userTO.getPlainAttr("fullname").getValues().get(0) });
+                    new Object[] { userTO.getPlainAttr("fullname").get().getValues().get(0) });
 
-            assertEquals(userTO.getPlainAttr("fullname").getValues().get(0), actuals.get("id").toString());
+            assertEquals(userTO.getPlainAttr("fullname").get().getValues().get(0), actuals.get("id").toString());
             assertEquals("ml@group.it", actuals.get("email"));
             // -------------------------------------------
         } catch (Exception e) {
@@ -608,7 +606,7 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = createUser(userTO).getEntity();
 
         assertNotNull(userTO.getVirAttr("virtualdata"));
-        assertEquals("syncope501@apache.org", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("syncope501@apache.org", userTO.getVirAttr("virtualdata").get().getValues().get(0));
 
         // 2. update virtual attribute
         UserPatch userPatch = new UserPatch();
@@ -620,23 +618,19 @@ public class VirAttrITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         // 3. check that user virtual attribute has really been updated 
-        assertFalse(userTO.getVirAttr("virtualdata").getValues().isEmpty());
-        assertEquals("syncope501_updated@apache.org", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertFalse(userTO.getVirAttr("virtualdata").get().getValues().isEmpty());
+        assertEquals("syncope501_updated@apache.org", userTO.getVirAttr("virtualdata").get().getValues().get(0));
     }
 
     @Test
     public void issueSYNCOPE691() {
         ResourceTO ldap = resourceService.read(RESOURCE_NAME_LDAP);
         try {
-            ProvisionTO provision = ldap.getProvision(AnyTypeKind.USER.name());
+            ProvisionTO provision = ldap.getProvision(AnyTypeKind.USER.name()).orElse(null);
             assertNotNull(provision);
-            CollectionUtils.filterInverse(provision.getMapping().getItems(), new Predicate<ItemTO>() {
-
-                @Override
-                public boolean evaluate(final ItemTO item) {
-                    return "mail".equals(item.getExtAttrName());
-                }
-            });
+            List<ItemTO> mail = provision.getMapping().getItems().stream().
+                    filter(item -> "mail".equals(item.getExtAttrName())).collect(Collectors.toList());
+            provision.getMapping().getItems().removeAll(mail);
             provision.getVirSchemas().clear();
 
             ldap.getProvisions().clear();
@@ -645,7 +639,7 @@ public class VirAttrITCase extends AbstractITCase {
             resourceService.create(ldap);
 
             ldap = resourceService.read(ldap.getKey());
-            provision = ldap.getProvision(AnyTypeKind.USER.name());
+            provision = ldap.getProvision(AnyTypeKind.USER.name()).get();
             assertNotNull(provision);
 
             // create new virtual schema for the resource below

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
index a600b06..1817c24 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/WorkflowITCase.java
@@ -25,9 +25,8 @@ import static org.junit.Assert.assertFalse;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.Optional;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.IOUtils;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -44,16 +43,10 @@ public class WorkflowITCase extends AbstractITCase {
     @BeforeClass
     public static void findDefault() {
         Assume.assumeTrue(ActivitiDetector.isActivitiEnabledForUsers(syncopeService));
-        WorkflowDefinitionTO found = IterableUtils.find(
-                workflowService.list(AnyTypeKind.USER.name()), new Predicate<WorkflowDefinitionTO>() {
-
-            @Override
-            public boolean evaluate(final WorkflowDefinitionTO object) {
-                return object.isMain();
-            }
-        });
-        if (found != null) {
-            defaultUserKey = found.getKey();
+        Optional<WorkflowDefinitionTO> found = workflowService.list(AnyTypeKind.USER.name()).stream().
+                filter(object -> object.isMain()).findAny();
+        if (found.isPresent()) {
+            defaultUserKey = found.get().getKey();
         }
         assertNotNull(defaultUserKey);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/ide/pom.xml
----------------------------------------------------------------------
diff --git a/ide/pom.xml b/ide/pom.xml
index 37eb9b7..d301f0d 100644
--- a/ide/pom.xml
+++ b/ide/pom.xml
@@ -36,7 +36,7 @@ under the License.
   </properties>
 
   <modules>
-    <module>eclipse</module>
+    <!--<module>eclipse</module>-->
     <module>netbeans</module>
   </modules>
 
@@ -104,4 +104,4 @@ under the License.
       </build>
     </profile>
   </profiles>
-</project>
\ No newline at end of file
+</project>

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 0474eed..df9e4f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -401,7 +401,6 @@ under the License.
     <commons-jexl.version>3.1</commons-jexl.version>
     <commons-lang.version>3.6</commons-lang.version>
     <commons-text.version>1.1</commons-text.version>
-    <commons-collection.version>4.1</commons-collection.version>
     <commons-logging.version>1.1.3</commons-logging.version>
 
     <joda.version>2.9.9</joda.version>
@@ -970,11 +969,6 @@ under the License.
         <artifactId>commons-text</artifactId>
         <version>${commons-text.version}</version>
       </dependency>
-      <dependency>
-        <groupId>org.apache.commons</groupId>
-        <artifactId>commons-collections4</artifactId>
-        <version>${commons-collection.version}</version>
-      </dependency>
 
       <dependency>
         <groupId>net.tirasa.connid</groupId>
@@ -2182,7 +2176,6 @@ under the License.
             <link>https://commons.apache.org/proper/commons-lang/javadocs/api-release/</link>
             <link>https://commons.apache.org/proper/commons-io/javadocs/api-2.5/</link>
             <link>https://commons.apache.org/proper/commons-jexl/apidocs/</link>
-            <link>https://commons.apache.org/proper/commons-collections/javadocs/api-release/</link>
             <link>http://docs.spring.io/spring/docs/4.3.x/javadoc-api/</link>
             <link>http://docs.spring.io/spring-security/site/docs/4.2.x/apidocs/</link>
             <link>http://activiti.org/javadocs/</link>


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
index 9348589..d776b65 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/PlainAttrs.java
@@ -20,11 +20,9 @@ package org.apache.syncope.client.console.wizards.any;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.SchemaUtils;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.LabelInfo;
@@ -170,10 +168,9 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
 
         Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
-        for (PlainSchemaTO schema : schemas.values()) {
+        schemas.values().stream().map(schema -> {
             AttrTO attrTO = new AttrTO();
             attrTO.setSchema(schema.getKey());
-
             if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
                 attrTO.getValues().add("");
 
@@ -182,8 +179,10 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
             } else {
                 attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
             }
+            return attrTO;
+        }).forEachOrdered(attrTO -> {
             attrs.add(attrTO);
-        }
+        });
 
         anyTO.getPlainAttrs().clear();
         anyTO.getPlainAttrs().addAll(attrs);
@@ -195,20 +194,22 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
 
         Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(membershipTO.getPlainAttrs());
 
-        for (PlainSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
-            AttrTO attrTO = new AttrTO();
-            attrTO.setSchema(schema.getKey());
+        membershipSchemas.get(membershipTO.getGroupKey()).values().stream().
+                map(schema -> {
+                    AttrTO attrTO = new AttrTO();
+                    attrTO.setSchema(schema.getKey());
+                    if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
+                        attrTO.getValues().add("");
 
-            if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
-                attrTO.getValues().add("");
-
-                // is important to set the schema info only after values setting
-                attrTO.setSchemaInfo(schema);
-            } else {
-                attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
-            }
+                        // is important to set the schema info only after values setting
+                        attrTO.setSchemaInfo(schema);
+                    } else {
+                        attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
+                    }
+                    return attrTO;
+                }).forEachOrdered(attrTO -> {
             attrs.add(attrTO);
-        }
+        });
 
         membershipTO.getPlainAttrs().clear();
         membershipTO.getPlainAttrs().addAll(attrs);
@@ -237,7 +238,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
         FieldPanel panel;
         switch (type) {
             case Boolean:
-                panel = new AjaxCheckBoxPanel("panel", schemaTO.getKey(), new Model<Boolean>(), true);
+                panel = new AjaxCheckBoxPanel("panel", schemaTO.getKey(), new Model<>(), true);
                 panel.setRequired(required);
                 break;
 
@@ -247,9 +248,9 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                         : schemaTO.getConversionPattern();
 
                 if (dataPattern.contains("H")) {
-                    panel = new AjaxDateTimeFieldPanel("panel", schemaTO.getKey(), new Model<Date>(), dataPattern);
+                    panel = new AjaxDateTimeFieldPanel("panel", schemaTO.getKey(), new Model<>(), dataPattern);
                 } else {
-                    panel = new AjaxDateFieldPanel("panel", schemaTO.getKey(), new Model<Date>(), dataPattern);
+                    panel = new AjaxDateFieldPanel("panel", schemaTO.getKey(), new Model<>(), dataPattern);
                 }
 
                 if (required) {
@@ -311,7 +312,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                 break;
 
             case Binary:
-                panel = new BinaryFieldPanel("panel", schemaTO.getKey(), new Model<String>(), schemaTO.getMimeType(),
+                panel = new BinaryFieldPanel("panel", schemaTO.getKey(), new Model<>(), schemaTO.getMimeType(),
                         fileKey);
 
                 if (required) {
@@ -320,7 +321,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                 break;
 
             case Encrypted:
-                panel = new EncryptedFieldPanel("panel", schemaTO.getKey(), new Model<String>(), true);
+                panel = new EncryptedFieldPanel("panel", schemaTO.getKey(), new Model<>(), true);
 
                 if (required) {
                     panel.addRequiredLabel();
@@ -328,7 +329,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                 break;
 
             default:
-                panel = new AjaxTextFieldPanel("panel", schemaTO.getKey(), new Model<String>(), true);
+                panel = new AjaxTextFieldPanel("panel", schemaTO.getKey(), new Model<>(), true);
 
                 if (jexlHelp) {
                     AjaxTextFieldPanel.class.cast(panel).enableJexlHelp();
@@ -369,7 +370,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                         FieldPanel.class.cast(panel).setNewModel(attrTO.getValues());
                     } else {
                         panel = new MultiFieldPanel.Builder<>(
-                                new PropertyModel<List<String>>(attrTO, "values")).build(
+                                new PropertyModel<>(attrTO, "values")).build(
                                 "panel",
                                 attrTO.getSchema(),
                                 FieldPanel.class.cast(panel));
@@ -379,24 +380,13 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                     if (previousObject != null
                             && (previousObject.getPlainAttr(attrTO.getSchema()) == null
                             || !ListUtils.isEqualList(
-                                    ListUtils.select(previousObject.getPlainAttr(attrTO.getSchema()).getValues(),
-                                            new Predicate<String>() {
-
-                                        @Override
-                                        public boolean evaluate(final String object) {
-                                            return StringUtils.isNotEmpty(object);
-                                        }
-                                    }), ListUtils.select(attrTO.getValues(),
-                                            new Predicate<String>() {
-
-                                        @Override
-                                        public boolean evaluate(final String object) {
-                                            return StringUtils.isNotEmpty(object);
-                                        }
-                                    })))) {
+                                    ListUtils.select(previousObject.getPlainAttr(attrTO.getSchema()).get().getValues(),
+                                            object -> StringUtils.isNotEmpty(object)),
+                                    ListUtils.select(attrTO.getValues(), object -> StringUtils.isNotEmpty(object))))) {
+
                         List<String> oldValues = previousObject.getPlainAttr(attrTO.getSchema()) == null
                                 ? Collections.<String>emptyList()
-                                : previousObject.getPlainAttr(attrTO.getSchema()).getValues();
+                                : previousObject.getPlainAttr(attrTO.getSchema()).get().getValues();
                         panel.showExternAction(new LabelInfo("externalAction", oldValues));
                     }
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
index 115da51..9da914b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Relationships.java
@@ -18,27 +18,22 @@
  */
 package org.apache.syncope.client.console.wizards.any;
 
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.SerializableTransformer;
 import org.apache.syncope.client.console.panels.AnyDirectoryPanel;
 import org.apache.syncope.client.console.panels.ListViewPanel;
 import org.apache.syncope.client.console.panels.ListViewPanel.ListViewReload;
 import org.apache.syncope.client.console.panels.search.AnyObjectSearchPanel;
 import org.apache.syncope.client.console.panels.search.AnyObjectSelectionDirectoryPanel;
 import org.apache.syncope.client.console.panels.search.AnySelectionDirectoryPanel;
-import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchClausePanel;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
@@ -53,13 +48,12 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.lib.SyncopeClient;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupableRelatableTO;
 import org.apache.syncope.common.lib.to.RelationshipTO;
-import org.apache.syncope.common.lib.to.RelationshipTypeTO;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.wicket.Component;
@@ -68,7 +62,6 @@ import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.event.Broadcast;
 import org.apache.wicket.event.IEvent;
 import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
-import org.apache.wicket.extensions.markup.html.tabs.ITab;
 import org.apache.wicket.extensions.wizard.IWizard;
 import org.apache.wicket.extensions.wizard.WizardModel;
 import org.apache.wicket.extensions.wizard.WizardStep;
@@ -95,7 +88,7 @@ public class Relationships extends WizardStep implements WizardModel.ICondition
     private final AnyTypeClassRestClient anyTypeClassRestClient = new AnyTypeClassRestClient();
 
     private final AnyTO anyTO;
-    
+
     private final RelationshipTypeRestClient relationshipTypeRestClient = new RelationshipTypeRestClient();
 
     public Relationships(final AnyWrapper<?> modelObject, final PageReference pageRef) {
@@ -134,38 +127,31 @@ public class Relationships extends WizardStep implements WizardModel.ICondition
         final Fragment viewFragment = new Fragment("relationships", "viewFragment", this);
         viewFragment.setOutputMarkupId(true);
 
-        viewFragment.add(new Accordion("relationships",
-                CollectionUtils.collect(relationships.keySet(), new SerializableTransformer<String, ITab>() {
-
-                    private static final long serialVersionUID = 3514912643300593122L;
-
-                    @Override
-                    public ITab transform(final String input) {
-                        return new AbstractTab(new ResourceModel("relationship", input)) {
+        viewFragment.add(new Accordion("relationships", relationships.keySet().stream().map(relationship -> {
+            return new AbstractTab(new ResourceModel("relationship", relationship)) {
 
-                            private static final long serialVersionUID = 1037272333056449378L;
+                private static final long serialVersionUID = 1037272333056449378L;
 
-                            @Override
-                            public Panel getPanel(final String panelId) {
-                                return new ListViewPanel.Builder<>(RelationshipTO.class, pageRef).
-                                        setItems(relationships.get(input)).
-                                        includes("rightType", "rightKey").
-                                        addAction(new ActionLink<RelationshipTO>() {
-
-                                            private static final long serialVersionUID = -6847033126124401556L;
-
-                                            @Override
-                                            public void onClick(
-                                                    final AjaxRequestTarget target, final RelationshipTO modelObject) {
-                                                removeRelationships(relationships, modelObject);
-                                                send(Relationships.this, Broadcast.DEPTH, new ListViewReload<>(target));
-                                            }
-                                        }, ActionType.DELETE, AnyEntitlement.UPDATE.getFor(anyTO.getType()), true).
-                                        build(panelId);
-                            }
-                        };
-                    }
-                }, new ArrayList<ITab>())) {
+                @Override
+                public Panel getPanel(final String panelId) {
+                    return new ListViewPanel.Builder<>(RelationshipTO.class, pageRef).
+                            setItems(relationships.get(relationship)).
+                            includes("rightType", "rightKey").
+                            addAction(new ActionLink<RelationshipTO>() {
+
+                                private static final long serialVersionUID = -6847033126124401556L;
+
+                                @Override
+                                public void onClick(
+                                        final AjaxRequestTarget target, final RelationshipTO modelObject) {
+                                    removeRelationships(relationships, modelObject);
+                                    send(Relationships.this, Broadcast.DEPTH, new ListViewReload<>(target));
+                                }
+                            }, ActionType.DELETE, AnyEntitlement.UPDATE.getFor(anyTO.getType()), true).
+                            build(panelId);
+                }
+            };
+        }).collect(Collectors.toList())) {
 
             private static final long serialVersionUID = 1037272333056449379L;
 
@@ -257,23 +243,17 @@ public class Relationships extends WizardStep implements WizardModel.ICondition
             super("specification");
             rel = new RelationshipTO();
 
-            final ArrayList<String> availableRels = CollectionUtils.collect(
-                    relationshipTypeRestClient.list(),
-                    EntityTOUtils.<RelationshipTypeTO>keyTransformer(), new ArrayList<String>());
+            final List<String> availableRels = relationshipTypeRestClient.list().stream().
+                    map(EntityTO::getKey).collect(Collectors.toList());
 
             final AjaxDropDownChoicePanel<String> type = new AjaxDropDownChoicePanel<>(
-                    "type", "type", new PropertyModel<String>(rel, "type"));
+                    "type", "type", new PropertyModel<>(rel, "type"));
             type.setChoices(availableRels);
             add(type.setRenderBodyOnly(true));
 
-            final List<AnyTypeTO> availableTypes = ListUtils.select(anyTypeRestClient.listAnyTypes(),
-                    new Predicate<AnyTypeTO>() {
-
-                @Override
-                public boolean evaluate(final AnyTypeTO object) {
-                    return object.getKind() != AnyTypeKind.GROUP && object.getKind() != AnyTypeKind.USER;
-                }
-            });
+            final List<AnyTypeTO> availableTypes = anyTypeRestClient.listAnyTypes().stream().
+                    filter(anyType -> anyType.getKind() != AnyTypeKind.GROUP
+                    && anyType.getKind() != AnyTypeKind.USER).collect(Collectors.toList());
 
             final AjaxDropDownChoicePanel<AnyTypeTO> rightType = new AjaxDropDownChoicePanel<>(
                     "rightType", "rightType", new PropertyModel<AnyTypeTO>(rel, "rightType") {
@@ -312,13 +292,8 @@ public class Relationships extends WizardStep implements WizardModel.ICondition
 
                 @Override
                 public AnyTypeTO getObject(final String id, final IModel<? extends List<? extends AnyTypeTO>> choices) {
-                    return IterableUtils.find(choices.getObject(), new Predicate<AnyTypeTO>() {
-
-                        @Override
-                        public boolean evaluate(final AnyTypeTO object) {
-                            return id.equals(object.getKey());
-                        }
-                    });
+                    return choices.getObject().stream().
+                            filter(anyTypeTO -> id.equals(anyTypeTO.getKey())).findAny().orElse(null);
                 }
             });
             // enable "rightType" dropdown only if "type" option is selected - SYNCOPE-1140
@@ -364,7 +339,7 @@ public class Relationships extends WizardStep implements WizardModel.ICondition
 
                         anyObjectSearchPanel = new AnyObjectSearchPanel.Builder(
                                 anyType.getKey(),
-                                new ListModel<>(new ArrayList<SearchClause>())).
+                                new ListModel<>(new ArrayList<>())).
                                 enableSearch(Specification.this).
                                 build("searchPanel");
                         fragment.add(anyObjectSearchPanel.setRenderBodyOnly(true));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
index 2ace1c7..806b87c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Resources.java
@@ -21,16 +21,14 @@ package org.apache.syncope.client.console.wizards.any;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.ListUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.LabelInfo;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.ActionPermissions;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.MetaDataRoleAuthorizationStrategy;
@@ -51,9 +49,9 @@ public class Resources extends WizardStep implements WizardModel.ICondition {
 
         if (modelObject instanceof UserWrapper
                 && UserWrapper.class.cast(modelObject).getPreviousUserTO() != null
-                && !ListUtils.isEqualList(
-                        modelObject.getInnerObject().getResources(),
+                && !modelObject.getInnerObject().getResources().equals(
                         UserWrapper.class.cast(modelObject).getPreviousUserTO().getResources())) {
+
             add(new LabelInfo("changed", StringUtils.EMPTY));
         } else {
             add(new Label("changed", StringUtils.EMPTY));
@@ -93,9 +91,9 @@ public class Resources extends WizardStep implements WizardModel.ICondition {
     public boolean evaluate() {
         if (SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
                 isActionAuthorized(this, RENDER)) {
-            available.setObject(CollectionUtils.collect(new ResourceRestClient().list(),
-                    EntityTOUtils.<ResourceTO>keyTransformer(), new ArrayList<String>()));
-            return CollectionUtils.isNotEmpty(available.getObject());
+            available.setObject(new ResourceRestClient().list().stream().
+                    map(EntityTO::getKey).collect(Collectors.toList()));
+            return !available.getObject().isEmpty();
         } else {
             return false;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Roles.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Roles.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Roles.java
index 07d8275..974d7e9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Roles.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Roles.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.console.wizards.any;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -28,9 +28,8 @@ import org.apache.syncope.client.console.SyncopeConsoleApplication;
 import org.apache.syncope.client.console.rest.RoleRestClient;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.LabelInfo;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.RoleTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.authroles.authorization.strategies.role.metadata.ActionPermissions;
@@ -75,8 +74,9 @@ public class Roles extends WizardStep implements ICondition {
         this.setOutputMarkupId(true);
 
         allRoles = SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                isActionAuthorized(this, RENDER) ? CollectionUtils.collect(new RoleRestClient().list(),
-                EntityTOUtils.<RoleTO>keyTransformer(), new ArrayList<String>()) : Collections.<String>emptyList();
+                isActionAuthorized(this, RENDER)
+                ? new RoleRestClient().list().stream().map(EntityTO::getKey).collect(Collectors.toList())
+                : Collections.<String>emptyList();
         Collections.sort(allRoles);
 
         add(new AjaxPalettePanel.Builder<String>().build("roles",
@@ -92,6 +92,6 @@ public class Roles extends WizardStep implements ICondition {
     public final boolean evaluate() {
         return CollectionUtils.isNotEmpty(allRoles)
                 && SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                isActionAuthorized(this, RENDER);
+                        isActionAuthorized(this, RENDER);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
index cc1a2cc..cac7b38 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/StatusPanel.java
@@ -22,10 +22,10 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
+import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.SerializableTransformer;
 import org.apache.syncope.client.console.commons.status.ConnObjectWrapper;
 import org.apache.syncope.client.console.commons.status.Status;
 import org.apache.syncope.client.console.commons.status.StatusBean;
@@ -64,20 +64,12 @@ public class StatusPanel extends Panel {
             final T any,
             final IModel<List<StatusBean>> model,
             final PageReference pageRef) {
+
         super(id);
         statusUtils = new StatusUtils();
-        init(any, model,
-                CollectionUtils.collect(statusUtils.getConnectorObjects(any),
-                        new SerializableTransformer<ConnObjectWrapper, Pair<ConnObjectTO, ConnObjectWrapper>>() {
-
-                    private static final long serialVersionUID = 2658691884036294287L;
-
-                    @Override
-                    public Pair<ConnObjectTO, ConnObjectWrapper> transform(final ConnObjectWrapper input) {
-                        return Pair.of(null, input);
-                    }
-
-                }, new ArrayList<Pair<ConnObjectTO, ConnObjectWrapper>>()), pageRef, false);
+        init(any, model, statusUtils.getConnectorObjects(any).stream().
+                map(input -> new ImmutablePair<ConnObjectTO, ConnObjectWrapper>(null, input)).
+                collect(Collectors.toList()), pageRef, false);
     }
 
     public <T extends AnyTO> StatusPanel(
@@ -123,7 +115,7 @@ public class StatusPanel extends Panel {
         statusBeans.add(syncope);
         initialStatusBeanMap.put(syncope.getResource(), syncope);
 
-        for (Pair<ConnObjectTO, ConnObjectWrapper> pair : connObjects) {
+        connObjects.forEach(pair -> {
             ConnObjectWrapper entry = pair.getRight();
             final StatusBean statusBean = statusUtils.getStatusBean(entry.getAny(),
                     entry.getResourceName(),
@@ -132,7 +124,7 @@ public class StatusPanel extends Panel {
 
             initialStatusBeanMap.put(entry.getResourceName(), statusBean);
             statusBeans.add(statusBean);
-        }
+        });
 
         final MultilevelPanel mlp = new MultilevelPanel("resources");
         add(mlp);
@@ -163,8 +155,8 @@ public class StatusPanel extends Panel {
 
             @Override
             protected boolean statusCondition(final StatusBean bean) {
-                final Pair<ConnObjectTO, ConnObjectTO> pair
-                        = getConnObjectTO(bean.getKey(), bean.getResource(), connObjects);
+                final Pair<ConnObjectTO, ConnObjectTO> pair =
+                        getConnObjectTO(bean.getKey(), bean.getResource(), connObjects);
 
                 return pair != null && pair.getRight() != null;
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TypeExtensionWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TypeExtensionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TypeExtensionWizardBuilder.java
index 35af482..2e5f725 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TypeExtensionWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/TypeExtensionWizardBuilder.java
@@ -19,18 +19,15 @@
 package org.apache.syncope.client.console.wizards.any;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
-import org.apache.syncope.common.lib.EntityTOUtils;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.TypeExtensionTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -73,14 +70,8 @@ public class TypeExtensionWizardBuilder extends AjaxWizardBuilder<TypeExtensionT
 
     @Override
     protected Serializable onApplyInternal(final TypeExtensionTO modelObject) {
-        final List<TypeExtensionTO> typeExtensions =
-                ListUtils.select(groupTO.getTypeExtensions(), new Predicate<TypeExtensionTO>() {
-
-                    @Override
-                    public boolean evaluate(final TypeExtensionTO object) {
-                        return !object.getAnyType().equals(modelObject.getAnyType());
-                    }
-                });
+        List<TypeExtensionTO> typeExtensions = groupTO.getTypeExtensions().stream().
+                filter(typeExt -> !typeExt.getAnyType().equals(modelObject.getAnyType())).collect(Collectors.toList());
         typeExtensions.add(modelObject);
         groupTO.getTypeExtensions().clear();
         groupTO.getTypeExtensions().addAll(typeExtensions);
@@ -100,30 +91,25 @@ public class TypeExtensionWizardBuilder extends AjaxWizardBuilder<TypeExtensionT
             if (typeExtensionTO.getAnyType() == null) {
                 List<String> anyTypes = new AnyTypeRestClient().list();
                 anyTypes.remove(AnyTypeKind.GROUP.name());
-                CollectionUtils.filter(anyTypes, new Predicate<String>() {
-
-                    @Override
-                    public boolean evaluate(final String anyType) {
-                        return groupTO.getTypeExtension(anyType) == null;
-                    }
-                });
+                anyTypes.removeAll(anyTypes.stream().
+                        filter(anyType -> groupTO.getTypeExtension(anyType).isPresent()).collect(Collectors.toList()));
 
                 AjaxDropDownChoicePanel<String> anyTypeComponent = new AjaxDropDownChoicePanel<>(
-                        "anyType.component", "anyType", new PropertyModel<String>(typeExtensionTO, "anyType"));
+                        "anyType.component", "anyType", new PropertyModel<>(typeExtensionTO, "anyType"));
                 anyTypeComponent.setChoices(anyTypes);
                 anyTypeComponent.addRequiredLabel();
                 add(anyTypeComponent.hideLabel().setOutputMarkupId(true));
             } else {
                 AjaxTextFieldPanel anyTypeComponent = new AjaxTextFieldPanel(
-                        "anyType.component", "anyType", new PropertyModel<String>(typeExtensionTO, "anyType"));
+                        "anyType.component", "anyType", new PropertyModel<>(typeExtensionTO, "anyType"));
                 anyTypeComponent.setEnabled(false);
                 add(anyTypeComponent.hideLabel());
             }
 
             add(new Label("auxClasses.label", auxClassesLabel));
 
-            List<String> anyTypeClasses = CollectionUtils.collect(new AnyTypeClassRestClient().list(),
-                    EntityTOUtils.keyTransformer(), new ArrayList<String>());
+            List<String> anyTypeClasses = new AnyTypeClassRestClient().list().stream().
+                    map(EntityTO::getKey).collect(Collectors.toList());
             AjaxPalettePanel<String> auxClassesPalette = new AjaxPalettePanel.Builder<String>().build(
                     "auxClasses.palette",
                     new PropertyModel<List<String>>(typeExtensionTO, "auxClasses"),

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
index c1c73f4..3746443 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/AbstractConnConfPanel.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.console.wizards.resources;
 
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
@@ -90,6 +89,6 @@ public abstract class AbstractConnConfPanel<T extends AbstractBaseBean>
 
     @Override
     public boolean evaluate() {
-        return model != null && CollectionUtils.isNotEmpty(model.getObject());
+        return model != null && model.getObject() != null && !model.getObject().isEmpty();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorConfPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorConfPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorConfPanel.java
index 580e2c8..f2a3a1e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorConfPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorConfPanel.java
@@ -18,15 +18,12 @@
  */
 package org.apache.syncope.client.console.wizards.resources;
 
-import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.types.ConnConfPropSchema;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.wicket.model.LoadableDetachableModel;
 
@@ -50,15 +47,11 @@ public abstract class ConnectorConfPanel extends AbstractConnConfPanel<ConnInsta
                 ConnectorConfPanel.this.modelObject.getConf().clear();
 
                 // re-order properties
-                Collections.sort(properties, new Comparator<ConnConfProperty>() {
-
-                    @Override
-                    public int compare(final ConnConfProperty left, final ConnConfProperty right) {
-                        if (left == null) {
-                            return -1;
-                        } else {
-                            return left.compareTo(right);
-                        }
+                Collections.sort(properties, (o1, o2) -> {
+                    if (o1 == null) {
+                        return -1;
+                    } else {
+                        return o1.compareTo(o2);
                     }
                 });
 
@@ -78,25 +71,21 @@ public abstract class ConnectorConfPanel extends AbstractConnConfPanel<ConnInsta
      */
     @Override
     protected final List<ConnConfProperty> getConnProperties(final ConnInstanceTO instance) {
-        return CollectionUtils.collect(
-                ConnectorWizardBuilder.getBundle(instance, bundles).getProperties(),
-                new Transformer<ConnConfPropSchema, ConnConfProperty>() {
-
-            @Override
-            public ConnConfProperty transform(final ConnConfPropSchema key) {
-                final ConnConfProperty property = new ConnConfProperty();
-                property.setSchema(key);
-
-                if (instance.getConf(key.getName()) != null && instance.getConf(key.getName()).getValues() != null) {
-                    property.getValues().addAll(instance.getConf(key.getName()).getValues());
-                    property.setOverridable(instance.getConf(key.getName()).isOverridable());
-                }
+        return ConnectorWizardBuilder.getBundle(instance, bundles).getProperties().stream().
+                map(key -> {
+                    ConnConfProperty property = new ConnConfProperty();
+                    property.setSchema(key);
+
+                    Optional<ConnConfProperty> conf = instance.getConf(key.getName());
+                    if (conf.isPresent() && conf.get().getValues() != null) {
+                        property.getValues().addAll(conf.get().getValues());
+                        property.setOverridable(conf.get().isOverridable());
+                    }
 
-                if (property.getValues().isEmpty() && !key.getDefaultValues().isEmpty()) {
-                    property.getValues().addAll(key.getDefaultValues());
-                }
-                return property;
-            }
-        }, new ArrayList<ConnConfProperty>());
+                    if (property.getValues().isEmpty() && !key.getDefaultValues().isEmpty()) {
+                        property.getValues().addAll(key.getDefaultValues());
+                    }
+                    return property;
+                }).collect(Collectors.toList());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorDetailsPanel.java
index 80a7a85..1a5f9a7 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorDetailsPanel.java
@@ -20,12 +20,8 @@ package org.apache.syncope.client.console.wizards.resources;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.RealmRestClient;
@@ -61,47 +57,31 @@ public class ConnectorDetailsPanel extends WizardStep {
             @Override
             protected List<String> load() {
                 List<RealmTO> allRealms = new RealmRestClient().list();
-                CollectionUtils.filter(allRealms, new Predicate<RealmTO>() {
-
-                    @Override
-                    public boolean evaluate(final RealmTO realm) {
-                        return IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-                            @Override
-                            public boolean evaluate(final String fullpath) {
-                                return realm.getFullPath().startsWith(fullpath);
-                            }
-                        });
-                    }
-                });
-
-                List<String> result = CollectionUtils.collect(allRealms, new Transformer<RealmTO, String>() {
+                allRealms.removeAll(allRealms.stream().filter(realm
+                        -> authRealms.stream().anyMatch(fullpath -> realm.getFullPath().startsWith(fullpath))).
+                        collect(Collectors.toList()));
 
-                    @Override
-                    public String transform(final RealmTO realm) {
-                        return realm.getFullPath();
-                    }
-                }, new ArrayList<String>());
+                List<String> result = allRealms.stream().map(RealmTO::getFullPath).collect(Collectors.toList());
                 Collections.sort(result);
                 return result;
             }
         };
 
         AjaxDropDownChoicePanel<String> realm = new AjaxDropDownChoicePanel<>(
-                "adminRealm", "adminRealm", new PropertyModel<String>(connInstanceTO, "adminRealm"), false);
+                "adminRealm", "adminRealm", new PropertyModel<>(connInstanceTO, "adminRealm"), false);
         realm.setChoices(realms);
         realm.setOutputMarkupId(true);
         realm.addRequiredLabel();
         add(realm);
 
         AjaxTextFieldPanel displayName = new AjaxTextFieldPanel(
-                "displayName", "displayName", new PropertyModel<String>(connInstanceTO, "displayName"), false);
+                "displayName", "displayName", new PropertyModel<>(connInstanceTO, "displayName"), false);
         displayName.setOutputMarkupId(true);
         displayName.addRequiredLabel();
         add(displayName);
 
         AjaxTextFieldPanel location = new AjaxTextFieldPanel(
-                "location", "location", new PropertyModel<String>(connInstanceTO, "location"), false);
+                "location", "location", new PropertyModel<>(connInstanceTO, "location"), false);
         location.addRequiredLabel();
         location.setOutputMarkupId(true);
         location.setEnabled(false);
@@ -110,15 +90,15 @@ public class ConnectorDetailsPanel extends WizardStep {
         final AjaxDropDownChoicePanel<String> bundleName = new AjaxDropDownChoicePanel<>(
                 "bundleName",
                 "bundleName",
-                new PropertyModel<String>(connInstanceTO, "bundleName"), false);
+                new PropertyModel<>(connInstanceTO, "bundleName"), false);
         ((DropDownChoice<String>) bundleName.getField()).setNullValid(true);
 
         List<String> bundleNames = new ArrayList<>();
-        for (ConnBundleTO bundle : bundles) {
-            if (!bundleNames.contains(bundle.getBundleName())) {
-                bundleNames.add(bundle.getBundleName());
-            }
-        }
+        bundles.stream().
+                filter(bundle -> (!bundleNames.contains(bundle.getBundleName()))).
+                forEachOrdered(bundle -> {
+                    bundleNames.add(bundle.getBundleName());
+                });
 
         bundleName.setChoices(bundleNames);
         bundleName.addRequiredLabel();
@@ -128,7 +108,7 @@ public class ConnectorDetailsPanel extends WizardStep {
         add(bundleName);
 
         final AjaxDropDownChoicePanel<String> version = new AjaxDropDownChoicePanel<>(
-                "version", "version", new PropertyModel<String>(connInstanceTO, "version"), false);
+                "version", "version", new PropertyModel<>(connInstanceTO, "version"), false);
         version.setChoices(getVersions(connInstanceTO, bundles));
         version.addRequiredLabel();
         version.setEnabled(connInstanceTO.getBundleName() != null);
@@ -186,20 +166,9 @@ public class ConnectorDetailsPanel extends WizardStep {
     }
 
     private List<String> getVersions(final ConnInstanceTO connInstanceTO, final List<ConnBundleTO> bundles) {
-        return new ArrayList<>(CollectionUtils.collect(
-                CollectionUtils.select(bundles, new Predicate<ConnBundleTO>() {
-
-                    @Override
-                    public boolean evaluate(final ConnBundleTO object) {
-                        return object.getLocation().equals(connInstanceTO.getLocation())
-                                && object.getBundleName().equals(connInstanceTO.getBundleName());
-                    }
-                }), new Transformer<ConnBundleTO, String>() {
-
-            @Override
-            public String transform(final ConnBundleTO input) {
-                return input.getVersion();
-            }
-        }, new HashSet<String>()));
+        return bundles.stream().filter(object
+                -> object.getLocation().equals(connInstanceTO.getLocation())
+                && object.getBundleName().equals(connInstanceTO.getBundleName())).
+                map(ConnBundleTO::getVersion).collect(Collectors.toList());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorWizardBuilder.java
index 20037d8..7fcd82c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ConnectorWizardBuilder.java
@@ -20,18 +20,14 @@ package org.apache.syncope.client.console.wizards.resources;
 
 import java.io.Serializable;
 import java.net.URI;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
 import org.apache.syncope.client.console.topology.TopologyNode;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.common.lib.to.ConnBundleTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.types.ConnectorCapability;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.extensions.wizard.WizardModel;
@@ -51,13 +47,8 @@ public class ConnectorWizardBuilder extends AbstractResourceWizardBuilder<ConnIn
 
     public ConnectorWizardBuilder(final ConnInstanceTO defaultItem, final PageReference pageRef) {
         super(defaultItem, pageRef);
-        this.bundles = CollectionUtils.select(connectorRestClient.getAllBundles(), new Predicate<ConnBundleTO>() {
-
-            @Override
-            public boolean evaluate(final ConnBundleTO object) {
-                return object.getLocation().equals(defaultItem.getLocation());
-            }
-        }, new ArrayList<ConnBundleTO>());
+        this.bundles = connectorRestClient.getAllBundles().stream().
+                filter(object -> object.getLocation().equals(defaultItem.getLocation())).collect(Collectors.toList());
     }
 
     @Override
@@ -86,8 +77,7 @@ public class ConnectorWizardBuilder extends AbstractResourceWizardBuilder<ConnIn
             }
 
         });
-        wizardModel.add(new ConnCapabilitiesPanel(
-                new PropertyModel<List<ConnectorCapability>>(connInstanceTO, "capabilities")));
+        wizardModel.add(new ConnCapabilitiesPanel(new PropertyModel<>(connInstanceTO, "capabilities")));
         return wizardModel;
     }
 
@@ -134,13 +124,9 @@ public class ConnectorWizardBuilder extends AbstractResourceWizardBuilder<ConnIn
     }
 
     protected static ConnBundleTO getBundle(final ConnInstanceTO connInstanceTO, final List<ConnBundleTO> bundles) {
-        return IterableUtils.find(bundles, new Predicate<ConnBundleTO>() {
-
-            @Override
-            public boolean evaluate(final ConnBundleTO bundle) {
-                return bundle.getBundleName().equals(connInstanceTO.getBundleName())
-                        && bundle.getVersion().equals(connInstanceTO.getVersion());
-            }
-        });
+        return bundles.stream().filter(bundle
+                -> bundle.getBundleName().equals(connInstanceTO.getBundleName())
+                && bundle.getVersion().equals(connInstanceTO.getVersion())).
+                findFirst().orElse(null);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
index 2ade6cf..4ebbfb3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ProvisionWizardBuilder.java
@@ -20,8 +20,7 @@ package org.apache.syncope.client.console.wizards.resources;
 
 import java.io.Serializable;
 import java.util.List;
-import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.console.commons.Constants;
@@ -71,7 +70,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ResourceProvision>
             add(container);
 
             clazz = new AjaxTextFieldPanel(
-                    "clazz", "clazz", new PropertyModel<String>(item, "objectClass"));
+                    "clazz", "clazz", new PropertyModel<>(item, "objectClass"));
             clazz.setRequired(true);
             clazz.setChoices(connectorRestClient.getObjectClasses(resourceTO.getConnector()));
             container.add(clazz);
@@ -158,7 +157,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ResourceProvision>
             final AjaxTextFieldPanel connObjectLink = new AjaxTextFieldPanel(
                     "connObjectLink",
                     new ResourceModel("connObjectLink", "connObjectLink").getObject(),
-                    new PropertyModel<String>(item, "connObjectLink"),
+                    new PropertyModel<>(item, "connObjectLink"),
                     false);
             connObjectLink.enableJexlHelp();
             connObjectLink.setEnabled(connObjectLinkEnabled);
@@ -224,21 +223,13 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ResourceProvision>
         } else if (modelObject.getProvisionTO() != null) {
             final List<ProvisionTO> provisions;
             if (modelObject.getKey() == null) {
-                provisions = ListUtils.select(this.resourceTO.getProvisions(), new Predicate<ProvisionTO>() {
-
-                    @Override
-                    public boolean evaluate(final ProvisionTO object) {
-                        return !modelObject.getAnyType().equals(object.getAnyType());
-                    }
-                });
+                provisions = this.resourceTO.getProvisions().stream().
+                        filter(object -> !modelObject.getAnyType().equals(object.getAnyType())).
+                        collect(Collectors.toList());
             } else {
-                provisions = ListUtils.select(this.resourceTO.getProvisions(), new Predicate<ProvisionTO>() {
-
-                    @Override
-                    public boolean evaluate(final ProvisionTO object) {
-                        return !modelObject.getKey().equals(object.getKey());
-                    }
-                });
+                provisions = this.resourceTO.getProvisions().stream().
+                        filter(object -> !modelObject.getKey().equals(object.getKey())).
+                        collect(Collectors.toList());
             }
 
             ProvisionTO provisionTO = modelObject.getProvisionTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
index f9fea37..ac7ccc3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/resources/ResourceProvisionPanel.java
@@ -21,14 +21,8 @@ package org.apache.syncope.client.console.wizards.resources;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.IteratorUtils;
-import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
@@ -105,16 +99,11 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
 
                 return item == null
                         ? null
-                        : IteratorUtils.find(list.iterator(), new Predicate<ResourceProvision>() {
-
-                            @Override
-                            public boolean evaluate(final ResourceProvision in) {
-                                return ((item.getKey() == null && in.getKey() == null)
-                                        || (in.getKey() != null && in.getKey().equals(item.getKey())))
-                                        && ((item.getAnyType() == null && in.getAnyType() == null)
-                                        || (in.getAnyType() != null && in.getAnyType().equals(item.getAnyType())));
-                            }
-                        });
+                        : list.stream().filter(in -> ((item.getKey() == null && in.getKey() == null)
+                        || (in.getKey() != null && in.getKey().equals(item.getKey())))
+                        && ((item.getAnyType() == null && in.getAnyType() == null)
+                        || (in.getAnyType() != null && in.getAnyType().equals(item.getAnyType())))).
+                                findAny().orElse(null);
             }
 
             @Override
@@ -150,9 +139,9 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
         if (resourceTO.getOrgUnit() != null) {
             provisions.add(new ResourceProvision(resourceTO.getOrgUnit()));
         }
-        for (ProvisionTO provision : resourceTO.getProvisions()) {
+        resourceTO.getProvisions().forEach(provision -> {
             provisions.add(new ResourceProvision(provision));
-        }
+        });
         // keep list ordered - SYNCOPE-1154
         sortProvisions();
 
@@ -279,13 +268,7 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
     }
 
     private void checkConnObjectKeyCount(final String anyType, final List<ItemTO> items) {
-        long connObjectKeyCount = IterableUtils.countMatches(items, new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO item) {
-                return item.isConnObjectKey();
-            }
-        });
+        long connObjectKeyCount = items.stream().filter(ItemTO::isConnObjectKey).count();
 
         if (connObjectKeyCount != 1) {
             throw new IllegalArgumentException(anyType + ": "
@@ -300,15 +283,15 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
                 checkConnObjectKeyCount(SyncopeConstants.REALM_ANYTYPE, resourceTO.getOrgUnit().getItems());
             }
 
-            for (ProvisionTO provision : new ArrayList<>(resourceTO.getProvisions())) {
-                if (provision != null) {
-                    if (provision.getMapping() == null || provision.getMapping().getItems().isEmpty()) {
-                        resourceTO.getProvisions().remove(provision);
-                    } else {
-                        checkConnObjectKeyCount(provision.getAnyType(), provision.getMapping().getItems());
-                    }
-                }
-            }
+            new ArrayList<>(resourceTO.getProvisions()).stream().
+                    filter(provision -> provision != null).
+                    forEachOrdered(provision -> {
+                        if (provision.getMapping() == null || provision.getMapping().getItems().isEmpty()) {
+                            resourceTO.getProvisions().remove(provision);
+                        } else {
+                            checkConnObjectKeyCount(provision.getAnyType(), provision.getMapping().getItems());
+                        }
+                    });
 
             resourceRestClient.update(resourceTO);
             SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
@@ -322,13 +305,8 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
     }
 
     private void sortProvisions() {
-        Collections.sort(provisions, new Comparator<ResourceProvision>() {
-
-            @Override
-            public int compare(final ResourceProvision o1, final ResourceProvision o2) {
-                return new AnyTypeRestClient.AnyTypeKeyComparator().compare(o1.getAnyType(), o2.getAnyType());
-            }
-        });
+        Collections.sort(provisions, (o1, o2)
+                -> new AnyTypeRestClient.AnyTypeKeyComparator().compare(o1.getAnyType(), o2.getAnyType()));
     }
 
     private LoadableDetachableModel<List<String>> getAnyTypes() {
@@ -340,21 +318,11 @@ public class ResourceProvisionPanel extends AbstractModalPanel<Serializable> {
             protected List<String> load() {
                 final List<String> currentlyAdded = new ArrayList<>();
 
-                CollectionUtils.collect(resourceTO.getProvisions(), new Transformer<ProvisionTO, String>() {
-
-                    @Override
-                    public String transform(final ProvisionTO provisionTO) {
-                        return provisionTO.getAnyType();
-                    }
-                }, currentlyAdded);
-
-                return ListUtils.select(new AnyTypeRestClient().list(), new Predicate<String>() {
+                currentlyAdded.addAll(resourceTO.getProvisions().stream().
+                        map(ProvisionTO::getAnyType).collect(Collectors.toList()));
 
-                    @Override
-                    public boolean evaluate(final String key) {
-                        return !currentlyAdded.contains(key);
-                    }
-                });
+                return new AnyTypeRestClient().list().stream().
+                        filter(anyType -> !currentlyAdded.contains(anyType)).collect(Collectors.toList());
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
index 4f60fa5..8ea6aa2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/role/RoleWizardBuilder.java
@@ -22,10 +22,8 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.UserSearchPanel;
 import org.apache.syncope.client.console.rest.DynRealmRestClient;
 import org.apache.syncope.client.console.rest.RealmRestClient;
@@ -34,7 +32,7 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accor
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
-import org.apache.syncope.common.lib.EntityTOUtils;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.wicket.PageReference;
@@ -105,7 +103,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
 
         public Details(final RoleWrapper modelObject) {
             add(new AjaxTextFieldPanel(
-                    "key", "key", new PropertyModel<String>(modelObject.getInnerObject(), "key"), false).
+                    "key", "key", new PropertyModel<>(modelObject.getInnerObject(), "key"), false).
                     setEnabled(StringUtils.isEmpty(modelObject.getInnerObject().getKey())));
 
             // ------------------------
@@ -119,7 +117,7 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
                 @Override
                 public Panel getPanel(final String panelId) {
                     return new UserSearchPanel.Builder(
-                            new PropertyModel<List<SearchClause>>(modelObject, "dynClauses")).
+                            new PropertyModel<>(modelObject, "dynClauses")).
                             required(true).build(panelId);
                 }
             }), Model.of(StringUtils.isBlank(modelObject.getDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
@@ -159,16 +157,11 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
 
         public Realms(final RoleTO modelObject) {
             setTitleModel(new ResourceModel("realms"));
-            add(new AjaxPalettePanel.Builder<String>().build("realms",
-                    new PropertyModel<List<String>>(modelObject, "realms"),
-                    new ListModel<>(
-                            CollectionUtils.collect(new RealmRestClient().list(), new Transformer<RealmTO, String>() {
-
-                                @Override
-                                public String transform(final RealmTO input) {
-                                    return input.getFullPath();
-                                }
-                            }, new ArrayList<String>()))).hideLabel().setOutputMarkupId(true));
+            add(new AjaxPalettePanel.Builder<>().build("realms",
+                    new PropertyModel<>(modelObject, "realms"),
+                    new ListModel<>(new RealmRestClient().list().stream().
+                            map(RealmTO::getFullPath).collect(Collectors.toList()))).
+                    hideLabel().setOutputMarkupId(true));
         }
     }
 
@@ -178,12 +171,11 @@ public class RoleWizardBuilder extends AjaxWizardBuilder<RoleWrapper> {
 
         public DynRealms(final RoleTO modelObject) {
             setTitleModel(new ResourceModel("dynRealms"));
-            add(new AjaxPalettePanel.Builder<String>().build("dynRealms",
-                    new PropertyModel<List<String>>(modelObject, "dynRealms"),
-                    new ListModel<>(
-                            CollectionUtils.collect(new DynRealmRestClient().list(),
-                                    EntityTOUtils.keyTransformer(),
-                                    new ArrayList<String>()))).hideLabel().setOutputMarkupId(true));
+            add(new AjaxPalettePanel.Builder<>().build("dynRealms",
+                    new PropertyModel<>(modelObject, "dynRealms"),
+                    new ListModel<>(new DynRealmRestClient().list().stream().
+                            map(EntityTO::getKey).collect(Collectors.toList()))).
+                    hideLabel().setOutputMarkupId(true));
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/enduser/src/test/java/org/apache/syncope/client/enduser/util/UserRequestValidatorTest.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/test/java/org/apache/syncope/client/enduser/util/UserRequestValidatorTest.java b/client/enduser/src/test/java/org/apache/syncope/client/enduser/util/UserRequestValidatorTest.java
index d8c021a..21c8218 100644
--- a/client/enduser/src/test/java/org/apache/syncope/client/enduser/util/UserRequestValidatorTest.java
+++ b/client/enduser/src/test/java/org/apache/syncope/client/enduser/util/UserRequestValidatorTest.java
@@ -61,11 +61,11 @@ public class UserRequestValidatorTest {
         assertTrue(UserRequestValidator.compliant(userTO, customForm, true));
 
         // firstname must have only one defaultValue
-        userTO.getPlainAttr("firstname").getValues().add("notAllowedFirstnameValue");
+        userTO.getPlainAttr("firstname").get().getValues().add("notAllowedFirstnameValue");
         assertFalse(UserRequestValidator.compliant(userTO, customForm, true));
         assertTrue(UserRequestValidator.compliant(userTO, customForm, false));
         // clean
-        userTO.getPlainAttr("firstname").getValues().remove("notAllowedFirstnameValue");
+        userTO.getPlainAttr("firstname").get().getValues().remove("notAllowedFirstnameValue");
 
         // derived must not be present
         AttrTO derivedNotAllowed = attrTO("derivedNotAllowed");
@@ -80,7 +80,7 @@ public class UserRequestValidatorTest {
         assertTrue(UserRequestValidator.compliant(userTO, customForm, true));
 
         // with empty form is compliant by definition
-        assertTrue(UserRequestValidator.compliant(userTO, new HashMap<String, CustomAttributesInfo>(), true));
+        assertTrue(UserRequestValidator.compliant(userTO, new HashMap<>(), true));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/lib/src/main/java/org/apache/syncope/client/lib/RestClientExceptionMapper.java
----------------------------------------------------------------------
diff --git a/client/lib/src/main/java/org/apache/syncope/client/lib/RestClientExceptionMapper.java b/client/lib/src/main/java/org/apache/syncope/client/lib/RestClientExceptionMapper.java
index 2818c7b..29fae09 100644
--- a/client/lib/src/main/java/org/apache/syncope/client/lib/RestClientExceptionMapper.java
+++ b/client/lib/src/main/java/org/apache/syncope/client/lib/RestClientExceptionMapper.java
@@ -112,7 +112,7 @@ public class RestClientExceptionMapper implements ResponseExceptionMapper<Except
             List<String> exInfos = response.getStringHeaders().get(RESTHeaders.ERROR_INFO);
 
             Set<String> handledExceptions = new HashSet<>();
-            for (String exTypeAsString : exTypesInHeaders) {
+            exTypesInHeaders.forEach(exTypeAsString -> {
                 ClientExceptionType exceptionType = null;
                 try {
                     exceptionType = ClientExceptionType.fromHeaderValue(exTypeAsString);
@@ -132,7 +132,7 @@ public class RestClientExceptionMapper implements ResponseExceptionMapper<Except
                     }
                     compException.addException(clientException);
                 }
-            }
+            });
 
             exTypesInHeaders.removeAll(handledExceptions);
             if (!exTypesInHeaders.isEmpty()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
----------------------------------------------------------------------
diff --git a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java b/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
index c13fa77..a3f959d 100644
--- a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
+++ b/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClient.java
@@ -76,7 +76,7 @@ public class SyncopeClient {
         this.mediaType = mediaType;
         this.restClientFactory = restClientFactory;
         if (this.restClientFactory.getHeaders() == null) {
-            this.restClientFactory.setHeaders(new HashMap<String, String>());
+            this.restClientFactory.setHeaders(new HashMap<>());
         }
         this.exceptionMapper = exceptionMapper;
         init(handler);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
----------------------------------------------------------------------
diff --git a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java b/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
index eba161d..c4105e8 100644
--- a/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
+++ b/client/lib/src/main/java/org/apache/syncope/client/lib/SyncopeClientFactoryBean.java
@@ -114,7 +114,7 @@ public class SyncopeClientFactoryBean {
 
     protected JAXRSClientFactoryBean defaultRestClientFactoryBean() {
         JAXRSClientFactoryBean defaultRestClientFactoryBean = new JAXRSClientFactoryBean();
-        defaultRestClientFactoryBean.setHeaders(new HashMap<String, String>());
+        defaultRestClientFactoryBean.setHeaders(new HashMap<>());
 
         if (StringUtils.isBlank(address)) {
             throw new IllegalArgumentException("Property 'address' is missing");
@@ -263,7 +263,7 @@ public class SyncopeClientFactoryBean {
      *
      * @param jwt value received after login, in the {@link RESTHeaders#TOKEN} response header
      * @return client instance which will be passing the provided value in the
-     *         {@link javax.ws.rs.core.HttpHeaders#AUTHORIZATION}
+     * {@link javax.ws.rs.core.HttpHeaders#AUTHORIZATION}
      * request header
      */
     public SyncopeClient create(final String jwt) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/pom.xml
----------------------------------------------------------------------
diff --git a/common/lib/pom.xml b/common/lib/pom.xml
index 810f45f..18cd8b8 100644
--- a/common/lib/pom.xml
+++ b/common/lib/pom.xml
@@ -61,10 +61,6 @@ under the License.
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-text</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-collections4</artifactId>
-    </dependency>
       
     <dependency>
       <groupId>org.slf4j</groupId>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/cli/CLIITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/cli/CLIITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/cli/CLIITCase.java
index 4f19f5a..c902481 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/cli/CLIITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/cli/CLIITCase.java
@@ -27,11 +27,9 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Properties;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.SystemUtils;
 import org.apache.syncope.client.cli.Command;
@@ -96,7 +94,7 @@ public class CLIITCase extends AbstractITCase {
             command.add(SCRIPT_FILENAME + ".sh");
         }
 
-        CollectionUtils.addAll(command, arguments);
+        command.addAll(Arrays.asList(arguments));
 
         return command.toArray(new String[command.size()]);
     }
@@ -137,15 +135,8 @@ public class CLIITCase extends AbstractITCase {
                     EntitlementCommand.EntitlementOptions.LIST.getOptionName()));
             process = PROCESS_BUILDER.start();
 
-            long entitlements = IterableUtils.countMatches(
-                    IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8),
-                    new Predicate<String>() {
-
-                @Override
-                public boolean evaluate(final String line) {
-                    return line.startsWith("-");
-                }
-            });
+            long entitlements = IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8).
+                    stream().filter(line -> line.startsWith("-")).count();
             assertEquals(syncopeService.platform().getEntitlements().size(), entitlements);
         } catch (IOException e) {
             fail(e.getMessage());
@@ -165,15 +156,8 @@ public class CLIITCase extends AbstractITCase {
                     ConnectorCommand.ConnectorOptions.LIST_BUNDLES.getOptionName()));
             process = PROCESS_BUILDER.start();
 
-            long bundles = IterableUtils.countMatches(
-                    IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8),
-                    new Predicate<String>() {
-
-                @Override
-                public boolean evaluate(final String line) {
-                    return line.startsWith(" > BUNDLE NAME:");
-                }
-            });
+            long bundles = IOUtils.readLines(process.getInputStream(), StandardCharsets.UTF_8).
+                    stream().filter(line -> line.startsWith(" > BUNDLE NAME:")).count();
             assertEquals(connectorService.getBundles(null).size(), bundles);
         } catch (IOException e) {
             fail(e.getMessage());
@@ -209,15 +193,8 @@ public class CLIITCase extends AbstractITCase {
                     String.valueOf(userKey1), String.valueOf(userKey2),
                     String.valueOf(userKey3), String.valueOf(userKey4), String.valueOf(userKey5)));
             process2 = PROCESS_BUILDER.start();
-            long users = IterableUtils.countMatches(
-                    IOUtils.readLines(process2.getInputStream(), StandardCharsets.UTF_8),
-                    new Predicate<String>() {
-
-                @Override
-                public boolean evaluate(final String line) {
-                    return line.startsWith(" > USER KEY:");
-                }
-            });
+            long users = IOUtils.readLines(process2.getInputStream(), StandardCharsets.UTF_8).
+                    stream().filter(line -> line.startsWith(" > USER KEY:")).count();
             assertEquals(5, users);
 
             PROCESS_BUILDER.command(getCommand(

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
index a3251fe..31e7f1b 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AnyObjectITCase.java
@@ -69,8 +69,8 @@ public class AnyObjectITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
         assertNotNull(connObjectTO.getAttr("LOCATION"));
         assertEquals(
-                anyObjectTO.getPlainAttr("location").getValues(),
-                connObjectTO.getAttr("LOCATION").getValues());
+                anyObjectTO.getPlainAttr("location").get().getValues(),
+                connObjectTO.getAttr("LOCATION").get().getValues());
     }
 
     @Test
@@ -127,9 +127,7 @@ public class AnyObjectITCase extends AbstractITCase {
                         build());
         assertNotNull(anyObjectTOs);
         assertTrue(anyObjectTOs.getResult().size() >= 2);
-        for (AnyObjectTO anyObjectTO : anyObjectTOs.getResult()) {
-            assertNotNull(anyObjectTO);
-        }
+        anyObjectTOs.getResult().forEach(anyObjectTO -> assertNotNull(anyObjectTO));
     }
 
     @Test
@@ -154,7 +152,7 @@ public class AnyObjectITCase extends AbstractITCase {
 
         anyObjectTO = updateAnyObject(anyObjectPatch).getEntity();
 
-        assertEquals(newLocation, anyObjectTO.getPlainAttr("location").getValues().get(0));
+        assertEquals(newLocation, anyObjectTO.getPlainAttr("location").get().getValues().get(0));
     }
 
     @Test
@@ -167,7 +165,7 @@ public class AnyObjectITCase extends AbstractITCase {
         assertEquals(anyObjectTO.getPlainAttrs(), attrs);
 
         AttrTO location = anyObjectService.read(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
-        assertEquals(anyObjectTO.getPlainAttr("location"), location);
+        assertEquals(anyObjectTO.getPlainAttr("location").get(), location);
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
index ddabfac..a2cad27 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/AuthenticationITCase.java
@@ -25,21 +25,17 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.security.AccessControlException;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.sql.DataSource;
 import javax.ws.rs.ForbiddenException;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.client.lib.BasicAuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeClient;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
@@ -210,8 +206,8 @@ public class AuthenticationITCase extends AbstractITCase {
                 fiql(SyncopeClient.getUserSearchConditionBuilder().isNotNull("key").query()).build());
         assertNotNull(matchingUsers);
         assertFalse(matchingUsers.getResult().isEmpty());
-        Set<String> matchingUserKeys = CollectionUtils.collect(matchingUsers.getResult(),
-                EntityTOUtils.<UserTO>keyTransformer(), new HashSet<String>());
+        Set<String> matchingUserKeys = matchingUsers.getResult().stream().
+                map(user -> user.getKey()).collect(Collectors.toSet());
         assertTrue(matchingUserKeys.contains("1417acbe-cbf6-4277-9372-e75e04f97000"));
         assertFalse(matchingUserKeys.contains("74cd8ece-715a-44a4-a736-e17b46c4e7e6"));
         assertFalse(matchingUserKeys.contains("823074dc-d280-436d-a7dd-07399fae48ec"));
@@ -222,13 +218,7 @@ public class AuthenticationITCase extends AbstractITCase {
         matchingUsers = userService3.search(new AnyQuery.Builder().realm("/even/two").
                 fiql(SyncopeClient.getUserSearchConditionBuilder().isNotNull("loginDate").query()).build());
         assertNotNull(matchingUsers);
-        assertTrue(IterableUtils.matchesAll(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-            @Override
-            public boolean evaluate(final UserTO matched) {
-                return "/even/two".equals(matched.getRealm());
-            }
-        }));
+        assertTrue(matchingUsers.getResult().stream().allMatch(matching -> "/even/two".equals(matching.getRealm())));
     }
 
     @Test
@@ -276,7 +266,7 @@ public class AuthenticationITCase extends AbstractITCase {
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
             }).getEntity();
-            assertEquals("surname", user.getPlainAttr("surname").getValues().get(0));
+            assertEquals("surname", user.getPlainAttr("surname").get().getValues().get(0));
 
             // 5. as delegated, update user attempting to move under realm / -> fail
             UserPatch userPatch = new UserPatch();
@@ -299,7 +289,7 @@ public class AuthenticationITCase extends AbstractITCase {
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
             }).getEntity();
-            assertEquals("surname2", user.getPlainAttr("surname").getValues().get(0));
+            assertEquals("surname2", user.getPlainAttr("surname").get().getValues().get(0));
 
             // 7. as delegated, delete user
             delegatedUserService.delete(user.getKey());
@@ -426,13 +416,8 @@ public class AuthenticationITCase extends AbstractITCase {
         final String anyTypeKey = "FOLDER " + getUUIDString();
 
         // 1. no entitlement exists (yet) for the any type to be created
-        assertFalse(IterableUtils.matchesAny(syncopeService.platform().getEntitlements(), new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String entitlement) {
-                return entitlement.contains(anyTypeKey);
-            }
-        }));
+        assertFalse(syncopeService.platform().getEntitlements().stream().
+                anyMatch(entitlement -> entitlement.contains(anyTypeKey)));
 
         // 2. create plain schema, any type class and any type
         PlainSchemaTO path = new PlainSchemaTO();
@@ -452,13 +437,8 @@ public class AuthenticationITCase extends AbstractITCase {
         anyTypeService.create(anyTypeTO);
 
         // 2. now entitlement exists for the any type just created
-        assertTrue(IterableUtils.matchesAny(syncopeService.platform().getEntitlements(), new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String entitlement) {
-                return entitlement.contains(anyTypeKey);
-            }
-        }));
+        assertTrue(syncopeService.platform().getEntitlements().stream().
+                anyMatch(entitlement -> entitlement.contains(anyTypeKey)));
 
         // 3. attempt to create an instance of the type above: fail because no entitlement was assigned
         AnyObjectTO folder = new AnyObjectTO();
@@ -522,7 +502,7 @@ public class AuthenticationITCase extends AbstractITCase {
         // 3. approve user
         WorkflowFormTO form = userWorkflowService.getFormForUser(userTO.getKey());
         form = userWorkflowService.claimForm(form.getTaskId());
-        form.getProperty("approve").setValue(Boolean.TRUE.toString());
+        form.getProperty("approve").get().setValue(Boolean.TRUE.toString());
         userTO = userWorkflowService.submitForm(form);
         assertNotNull(userTO);
         assertEquals("active", userTO.getStatus());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CamelRouteITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CamelRouteITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CamelRouteITCase.java
index 4f4f475..f3b9693 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CamelRouteITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/CamelRouteITCase.java
@@ -46,9 +46,7 @@ public class CamelRouteITCase extends AbstractITCase {
         List<CamelRouteTO> userRoutes = camelRouteService.list(AnyTypeKind.USER);
         assertNotNull(userRoutes);
         assertEquals(16, userRoutes.size());
-        for (CamelRouteTO route : userRoutes) {
-            assertNotNull(route.getContent());
-        }
+        userRoutes.forEach(route -> assertNotNull(route.getContent()));
     }
 
     @Test
@@ -58,9 +56,7 @@ public class CamelRouteITCase extends AbstractITCase {
         List<CamelRouteTO> groupRoutes = camelRouteService.list(AnyTypeKind.GROUP);
         assertNotNull(groupRoutes);
         assertEquals(8, groupRoutes.size());
-        for (CamelRouteTO route : groupRoutes) {
-            assertNotNull(route.getContent());
-        }
+        groupRoutes.forEach(route -> assertNotNull(route.getContent()));
     }
 
     private CamelRouteTO doUpdate(final String key, final String content) {
@@ -120,7 +116,7 @@ public class CamelRouteITCase extends AbstractITCase {
                 + "    </setProperty>\n"
                 + "    <setBody>\n"
                 + "     <groovy>\n"
-                + "request.body.getPlainAttr(\"camelAttribute\").getValues().set(0,\"true\")\n"
+                + "request.body.getPlainAttr(\"camelAttribute\").get().getValues().set(0,\"true\")\n"
                 + "       return request.body\n"
                 + "     </groovy>\n"
                 + "    </setBody>\n"
@@ -165,7 +161,7 @@ public class CamelRouteITCase extends AbstractITCase {
 
             userTO = createUser(userTO).getEntity();
             assertNotNull(userTO);
-            assertEquals("true", userTO.getPlainAttr("camelAttribute").getValues().get(0));
+            assertEquals("true", userTO.getPlainAttr("camelAttribute").get().getValues().get(0));
         } finally {
             doUpdate(oldRoute.getKey(), oldRoute.getContent());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
index 09a2653..5f01974 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConnectorITCase.java
@@ -36,11 +36,8 @@ import java.util.Locale;
 import java.util.Properties;
 import java.util.Set;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.exception.ExceptionUtils;
@@ -295,9 +292,7 @@ public class ConnectorITCase extends AbstractITCase {
         List<ConnInstanceTO> connectorInstanceTOs = connectorService.list(null);
         assertNotNull(connectorInstanceTOs);
         assertFalse(connectorInstanceTOs.isEmpty());
-        for (ConnInstanceTO instance : connectorInstanceTOs) {
-            assertNotNull(instance);
-        }
+        connectorInstanceTOs.forEach(instance -> assertNotNull(instance));
     }
 
     @Test
@@ -312,9 +307,7 @@ public class ConnectorITCase extends AbstractITCase {
         List<ConnBundleTO> bundles = connectorService.getBundles(Locale.ENGLISH.getLanguage());
         assertNotNull(bundles);
         assertFalse(bundles.isEmpty());
-        for (ConnBundleTO bundle : bundles) {
-            assertNotNull(bundle);
-        }
+        bundles.forEach(bundle -> assertNotNull(bundle));
     }
 
     @Test
@@ -347,7 +340,7 @@ public class ConnectorITCase extends AbstractITCase {
 
         for (ConnInstanceTO instance : connectorInstanceTOs) {
             if ("net.tirasa.connid.bundles.db.table".equals(instance.getBundleName())) {
-                assertEquals("Utente", instance.getConf("user").getSchema().getDisplayName());
+                assertEquals("Utente", instance.getConf("user").get().getSchema().getDisplayName());
             }
         }
 
@@ -356,7 +349,7 @@ public class ConnectorITCase extends AbstractITCase {
 
         for (ConnInstanceTO instance : connectorInstanceTOs) {
             if ("net.tirasa.connid.bundles.db.table".equals(instance.getBundleName())) {
-                assertEquals("User", instance.getConf("user").getSchema().getDisplayName());
+                assertEquals("User", instance.getConf("user").get().getSchema().getDisplayName());
             }
         }
     }
@@ -478,15 +471,8 @@ public class ConnectorITCase extends AbstractITCase {
         objectClassInfo = connectorService.buildObjectClassInfo(ldap, true);
         assertNotNull(objectClassInfo);
 
-        Collection<String> objectClasses = CollectionUtils.collect(objectClassInfo,
-                new Transformer<ConnIdObjectClassTO, String>() {
-
-            @Override
-            public String transform(final ConnIdObjectClassTO info) {
-                return info.getType();
-            }
-
-        });
+        Collection<String> objectClasses = objectClassInfo.stream().
+                map(info -> info.getType()).collect(Collectors.toSet());
         assertTrue(objectClasses.contains(ObjectClass.ACCOUNT_NAME));
         assertTrue(objectClasses.contains(ObjectClass.GROUP_NAME));
     }
@@ -500,13 +486,14 @@ public class ConnectorITCase extends AbstractITCase {
         ConnInstanceTO ldapConn = connectorService.read("74141a3b-0762-4720-a4aa-fc3e374ef3ef", null);
         String originalDisplayName = ldapConn.getDisplayName();
         Set<ConnectorCapability> originalCapabilities = new HashSet<>(ldapConn.getCapabilities());
-        ConnConfProperty originalConfProp = SerializationUtils.clone(ldapConn.getConf("maintainPosixGroupMembership"));
+        ConnConfProperty originalConfProp = SerializationUtils.clone(
+                ldapConn.getConf("maintainPosixGroupMembership").get());
         assertEquals(1, originalConfProp.getValues().size());
         assertEquals("false", originalConfProp.getValues().get(0));
 
         ldapConn.setDisplayName(originalDisplayName + " modified");
         ldapConn.getCapabilities().clear();
-        ldapConn.getConf("maintainPosixGroupMembership").getValues().set(0, "true");
+        ldapConn.getConf("maintainPosixGroupMembership").get().getValues().set(0, "true");
         connectorService.update(ldapConn);
 
         ldapConn = connectorService.read("74141a3b-0762-4720-a4aa-fc3e374ef3ef", null);
@@ -522,7 +509,7 @@ public class ConnectorITCase extends AbstractITCase {
         ldapConn = connectorService.read("74141a3b-0762-4720-a4aa-fc3e374ef3ef", null);
         assertEquals(originalDisplayName, ldapConn.getDisplayName());
         assertEquals(originalCapabilities, ldapConn.getCapabilities());
-        assertEquals(originalConfProp, ldapConn.getConf("maintainPosixGroupMembership"));
+        assertEquals(originalConfProp, ldapConn.getConf("maintainPosixGroupMembership").get());
     }
 
     @Test
@@ -534,14 +521,9 @@ public class ConnectorITCase extends AbstractITCase {
         List<ConnInstanceTO> connInstances = pcs.list(null);
         assertEquals(2, connInstances.size());
 
-        assertTrue(IterableUtils.matchesAll(connInstances, new Predicate<ConnInstanceTO>() {
-
-            @Override
-            public boolean evaluate(final ConnInstanceTO object) {
-                return "a6d017fd-a705-4507-bb7c-6ab6a6745997".equals(object.getKey())
-                        || "44c02549-19c3-483c-8025-4919c3283c37".equals(object.getKey());
-            }
-        }));
+        assertTrue(connInstances.stream().allMatch(connInstance
+                -> "a6d017fd-a705-4507-bb7c-6ab6a6745997".equals(connInstance.getKey())
+                || "44c02549-19c3-483c-8025-4919c3283c37".equals(connInstance.getKey())));
 
         // 2. attempt to read a connector with a different admin realm: fail
         try {
@@ -554,18 +536,18 @@ public class ConnectorITCase extends AbstractITCase {
         // 3. read and upate a connector in the realm for which entitlements are owned: succeed
         try {
             ConnInstanceTO scriptedsql = pcs.read("a6d017fd-a705-4507-bb7c-6ab6a6745997", null);
-            ConnConfProperty reloadScriptOnExecution = scriptedsql.getConf("reloadScriptOnExecution");
+            ConnConfProperty reloadScriptOnExecution = scriptedsql.getConf("reloadScriptOnExecution").get();
             assertEquals("true", reloadScriptOnExecution.getValues().get(0).toString());
 
             reloadScriptOnExecution.getValues().set(0, "false");
             pcs.update(scriptedsql);
 
             scriptedsql = pcs.read(scriptedsql.getKey(), null);
-            reloadScriptOnExecution = scriptedsql.getConf("reloadScriptOnExecution");
+            reloadScriptOnExecution = scriptedsql.getConf("reloadScriptOnExecution").get();
             assertEquals("false", reloadScriptOnExecution.getValues().get(0).toString());
         } finally {
             ConnInstanceTO scriptedsql = connectorService.read("a6d017fd-a705-4507-bb7c-6ab6a6745997", null);
-            ConnConfProperty reloadScriptOnExecution = scriptedsql.getConf("reloadScriptOnExecution");
+            ConnConfProperty reloadScriptOnExecution = scriptedsql.getConf("reloadScriptOnExecution").get();
             reloadScriptOnExecution.getValues().set(0, "true");
             connectorService.update(scriptedsql);
         }
@@ -582,17 +564,13 @@ public class ConnectorITCase extends AbstractITCase {
         assertNotNull(connInstanceTO);
 
         // check for resource
-        Collection<ResourceTO> resources = CollectionUtils.select(resourceService.list(), new Predicate<ResourceTO>() {
-
-            @Override
-            public boolean evaluate(final ResourceTO object) {
-                return "fcf9f2b0-f7d6-42c9-84a6-61b28255a42b".equals(object.getConnector());
-            }
-        });
+        List<ResourceTO> resources = resourceService.list().stream().
+                filter(resource -> "fcf9f2b0-f7d6-42c9-84a6-61b28255a42b".equals(resource.getConnector())).
+                collect(Collectors.toList());
         assertEquals(4, resources.size());
 
         // Retrieve a resource TO template.
-        ResourceTO resourceTO = resources.iterator().next();
+        ResourceTO resourceTO = resources.get(0);
 
         // Make it new.
         resourceTO.setKey("newAbout103" + getUUIDString());
@@ -628,13 +606,8 @@ public class ConnectorITCase extends AbstractITCase {
 
         assertNotNull(resourceTO);
 
-        resources = CollectionUtils.select(resourceService.list(), new Predicate<ResourceTO>() {
-
-            @Override
-            public boolean evaluate(final ResourceTO object) {
-                return connKey.equals(object.getConnector());
-            }
-        });
+        resources = resourceService.list().stream().
+                filter(resource -> connKey.equals(resource.getConnector())).collect(Collectors.toList());
         assertEquals(1, resources.size());
         // ----------------------------------
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
index 7d745a7..3506b8d 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java
@@ -26,8 +26,6 @@ import static org.junit.Assert.fail;
 
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.AttrPatch;
@@ -141,22 +139,11 @@ public class DynRealmITCase extends AbstractITCase {
             // 5. verify that the new user and group are found when searching by dynamic realm
             PagedResult<UserTO> matchingUsers = userService.search(new AnyQuery.Builder().realm("/").fiql(
                     SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
-            assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
+            assertTrue(matchingUsers.getResult().stream().anyMatch(object -> object.getKey().equals(userKey)));
 
-                @Override
-                public boolean evaluate(final UserTO object) {
-                    return object.getKey().equals(userKey);
-                }
-            }));
             PagedResult<GroupTO> matchingGroups = groupService.search(new AnyQuery.Builder().realm("/").fiql(
                     SyncopeClient.getGroupSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());
-            assertTrue(IterableUtils.matchesAny(matchingGroups.getResult(), new Predicate<GroupTO>() {
-
-                @Override
-                public boolean evaluate(final GroupTO object) {
-                    return object.getKey().equals(groupKey);
-                }
-            }));
+            assertTrue(matchingGroups.getResult().stream().anyMatch(object -> object.getKey().equals(groupKey)));
 
             // 6. prepare to act as delegated admin
             SyncopeClient delegatedClient = clientFactory.create(dynRealmAdmin.getUsername(), "password123");
@@ -172,13 +159,7 @@ public class DynRealmITCase extends AbstractITCase {
 
             // USER_SEARCH
             matchingUsers = delegatedUserService.search(new AnyQuery.Builder().realm("/").build());
-            assertTrue(IterableUtils.matchesAny(matchingUsers.getResult(), new Predicate<UserTO>() {
-
-                @Override
-                public boolean evaluate(final UserTO object) {
-                    return object.getKey().equals(userKey);
-                }
-            }));
+            assertTrue(matchingUsers.getResult().stream().anyMatch(object -> object.getKey().equals(userKey)));
 
             // USER_UPDATE
             UserPatch userPatch = new UserPatch();
@@ -209,7 +190,7 @@ public class DynRealmITCase extends AbstractITCase {
                     readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
                     }).getEntity();
             assertNotNull(group);
-            assertEquals("modified", group.getPlainAttr("icon").getValues().get(0));
+            assertEquals("modified", group.getPlainAttr("icon").get().getValues().get(0));
         } finally {
             if (role != null) {
                 roleService.delete(role.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
index 9d833cc..817d8e4 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
@@ -38,8 +38,6 @@ import javax.naming.directory.SearchResult;
 import javax.ws.rs.ForbiddenException;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeClient;
@@ -121,9 +119,9 @@ public class GroupITCase extends AbstractITCase {
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
 
-        assertNotNull(groupTO.getVirAttr("rvirtualdata").getValues());
-        assertFalse(groupTO.getVirAttr("rvirtualdata").getValues().isEmpty());
-        assertEquals("rvirtualvalue", groupTO.getVirAttr("rvirtualdata").getValues().get(0));
+        assertNotNull(groupTO.getVirAttr("rvirtualdata").get().getValues());
+        assertFalse(groupTO.getVirAttr("rvirtualdata").get().getValues().isEmpty());
+        assertEquals("rvirtualvalue", groupTO.getVirAttr("rvirtualdata").get().getValues().get(0));
 
         assertTrue(groupTO.getResources().contains(RESOURCE_NAME_LDAP));
 
@@ -181,9 +179,7 @@ public class GroupITCase extends AbstractITCase {
                 groupService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).build());
         assertNotNull(groupTOs);
         assertTrue(groupTOs.getResult().size() >= 8);
-        for (GroupTO groupTO : groupTOs.getResult()) {
-            assertNotNull(groupTO);
-        }
+        groupTOs.getResult().forEach(groupTO -> assertNotNull(groupTO));
     }
 
     @Test
@@ -200,8 +196,8 @@ public class GroupITCase extends AbstractITCase {
         UserTO userTO = userService.read("1417acbe-cbf6-4277-9372-e75e04f97000");
         assertNotNull(userTO);
 
-        assertNotNull(userTO.getMembership("37d15e4c-cdc1-460b-a591-8505c8133806"));
-        assertNull(userTO.getMembership("29f96485-729e-4d31-88a1-6fc60e4677f3"));
+        assertTrue(userTO.getMembership("37d15e4c-cdc1-460b-a591-8505c8133806").isPresent());
+        assertFalse(userTO.getMembership("29f96485-729e-4d31-88a1-6fc60e4677f3").isPresent());
 
         GroupService groupService2 = clientFactory.create("rossini", ADMIN_PWD).getService(GroupService.class);
 
@@ -214,13 +210,7 @@ public class GroupITCase extends AbstractITCase {
 
         List<GroupTO> groups = groupService2.own();
         assertNotNull(groups);
-        assertTrue(IterableUtils.matchesAny(groups, new Predicate<GroupTO>() {
-
-            @Override
-            public boolean evaluate(final GroupTO group) {
-                return "37d15e4c-cdc1-460b-a591-8505c8133806".equals(group.getKey());
-            }
-        }));
+        assertTrue(groups.stream().anyMatch(group -> "37d15e4c-cdc1-460b-a591-8505c8133806".equals(group.getKey())));
     }
 
     @Test
@@ -241,12 +231,12 @@ public class GroupITCase extends AbstractITCase {
         assertEquals(modName, groupTO.getName());
         assertEquals(2, groupTO.getPlainAttrs().size());
 
-        groupTO.getPlainAttr("show").getValues().clear();
+        groupTO.getPlainAttr("show").get().getValues().clear();
 
         groupTO = groupService.update(groupTO).readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
         }).getEntity();
 
-        assertNull(groupTO.getPlainAttr("show"));
+        assertFalse(groupTO.getPlainAttr("show").isPresent());
     }
 
     @Test
@@ -575,10 +565,10 @@ public class GroupITCase extends AbstractITCase {
 
         // 2. create a group *without* an attribute for that schema: it works
         GroupTO groupTO = getSampleTO("lastGroup");
-        assertNull(groupTO.getPlainAttr(badge.getKey()));
+        assertFalse(groupTO.getPlainAttr(badge.getKey()).isPresent());
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
-        assertNull(groupTO.getPlainAttr(badge.getKey()));
+        assertFalse(groupTO.getPlainAttr(badge.getKey()).isPresent());
 
         // 3. add the new mandatory schema to the default group type
         AnyTypeTO type = anyTypeService.read(AnyTypeKind.GROUP.name());
@@ -651,7 +641,7 @@ public class GroupITCase extends AbstractITCase {
         final String groupKey = group.getKey();
 
         List<MembershipTO> memberships = userService.read(
-            "c9b2dec2-00a7-4855-97c0-d854842b4b24").getDynMemberships();
+                "c9b2dec2-00a7-4855-97c0-d854842b4b24").getDynMemberships();
         assertTrue(memberships.stream().anyMatch(m -> m.getGroupKey().equals(groupKey)));
 
         GroupPatch patch = new GroupPatch();
@@ -682,11 +672,11 @@ public class GroupITCase extends AbstractITCase {
         newAny = createAnyObject(newAny).getEntity();
         assertNotNull(newAny.getPlainAttr("location"));
         List<MembershipTO> memberships = anyObjectService.read(
-            "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynMemberships();
+                "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynMemberships();
         assertTrue(memberships.stream().anyMatch(m -> m.getGroupKey().equals(groupKey)));
 
         memberships = anyObjectService.read(
-            "8559d14d-58c2-46eb-a2d4-a7d35161e8f8").getDynMemberships();
+                "8559d14d-58c2-46eb-a2d4-a7d35161e8f8").getDynMemberships();
         assertTrue(memberships.stream().anyMatch(m -> m.getGroupKey().equals(groupKey)));
 
         memberships = anyObjectService.read(newAny.getKey()).getDynMemberships();
@@ -713,13 +703,13 @@ public class GroupITCase extends AbstractITCase {
                 attrTO(new AttrTO.Builder().schema("location").build()).
                 build());
         newAny = updateAnyObject(anyPatch).getEntity();
-        assertNull(newAny.getPlainAttr("location"));
+        assertFalse(newAny.getPlainAttr("location").isPresent());
 
         memberships = anyObjectService.read(
-            "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynMemberships();
+                "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynMemberships();
         assertFalse(memberships.stream().anyMatch(m -> m.getGroupKey().equals(groupKey)));
         memberships = anyObjectService.read(
-            "8559d14d-58c2-46eb-a2d4-a7d35161e8f8").getDynMemberships();
+                "8559d14d-58c2-46eb-a2d4-a7d35161e8f8").getDynMemberships();
         assertFalse(memberships.stream().anyMatch(m -> m.getGroupKey().equals(groupKey)));
         memberships = anyObjectService.read(newAny.getKey()).getDynMemberships();
         assertTrue(memberships.stream().anyMatch(m -> m.getGroupKey().equals(groupKey)));
@@ -826,8 +816,8 @@ public class GroupITCase extends AbstractITCase {
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
         assertEquals(1, groupTO.getTypeExtensions().size());
-        assertEquals(1, groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().size());
-        assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().contains("csv"));
+        assertEquals(1, groupTO.getTypeExtension(AnyTypeKind.USER.name()).get().getAuxClasses().size());
+        assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).get().getAuxClasses().contains("csv"));
 
         typeExtension = new TypeExtensionTO();
         typeExtension.setAnyType(AnyTypeKind.USER.name());
@@ -841,9 +831,9 @@ public class GroupITCase extends AbstractITCase {
         groupTO = updateGroup(groupPatch).getEntity();
         assertNotNull(groupTO);
         assertEquals(1, groupTO.getTypeExtensions().size());
-        assertEquals(2, groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().size());
-        assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().contains("csv"));
-        assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).getAuxClasses().contains("other"));
+        assertEquals(2, groupTO.getTypeExtension(AnyTypeKind.USER.name()).get().getAuxClasses().size());
+        assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).get().getAuxClasses().contains("csv"));
+        assertTrue(groupTO.getTypeExtension(AnyTypeKind.USER.name()).get().getAuxClasses().contains("other"));
     }
 
     @Test
@@ -958,7 +948,7 @@ public class GroupITCase extends AbstractITCase {
                 provision.getVirSchemas().clear();
             }
 
-            MappingTO mapping = newLDAP.getProvision(AnyTypeKind.GROUP.name()).getMapping();
+            MappingTO mapping = newLDAP.getProvision(AnyTypeKind.GROUP.name()).get().getMapping();
 
             ItemTO connObjectKey = mapping.getConnObjectKeyItem();
             connObjectKey.setIntAttrName("displayProperty");
@@ -1055,7 +1045,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
+        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).get().getValues().get(0));
 
         // 3. update schema, set conversion pattern
         schema = schemaService.read(SchemaType.PLAIN, schema.getKey());
@@ -1065,7 +1055,7 @@ public class GroupITCase extends AbstractITCase {
         // 4. re-read group, verify that pattern was applied
         groupTO = groupService.read(groupTO.getKey());
         assertNotNull(groupTO);
-        assertEquals("11.230", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
+        assertEquals("11.230", groupTO.getPlainAttr(doubleSchemaName).get().getValues().get(0));
 
         // 5. modify group with new double value
         GroupPatch patch = new GroupPatch();
@@ -1074,7 +1064,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = updateGroup(patch).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.257", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
+        assertEquals("11.257", groupTO.getPlainAttr(doubleSchemaName).get().getValues().get(0));
 
         // 6. update schema, unset conversion pattern
         schema.setConversionPattern(null);
@@ -1087,6 +1077,6 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = updateGroup(patch).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
+        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).get().getValues().get(0));
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/IdentityRecertificationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/IdentityRecertificationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/IdentityRecertificationITCase.java
index 3a9ee36..00f8fdb 100755
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/IdentityRecertificationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/IdentityRecertificationITCase.java
@@ -39,7 +39,7 @@ public class IdentityRecertificationITCase extends AbstractTaskITCase {
         assertFalse(forms.isEmpty());
         for (WorkflowFormTO form : forms) {
             userWorkflowService.claimForm(form.getTaskId());
-            WorkflowFormPropertyTO approve = form.getProperty("approve");
+            WorkflowFormPropertyTO approve = form.getProperty("approve").get();
             approve.setValue("true");
             userWorkflowService.submitForm(form);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
index 0f7253e..e90e9d2 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/LoggerITCase.java
@@ -33,8 +33,6 @@ import java.util.List;
 import java.util.Properties;
 import javax.ws.rs.core.Response;
 import javax.xml.ws.WebServiceException;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -69,10 +67,10 @@ public class LoggerITCase extends AbstractITCase {
         List<LogAppender> memoryAppenders = loggerService.memoryAppenders();
         assertNotNull(memoryAppenders);
         assertFalse(memoryAppenders.isEmpty());
-        for (LogAppender appender : memoryAppenders) {
+        memoryAppenders.forEach(appender -> {
             assertNotNull(appender);
             assertNotNull(appender.getName());
-        }
+        });
     }
 
     @Test
@@ -94,9 +92,9 @@ public class LoggerITCase extends AbstractITCase {
         List<LoggerTO> loggers = loggerService.list(LoggerType.LOG);
         assertNotNull(loggers);
         assertFalse(loggers.isEmpty());
-        for (LoggerTO logger : loggers) {
+        loggers.forEach(logger -> {
             assertNotNull(logger);
-        }
+        });
     }
 
     @Test
@@ -354,14 +352,9 @@ public class LoggerITCase extends AbstractITCase {
         List<EventCategoryTO> events = loggerService.events();
         assertNotNull(events);
 
-        EventCategoryTO userLogic = IterableUtils.find(events, new Predicate<EventCategoryTO>() {
-
-            @Override
-            public boolean evaluate(final EventCategoryTO object) {
-                return "UserLogic".equals(object.getCategory());
-            }
-        });
+        EventCategoryTO userLogic = events.stream().
+                filter(object -> "UserLogic".equals(object.getCategory())).findAny().get();
         assertNotNull(userLogic);
-        assertEquals(1, IterableUtils.frequency(userLogic.getEvents(), "create"));
+        assertEquals(1, userLogic.getEvents().stream().filter(event -> "create".equals(event)).count());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
index 6a4abd1..3511552 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MembershipITCase.java
@@ -21,15 +21,11 @@ package org.apache.syncope.fit.core;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import javax.sql.DataSource;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.AttrPatch;
@@ -75,7 +71,7 @@ public class MembershipITCase extends AbstractITCase {
         UserTO user = UserITCase.getUniqueSampleTO("memb@apache.org");
         user.setRealm("/even/two");
         user.getPlainAttrs().add(new AttrTO.Builder().schema("aLong").value("1976").build());
-        user.getPlainAttrs().remove(user.getPlainAttr("ctype"));
+        user.getPlainAttrs().remove(user.getPlainAttr("ctype").get());
 
         // the group 034740a9-fa10-453b-af37-dc7897e98fb1 has USER type extensions for 'csv' and 'other' 
         // any type classes
@@ -97,30 +93,24 @@ public class MembershipITCase extends AbstractITCase {
         }
 
         // remove fullname and try again
-        CollectionUtils.filterInverse(membership.getPlainAttrs(), new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return "fullname".equals(object.getSchema());
-            }
-        });
+        membership.getPlainAttrs().remove(membership.getPlainAttr("fullname").get());
         try {
             user = createUser(user).getEntity();
 
             // 1. verify that 'aLong' is correctly populated for user
-            assertEquals(1, user.getPlainAttr("aLong").getValues().size());
-            assertEquals("1976", user.getPlainAttr("aLong").getValues().get(0));
+            assertEquals(1, user.getPlainAttr("aLong").get().getValues().size());
+            assertEquals("1976", user.getPlainAttr("aLong").get().getValues().get(0));
 
             // 2. verify that 'aLong' is correctly populated for user's membership
             assertEquals(1, user.getMemberships().size());
-            membership = user.getMembership("034740a9-fa10-453b-af37-dc7897e98fb1");
+            membership = user.getMembership("034740a9-fa10-453b-af37-dc7897e98fb1").get();
             assertNotNull(membership);
-            assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
-            assertEquals("1977", membership.getPlainAttr("aLong").getValues().get(0));
+            assertEquals(1, membership.getPlainAttr("aLong").get().getValues().size());
+            assertEquals("1977", membership.getPlainAttr("aLong").get().getValues().get(0));
 
             // 3. verify that derived attrbutes from 'csv' and 'other' are also populated for user's membership
-            assertFalse(membership.getDerAttr("csvuserid").getValues().isEmpty());
-            assertFalse(membership.getDerAttr("noschema").getValues().isEmpty());
+            assertFalse(membership.getDerAttr("csvuserid").get().getValues().isEmpty());
+            assertFalse(membership.getDerAttr("noschema").get().getValues().isEmpty());
 
             // update user - change some values and add new membership attribute
             UserPatch userPatch = new UserPatch();
@@ -139,19 +129,19 @@ public class MembershipITCase extends AbstractITCase {
             user = updateUser(userPatch).getEntity();
 
             // 4. verify that 'aLong' is correctly populated for user
-            assertEquals(1, user.getPlainAttr("aLong").getValues().size());
-            assertEquals("1977", user.getPlainAttr("aLong").getValues().get(0));
-            assertNull(user.getPlainAttr("ctype"));
+            assertEquals(1, user.getPlainAttr("aLong").get().getValues().size());
+            assertEquals("1977", user.getPlainAttr("aLong").get().getValues().get(0));
+            assertFalse(user.getPlainAttr("ctype").isPresent());
 
             // 5. verify that 'aLong' is correctly populated for user's membership
             assertEquals(1, user.getMemberships().size());
-            membership = user.getMembership("034740a9-fa10-453b-af37-dc7897e98fb1");
+            membership = user.getMembership("034740a9-fa10-453b-af37-dc7897e98fb1").get();
             assertNotNull(membership);
-            assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
-            assertEquals("1976", membership.getPlainAttr("aLong").getValues().get(0));
+            assertEquals(1, membership.getPlainAttr("aLong").get().getValues().size());
+            assertEquals("1976", membership.getPlainAttr("aLong").get().getValues().get(0));
 
             // 6. verify that 'ctype' is correctly populated for user's membership
-            assertEquals("membership type", membership.getPlainAttr("ctype").getValues().get(0));
+            assertEquals("membership type", membership.getPlainAttr("ctype").get().getValues().get(0));
 
             // finally remove membership
             userPatch = new UserPatch();
@@ -211,14 +201,14 @@ public class MembershipITCase extends AbstractITCase {
 
         // verify that 'aLong' is correctly populated for user's membership
         assertEquals(1, user.getMemberships().size());
-        membership = user.getMembership(groupTO.getKey());
+        membership = user.getMembership(groupTO.getKey()).get();
         assertNotNull(membership);
-        assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
-        assertEquals("1454", membership.getPlainAttr("aLong").getValues().get(0));
+        assertEquals(1, membership.getPlainAttr("aLong").get().getValues().size());
+        assertEquals("1454", membership.getPlainAttr("aLong").get().getValues().get(0));
 
         // verify that derived attrbutes from 'csv' and 'other' are also populated for user's membership
-        assertFalse(membership.getDerAttr("csvuserid").getValues().isEmpty());
-        assertFalse(membership.getDerAttr("noschema").getValues().isEmpty());
+        assertFalse(membership.getDerAttr("csvuserid").get().getValues().isEmpty());
+        assertFalse(membership.getDerAttr("noschema").get().getValues().isEmpty());
 
         // now remove the group -> all related memberships should have been removed as well
         groupService.delete(groupTO.getKey());
@@ -234,27 +224,15 @@ public class MembershipITCase extends AbstractITCase {
         ResourceTO newResource = resourceService.read(RESOURCE_NAME_DBPULL);
         newResource.setKey(getUUIDString());
 
-        ItemTO item = IterableUtils.find(newResource.getProvision("USER").getMapping().getItems(),
-                new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO object) {
-                return "firstname".equals(object.getIntAttrName());
-            }
-        });
+        ItemTO item = newResource.getProvision("USER").get().getMapping().getItems().stream().
+                filter(object -> "firstname".equals(object.getIntAttrName())).findFirst().get();
         assertNotNull(item);
         assertEquals("ID", item.getExtAttrName());
         item.setIntAttrName("memberships[additional].aLong");
         item.setPurpose(MappingPurpose.BOTH);
 
-        item = IterableUtils.find(newResource.getProvision("USER").getMapping().getItems(),
-                new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO object) {
-                return "fullname".equals(object.getIntAttrName());
-            }
-        });
+        item = newResource.getProvision("USER").get().getMapping().getItems().stream().
+                filter(object -> "fullname".equals(object.getIntAttrName())).findFirst().get();
         item.setPurpose(MappingPurpose.PULL);
 
         PullTaskTO newTask = null;
@@ -265,7 +243,7 @@ public class MembershipITCase extends AbstractITCase {
             // 1. create user with new resource assigned
             UserTO user = UserITCase.getUniqueSampleTO("memb@apache.org");
             user.setRealm("/even/two");
-            user.getPlainAttrs().remove(user.getPlainAttr("ctype"));
+            user.getPlainAttrs().remove(user.getPlainAttr("ctype").get());
             user.getResources().clear();
             user.getResources().add(newResource.getKey());
 
@@ -311,7 +289,7 @@ public class MembershipITCase extends AbstractITCase {
             assertEquals(1, users.getTotalCount());
             assertEquals(1, users.getResult().get(0).getMemberships().size());
             assertEquals("5432", users.getResult().get(0).getMemberships().get(0).
-                    getPlainAttr("aLong").getValues().get(0));
+                    getPlainAttr("aLong").get().getValues().get(0));
         } catch (Exception e) {
             LOG.error("Unexpected error", e);
             fail(e.getMessage());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MigrationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MigrationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MigrationITCase.java
index 7600340..40e878a 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MigrationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/MigrationITCase.java
@@ -27,12 +27,9 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.IOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.BulkAction;
@@ -40,7 +37,6 @@ import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.ItemTO;
 import org.apache.syncope.common.lib.to.MappingTO;
-import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.ProvisionTO;
 import org.apache.syncope.common.lib.to.PullTaskTO;
@@ -428,13 +424,12 @@ public class MigrationITCase extends AbstractTaskITCase {
     public void migrateFromSyncope12() throws InterruptedException {
         // 1. cleanup
         try {
-            for (AbstractTaskTO task : taskService.list(
-                    new TaskQuery.Builder(TaskType.PULL).resource(RESOURCE_KEY).build()).getResult()) {
-
-                if (PULL_TASK_NAME.equals(PullTaskTO.class.cast(task).getName())) {
-                    taskService.delete(task.getKey());
-                }
-            }
+            taskService.list(
+                    new TaskQuery.Builder(TaskType.PULL).resource(RESOURCE_KEY).build()).getResult().stream().
+                    filter(task -> PULL_TASK_NAME.equals(PullTaskTO.class.cast(task).getName())).
+                    forEachOrdered(task -> {
+                        taskService.delete(task.getKey());
+                    });
         } catch (Exception e) {
             // ignore
         }
@@ -444,11 +439,11 @@ public class MigrationITCase extends AbstractTaskITCase {
             // ignore
         }
         try {
-            for (ConnInstanceTO connInstance : connectorService.list(null)) {
-                if (CONNINSTANCE_DISPLAY_NAME.equals(connInstance.getDisplayName())) {
-                    connectorService.delete(connInstance.getKey());
-                }
-            }
+            connectorService.list(null).stream().
+                    filter(connInstance -> CONNINSTANCE_DISPLAY_NAME.equals(connInstance.getDisplayName())).
+                    forEachOrdered(connInstance -> {
+                        connectorService.delete(connInstance.getKey());
+                    });
         } catch (Exception e) {
             // ignore
         }
@@ -464,15 +459,17 @@ public class MigrationITCase extends AbstractTaskITCase {
         BulkAction bulkAction = new BulkAction();
         bulkAction.setType(BulkAction.Type.DELETE);
 
-        for (UserTO user : userService.search(new AnyQuery.Builder().fiql("username==*12").build()).getResult()) {
-            bulkAction.getTargets().add(user.getKey());
-        }
+        userService.search(new AnyQuery.Builder().fiql("username==*12").build()).getResult().
+                forEach(user -> {
+                    bulkAction.getTargets().add(user.getKey());
+                });
         userService.bulk(bulkAction);
 
         bulkAction.getTargets().clear();
-        for (GroupTO group : groupService.search(new AnyQuery.Builder().fiql("name==*12").build()).getResult()) {
-            bulkAction.getTargets().add(group.getKey());
-        }
+        groupService.search(new AnyQuery.Builder().fiql("name==*12").build()).getResult().
+                forEach(group -> {
+                    bulkAction.getTargets().add(group.getKey());
+                });
         groupService.bulk(bulkAction);
 
         // 2. setup
@@ -498,13 +495,8 @@ public class MigrationITCase extends AbstractTaskITCase {
                 user = userService.read("rossini12");
                 assertNotNull(user);
 
-                membershipFound = IterableUtils.matchesAny(user.getMemberships(), new Predicate<MembershipTO>() {
-
-                    @Override
-                    public boolean evaluate(final MembershipTO object) {
-                        return "1 root12".equals(object.getGroupName());
-                    }
-                });
+                membershipFound = user.getMemberships().stream().
+                        anyMatch(object -> "1 root12".equals(object.getGroupName()));
             } catch (Exception e) {
                 // ignore
             }
@@ -520,8 +512,8 @@ public class MigrationITCase extends AbstractTaskITCase {
         assertEquals("/" + MIGRATION_REALM, group.getRealm());
 
         // 4a. user plain attrs
-        assertEquals("Gioacchino", user.getPlainAttr("firstname").getValues().get(0));
-        assertEquals("Rossini", user.getPlainAttr("surname").getValues().get(0));
+        assertEquals("Gioacchino", user.getPlainAttr("firstname").get().getValues().get(0));
+        assertEquals("Rossini", user.getPlainAttr("surname").get().getValues().get(0));
 
         // 4b. user resources
         assertTrue(user.getResources().contains(RESOURCE_NAME_TESTDB2));
@@ -530,7 +522,7 @@ public class MigrationITCase extends AbstractTaskITCase {
         assertNotNull(clientFactory.create("bellini12", ADMIN_PWD).self());
 
         // 4d. group plain attrs
-        assertEquals("r12", group.getPlainAttr("title").getValues().get(0));
+        assertEquals("r12", group.getPlainAttr("title").get().getValues().get(0));
 
         // 4e. group resources
         assertTrue(group.getResources().contains(RESOURCE_NAME_CSV));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
index 8841851..152fcdd 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PlainSchemaITCase.java
@@ -28,8 +28,6 @@ import static org.junit.Assert.fail;
 import java.util.List;
 import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -163,9 +161,9 @@ public class PlainSchemaITCase extends AbstractITCase {
     public void list() {
         List<PlainSchemaTO> schemas = schemaService.list(new SchemaQuery.Builder().type(SchemaType.PLAIN).build());
         assertFalse(schemas.isEmpty());
-        for (PlainSchemaTO schemaTO : schemas) {
+        schemas.forEach(schemaTO -> {
             assertNotNull(schemaTO);
-        }
+        });
     }
 
     @Test
@@ -173,24 +171,14 @@ public class PlainSchemaITCase extends AbstractITCase {
         List<PlainSchemaTO> userSchemas = schemaService.list(
                 new SchemaQuery.Builder().type(SchemaType.PLAIN).anyTypeClass("minimal user").build());
 
-        assertTrue(IterableUtils.matchesAny(userSchemas, new Predicate<PlainSchemaTO>() {
-
-            @Override
-            public boolean evaluate(final PlainSchemaTO object) {
-                return "fullname".equals(object.getKey());
-            }
-        }));
-
-        assertFalse(IterableUtils.matchesAny(userSchemas, new Predicate<PlainSchemaTO>() {
+        assertTrue(userSchemas.stream().anyMatch(object -> "fullname".equals(object.getKey())));
 
-            @Override
-            public boolean evaluate(final PlainSchemaTO object) {
-                return "password.cipher.algorithm".equals(object.getKey())
-                        || "rderived_dx".equals(object.getKey())
-                        || "icon".equals(object.getKey())
-                        || "mderived_sx".equals(object.getKey())
-                        || "self.membership.layout".equals(object.getKey());
-            }
+        assertFalse(userSchemas.stream().anyMatch(object -> {
+            return "password.cipher.algorithm".equals(object.getKey())
+                    || "rderived_dx".equals(object.getKey())
+                    || "icon".equals(object.getKey())
+                    || "mderived_sx".equals(object.getKey())
+                    || "self.membership.layout".equals(object.getKey());
         }));
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
index f4aa9bf..20b61ac 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PropagationTaskITCase.java
@@ -25,8 +25,7 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
@@ -98,9 +97,7 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
 
         BulkAction bulkAction = new BulkAction();
         bulkAction.setType(BulkAction.Type.DELETE);
-        for (PropagationTaskTO taskTO : tasks) {
-            bulkAction.getTargets().add(taskTO.getKey());
-        }
+        tasks.forEach(taskTO -> bulkAction.getTargets().add(taskTO.getKey()));
 
         taskService.bulk(bulkAction);
 
@@ -113,29 +110,23 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
         // 0. Set propagation JEXL MappingItemTransformer
         ResourceTO resource = resourceService.read(RESOURCE_NAME_DBSCRIPTED);
         ResourceTO originalResource = SerializationUtils.clone(resource);
-        ProvisionTO provision = resource.getProvision("PRINTER");
+        ProvisionTO provision = resource.getProvision("PRINTER").get();
         assertNotNull(provision);
 
-        ItemTO mappingItem = IterableUtils.find(
-                provision.getMapping().getItems(), new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO object) {
-                return "location".equals(object.getIntAttrName());
-            }
-        });
-        assertNotNull(mappingItem);
-        assertTrue(mappingItem.getTransformerClassNames().isEmpty());
+        Optional<ItemTO> mappingItem = provision.getMapping().getItems().stream().
+                filter(item -> "location".equals(item.getIntAttrName())).findFirst();
+        assertTrue(mappingItem.isPresent());
+        assertTrue(mappingItem.get().getTransformerClassNames().isEmpty());
 
         String suffix = getUUIDString();
-        mappingItem.setPropagationJEXLTransformer("value + '" + suffix + "'");
+        mappingItem.get().setPropagationJEXLTransformer("value + '" + suffix + "'");
 
         try {
             resourceService.update(resource);
 
             // 1. create printer on external resource
             AnyObjectTO anyObjectTO = AnyObjectITCase.getSampleTO("propagationJEXLTransformer");
-            String originalLocation = anyObjectTO.getPlainAttr("location").getValues().get(0);
+            String originalLocation = anyObjectTO.getPlainAttr("location").get().getValues().get(0);
             assertFalse(originalLocation.endsWith(suffix));
 
             anyObjectTO = createAnyObject(anyObjectTO).getEntity();
@@ -145,8 +136,8 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
             // (location ends with given suffix on external resource)
             ConnObjectTO connObjectTO = resourceService.
                     readConnObject(RESOURCE_NAME_DBSCRIPTED, anyObjectTO.getType(), anyObjectTO.getKey());
-            assertFalse(anyObjectTO.getPlainAttr("location").getValues().get(0).endsWith(suffix));
-            assertTrue(connObjectTO.getAttr("LOCATION").getValues().get(0).endsWith(suffix));
+            assertFalse(anyObjectTO.getPlainAttr("location").get().getValues().get(0).endsWith(suffix));
+            assertTrue(connObjectTO.getAttr("LOCATION").get().getValues().get(0).endsWith(suffix));
         } finally {
             resourceService.update(originalResource);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
index c0ac469..9427672 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PullTaskITCase.java
@@ -39,8 +39,6 @@ import java.util.Set;
 import java.util.UUID;
 import javax.sql.DataSource;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -121,11 +119,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
     public void list() {
         PagedResult<PullTaskTO> tasks = taskService.list(new TaskQuery.Builder(TaskType.PULL).build());
         assertFalse(tasks.getResult().isEmpty());
-        for (AbstractTaskTO task : tasks.getResult()) {
-            if (!(task instanceof PullTaskTO)) {
-                fail();
-            }
-        }
+        tasks.getResult().stream().
+                filter(task -> (!(task instanceof PullTaskTO))).
+                forEach(item -> fail());
     }
 
     @Test
@@ -228,9 +224,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(userName, userTO.getUsername());
             assertEquals(ActivitiDetector.isActivitiEnabledForUsers(syncopeService)
                     ? "active" : "created", userTO.getStatus());
-            assertEquals("test9@syncope.apache.org", userTO.getPlainAttr("email").getValues().get(0));
-            assertEquals("test9@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
-            assertTrue(Integer.valueOf(userTO.getPlainAttr("fullname").getValues().get(0)) <= 10);
+            assertEquals("test9@syncope.apache.org", userTO.getPlainAttr("email").get().getValues().get(0));
+            assertEquals("test9@syncope.apache.org", userTO.getPlainAttr("userId").get().getValues().get(0));
+            assertTrue(Integer.valueOf(userTO.getPlainAttr("fullname").get().getValues().get(0)) <= 10);
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
 
@@ -240,7 +236,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // check for user template
             userTO = userService.read("test7");
             assertNotNull(userTO);
-            assertEquals("TYPE_OTHER", userTO.getPlainAttr("ctype").getValues().get(0));
+            assertEquals("TYPE_OTHER", userTO.getPlainAttr("ctype").get().getValues().get(0));
             assertEquals(3, userTO.getResources().size());
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
@@ -249,17 +245,12 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             // Unmatching --> Assign (link) - SYNCOPE-658
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_CSV));
-            assertEquals(1, IterableUtils.countMatches(userTO.getDerAttrs(), new Predicate<AttrTO>() {
-
-                @Override
-                public boolean evaluate(final AttrTO attrTO) {
-                    return "csvuserid".equals(attrTO.getSchema());
-                }
-            }));
+            assertEquals(1, userTO.getDerAttrs().stream().
+                    filter(attrTO -> "csvuserid".equals(attrTO.getSchema())).count());
 
             userTO = userService.read("test8");
             assertNotNull(userTO);
-            assertEquals("TYPE_8", userTO.getPlainAttr("ctype").getValues().get(0));
+            assertEquals("TYPE_8", userTO.getPlainAttr("ctype").get().getValues().get(0));
 
             // Check for ignored user - SYNCOPE-663
             try {
@@ -312,7 +303,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("testuser1");
             assertNotNull(userTO);
-            assertEquals("reconciled@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
+            assertEquals("reconciled@syncope.apache.org", userTO.getPlainAttr("userId").get().getValues().get(0));
             assertEquals("suspended", userTO.getStatus());
 
             // enable user on external resource
@@ -370,7 +361,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // Check for SYNCOPE-436
         assertEquals("pullFromLDAP",
-                matchingUsers.getResult().get(0).getVirAttr("virtualReadOnly").getValues().get(0));
+                matchingUsers.getResult().get(0).getVirAttr("virtualReadOnly").get().getValues().get(0));
         // Check for SYNCOPE-270
         assertNotNull(matchingUsers.getResult().get(0).getPlainAttr("obscure"));
         // Check for SYNCOPE-123
@@ -379,7 +370,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         GroupTO groupTO = matchingGroups.getResult().iterator().next();
         assertNotNull(groupTO);
         assertEquals("testLDAPGroup", groupTO.getName());
-        assertEquals("true", groupTO.getPlainAttr("show").getValues().get(0));
+        assertEquals("true", groupTO.getPlainAttr("show").get().getValues().get(0));
         assertEquals(matchingUsers.getResult().iterator().next().getKey(), groupTO.getUserOwner());
         assertNull(groupTO.getGroupOwner());
 
@@ -414,16 +405,11 @@ public class PullTaskITCase extends AbstractTaskITCase {
         // 0. reset sync token and set MappingItemTransformer
         ResourceTO resource = resourceService.read(RESOURCE_NAME_DBSCRIPTED);
         ResourceTO originalResource = SerializationUtils.clone(resource);
-        ProvisionTO provision = resource.getProvision("PRINTER");
+        ProvisionTO provision = resource.getProvision("PRINTER").get();
         assertNotNull(provision);
 
-        ItemTO mappingItem = IterableUtils.find(provision.getMapping().getItems(), new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO object) {
-                return "location".equals(object.getIntAttrName());
-            }
-        });
+        ItemTO mappingItem = provision.getMapping().getItems().stream().
+                filter(object -> "location".equals(object.getIntAttrName())).findFirst().get();
         assertNotNull(mappingItem);
         mappingItem.getTransformerClassNames().clear();
         mappingItem.getTransformerClassNames().add(PrefixItemTransformer.class.getName());
@@ -441,7 +427,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             // 1. create printer on external resource
             AnyObjectTO anyObjectTO = AnyObjectITCase.getSampleTO("pull");
-            String originalLocation = anyObjectTO.getPlainAttr("location").getValues().get(0);
+            String originalLocation = anyObjectTO.getPlainAttr("location").get().getValues().get(0);
             assertFalse(originalLocation.startsWith(PrefixItemTransformer.PREFIX));
 
             anyObjectTO = createAnyObject(anyObjectTO).getEntity();
@@ -451,9 +437,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // (location starts with given prefix on external resource)
             ConnObjectTO connObjectTO = resourceService.
                     readConnObject(RESOURCE_NAME_DBSCRIPTED, anyObjectTO.getType(), anyObjectTO.getKey());
-            assertFalse(anyObjectTO.getPlainAttr("location").getValues().get(0).
+            assertFalse(anyObjectTO.getPlainAttr("location").get().getValues().get(0).
                     startsWith(PrefixItemTransformer.PREFIX));
-            assertTrue(connObjectTO.getAttr("LOCATION").getValues().get(0).
+            assertTrue(connObjectTO.getAttr("LOCATION").get().getValues().get(0).
                     startsWith(PrefixItemTransformer.PREFIX));
 
             // 3. unlink any existing printer and delete from Syncope (printer is now only on external resource)
@@ -487,8 +473,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertTrue(matchingPrinters.getSize() > 0);
 
             // 6. verify that synctoken was updated
-            assertNotNull(
-                    resourceService.read(RESOURCE_NAME_DBSCRIPTED).getProvision(anyObjectTO.getType()).getSyncToken());
+            assertNotNull(resourceService.read(RESOURCE_NAME_DBSCRIPTED).
+                    getProvision(anyObjectTO.getType()).get().getSyncToken());
         } finally {
             resourceService.update(originalResource);
         }
@@ -562,7 +548,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         try {
             connForTest.getCapabilities().add(ConnectorCapability.SYNC);
 
-            ConnConfProperty changeLogColumn = connForTest.getConf("changeLogColumn");
+            ConnConfProperty changeLogColumn = connForTest.getConf("changeLogColumn").get();
             assertNotNull(changeLogColumn);
             assertTrue(changeLogColumn.getValues().isEmpty());
             changeLogColumn.getValues().add("lastModification");
@@ -607,7 +593,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(PropagationTaskExecStatus.SUCCESS, PropagationTaskExecStatus.valueOf(exec.getStatus()));
 
             resForTest = resourceService.read(resForTest.getKey());
-            assertTrue(resForTest.getProvision(AnyTypeKind.USER.name()).getSyncToken().contains("2014-05-23"));
+            assertTrue(resForTest.getProvision(AnyTypeKind.USER.name()).get().getSyncToken().contains("2014-05-23"));
 
             jdbcTemplate.execute("UPDATE testpull "
                     + "SET email='syncTokenWithErrors2@syncope.apache.org', lastModification='2016-05-23 13:53:24.293' "
@@ -617,7 +603,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(PropagationTaskExecStatus.SUCCESS, PropagationTaskExecStatus.valueOf(exec.getStatus()));
 
             resForTest = resourceService.read(resForTest.getKey());
-            assertTrue(resForTest.getProvision(AnyTypeKind.USER.name()).getSyncToken().contains("2016-05-23"));
+            assertTrue(resForTest.getProvision(AnyTypeKind.USER.name()).get().getSyncToken().contains("2016-05-23"));
         } finally {
             if (resForTest.getConnector() != null) {
                 resourceService.delete(resForTest.getKey());
@@ -689,7 +675,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("testuser2");
             assertNotNull(userTO);
-            assertEquals("testuser2@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
+            assertEquals("testuser2@syncope.apache.org", userTO.getPlainAttr("userId").get().getValues().get(0));
             assertEquals(2, userTO.getMemberships().size());
             assertEquals(4, userTO.getResources().size());
         } finally {
@@ -714,7 +700,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         // 3. read e-mail address for user created by the PullTask first execution
         UserTO userTO = userService.read("issuesyncope230");
         assertNotNull(userTO);
-        String email = userTO.getPlainAttr("email").getValues().iterator().next();
+        String email = userTO.getPlainAttr("email").get().getValues().iterator().next();
         assertNotNull(email);
 
         // 4. update TESTPULL on external H2 by changing e-mail address
@@ -726,7 +712,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         // 6. verify that the e-mail was updated
         userTO = userService.read("issuesyncope230");
         assertNotNull(userTO);
-        email = userTO.getPlainAttr("email").getValues().iterator().next();
+        email = userTO.getPlainAttr("email").get().getValues().iterator().next();
         assertNotNull(email);
         assertEquals("updatedSYNCOPE230@syncope.apache.org", email);
     }
@@ -806,7 +792,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read(userTO.getKey());
             assertNotNull(userTO);
-            assertNotNull(userTO.getPlainAttr("firstname").getValues().get(0));
+            assertNotNull(userTO.getPlainAttr("firstname").get().getValues().get(0));
         } finally {
             removeTestUsers();
         }
@@ -816,8 +802,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
     public void issueSYNCOPE307() {
         UserTO userTO = UserITCase.getUniqueSampleTO("s307@apache.org");
         userTO.setUsername("test0");
-        userTO.getPlainAttr("firstname").getValues().clear();
-        userTO.getPlainAttr("firstname").getValues().add("nome0");
+        userTO.getPlainAttr("firstname").get().getValues().clear();
+        userTO.getPlainAttr("firstname").get().getValues().add("nome0");
         userTO.getAuxClasses().add("csv");
 
         userTO.getResources().clear();
@@ -847,7 +833,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // check that template was successfully applied...
         userTO = userService.read(userTO.getKey());
-        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").getValues().get(0));
+        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").get().getValues().get(0));
 
         // ...and that propagation to db succeeded
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
@@ -944,15 +930,15 @@ public class PullTaskITCase extends AbstractTaskITCase {
             ConnObjectTO connObject =
                     resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
             assertNotNull(getLdapRemoteObject(
-                    connObject.getAttr(Name.NAME).getValues().get(0),
+                    connObject.getAttr(Name.NAME).get().getValues().get(0),
                     oldCleanPassword,
-                    connObject.getAttr(Name.NAME).getValues().get(0)));
+                    connObject.getAttr(Name.NAME).get().getValues().get(0)));
 
             // 5. Update the LDAP Connector to retrieve passwords
             ResourceTO ldapResource = resourceService.read(RESOURCE_NAME_LDAP);
             resourceConnector = connectorService.read(
                     ldapResource.getConnector(), Locale.ENGLISH.getLanguage());
-            property = resourceConnector.getConf("retrievePasswordsWithSearch");
+            property = resourceConnector.getConf("retrievePasswordsWithSearch").get();
             property.getValues().clear();
             property.getValues().add(Boolean.TRUE);
             connectorService.update(resourceConnector);
@@ -1038,7 +1024,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // the user is successfully pulled...
             user = userService.read("pullFromLDAP");
             assertNotNull(user);
-            assertEquals("pullFromLDAP@syncope.apache.org", user.getPlainAttr("email").getValues().get(0));
+            assertEquals("pullFromLDAP@syncope.apache.org", user.getPlainAttr("email").get().getValues().get(0));
 
             group = groupService.read("testLDAPGroup");
             assertNotNull(group);
@@ -1046,8 +1032,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
             ConnObjectTO connObject =
                     resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
             assertNotNull(connObject);
-            assertEquals("pullFromLDAP@syncope.apache.org", connObject.getAttr("mail").getValues().get(0));
-            AttrTO userDn = connObject.getAttr(Name.NAME);
+            assertEquals("pullFromLDAP@syncope.apache.org", connObject.getAttr("mail").get().getValues().get(0));
+            AttrTO userDn = connObject.getAttr(Name.NAME).get();
             assertNotNull(userDn);
             assertEquals(1, userDn.getValues().size());
             assertNotNull(
@@ -1065,7 +1051,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             connObject = resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
             assertNotNull(connObject);
-            assertEquals("pullFromLDAP2@syncope.apache.org", connObject.getAttr("mail").getValues().get(0));
+            assertEquals("pullFromLDAP2@syncope.apache.org", connObject.getAttr("mail").get().getValues().get(0));
 
             // 5. exec the pull task again
             execution = execProvisioningTask(taskService, pullTask.getKey(), 50, false);
@@ -1074,7 +1060,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // the internal is updated...
             user = userService.read("pullFromLDAP");
             assertNotNull(user);
-            assertEquals("pullFromLDAP2@syncope.apache.org", user.getPlainAttr("email").getValues().get(0));
+            assertEquals("pullFromLDAP2@syncope.apache.org", user.getPlainAttr("email").get().getValues().get(0));
 
             // ...and propagated
             propagationTasks = taskService.list(new TaskQuery.Builder(TaskType.PROPAGATION).

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
index fe62261..368acde 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/PushTaskITCase.java
@@ -31,7 +31,6 @@ import javax.sql.DataSource;
 import javax.ws.rs.core.Response;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.to.AbstractTaskTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.PushTaskTO;
@@ -90,11 +89,9 @@ public class PushTaskITCase extends AbstractTaskITCase {
     public void list() {
         PagedResult<PushTaskTO> tasks = taskService.list(new TaskQuery.Builder(TaskType.PUSH).build());
         assertFalse(tasks.getResult().isEmpty());
-        for (AbstractTaskTO task : tasks.getResult()) {
-            if (!(task instanceof PushTaskTO)) {
-                fail();
-            }
-        }
+        tasks.getResult().stream().
+                filter((task) -> (!(task instanceof PushTaskTO))).
+                forEach(item -> fail());
     }
 
     @Test
@@ -358,8 +355,8 @@ public class PushTaskITCase extends AbstractTaskITCase {
             Response response = resourceService.create(resourceTO);
             newResourceTO = getObject(response.getLocation(), ResourceService.class, ResourceTO.class);
             assertNotNull(newResourceTO);
-            assertNull(newResourceTO.getProvision(AnyTypeKind.USER.name()));
-            assertNotNull(newResourceTO.getProvision(AnyTypeKind.GROUP.name()).getMapping());
+            assertFalse(newResourceTO.getProvision(AnyTypeKind.USER.name()).isPresent());
+            assertNotNull(newResourceTO.getProvision(AnyTypeKind.GROUP.name()).get().getMapping());
 
             // create push task ad-hoc
             PushTaskTO task = new PushTaskTO();


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowFormTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowFormTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowFormTO.java
index 0e80be6..2f99b65 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowFormTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/WorkflowFormTO.java
@@ -23,12 +23,11 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.patch.UserPatch;
 
@@ -135,14 +134,8 @@ public class WorkflowFormTO extends AbstractBaseBean {
     }
 
     @JsonIgnore
-    public WorkflowFormPropertyTO getProperty(final String id) {
-        return IterableUtils.find(properties, new Predicate<WorkflowFormPropertyTO>() {
-
-            @Override
-            public boolean evaluate(final WorkflowFormPropertyTO object) {
-                return id.equals(object.getId());
-            }
-        });
+    public Optional<WorkflowFormPropertyTO> getProperty(final String id) {
+        return properties.stream().filter(property -> id.equals(property.getId())).findFirst();
     }
 
     @XmlElementWrapper(name = "workflowFormProperties")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
index fd7e5f2..ad43e0e 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AbstractAnyLogic.java
@@ -22,9 +22,6 @@ 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.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -77,7 +74,7 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, P extends AnyPatch> ext
     private List<LogicActions> getActions(final Realm realm) {
         List<LogicActions> actions = new ArrayList<>();
 
-        for (String className : realm.getActionsClassNames()) {
+        realm.getActionsClassNames().forEach(className -> {
             try {
                 Class<?> actionsClass = Class.forName(className);
                 LogicActions logicActions = (LogicActions) ApplicationContextProvider.getBeanFactory().
@@ -87,7 +84,7 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, P extends AnyPatch> ext
             } catch (Exception e) {
                 LOG.warn("Class '{}' not found", className, e);
             }
-        }
+        });
 
         return actions;
     }
@@ -229,20 +226,15 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, P extends AnyPatch> ext
     }
 
     protected boolean securityChecks(final Set<String> effectiveRealms, final String realm, final String key) {
-        boolean authorized = IterableUtils.matchesAny(effectiveRealms, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String ownedRealm) {
-                return realm.startsWith(ownedRealm);
-            }
-        });
+        boolean authorized = effectiveRealms.stream().anyMatch(ownedRealm -> realm.startsWith(ownedRealm));
         if (!authorized) {
             AnyDAO<?> anyDAO = this instanceof UserLogic
                     ? userDAO
                     : this instanceof GroupLogic
                             ? groupDAO
                             : anyObjectDAO;
-            authorized = !CollectionUtils.intersection(anyDAO.findDynRealms(key), effectiveRealms).isEmpty();
+            authorized = anyDAO.findDynRealms(key).stream().
+                    filter(dynRealm -> effectiveRealms.contains(dynRealm)).findFirst().isPresent();
         }
         if (!authorized) {
             throw new DelegatedAdministrationException(
@@ -255,7 +247,7 @@ public abstract class AbstractAnyLogic<TO extends AnyTO, P extends AnyPatch> ext
                     key);
         }
 
-        return IterableUtils.matchesAny(effectiveRealms, new RealmUtils.DynRealmsPredicate());
+        return effectiveRealms.stream().anyMatch(new RealmUtils.DynRealmsPredicate());
     }
 
     public abstract TO read(String key);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/AccessTokenLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AccessTokenLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AccessTokenLogic.java
index f1a39c1..ee3877f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AccessTokenLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AccessTokenLogic.java
@@ -21,13 +21,11 @@ package org.apache.syncope.core.logic;
 import static org.apache.syncope.core.logic.AbstractLogic.LOG;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.to.AccessTokenTO;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
@@ -115,14 +113,8 @@ public class AccessTokenLogic extends AbstractTransactionalLogic<AccessTokenTO>
             final int size,
             final List<OrderByClause> orderByClauses) {
 
-        return CollectionUtils.collect(accessTokenDAO.findAll(page, size, orderByClauses),
-                new Transformer<AccessToken, AccessTokenTO>() {
-
-            @Override
-            public AccessTokenTO transform(final AccessToken input) {
-                return binder.getAccessTokenTO(input);
-            }
-        }, new ArrayList<AccessTokenTO>());
+        return accessTokenDAO.findAll(page, size, orderByClauses).stream().
+                map(accessToken -> binder.getAccessTokenTO(accessToken)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ACCESS_TOKEN_DELETE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
index e5621be..a067ab7 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyObjectLogic.java
@@ -19,13 +19,11 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Collection;
 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.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -95,14 +93,8 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
 
         List<AnyObject> matching = searchDAO.search(
                 effectiveRealms, searchCond, page, size, orderBy, AnyTypeKind.ANY_OBJECT);
-        List<AnyObjectTO> result = CollectionUtils.collect(matching, new Transformer<AnyObject, AnyObjectTO>() {
-
-            @Transactional(readOnly = true)
-            @Override
-            public AnyObjectTO transform(final AnyObject input) {
-                return binder.getAnyObjectTO(input, details);
-            }
-        }, new ArrayList<AnyObjectTO>());
+        List<AnyObjectTO> result = matching.stream().
+                map(anyObject -> binder.getAnyObjectTO(anyObject, details)).collect(Collectors.toList());
 
         return Pair.of(count, result);
     }
@@ -184,13 +176,9 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
 
         AnyObjectPatch patch = new AnyObjectPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return binder.getAnyObjectTO(provisioningManager.unlink(patch));
     }
@@ -206,13 +194,9 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
 
         AnyObjectPatch patch = new AnyObjectPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return binder.getAnyObjectTO(provisioningManager.link(patch));
     }
@@ -230,13 +214,9 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
 
         AnyObjectPatch patch = new AnyObjectPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return update(patch, nullPriorityAsync);
     }
@@ -258,13 +238,9 @@ public class AnyObjectLogic extends AbstractAnyLogic<AnyObjectTO, AnyObjectPatch
 
         AnyObjectPatch patch = new AnyObjectPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return update(patch, nullPriorityAsync);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
index babe255..03f6909 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeClassLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -64,13 +62,8 @@ public class AnyTypeClassLogic extends AbstractTransactionalLogic<AnyTypeClassTO
     @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPECLASS_LIST + "')")
     @Transactional(readOnly = true)
     public List<AnyTypeClassTO> list() {
-        return CollectionUtils.collect(anyTypeClassDAO.findAll(), new Transformer<AnyTypeClass, AnyTypeClassTO>() {
-
-            @Override
-            public AnyTypeClassTO transform(final AnyTypeClass input) {
-                return binder.getAnyTypeClassTO(input);
-            }
-        }, new ArrayList<AnyTypeClassTO>());
+        return anyTypeClassDAO.findAll().stream().
+                map(anyTypeClass -> binder.getAnyTypeClassTO(anyTypeClass)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPECLASS_CREATE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
index f967da8..783d356 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/AnyTypeLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -64,13 +62,7 @@ public class AnyTypeLogic extends AbstractTransactionalLogic<AnyTypeTO> {
     @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPE_LIST + "')")
     @Transactional(readOnly = true)
     public List<AnyTypeTO> list() {
-        return CollectionUtils.collect(anyTypeDAO.findAll(), new Transformer<AnyType, AnyTypeTO>() {
-
-            @Override
-            public AnyTypeTO transform(final AnyType input) {
-                return binder.getAnyTypeTO(input);
-            }
-        }, new ArrayList<AnyTypeTO>());
+        return anyTypeDAO.findAll().stream().map(anyType -> binder.getAnyTypeTO(anyType)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ANYTYPE_CREATE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
index eea22ad..cc7a4bd 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.logic;
 import java.io.OutputStream;
 import java.lang.reflect.Method;
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
@@ -65,8 +66,8 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONFIGURATION_DELETE + "')")
     public void delete(final String schema) {
-        CPlainAttr conf = confDAO.find(schema);
-        if (conf == null) {
+        Optional<? extends CPlainAttr> conf = confDAO.find(schema);
+        if (!conf.isPresent()) {
             PlainSchema plainSchema = plainSchemaDAO.find(schema);
             if (plainSchema == null) {
                 throw new NotFoundException("Configuration schema " + schema);
@@ -86,8 +87,10 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
     public AttrTO get(final String schema) {
         AttrTO result;
 
-        CPlainAttr conf = confDAO.find(schema);
-        if (conf == null) {
+        Optional<? extends CPlainAttr> conf = confDAO.find(schema);
+        if (conf.isPresent()) {
+            result = binder.getAttrTO(conf.get());
+        } else {
             PlainSchema plainSchema = plainSchemaDAO.find(schema);
             if (plainSchema == null) {
                 throw new NotFoundException("Configuration schema " + schema);
@@ -95,8 +98,6 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
 
             result = new AttrTO();
             result.setSchema(schema);
-        } else {
-            result = binder.getAttrTO(conf);
         }
 
         return result;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java
index 2d0afa7..e7ff07c 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorHistoryLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.to.ConnInstanceHistoryConfTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.ConnInstanceDAO;
@@ -64,15 +62,8 @@ public class ConnectorHistoryLogic extends AbstractTransactionalLogic<ConnInstan
             throw new NotFoundException("Connector '" + key + "'");
         }
 
-        return CollectionUtils.collect(connInstanceHistoryConfDAO.findByEntity(connInstance),
-                new Transformer<ConnInstanceHistoryConf, ConnInstanceHistoryConfTO>() {
-
-            @Override
-            public ConnInstanceHistoryConfTO transform(final ConnInstanceHistoryConf input) {
-                return getConnInstanceHistoryConfTO(input);
-            }
-
-        }, new ArrayList<ConnInstanceHistoryConfTO>());
+        return connInstanceHistoryConfDAO.findByEntity(connInstance).stream().
+                map(historyConf -> getConnInstanceHistoryConfTO(historyConf)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_HISTORY_RESTORE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
index 9c92e29..5d80ef7 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConnectorLogic.java
@@ -25,11 +25,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.PredicateUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -51,10 +47,8 @@ import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
 import org.identityconnectors.common.l10n.CurrentLocale;
 import org.identityconnectors.framework.api.ConfigurationProperties;
-import org.identityconnectors.framework.api.ConnectorInfo;
 import org.identityconnectors.framework.api.ConnectorInfoManager;
 import org.identityconnectors.framework.api.ConnectorKey;
-import org.identityconnectors.framework.common.objects.AttributeInfo;
 import org.identityconnectors.framework.common.objects.AttributeUtil;
 import org.identityconnectors.framework.common.objects.ObjectClassInfo;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -81,13 +75,7 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
     private ConnectorFactory connFactory;
 
     protected void securityChecks(final Set<String> effectiveRealms, final String realm, final String key) {
-        boolean authorized = IterableUtils.matchesAny(effectiveRealms, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String ownedRealm) {
-                return realm.startsWith(ownedRealm);
-            }
-        });
+        boolean authorized = effectiveRealms.stream().anyMatch(ownedRealm -> realm.startsWith(ownedRealm));
         if (!authorized) {
             throw new DelegatedAdministrationException(realm, ConnInstance.class.getSimpleName(), key);
         }
@@ -138,9 +126,9 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
         if (!connInstance.getResources().isEmpty()) {
             SyncopeClientException associatedResources = SyncopeClientException.build(
                     ClientExceptionType.AssociatedResources);
-            for (ExternalResource resource : connInstance.getResources()) {
+            connInstance.getResources().forEach(resource -> {
                 associatedResources.getElements().add(resource.getKey());
-            }
+            });
             throw associatedResources;
         }
 
@@ -154,23 +142,20 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
     public List<ConnInstanceTO> list(final String lang) {
         CurrentLocale.set(StringUtils.isBlank(lang) ? Locale.ENGLISH : new Locale(lang));
 
-        List<ConnInstanceTO> result = CollectionUtils.collect(connInstanceDAO.findAll().iterator(),
-                new Transformer<ConnInstance, ConnInstanceTO>() {
-
-            @Override
-            public ConnInstanceTO transform(final ConnInstance connInstance) {
-                ConnInstanceTO result = null;
-                try {
-                    result = binder.getConnInstanceTO(connInstance);
-                } catch (NotFoundException e) {
-                    LOG.error("Connector '{}#{}' not found", connInstance.getBundleName(), connInstance.getVersion());
-                }
-
-                return result;
-            }
-        }, new ArrayList<ConnInstanceTO>());
-        CollectionUtils.filter(result, PredicateUtils.notNullPredicate());
-        return result;
+        return connInstanceDAO.findAll().stream().
+                filter(connInstance -> connInstance != null).
+                map(connInstance -> {
+                    ConnInstanceTO result = null;
+                    try {
+                        result = binder.getConnInstanceTO(connInstance);
+                    } catch (NotFoundException e) {
+                        LOG.
+                                error("Connector '{}#{}' not found", connInstance.getBundleName(), connInstance.
+                                        getVersion());
+                    }
+
+                    return result;
+                }).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONNECTOR_READ + "')")
@@ -197,25 +182,22 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
 
         List<ConnBundleTO> connectorBundleTOs = new ArrayList<>();
         for (Map.Entry<URI, ConnectorInfoManager> entry : connIdBundleManager.getConnInfoManagers().entrySet()) {
-            for (ConnectorInfo bundle : entry.getValue().getConnectorInfos()) {
+            entry.getValue().getConnectorInfos().stream().map(bundle -> {
                 ConnBundleTO connBundleTO = new ConnBundleTO();
                 connBundleTO.setDisplayName(bundle.getConnectorDisplayName());
-
                 connBundleTO.setLocation(entry.getKey().toString());
-
                 ConnectorKey key = bundle.getConnectorKey();
                 connBundleTO.setBundleName(key.getBundleName());
                 connBundleTO.setConnectorName(key.getConnectorName());
                 connBundleTO.setVersion(key.getBundleVersion());
-
                 ConfigurationProperties properties = connIdBundleManager.getConfigurationProperties(bundle);
-
                 for (String propName : properties.getPropertyNames()) {
                     connBundleTO.getProperties().add(binder.build(properties.getProperty(propName)));
                 }
-
+                return connBundleTO;
+            }).forEachOrdered(connBundleTO -> {
                 connectorBundleTOs.add(connBundleTO);
-            }
+            });
         }
 
         return connectorBundleTOs;
@@ -235,20 +217,20 @@ public class ConnectorLogic extends AbstractTransactionalLogic<ConnInstanceTO> {
                 getObjectClassInfo();
 
         List<ConnIdObjectClassTO> result = new ArrayList<>(objectClassInfo.size());
-        for (ObjectClassInfo info : objectClassInfo) {
+        objectClassInfo.stream().map(info -> {
             ConnIdObjectClassTO connIdObjectClassTO = new ConnIdObjectClassTO();
             connIdObjectClassTO.setType(info.getType());
             connIdObjectClassTO.setAuxiliary(info.isAuxiliary());
             connIdObjectClassTO.setContainer(info.isContainer());
-
-            for (AttributeInfo attrInfo : info.getAttributeInfo()) {
-                if (includeSpecial || !AttributeUtil.isSpecialName(attrInfo.getName())) {
-                    connIdObjectClassTO.getAttributes().add(attrInfo.getName());
-                }
-            }
-
+            info.getAttributeInfo().stream().
+                    filter(attrInfo -> includeSpecial || !AttributeUtil.isSpecialName(attrInfo.getName())).
+                    forEachOrdered(attrInfo -> {
+                        connIdObjectClassTO.getAttributes().add(attrInfo.getName());
+                    });
+            return connIdObjectClassTO;
+        }).forEachOrdered((connIdObjectClassTO) -> {
             result.add(connIdObjectClassTO);
-        }
+        });
 
         return result;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
index cfefdd0..d9d29ba 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/DomainLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.DomainTO;
@@ -63,13 +61,7 @@ public class DomainLogic extends AbstractTransactionalLogic<DomainTO> {
 
     @PreAuthorize("isAuthenticated()")
     public List<DomainTO> list() {
-        return CollectionUtils.collect(domainDAO.findAll(), new Transformer<Domain, DomainTO>() {
-
-            @Override
-            public DomainTO transform(final Domain input) {
-                return binder.getDomainTO(input);
-            }
-        }, new ArrayList<DomainTO>());
+        return domainDAO.findAll().stream().map(domain -> binder.getDomainTO(domain)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.DOMAIN_CREATE + "') and authentication.details.domain == "

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/DynRealmLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/DynRealmLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/DynRealmLogic.java
index 0b17724..de9e78a 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/DynRealmLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/DynRealmLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.to.DynRealmTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -56,13 +54,8 @@ public class DynRealmLogic extends AbstractTransactionalLogic<DynRealmTO> {
     }
 
     public List<DynRealmTO> list() {
-        return CollectionUtils.collect(dynRealmDAO.findAll(), new Transformer<DynRealm, DynRealmTO>() {
-
-            @Override
-            public DynRealmTO transform(final DynRealm input) {
-                return binder.getDynRealmTO(input);
-            }
-        }, new ArrayList<DynRealmTO>());
+        return dynRealmDAO.findAll().stream().
+                map(dynRealm -> binder.getDynRealmTO(dynRealm)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.DYNREALM_CREATE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
index 898113d..efdab59 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/GroupLogic.java
@@ -19,17 +19,13 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 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.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -110,21 +106,17 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
 
     @Override
     protected boolean securityChecks(final Set<String> effectiveRealms, final String realm, final String key) {
-        boolean authorized = IterableUtils.matchesAny(effectiveRealms, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String ownedRealm) {
-                return realm.startsWith(ownedRealm) || ownedRealm.equals(RealmUtils.getGroupOwnerRealm(realm, key));
-            }
-        });
+        boolean authorized = effectiveRealms.stream().anyMatch(ownedRealm
+                -> realm.startsWith(ownedRealm) || ownedRealm.equals(RealmUtils.getGroupOwnerRealm(realm, key)));
         if (!authorized) {
-            authorized = !CollectionUtils.intersection(groupDAO.findDynRealms(key), effectiveRealms).isEmpty();
+            authorized = groupDAO.findDynRealms(key).stream().
+                    filter(dynRealm -> effectiveRealms.contains(dynRealm)).findFirst().isPresent();
         }
         if (!authorized) {
             throw new DelegatedAdministrationException(realm, AnyTypeKind.GROUP.name(), key);
         }
 
-        return IterableUtils.matchesAny(effectiveRealms, new RealmUtils.DynRealmsPredicate());
+        return effectiveRealms.stream().anyMatch(new RealmUtils.DynRealmsPredicate());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.GROUP_READ + "')")
@@ -137,16 +129,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
     @PreAuthorize("isAuthenticated() and not(hasRole('" + StandardEntitlement.ANONYMOUS + "'))")
     @Transactional(readOnly = true)
     public List<GroupTO> own() {
-        return CollectionUtils.collect(
-                userDAO.findAllGroups(userDAO.findByUsername(AuthContextUtils.getUsername())),
-                new Transformer<Group, GroupTO>() {
-
-            @Transactional(readOnly = true)
-            @Override
-            public GroupTO transform(final Group input) {
-                return binder.getGroupTO(input, true);
-            }
-        }, new ArrayList<GroupTO>());
+        return userDAO.findAllGroups(userDAO.findByUsername(AuthContextUtils.getUsername())).stream().
+                map(group -> binder.getGroupTO(group, true)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.GROUP_SEARCH + "')")
@@ -166,14 +150,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
                 RealmUtils.getEffective(SyncopeConstants.FULL_ADMIN_REALMS, realm),
                 searchCond == null ? groupDAO.getAllMatchingCond() : searchCond,
                 page, size, orderBy, AnyTypeKind.GROUP);
-        List<GroupTO> result = CollectionUtils.collect(matching, new Transformer<Group, GroupTO>() {
-
-            @Transactional(readOnly = true)
-            @Override
-            public GroupTO transform(final Group input) {
-                return binder.getGroupTO(input, details);
-            }
-        }, new ArrayList<GroupTO>());
+        List<GroupTO> result = matching.stream().
+                map(group -> binder.getGroupTO(group, details)).collect(Collectors.toList());
 
         return Pair.of(count, result);
     }
@@ -238,14 +216,8 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
         List<Group> ownedGroups = groupDAO.findOwnedByGroup(before.getLeft().getKey());
         if (!ownedGroups.isEmpty()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.GroupOwnership);
-            sce.getElements().addAll(CollectionUtils.collect(ownedGroups, new Transformer<Group, String>() {
-
-                @Transactional(readOnly = true)
-                @Override
-                public String transform(final Group group) {
-                    return group.getKey() + " " + group.getName();
-                }
-            }, new ArrayList<String>()));
+            sce.getElements().addAll(ownedGroups.stream().
+                    map(g -> g.getKey() + " " + g.getName()).collect(Collectors.toList()));
             throw sce;
         }
 
@@ -269,13 +241,9 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
 
         GroupPatch patch = new GroupPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().
+                map(resource -> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return binder.getGroupTO(provisioningManager.unlink(patch));
     }
@@ -292,13 +260,9 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
 
         GroupPatch patch = new GroupPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return binder.getGroupTO(provisioningManager.link(patch));
     }
@@ -317,13 +281,9 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
 
         GroupPatch patch = new GroupPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return update(patch, nullPriorityAsync);
     }
@@ -346,13 +306,9 @@ public class GroupLogic extends AbstractAnyLogic<GroupTO, GroupPatch> {
 
         GroupPatch patch = new GroupPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return update(patch, nullPriorityAsync);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
index 5429c24..9c8a8b3 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/LoggerLogic.java
@@ -24,13 +24,7 @@ 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.IterableUtils;
-import org.apache.commons.collections4.IteratorUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.PredicateUtils;
-import org.apache.commons.collections4.Transformer;
-import org.apache.commons.collections4.TransformerUtils;
+import java.util.stream.Collectors;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
@@ -60,7 +54,6 @@ import org.apache.syncope.core.persistence.api.dao.LoggerDAO;
 import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.TaskDAO;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.Logger;
 import org.apache.syncope.core.persistence.api.entity.task.SchedTask;
 import org.apache.syncope.core.spring.BeanUtils;
@@ -99,31 +92,21 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
     private EntityFactory entityFactory;
 
     private List<LoggerTO> list(final LoggerType type) {
-        return CollectionUtils.collect(loggerDAO.findAll(type), new Transformer<Logger, LoggerTO>() {
-
-            @Override
-            public LoggerTO transform(final Logger logger) {
-                LoggerTO loggerTO = new LoggerTO();
-                BeanUtils.copyProperties(logger, loggerTO);
-                return loggerTO;
-            }
-        }, new ArrayList<LoggerTO>());
+        return loggerDAO.findAll(type).stream().map(logger -> {
+            LoggerTO loggerTO = new LoggerTO();
+            BeanUtils.copyProperties(logger, loggerTO);
+            return loggerTO;
+        }).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.LOG_LIST + "') and authentication.details.domain == "
             + "T(org.apache.syncope.common.lib.SyncopeConstants).MASTER_DOMAIN")
     public List<LogAppender> memoryAppenders() {
-        return CollectionUtils.collect(
-                loggerLoader.getMemoryAppenders().keySet(),
-                new Transformer<String, LogAppender>() {
-
-            @Override
-            public LogAppender transform(final String input) {
-                LogAppender logAppender = new LogAppender();
-                logAppender.setName(input);
-                return logAppender;
-            }
-        }, new ArrayList<LogAppender>());
+        return loggerLoader.getMemoryAppenders().keySet().stream().map(appender -> {
+            LogAppender logAppender = new LogAppender();
+            logAppender.setName(appender);
+            return logAppender;
+        }).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.LOG_READ + "') and authentication.details.domain == "
@@ -134,10 +117,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
             throw new NotFoundException("Appender " + memoryAppender);
         }
 
-        return CollectionUtils.collect(
-                appender.getStatements(),
-                TransformerUtils.<LogStatementTO>nopTransformer(),
-                new ArrayList<LogStatementTO>());
+        return appender.getStatements().stream().collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.LOG_LIST + "') and authentication.details.domain == "
@@ -150,22 +130,18 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
     @PreAuthorize("hasRole('" + StandardEntitlement.AUDIT_LIST + "')")
     @Transactional(readOnly = true)
     public List<AuditLoggerName> listAudits() {
-        return CollectionUtils.collect(
-                IteratorUtils.filteredIterator(list(LoggerType.AUDIT).iterator(), PredicateUtils.notNullPredicate()),
-                new Transformer<LoggerTO, AuditLoggerName>() {
-
-            @Override
-            public AuditLoggerName transform(final LoggerTO logger) {
-                AuditLoggerName result = null;
-                try {
-                    result = AuditLoggerName.fromLoggerName(logger.getKey());
-                } catch (Exception e) {
-                    LOG.warn("Unexpected audit logger name: {}", logger.getKey(), e);
-                }
+        return list(LoggerType.AUDIT).stream().
+                filter(logger -> logger != null).
+                map(logger -> {
+                    AuditLoggerName result = null;
+                    try {
+                        result = AuditLoggerName.fromLoggerName(logger.getKey());
+                    } catch (Exception e) {
+                        LOG.warn("Unexpected audit logger name: {}", logger.getKey(), e);
+                    }
 
-                return result;
-            }
-        }, new ArrayList<AuditLoggerName>());
+                    return result;
+                }).collect(Collectors.toList());
     }
 
     private void throwInvalidLogger(final LoggerType type) {
@@ -235,14 +211,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
                 logConf = new LoggerConfig(auditLoggerName, null, false);
             }
             for (AuditAppender auditAppender : loggerLoader.auditAppenders(AuthContextUtils.getDomain())) {
-                if (IterableUtils.matchesAny(auditAppender.getEvents(), new Predicate<AuditLoggerName>() {
-
-                    @Override
-                    public boolean evaluate(final AuditLoggerName auditLoggerName) {
-                        return name.equalsIgnoreCase(auditLoggerName.toLoggerName());
-                    }
-                })) {
-
+                if (auditAppender.getEvents().stream().anyMatch(event -> name.equalsIgnoreCase(event.toLoggerName()))) {
                     loggerLoader.addAppenderToContext(ctx, auditAppender, logConf);
                 }
             }
@@ -380,7 +349,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
             events.add(new EventCategoryTO(EventCategoryType.PUSH));
 
             for (AnyTypeKind anyTypeKind : AnyTypeKind.values()) {
-                for (ExternalResource resource : resourceDAO.findAll()) {
+                resourceDAO.findAll().forEach(resource -> {
                     EventCategoryTO propEventCategoryTO = new EventCategoryTO(EventCategoryType.PROPAGATION);
                     EventCategoryTO syncEventCategoryTO = new EventCategoryTO(EventCategoryType.PULL);
                     EventCategoryTO pushEventCategoryTO = new EventCategoryTO(EventCategoryType.PUSH);
@@ -414,7 +383,7 @@ public class LoggerLogic extends AbstractTransactionalLogic<LoggerTO> {
                     events.add(propEventCategoryTO);
                     events.add(syncEventCategoryTO);
                     events.add(pushEventCategoryTO);
-                }
+                });
             }
 
             for (SchedTask task : taskDAO.<SchedTask>findAll(TaskType.SCHEDULED)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/MailTemplateLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/MailTemplateLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/MailTemplateLogic.java
index 7839e12..ff742c5 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/MailTemplateLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/MailTemplateLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -34,6 +32,7 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.DuplicateException;
 import org.apache.syncope.core.persistence.api.dao.MailTemplateDAO;
 import org.apache.syncope.core.persistence.api.dao.NotificationDAO;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.MailTemplate;
 import org.apache.syncope.core.persistence.api.entity.Notification;
@@ -73,13 +72,8 @@ public class MailTemplateLogic extends AbstractTransactionalLogic<MailTemplateTO
 
     @PreAuthorize("hasRole('" + StandardEntitlement.MAIL_TEMPLATE_LIST + "')")
     public List<MailTemplateTO> list() {
-        return CollectionUtils.collect(mailTemplateDAO.findAll(), new Transformer<MailTemplate, MailTemplateTO>() {
-
-            @Override
-            public MailTemplateTO transform(final MailTemplate input) {
-                return getMailTemplateTO(input.getKey());
-            }
-        }, new ArrayList<MailTemplateTO>());
+        return mailTemplateDAO.findAll().stream().
+                map(template -> getMailTemplateTO(template.getKey())).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.MAIL_TEMPLATE_CREATE + "')")
@@ -145,13 +139,7 @@ public class MailTemplateLogic extends AbstractTransactionalLogic<MailTemplateTO
         List<Notification> notifications = notificationDAO.findByTemplate(mailTemplate);
         if (!notifications.isEmpty()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InUseByNotifications);
-            sce.getElements().addAll(CollectionUtils.collect(notifications, new Transformer<Notification, String>() {
-
-                @Override
-                public String transform(final Notification notification) {
-                    return String.valueOf(notification.getKey());
-                }
-            }, new ArrayList<String>()));
+            sce.getElements().addAll(notifications.stream().map(Entity::getKey).collect(Collectors.toList()));
             throw sce;
         }
 
@@ -169,7 +157,7 @@ public class MailTemplateLogic extends AbstractTransactionalLogic<MailTemplateTO
         if (ArrayUtils.isNotEmpty(args)) {
             for (int i = 0; key == null && i < args.length; i++) {
                 if (args[i] instanceof String) {
-                    key = ((String) args[i]).toString();
+                    key = ((String) args[i]);
                 } else if (args[i] instanceof MailTemplateTO) {
                     key = ((MailTemplateTO) args[i]).getKey();
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/MemoryAppender.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/MemoryAppender.java b/core/logic/src/main/java/org/apache/syncope/core/logic/MemoryAppender.java
index 8183979..d78585b 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/MemoryAppender.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/MemoryAppender.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.logic;
 
 import java.util.Queue;
-import org.apache.commons.collections4.queue.CircularFifoQueue;
 import org.apache.logging.log4j.core.Appender;
 import org.apache.logging.log4j.core.Filter;
 import org.apache.logging.log4j.core.LogEvent;
@@ -30,6 +29,7 @@ import org.apache.logging.log4j.core.config.plugins.PluginElement;
 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
 import org.apache.logging.log4j.message.Message;
 import org.apache.logging.log4j.message.ReusableMessage;
+import org.apache.syncope.common.lib.collections.CircularFifoQueue;
 import org.apache.syncope.common.lib.log.LogStatementTO;
 import org.apache.syncope.common.lib.types.LoggerLevel;
 import org.apache.syncope.core.provisioning.api.utils.ExceptionUtils2;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
index 3b867b4..b594613 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/NotificationLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.common.lib.to.JobTO;
@@ -64,13 +62,8 @@ public class NotificationLogic extends AbstractJobLogic<NotificationTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.NOTIFICATION_LIST + "')")
     public List<NotificationTO> list() {
-        return CollectionUtils.collect(notificationDAO.findAll(), new Transformer<Notification, NotificationTO>() {
-
-            @Override
-            public NotificationTO transform(final Notification input) {
-                return binder.getNotificationTO(input);
-            }
-        }, new ArrayList<NotificationTO>());
+        return notificationDAO.findAll().stream().
+                map(notification -> binder.getNotificationTO(notification)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.NOTIFICATION_CREATE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
index 0cffd0c..4f5e053 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/PolicyLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
 import org.apache.syncope.common.lib.types.PolicyType;
@@ -78,13 +76,8 @@ public class PolicyLogic extends AbstractTransactionalLogic<AbstractPolicyTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_LIST + "')")
     public <T extends AbstractPolicyTO> List<T> list(final PolicyType type) {
-        return CollectionUtils.collect(policyDAO.find(getPolicyClass(type)), new Transformer<Policy, T>() {
-
-            @Override
-            public T transform(final Policy input) {
-                return binder.getPolicyTO(input);
-            }
-        }, new ArrayList<T>());
+        return policyDAO.find(getPolicyClass(type)).stream().
+                <T>map(policy -> binder.getPolicyTO(policy)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.POLICY_READ + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
index e82e495..03cfe0f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RealmLogic.java
@@ -19,12 +19,10 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -81,13 +79,8 @@ public class RealmLogic extends AbstractTransactionalLogic<RealmTO> {
         }
 
         final boolean admin = AuthContextUtils.getAuthorizations().keySet().contains(StandardEntitlement.REALM_LIST);
-        return CollectionUtils.collect(realmDAO.findDescendants(realm), new Transformer<Realm, RealmTO>() {
-
-            @Override
-            public RealmTO transform(final Realm input) {
-                return binder.getRealmTO(input, admin);
-            }
-        }, new ArrayList<RealmTO>());
+        return realmDAO.findDescendants(realm).stream().
+                map(descendant -> binder.getRealmTO(descendant, admin)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REALM_CREATE + "')")
@@ -100,9 +93,9 @@ public class RealmLogic extends AbstractTransactionalLogic<RealmTO> {
         Realm realm = realmDAO.save(binder.create(parentPath, realmTO));
 
         PropagationByResource propByRes = new PropagationByResource();
-        for (String resource : realm.getResourceKeys()) {
+        realm.getResourceKeys().forEach(resource -> {
             propByRes.add(ResourceOperation.CREATE, resource);
-        }
+        });
         List<PropagationTask> tasks = propagationManager.createTasks(realm, propByRes, null);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, false);
 
@@ -165,9 +158,9 @@ public class RealmLogic extends AbstractTransactionalLogic<RealmTO> {
         }
 
         PropagationByResource propByRes = new PropagationByResource();
-        for (String resource : realm.getResourceKeys()) {
+        realm.getResourceKeys().forEach(resource -> {
             propByRes.add(ResourceOperation.DELETE, resource);
-        }
+        });
         List<PropagationTask> tasks = propagationManager.createTasks(realm, propByRes, null);
         PropagationReporter propagationReporter = taskExecutor.execute(tasks, false);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
index 6d96e8b..30ac9a2 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RelationshipTypeLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.RelationshipTypeTO;
@@ -58,14 +56,8 @@ public class RelationshipTypeLogic extends AbstractTransactionalLogic<Relationsh
 
     @PreAuthorize("hasRole('" + StandardEntitlement.RELATIONSHIPTYPE_LIST + "')")
     public List<RelationshipTypeTO> list() {
-        return CollectionUtils.collect(relationshipTypeDAO.findAll(),
-                new Transformer<RelationshipType, RelationshipTypeTO>() {
-
-            @Override
-            public RelationshipTypeTO transform(final RelationshipType input) {
-                return binder.getRelationshipTypeTO(input);
-            }
-        }, new ArrayList<RelationshipTypeTO>());
+        return relationshipTypeDAO.findAll().stream().
+                map(relationshipType -> binder.getRelationshipTypeTO(relationshipType)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.RELATIONSHIPTYPE_CREATE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
index 5243277..854870f 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ReportLogic.java
@@ -22,11 +22,11 @@ import java.io.ByteArrayInputStream;
 import java.io.OutputStream;
 import java.lang.reflect.Method;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 import java.util.zip.ZipInputStream;
 import javax.xml.transform.stream.StreamSource;
 import org.apache.cocoon.pipeline.NonCachingPipeline;
@@ -34,8 +34,6 @@ import org.apache.cocoon.pipeline.Pipeline;
 import org.apache.cocoon.sax.SAXPipelineComponent;
 import org.apache.cocoon.sax.component.XMLGenerator;
 import org.apache.cocoon.sax.component.XMLSerializer;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.tuple.Triple;
@@ -137,13 +135,7 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REPORT_LIST + "')")
     public List<ReportTO> list() {
-        return CollectionUtils.collect(reportDAO.findAll(), new Transformer<Report, ReportTO>() {
-
-            @Override
-            public ReportTO transform(final Report input) {
-                return binder.getReportTO(input);
-            }
-        }, new ArrayList<ReportTO>());
+        return reportDAO.findAll().stream().map(report -> binder.getReportTO(report)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REPORT_READ + "')")
@@ -314,26 +306,15 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
             throw new NotFoundException("Report " + key);
         }
 
-        return CollectionUtils.collect(reportExecDAO.findAll(report, page, size, orderByClauses),
-                new Transformer<ReportExec, ExecTO>() {
-
-            @Override
-            public ExecTO transform(final ReportExec reportExec) {
-                return binder.getExecTO(reportExec);
-            }
-        }, new ArrayList<ExecTO>());
+        return reportExecDAO.findAll(report, page, size, orderByClauses).stream().
+                map(reportExec -> binder.getExecTO(reportExec)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REPORT_LIST + "')")
     @Override
     public List<ExecTO> listRecentExecutions(final int max) {
-        return CollectionUtils.collect(reportExecDAO.findRecent(max), new Transformer<ReportExec, ExecTO>() {
-
-            @Override
-            public ExecTO transform(final ReportExec reportExec) {
-                return binder.getExecTO(reportExec);
-            }
-        }, new ArrayList<ExecTO>());
+        return reportExecDAO.findRecent(max).stream().
+                map(reportExec -> binder.getExecTO(reportExec)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REPORT_DELETE + "')")
@@ -362,7 +343,7 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
 
         BulkActionResult result = new BulkActionResult();
 
-        for (ReportExec exec : reportExecDAO.findAll(report, startedBefore, startedAfter, endedBefore, endedAfter)) {
+        reportExecDAO.findAll(report, startedBefore, startedAfter, endedBefore, endedAfter).forEach(exec -> {
             try {
                 reportExecDAO.delete(exec);
                 result.getResults().put(String.valueOf(exec.getKey()), BulkActionResult.Status.SUCCESS);
@@ -370,7 +351,7 @@ public class ReportLogic extends AbstractExecutableLogic<ReportTO> {
                 LOG.error("Error deleting execution {} of report {}", exec.getKey(), key, e);
                 result.getResults().put(String.valueOf(exec.getKey()), BulkActionResult.Status.FAILURE);
             }
-        }
+        });
 
         return result;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportTemplateLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportTemplateLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ReportTemplateLogic.java
index f44427f..4d150d9 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ReportTemplateLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ReportTemplateLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -34,6 +32,7 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException;
 import org.apache.syncope.core.persistence.api.dao.DuplicateException;
 import org.apache.syncope.core.persistence.api.dao.ReportTemplateDAO;
 import org.apache.syncope.core.persistence.api.dao.ReportDAO;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.ReportTemplate;
 import org.apache.syncope.core.persistence.api.entity.Report;
@@ -73,14 +72,8 @@ public class ReportTemplateLogic extends AbstractTransactionalLogic<ReportTempla
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REPORT_TEMPLATE_LIST + "')")
     public List<ReportTemplateTO> list() {
-        return CollectionUtils.collect(
-                reportTemplateDAO.findAll(), new Transformer<ReportTemplate, ReportTemplateTO>() {
-
-            @Override
-            public ReportTemplateTO transform(final ReportTemplate input) {
-                return getReportTemplateTO(input.getKey());
-            }
-        }, new ArrayList<ReportTemplateTO>());
+        return reportTemplateDAO.findAll().stream().
+                map(template -> getReportTemplateTO(template.getKey())).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.REPORT_TEMPLATE_CREATE + "')")
@@ -158,13 +151,7 @@ public class ReportTemplateLogic extends AbstractTransactionalLogic<ReportTempla
         List<Report> reports = reportDAO.findByTemplate(reportTemplate);
         if (!reports.isEmpty()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InUseByNotifications);
-            sce.getElements().addAll(CollectionUtils.collect(reports, new Transformer<Report, String>() {
-
-                @Override
-                public String transform(final Report report) {
-                    return String.valueOf(report.getKey());
-                }
-            }, new ArrayList<String>()));
+            sce.getElements().addAll(reports.stream().map(Entity::getKey).collect(Collectors.toList()));
             throw sce;
         }
 
@@ -182,7 +169,7 @@ public class ReportTemplateLogic extends AbstractTransactionalLogic<ReportTempla
         if (ArrayUtils.isNotEmpty(args)) {
             for (int i = 0; key == null && i < args.length; i++) {
                 if (args[i] instanceof String) {
-                    key = ((String) args[i]).toString();
+                    key = ((String) args[i]);
                 } else if (args[i] instanceof ReportTemplateTO) {
                     key = ((ReportTemplateTO) args[i]).getKey();
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java
index fc95f81..d027e97 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceHistoryLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.to.ResourceHistoryConfTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.core.persistence.api.dao.ExternalResourceDAO;
@@ -64,14 +62,8 @@ public class ResourceHistoryLogic extends AbstractTransactionalLogic<ResourceHis
             throw new NotFoundException("Resource '" + key + "'");
         }
 
-        return CollectionUtils.collect(resourceHistoryConfDAO.findByEntity(resource),
-                new Transformer<ExternalResourceHistoryConf, ResourceHistoryConfTO>() {
-
-            @Override
-            public ResourceHistoryConfTO transform(final ExternalResourceHistoryConf input) {
-                return getResourceHistoryConfTO(input);
-            }
-        }, new ArrayList<ResourceHistoryConfTO>());
+        return resourceHistoryConfDAO.findByEntity(resource).stream().
+                map(historyConf -> getResourceHistoryConfTO(historyConf)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.RESOURCE_HISTORY_RESTORE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
index 3f2ff75..eccbd6d 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ResourceLogic.java
@@ -23,18 +23,16 @@ import java.util.ArrayList;
 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.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.IteratorUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.ImmutableTriple;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
+import org.apache.syncope.common.lib.collections.IteratorChain;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
@@ -61,7 +59,6 @@ import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.provisioning.api.MappingManager;
 import org.apache.syncope.core.provisioning.api.utils.RealmUtils;
@@ -120,13 +117,8 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
     private ConnectorFactory connFactory;
 
     protected void securityChecks(final Set<String> effectiveRealms, final String realm, final String key) {
-        boolean authorized = IterableUtils.matchesAny(effectiveRealms, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String ownedRealm) {
-                return realm.startsWith(ownedRealm);
-            }
-        });
+        effectiveRealms.stream().anyMatch(ownedRealm -> realm.startsWith(ownedRealm));
+        boolean authorized = effectiveRealms.stream().anyMatch(ownedRealm -> realm.startsWith(ownedRealm));
         if (!authorized) {
             throw new DelegatedAdministrationException(realm, ExternalResource.class.getSimpleName(), key);
         }
@@ -201,12 +193,12 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
             if (anyType == null) {
                 throw new NotFoundException("AnyType '" + anyTypeKey + "'");
             }
-            Provision provision = resource.getProvision(anyType);
-            if (provision == null) {
+            Optional<? extends Provision> provision = resource.getProvision(anyType);
+            if (!provision.isPresent()) {
                 throw new NotFoundException("Provision for AnyType '" + anyTypeKey + "' in Resource '" + key + "'");
             }
 
-            provision.setSyncToken(connector.getLatestSyncToken(provision.getObjectClass()));
+            provision.get().setSyncToken(connector.getLatestSyncToken(provision.get().getObjectClass()));
         }
 
         Set<String> effectiveRealms = RealmUtils.getEffective(
@@ -234,12 +226,12 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
             if (anyType == null) {
                 throw new NotFoundException("AnyType '" + anyTypeKey + "'");
             }
-            Provision provision = resource.getProvision(anyType);
-            if (provision == null) {
+            Optional<? extends Provision> provision = resource.getProvision(anyType);
+            if (!provision.isPresent()) {
                 throw new NotFoundException("Provision for AnyType '" + anyTypeKey + "' in Resource '" + key + "'");
             }
 
-            provision.setSyncToken(null);
+            provision.get().setSyncToken(null);
         }
 
         Set<String> effectiveRealms = RealmUtils.getEffective(
@@ -283,13 +275,8 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
     @PreAuthorize("hasRole('" + StandardEntitlement.RESOURCE_LIST + "')")
     @Transactional(readOnly = true)
     public List<ResourceTO> list() {
-        return CollectionUtils.collect(resourceDAO.findAll(), new Transformer<ExternalResource, ResourceTO>() {
-
-            @Override
-            public ResourceTO transform(final ExternalResource input) {
-                return binder.getResourceTO(input);
-            }
-        }, new ArrayList<ResourceTO>());
+        return resourceDAO.findAll().stream().
+                map(resource -> binder.getResourceTO(resource)).collect(Collectors.toList());
     }
 
     private Triple<ExternalResource, AnyType, Provision> connObjectInit(
@@ -303,12 +290,12 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
         if (anyType == null) {
             throw new NotFoundException("AnyType '" + anyTypeKey + "'");
         }
-        Provision provision = resource.getProvision(anyType);
-        if (provision == null) {
+        Optional<? extends Provision> provision = resource.getProvision(anyType);
+        if (!provision.isPresent()) {
             throw new NotFoundException("Provision on resource '" + resourceKey + "' for type '" + anyTypeKey + "'");
         }
 
-        return ImmutableTriple.of(resource, anyType, provision);
+        return ImmutableTriple.of(resource, anyType, provision.get());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.RESOURCE_GET_CONNOBJECT + "')")
@@ -327,19 +314,19 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
         }
 
         // 2. build connObjectKeyItem
-        MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(init.getRight());
-        if (connObjectKeyItem == null) {
+        Optional<MappingItem> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(init.getRight());
+        if (!connObjectKeyItem.isPresent()) {
             throw new NotFoundException(
                     "ConnObjectKey mapping for " + init.getMiddle() + " " + anyKey + " on resource '" + key + "'");
         }
-        String connObjectKeyValue = mappingManager.getConnObjectKeyValue(any, init.getRight());
+        Optional<String> connObjectKeyValue = mappingManager.getConnObjectKeyValue(any, init.getRight());
 
         // 3. determine attributes to query
         Set<MappingItem> linkinMappingItems = new HashSet<>();
-        for (VirSchema virSchema : virSchemaDAO.findByProvision(init.getRight())) {
+        virSchemaDAO.findByProvision(init.getRight()).forEach(virSchema -> {
             linkinMappingItems.add(virSchema.asLinkingMappingItem());
-        }
-        Iterator<MappingItem> mapItems = IteratorUtils.chainedIterator(
+        });
+        Iterator<MappingItem> mapItems = new IteratorChain<>(
                 init.getRight().getMapping().getItems().iterator(),
                 linkinMappingItems.iterator());
 
@@ -347,11 +334,11 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
         Connector connector = connFactory.getConnector(init.getLeft());
         ConnectorObject connectorObject = connector.getObject(
                 init.getRight().getObjectClass(),
-                AttributeBuilder.build(connObjectKeyItem.getExtAttrName(), connObjectKeyValue),
+                AttributeBuilder.build(connObjectKeyItem.get().getExtAttrName(), connObjectKeyValue.get()),
                 MappingUtils.buildOperationOptions(mapItems));
         if (connectorObject == null) {
             throw new NotFoundException(
-                    "Object " + connObjectKeyValue + " with class " + init.getRight().getObjectClass()
+                    "Object " + connObjectKeyValue.get() + " with class " + init.getRight().getObjectClass()
                     + " not found on resource " + key);
         }
 
@@ -394,10 +381,10 @@ public class ResourceLogic extends AbstractTransactionalLogic<ResourceTO> {
             init.getRight().getMapping().getItems();
 
             Set<MappingItem> linkinMappingItems = new HashSet<>();
-            for (VirSchema virSchema : virSchemaDAO.findByProvision(init.getRight())) {
+            virSchemaDAO.findByProvision(init.getRight()).forEach(virSchema -> {
                 linkinMappingItems.add(virSchema.asLinkingMappingItem());
-            }
-            Iterator<MappingItem> mapItems = IteratorUtils.chainedIterator(
+            });
+            Iterator<MappingItem> mapItems = new IteratorChain<>(
                     init.getRight().getMapping().getItems().iterator(),
                     linkinMappingItems.iterator());
             options = MappingUtils.buildOperationOptions(mapItems);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
index c5b3b9a..e8b9f8a 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.RoleTO;
@@ -61,13 +59,7 @@ public class RoleLogic extends AbstractTransactionalLogic<RoleTO> {
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_LIST + "')")
     @Transactional(readOnly = true)
     public List<RoleTO> list() {
-        return CollectionUtils.collect(roleDAO.findAll(), new Transformer<Role, RoleTO>() {
-
-            @Override
-            public RoleTO transform(final Role input) {
-                return binder.getRoleTO(input);
-            }
-        }, new ArrayList<RoleTO>());
+        return roleDAO.findAll().stream().map(role -> binder.getRoleTO(role)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_CREATE + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
index 97da0f6..dba439b 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SchemaLogic.java
@@ -21,8 +21,8 @@ package org.apache.syncope.core.logic;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -145,7 +145,7 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> {
     }
 
     @PreAuthorize("isAuthenticated()")
-    @SuppressWarnings("unchecked")
+    @SuppressWarnings({ "unchecked", "Convert2Lambda" })
     public <T extends AbstractSchemaTO> List<T> list(
             final SchemaType schemaType, final List<String> anyTypeClasses) {
 
@@ -153,53 +153,50 @@ public class SchemaLogic extends AbstractTransactionalLogic<AbstractSchemaTO> {
         if (anyTypeClasses != null) {
             anyTypeClasses.remove(AnyTypeKind.USER.name());
             anyTypeClasses.remove(AnyTypeKind.GROUP.name());
-            for (String anyTypeClass : anyTypeClasses) {
+            anyTypeClasses.forEach(anyTypeClass -> {
                 AnyTypeClass clazz = anyTypeClassDAO.find(anyTypeClass);
                 if (clazz == null) {
                     LOG.warn("Ignoring invalid {}: {}", AnyTypeClass.class.getSimpleName(), anyTypeClass);
                 } else {
                     classes.add(clazz);
                 }
-            }
+            });
         }
 
         List<T> result;
         switch (schemaType) {
             case VIRTUAL:
-                result = CollectionUtils.collect(
-                        classes.isEmpty() ? virSchemaDAO.findAll() : virSchemaDAO.findByAnyTypeClasses(classes),
-                        new Transformer<VirSchema, T>() {
-
-                    @Override
-                    public T transform(final VirSchema input) {
-                        return (T) binder.getVirSchemaTO(input);
-                    }
-                }, new ArrayList<T>());
+                result = (classes.isEmpty() ? virSchemaDAO.findAll() : virSchemaDAO.findByAnyTypeClasses(classes)).
+                        stream().map(new Function<VirSchema, T>() {
+
+                            @Override
+                            public T apply(final VirSchema schema) {
+                                return (T) binder.getVirSchemaTO(schema);
+                            }
+                        }).collect(Collectors.toList());
                 break;
 
             case DERIVED:
-                result = CollectionUtils.collect(
-                        classes.isEmpty() ? derSchemaDAO.findAll() : derSchemaDAO.findByAnyTypeClasses(classes),
-                        new Transformer<DerSchema, T>() {
-
-                    @Override
-                    public T transform(final DerSchema input) {
-                        return (T) binder.getDerSchemaTO(input);
-                    }
-                }, new ArrayList<T>());
+                result = (classes.isEmpty() ? derSchemaDAO.findAll() : derSchemaDAO.findByAnyTypeClasses(classes)).
+                        stream().map(new Function<DerSchema, T>() {
+
+                            @Override
+                            public T apply(final DerSchema schema) {
+                                return (T) binder.getDerSchemaTO(schema);
+                            }
+                        }).collect(Collectors.toList());
                 break;
 
             case PLAIN:
             default:
-                result = CollectionUtils.collect(
-                        classes.isEmpty() ? plainSchemaDAO.findAll() : plainSchemaDAO.findByAnyTypeClasses(classes),
-                        new Transformer<PlainSchema, T>() {
-
-                    @Override
-                    public T transform(final PlainSchema input) {
-                        return (T) binder.getPlainSchemaTO(input);
-                    }
-                }, new ArrayList<T>());
+                result = (classes.isEmpty() ? plainSchemaDAO.findAll() : plainSchemaDAO.findByAnyTypeClasses(classes)).
+                        stream().map(new Function<PlainSchema, T>() {
+
+                            @Override
+                            public T apply(final PlainSchema schema) {
+                                return (T) binder.getPlainSchemaTO(schema);
+                            }
+                        }).collect(Collectors.toList());
         }
 
         return result;


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index d2d7314..c9b177e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -23,27 +23,22 @@ import java.util.Collections;
 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.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+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;
 import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.patch.AttrPatch;
-import org.apache.syncope.common.lib.patch.MembershipPatch;
-import org.apache.syncope.common.lib.patch.RelationshipPatch;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
-import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
-import org.apache.syncope.common.lib.to.RelationshipTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
 import org.apache.syncope.common.lib.types.ResourceOperation;
 import org.apache.syncope.core.spring.BeanUtils;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
@@ -103,41 +98,27 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
             anyObjectTO.getDynRealms().addAll(userDAO.findDynRealms(anyObject.getKey()));
 
             // relationships
-            CollectionUtils.collect(anyObject.getRelationships(), new Transformer<ARelationship, RelationshipTO>() {
-
-                @Override
-                public RelationshipTO transform(final ARelationship relationship) {
-                    return AnyObjectDataBinderImpl.this.getRelationshipTO(relationship);
-                }
-
-            }, anyObjectTO.getRelationships());
+            anyObjectTO.getRelationships().addAll(
+                    anyObject.getRelationships().stream().map(relationship -> getRelationshipTO(relationship)).
+                            collect(Collectors.toList()));
 
             // memberships
-            CollectionUtils.collect(anyObject.getMemberships(), new Transformer<AMembership, MembershipTO>() {
-
-                @Override
-                public MembershipTO transform(final AMembership membership) {
-                    return getMembershipTO(
-                            anyObject.getPlainAttrs(membership),
-                            derAttrHandler.getValues(anyObject, membership),
-                            virAttrHandler.getValues(anyObject, membership),
-                            membership);
-                }
-            }, anyObjectTO.getMemberships());
+            anyObjectTO.getMemberships().addAll(
+                    anyObject.getMemberships().stream().map(membership -> {
+                        return getMembershipTO(
+                                anyObject.getPlainAttrs(membership),
+                                derAttrHandler.getValues(anyObject, membership),
+                                virAttrHandler.getValues(anyObject, membership),
+                                membership);
+                    }).collect(Collectors.toList()));
 
             // dynamic memberships
-            CollectionUtils.collect(anyObjectDAO.findDynGroups(anyObject.getKey()),
-                    new Transformer<Group, MembershipTO>() {
-
-                @Override
-                public MembershipTO transform(final Group group) {
-                    MembershipTO membershipTO = new MembershipTO.Builder().
-                            group(group.getKey(), group.getName()).
-                            build();
-                    return membershipTO;
-
-                }
-            }, anyObjectTO.getDynMemberships());
+            anyObjectTO.getDynMemberships().addAll(
+                    anyObjectDAO.findDynGroups(anyObject.getKey()).stream().map(group -> {
+                        return new MembershipTO.Builder().
+                                group(group.getKey(), group.getName()).
+                                build();
+                    }).collect(Collectors.toList()));
         }
 
         return anyObjectTO;
@@ -177,11 +158,11 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
         AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.ANY_OBJECT);
         if (anyObject.getRealm() != null) {
             // relationships
-            Collection<String> assignableAnyObjects = CollectionUtils.collect(
-                    searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT),
-                    EntityUtils.keyTransformer());
+            Collection<String> assignableAnyObjects =
+                    searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT).stream().
+                            map(a -> a.getKey()).collect(Collectors.toList());
 
-            for (RelationshipTO relationshipTO : anyObjectTO.getRelationships()) {
+            anyObjectTO.getRelationships().forEach(relationshipTO -> {
                 if (StringUtils.isBlank(relationshipTO.getRightType())
                         || AnyTypeKind.USER.name().equals(relationshipTO.getRightType())
                         || AnyTypeKind.GROUP.name().equals(relationshipTO.getRightType())) {
@@ -216,14 +197,14 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                         scce.addException(unassignabled);
                     }
                 }
-            }
+            });
 
             // memberships
-            Collection<String> assignableGroups = CollectionUtils.collect(
-                    searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.GROUP),
-                    EntityUtils.keyTransformer());
+            Collection<String> assignableGroups =
+                    searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.GROUP).stream().
+                            map(g -> g.getKey()).collect(Collectors.toList());
 
-            for (MembershipTO membershipTO : anyObjectTO.getMemberships()) {
+            anyObjectTO.getMemberships().forEach(membershipTO -> {
                 Group group = membershipTO.getRightKey() == null
                         ? groupDAO.findByName(membershipTO.getGroupName())
                         : groupDAO.find(membershipTO.getRightKey());
@@ -247,7 +228,7 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                     unassignable.getElements().add("Cannot be assigned: " + group);
                     scce.addException(unassignable);
                 }
-            }
+            });
         }
 
         // attributes and resources
@@ -291,136 +272,134 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
         Set<String> toBeProvisioned = new HashSet<>();
 
         // relationships
-        Collection<String> assignableAnyObjects = CollectionUtils.collect(
-                searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT),
-                EntityUtils.keyTransformer());
-
-        for (RelationshipPatch patch : anyObjectPatch.getRelationships()) {
-            if (patch.getRelationshipTO() != null) {
-                RelationshipType relationshipType = relationshipTypeDAO.find(patch.getRelationshipTO().getType());
-                if (relationshipType == null) {
-                    LOG.debug("Ignoring invalid relationship type {}", patch.getRelationshipTO().getType());
-                } else {
-                    ARelationship relationship =
-                            anyObject.getRelationship(relationshipType, patch.getRelationshipTO().getRightKey());
-                    if (relationship != null) {
-                        anyObject.getRelationships().remove(relationship);
-                        relationship.setLeftEnd(null);
-
-                        toBeDeprovisioned.addAll(
-                                anyObjectDAO.findAllResourceKeys(relationship.getRightEnd().getKey()));
-                    }
+        Collection<String> assignableAnyObjects =
+                searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT).stream().
+                        map(a -> a.getKey()).collect(Collectors.toList());
+
+        anyObjectPatch.getRelationships().stream().
+                filter(patch -> patch.getRelationshipTO() != null).forEachOrdered((patch) -> {
+            RelationshipType relationshipType = relationshipTypeDAO.find(patch.getRelationshipTO().getType());
+            if (relationshipType == null) {
+                LOG.debug("Ignoring invalid relationship type {}", patch.getRelationshipTO().getType());
+            } else {
+                Optional<? extends ARelationship> relationship =
+                        anyObject.getRelationship(relationshipType, patch.getRelationshipTO().getRightKey());
+                if (relationship.isPresent()) {
+                    anyObject.getRelationships().remove(relationship.get());
+                    relationship.get().setLeftEnd(null);
+
+                    toBeDeprovisioned.addAll(
+                            anyObjectDAO.findAllResourceKeys(relationship.get().getRightEnd().getKey()));
+                }
 
-                    if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
-                        if (StringUtils.isBlank(patch.getRelationshipTO().getRightType())
-                                || AnyTypeKind.USER.name().equals(patch.getRelationshipTO().getRightType())
-                                || AnyTypeKind.GROUP.name().equals(patch.getRelationshipTO().getRightType())) {
+                if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
+                    if (StringUtils.isBlank(patch.getRelationshipTO().getRightType())
+                            || AnyTypeKind.USER.name().equals(patch.getRelationshipTO().getRightType())
+                            || AnyTypeKind.GROUP.name().equals(patch.getRelationshipTO().getRightType())) {
 
-                            SyncopeClientException invalidAnyType =
-                                    SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
-                            invalidAnyType.getElements().add(AnyType.class.getSimpleName()
-                                    + " not allowed for relationship: " + patch.getRelationshipTO().getRightType());
-                            scce.addException(invalidAnyType);
+                        SyncopeClientException invalidAnyType =
+                                SyncopeClientException.build(ClientExceptionType.InvalidAnyType);
+                        invalidAnyType.getElements().add(AnyType.class.getSimpleName()
+                                + " not allowed for relationship: " + patch.getRelationshipTO().getRightType());
+                        scce.addException(invalidAnyType);
+                    } else {
+                        AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
+                        if (otherEnd == null) {
+                            LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
+                        } else if (assignableAnyObjects.contains(otherEnd.getKey())) {
+                            ARelationship newRelationship = entityFactory.newEntity(ARelationship.class);
+                            newRelationship.setType(relationshipType);
+                            newRelationship.setRightEnd(otherEnd);
+                            newRelationship.setLeftEnd(anyObject);
+
+                            anyObject.add(newRelationship);
+
+                            toBeProvisioned.addAll(anyObjectDAO.findAllResourceKeys(otherEnd.getKey()));
                         } else {
-                            AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
-                            if (otherEnd == null) {
-                                LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
-                            } else if (assignableAnyObjects.contains(otherEnd.getKey())) {
-                                relationship = entityFactory.newEntity(ARelationship.class);
-                                relationship.setType(relationshipType);
-                                relationship.setRightEnd(otherEnd);
-                                relationship.setLeftEnd(anyObject);
-
-                                anyObject.add(relationship);
-
-                                toBeProvisioned.addAll(anyObjectDAO.findAllResourceKeys(otherEnd.getKey()));
-                            } else {
-                                LOG.error("{} cannot be assigned to {}", otherEnd, anyObject);
-
-                                SyncopeClientException unassignable =
-                                        SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
-                                unassignable.getElements().add("Cannot be assigned: " + otherEnd);
-                                scce.addException(unassignable);
-                            }
+                            LOG.error("{} cannot be assigned to {}", otherEnd, anyObject);
+
+                            SyncopeClientException unassignable =
+                                    SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
+                            unassignable.getElements().add("Cannot be assigned: " + otherEnd);
+                            scce.addException(unassignable);
                         }
                     }
                 }
             }
-        }
+        });
 
         Collection<ExternalResource> resources = anyObjectDAO.findAllResources(anyObject);
         SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
         // memberships
-        Collection<String> assignableGroups = CollectionUtils.collect(
-                searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.GROUP),
-                EntityUtils.keyTransformer());
-
-        for (MembershipPatch membPatch : anyObjectPatch.getMemberships()) {
-            if (membPatch.getGroup() != null) {
-                AMembership membership = anyObject.getMembership(membPatch.getGroup());
-                if (membership != null) {
-                    anyObject.getMemberships().remove(membership);
-                    membership.setLeftEnd(null);
-                    for (APlainAttr attr : anyObject.getPlainAttrs(membership)) {
-                        anyObject.remove(attr);
-                        attr.setOwner(null);
-                    }
+        Collection<String> assignableGroups =
+                searchDAO.searchAssignable(anyObject.getRealm().getFullPath(), AnyTypeKind.GROUP).stream().
+                        map(g -> g.getKey()).collect(Collectors.toList());
+
+        anyObjectPatch.getMemberships().stream().
+                filter((membPatch) -> (membPatch.getGroup() != null)).forEachOrdered(membPatch -> {
+            Optional<? extends AMembership> membership = anyObject.getMembership(membPatch.getGroup());
+            if (membership.isPresent()) {
+                anyObject.getMemberships().remove(membership.get());
+                membership.get().setLeftEnd(null);
+                anyObject.getPlainAttrs(membership.get()).forEach(attr -> {
+                    anyObject.remove(attr);
+                    attr.setOwner(null);
+                });
+
+                toBeDeprovisioned.addAll(groupDAO.findAllResourceKeys(membership.get().getRightEnd().getKey()));
+            }
+            if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
+                Group group = groupDAO.find(membPatch.getGroup());
+                if (group == null) {
+                    LOG.debug("Ignoring invalid group {}", membPatch.getGroup());
+                } else if (assignableGroups.contains(group.getKey())) {
+                    AMembership newMembership = entityFactory.newEntity(AMembership.class);
+                    newMembership.setRightEnd(group);
+                    newMembership.setLeftEnd(anyObject);
 
-                    toBeDeprovisioned.addAll(groupDAO.findAllResourceKeys(membership.getRightEnd().getKey()));
-                }
+                    anyObject.add(newMembership);
 
-                if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    Group group = groupDAO.find(membPatch.getGroup());
-                    if (group == null) {
-                        LOG.debug("Ignoring invalid group {}", membPatch.getGroup());
-                    } else if (assignableGroups.contains(group.getKey())) {
-                        membership = entityFactory.newEntity(AMembership.class);
-                        membership.setRightEnd(group);
-                        membership.setLeftEnd(anyObject);
-
-                        anyObject.add(membership);
-
-                        for (AttrTO attrTO : membPatch.getPlainAttrs()) {
-                            PlainSchema schema = getPlainSchema(attrTO.getSchema());
-                            if (schema == null) {
-                                LOG.debug("Invalid " + PlainSchema.class.getSimpleName()
-                                        + "{}, ignoring...", attrTO.getSchema());
-                            } else {
-                                APlainAttr attr = anyObject.getPlainAttr(schema.getKey(), membership);
-                                if (attr == null) {
-                                    LOG.debug("No plain attribute found for {} and membership of {}",
-                                            schema, membership.getRightEnd());
-
-                                    attr = anyUtils.newPlainAttr();
-                                    attr.setOwner(anyObject);
-                                    attr.setMembership(membership);
-                                    attr.setSchema(schema);
-                                    anyObject.add(attr);
-
-                                    AttrPatch patch = new AttrPatch.Builder().attrTO(attrTO).build();
-                                    processAttrPatch(
-                                            anyObject, patch, schema, attr, anyUtils,
-                                            resources, propByRes, invalidValues);
-                                }
+                    membPatch.getPlainAttrs().forEach(attrTO -> {
+                        PlainSchema schema = getPlainSchema(attrTO.getSchema());
+                        if (schema == null) {
+                            LOG.debug("Invalid " + PlainSchema.class.getSimpleName()
+                                    + "{}, ignoring...", attrTO.getSchema());
+                        } else {
+                            Optional<? extends APlainAttr> attr =
+                                    anyObject.getPlainAttr(schema.getKey(), newMembership);
+                            if (!attr.isPresent()) {
+                                LOG.debug("No plain attribute found for {} and membership of {}",
+                                        schema, newMembership.getRightEnd());
+
+                                APlainAttr newAttr = anyUtils.newPlainAttr();
+                                newAttr.setOwner(anyObject);
+                                newAttr.setMembership(newMembership);
+                                newAttr.setSchema(schema);
+                                anyObject.add(newAttr);
+
+                                AttrPatch patch = new AttrPatch.Builder().attrTO(attrTO).build();
+                                processAttrPatch(
+                                        anyObject, patch, schema, newAttr, anyUtils,
+                                        resources, propByRes, invalidValues);
                             }
                         }
-                        if (!invalidValues.isEmpty()) {
-                            scce.addException(invalidValues);
-                        }
+                    });
+                    if (!invalidValues.isEmpty()) {
+                        scce.addException(invalidValues);
+                    }
 
-                        toBeProvisioned.addAll(groupDAO.findAllResourceKeys(group.getKey()));
-                    } else {
-                        LOG.error("{} cannot be assigned to {}", group, anyObject);
+                    toBeProvisioned.addAll(groupDAO.findAllResourceKeys(group.getKey()));
+                } else {
+                    LOG.error("{} cannot be assigned to {}", group, anyObject);
 
-                        SyncopeClientException unassignabled =
-                                SyncopeClientException.build(ClientExceptionType.InvalidMembership);
-                        unassignabled.getElements().add("Cannot be assigned: " + group);
-                        scce.addException(unassignabled);
-                    }
+                    SyncopeClientException unassignabled =
+                            SyncopeClientException.build(ClientExceptionType.InvalidMembership);
+                    unassignabled.getElements().add("Cannot be assigned: " + group);
+                    scce.addException(unassignabled);
                 }
             }
-        }
+        });
 
         propByRes.addAll(ResourceOperation.DELETE, toBeDeprovisioned);
         propByRes.addAll(ResourceOperation.UPDATE, toBeProvisioned);
@@ -436,14 +415,14 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
 
         // check if some connObjectKey was changed by the update above
         Map<String, String> newcCnnObjectKeys = getConnObjectKeys(anyObject);
-        for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
-            if (newcCnnObjectKeys.containsKey(entry.getKey())
-                    && !entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))) {
-
-                propByRes.addOldConnObjectKey(entry.getKey(), entry.getValue());
-                propByRes.add(ResourceOperation.UPDATE, entry.getKey());
-            }
-        }
+        oldConnObjectKeys.entrySet().stream().
+                filter(entry -> newcCnnObjectKeys.containsKey(entry.getKey())
+                && !entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))).
+                forEach(entry -> {
+
+                    propByRes.addOldConnObjectKey(entry.getKey(), entry.getValue());
+                    propByRes.add(ResourceOperation.UPDATE, entry.getKey());
+                });
 
         anyObjectDAO.save(anyObject);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
index 84d9bd9..45b5089 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyTypeDataBinderImpl.java
@@ -21,9 +21,8 @@ package org.apache.syncope.core.provisioning.java.data;
 import com.fasterxml.jackson.core.type.TypeReference;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
@@ -85,9 +84,9 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
                         new TypeReference<Set<SyncopeGrantedAuthority>>() {
                 }));
 
-                for (String entitlement : added) {
+                added.forEach(entitlement -> {
                     authorities.add(new SyncopeGrantedAuthority(entitlement, SyncopeConstants.ROOT_REALM));
-                }
+                });
 
                 accessToken.setAuthorities(ENCRYPTOR.encode(
                         POJOHelper.serialize(authorities), CipherAlgorithm.AES).
@@ -117,14 +116,14 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
         }
 
         anyType.getClasses().clear();
-        for (String anyTypeClassName : anyTypeTO.getClasses()) {
+        anyTypeTO.getClasses().forEach(anyTypeClassName -> {
             AnyTypeClass anyTypeClass = anyTypeClassDAO.find(anyTypeClassName);
             if (anyTypeClass == null) {
                 LOG.debug("Invalid " + AnyTypeClass.class.getSimpleName() + "{}, ignoring...", anyTypeClassName);
             } else {
                 anyType.add(anyTypeClass);
             }
-        }
+        });
     }
 
     @Override
@@ -143,13 +142,8 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
                         new TypeReference<Set<SyncopeGrantedAuthority>>() {
                 }));
 
-                CollectionUtils.filterInverse(authorities, new Predicate<SyncopeGrantedAuthority>() {
-
-                    @Override
-                    public boolean evaluate(final SyncopeGrantedAuthority authority) {
-                        return removed.contains(authority.getAuthority());
-                    }
-                });
+                authorities.removeAll(authorities.stream().
+                        filter(authority -> removed.contains(authority.getAuthority())).collect(Collectors.toList()));
 
                 accessToken.setAuthorities(ENCRYPTOR.encode(
                         POJOHelper.serialize(authorities), CipherAlgorithm.AES).
@@ -170,9 +164,9 @@ public class AnyTypeDataBinderImpl implements AnyTypeDataBinder {
 
         anyTypeTO.setKey(anyType.getKey());
         anyTypeTO.setKind(anyType.getKind());
-        for (AnyTypeClass anyTypeClass : anyType.getClasses()) {
+        anyType.getClasses().forEach(anyTypeClass -> {
             anyTypeTO.getClasses().add(anyTypeClass.getKey());
-        }
+        });
 
         return anyTypeTO;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
index 7dfb721..d4b9206 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConnInstanceDataBinderImpl.java
@@ -25,6 +25,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
@@ -249,16 +250,16 @@ public class ConnInstanceDataBinderImpl implements ConnInstanceDataBinder {
         connInstanceTO.getConf().addAll(connInstance.getConf());
         // refresh stored properties in the given connInstance with direct information from underlying connector
         ConfigurationProperties properties = connIdBundleManager.getConfigurationProperties(info.getRight());
-        for (String propName : properties.getPropertyNames()) {
+        properties.getPropertyNames().forEach(propName -> {
             ConnConfPropSchema schema = build(properties.getProperty(propName));
 
-            ConnConfProperty property = connInstanceTO.getConf(propName);
-            if (property == null) {
-                property = new ConnConfProperty();
-                connInstanceTO.getConf().add(property);
+            Optional<ConnConfProperty> property = connInstanceTO.getConf(propName);
+            if (!property.isPresent()) {
+                property = Optional.of(new ConnConfProperty());
+                connInstanceTO.getConf().add(property.get());
             }
-            property.setSchema(schema);
-        }
+            property.get().setSchema(schema);
+        });
         Collections.sort(connInstanceTO.getConf());
 
         // pool configuration

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index 787353c..3105e19 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -23,8 +23,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-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.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -46,14 +45,12 @@ import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.DynGroupMembership;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -74,7 +71,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
         }
 
         DynGroupMembership<?> dynMembership;
-        if (anyType.getKind() == AnyTypeKind.ANY_OBJECT && group.getADynMembership(anyType) == null) {
+        if (anyType.getKind() == AnyTypeKind.ANY_OBJECT && !group.getADynMembership(anyType).isPresent()) {
             dynMembership = entityFactory.newEntity(ADynGroupMembership.class);
             dynMembership.setGroup(group);
             group.add((ADynGroupMembership) dynMembership);
@@ -85,7 +82,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
             group.setUDynMembership((UDynGroupMembership) dynMembership);
         } else {
             dynMembership = anyType.getKind() == AnyTypeKind.ANY_OBJECT
-                    ? group.getADynMembership(anyType)
+                    ? group.getADynMembership(anyType).get()
                     : group.getUDynMembership();
         }
         dynMembership.setFIQLCond(dynMembershipFIQL);
@@ -139,17 +136,17 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
         if (groupTO.getUDynMembershipCond() != null) {
             setDynMembership(group, anyTypeDAO.findUser(), groupTO.getUDynMembershipCond());
         }
-        for (Map.Entry<String, String> entry : groupTO.getADynMembershipConds().entrySet()) {
+        groupTO.getADynMembershipConds().entrySet().forEach(entry -> {
             AnyType anyType = anyTypeDAO.find(entry.getKey());
             if (anyType == null) {
                 LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), entry.getKey());
             } else {
                 setDynMembership(group, anyType, entry.getValue());
             }
-        }
+        });
 
         // type extensions
-        for (TypeExtensionTO typeExtTO : groupTO.getTypeExtensions()) {
+        groupTO.getTypeExtensions().forEach(typeExtTO -> {
             AnyType anyType = anyTypeDAO.find(typeExtTO.getAnyType());
             if (anyType == null) {
                 LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), typeExtTO.getAnyType());
@@ -159,21 +156,21 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
                 typeExt.setGroup(group);
                 group.add(typeExt);
 
-                for (String name : typeExtTO.getAuxClasses()) {
+                typeExtTO.getAuxClasses().forEach(name -> {
                     AnyTypeClass anyTypeClass = anyTypeClassDAO.find(name);
                     if (anyTypeClass == null) {
                         LOG.warn("Ignoring invalid {}: {}", AnyTypeClass.class.getSimpleName(), name);
                     } else {
                         typeExt.add(anyTypeClass);
                     }
-                }
+                });
 
                 if (typeExt.getAuxClasses().isEmpty()) {
                     group.getTypeExtensions().remove(typeExt);
                     typeExt.setGroup(null);
                 }
             }
-        }
+        });
 
         // Throw composite exception if there is at least one element set in the composing exceptions
         if (scce.hasExceptions()) {
@@ -220,14 +217,14 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
 
         // check if some connObjectKey was changed by the update above
         Map<String, String> newConnObjectKeys = getConnObjectKeys(group);
-        for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
-            if (newConnObjectKeys.containsKey(entry.getKey())
-                    && !entry.getValue().equals(newConnObjectKeys.get(entry.getKey()))) {
+        oldConnObjectKeys.entrySet().stream().
+                filter(entry -> newConnObjectKeys.containsKey(entry.getKey())
+                && !entry.getValue().equals(newConnObjectKeys.get(entry.getKey()))).
+                forEach(entry -> {
 
-                propByRes.addOldConnObjectKey(entry.getKey(), entry.getValue());
-                propByRes.add(ResourceOperation.UPDATE, entry.getKey());
-            }
-        }
+                    propByRes.addOldConnObjectKey(entry.getKey(), entry.getValue());
+                    propByRes.add(ResourceOperation.UPDATE, entry.getKey());
+                });
 
         group = groupDAO.save(group);
 
@@ -262,7 +259,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
             if (anyType == null) {
                 LOG.warn("Ignoring invalid {}: {}", AnyType.class.getSimpleName(), typeExtTO.getAnyType());
             } else {
-                TypeExtension typeExt = group.getTypeExtension(anyType);
+                TypeExtension typeExt = group.getTypeExtension(anyType).orElse(null);
                 if (typeExt == null) {
                     typeExt = entityFactory.newEntity(TypeExtension.class);
                     typeExt.setAnyType(anyType);
@@ -297,7 +294,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
         // remove all type extensions not contained in the TO
         for (Iterator<? extends TypeExtension> itor = group.getTypeExtensions().iterator(); itor.hasNext();) {
             TypeExtension typeExt = itor.next();
-            if (groupPatch.getTypeExtension(typeExt.getAnyType().getKey()) == null) {
+            if (!groupPatch.getTypeExtension(typeExt.getAnyType().getKey()).isPresent()) {
                 itor.remove();
             }
         }
@@ -314,15 +311,8 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
     public TypeExtensionTO getTypeExtensionTO(final TypeExtension typeExt) {
         TypeExtensionTO typeExtTO = new TypeExtensionTO();
         typeExtTO.setAnyType(typeExt.getAnyType().getKey());
-        typeExtTO.getAuxClasses().addAll(CollectionUtils.collect(typeExt.getAuxClasses(),
-                new Transformer<AnyTypeClass, String>() {
-
-            @Override
-            public String transform(final AnyTypeClass clazz) {
-                return clazz.getKey();
-            }
-        }));
-
+        typeExtTO.getAuxClasses().addAll(
+                typeExt.getAuxClasses().stream().map(Entity::getKey).collect(Collectors.toList()));
         return typeExtTO;
     }
 
@@ -368,13 +358,13 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
         if (group.getUDynMembership() != null) {
             groupTO.setUDynMembershipCond(group.getUDynMembership().getFIQLCond());
         }
-        for (ADynGroupMembership memb : group.getADynMemberships()) {
+        group.getADynMemberships().forEach(memb -> {
             groupTO.getADynMembershipConds().put(memb.getAnyType().getKey(), memb.getFIQLCond());
-        }
+        });
 
-        for (TypeExtension typeExt : group.getTypeExtensions()) {
+        group.getTypeExtensions().forEach(typeExt -> {
             groupTO.getTypeExtensions().add(getTypeExtensionTO(typeExt));
-        }
+        });
 
         return groupTO;
     }
@@ -389,7 +379,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
             final Group group, final Any<?> any, final Map<String, PropagationByResource> result) {
 
         PropagationByResource propByRes = new PropagationByResource();
-        for (ExternalResource resource : group.getResources()) {
+        group.getResources().forEach(resource -> {
             if (!any.getResources().contains(resource)) {
                 propByRes.add(ResourceOperation.DELETE, resource.getKey());
             }
@@ -397,7 +387,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
             if (!propByRes.isEmpty()) {
                 result.put(any.getKey(), propByRes);
             }
-        }
+        });
     }
 
     @Transactional(readOnly = true)
@@ -407,9 +397,9 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
 
         Map<String, PropagationByResource> result = new HashMap<>();
 
-        for (AMembership membership : groupDAO.findAMemberships(group)) {
+        groupDAO.findAMemberships(group).forEach((membership) -> {
             populateTransitiveResources(group, membership.getLeftEnd(), result);
-        }
+        });
 
         return result;
     }
@@ -421,9 +411,9 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
 
         Map<String, PropagationByResource> result = new HashMap<>();
 
-        for (UMembership membership : groupDAO.findUMemberships(group)) {
+        groupDAO.findUMemberships(group).forEach((membership) -> {
             populateTransitiveResources(group, membership.getLeftEnd(), result);
-        }
+        });
 
         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/data/NotificationDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
index ccea817..3afe622 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/NotificationDataBinderImpl.java
@@ -18,10 +18,8 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import java.util.Map;
 import java.util.regex.Matcher;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -70,9 +68,9 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
 
         BeanUtils.copyProperties(notification, result, IGNORE_PROPERTIES);
 
-        for (AnyAbout about : notification.getAbouts()) {
+        notification.getAbouts().forEach(about -> {
             result.getAbouts().put(about.getAnyType().getKey(), about.get());
-        }
+        });
 
         return result;
     }
@@ -101,13 +99,13 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
         }
 
         if (!notification.getStaticRecipients().isEmpty()) {
-            for (String mail : notification.getStaticRecipients()) {
+            notification.getStaticRecipients().forEach(mail -> {
                 Matcher matcher = SyncopeConstants.EMAIL_PATTERN.matcher(mail);
                 if (!matcher.matches()) {
                     LOG.error("Invalid mail address: {}", mail);
                     sce.getElements().add("staticRecipients: " + mail);
                 }
-            }
+            });
         }
 
         if (!sce.isEmpty()) {
@@ -115,33 +113,30 @@ public class NotificationDataBinderImpl implements NotificationDataBinder {
         }
 
         // 1. add or update all (valid) abouts from TO
-        for (Map.Entry<String, String> entry : notificationTO.getAbouts().entrySet()) {
-            if (StringUtils.isNotBlank(entry.getValue())) {
-                AnyType anyType = anyTypeDAO.find(entry.getKey());
-                if (anyType == null) {
-                    LOG.debug("Invalid AnyType {} specified, ignoring...", entry.getKey());
-                } else {
-                    AnyAbout about = notification.getAbout(anyType);
-                    if (about == null) {
-                        about = entityFactory.newEntity(AnyAbout.class);
-                        about.setAnyType(anyType);
-                        about.setNotification(notification);
-
-                        notification.add(about);
+        notificationTO.getAbouts().entrySet().stream().
+                filter(entry -> StringUtils.isNotBlank(entry.getValue())).
+                forEachOrdered((entry) -> {
+
+                    AnyType anyType = anyTypeDAO.find(entry.getKey());
+                    if (anyType == null) {
+                        LOG.debug("Invalid AnyType {} specified, ignoring...", entry.getKey());
+                    } else {
+                        AnyAbout about = notification.getAbout(anyType).orElse(null);
+                        if (about == null) {
+                            about = entityFactory.newEntity(AnyAbout.class);
+                            about.setAnyType(anyType);
+                            about.setNotification(notification);
+
+                            notification.add(about);
+                        }
+                        about.set(entry.getValue());
                     }
-                    about.set(entry.getValue());
-                }
-            }
-        }
+                });
 
         // 2. remove all abouts not contained in the TO
-        CollectionUtils.filter(notification.getAbouts(), new Predicate<AnyAbout>() {
-
-            @Override
-            public boolean evaluate(final AnyAbout anyAbout) {
-                return notificationTO.getAbouts().containsKey(anyAbout.getAnyType().getKey());
-            }
-        });
+        notification.getAbouts().removeAll(notification.getAbouts().stream().
+                filter(anyAbout -> !notificationTO.getAbouts().containsKey(anyAbout.getAnyType().getKey())).
+                collect(Collectors.toList()));
 
         // 3. verify recipientAttrName
         intAttrNameParser.parse(notification.getRecipientAttrName(), AnyTypeKind.USER);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
index 35eac98..a049fe8 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/PolicyDataBinderImpl.java
@@ -152,7 +152,7 @@ public class PolicyDataBinderImpl implements PolicyDataBinder {
                 accountPolicyTO.getRuleConfs().add((AbstractAccountRuleConf) ruleConf);
             }
 
-            accountPolicyTO.getPassthroughResources().addAll(accountPolicy.getResourceNames());
+            accountPolicyTO.getPassthroughResources().addAll(accountPolicy.getResourceKeys());
         } else if (policy instanceof PullPolicy) {
             policyTO = (T) new PullPolicyTO();
             ((PullPolicyTO) policyTO).setSpecification(((PullPolicy) policy).getSpecification());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
index 32678cc..c7fc089 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RealmDataBinderImpl.java
@@ -18,11 +18,8 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.RealmTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.provisioning.api.PropagationByResource;
@@ -73,12 +70,12 @@ public class RealmDataBinderImpl implements RealmDataBinder {
     private void setTemplates(final RealmTO realmTO, final Realm realm) {
         // validate JEXL expressions from templates and proceed if fine
         templateUtils.check(realmTO.getTemplates(), ClientExceptionType.InvalidPullTask);
-        for (Map.Entry<String, AnyTO> entry : realmTO.getTemplates().entrySet()) {
+        realmTO.getTemplates().entrySet().forEach(entry -> {
             AnyType type = anyTypeDAO.find(entry.getKey());
             if (type == null) {
                 LOG.debug("Invalid AnyType {} specified, ignoring...", entry.getKey());
             } else {
-                AnyTemplateRealm anyTemplate = realm.getTemplate(type);
+                AnyTemplateRealm anyTemplate = realm.getTemplate(type).orElse(null);
                 if (anyTemplate == null) {
                     anyTemplate = entityFactory.newEntity(AnyTemplateRealm.class);
                     anyTemplate.setAnyType(type);
@@ -88,15 +85,12 @@ public class RealmDataBinderImpl implements RealmDataBinder {
                 }
                 anyTemplate.set(entry.getValue());
             }
-        }
-        // remove all templates not contained in the TO
-        CollectionUtils.filter(realm.getTemplates(), new Predicate<AnyTemplate>() {
-
-            @Override
-            public boolean evaluate(final AnyTemplate anyTemplate) {
-                return realmTO.getTemplates().containsKey(anyTemplate.getAnyType().getKey());
-            }
         });
+        // remove all templates not contained in the TO
+        realm.getTemplates().removeAll(
+                realm.getTemplates().stream().
+                        filter(anyTemplate -> !realmTO.getTemplates().containsKey(anyTemplate.getAnyType().getKey())).
+                        collect(Collectors.toList()));
     }
 
     @Override
@@ -133,14 +127,14 @@ public class RealmDataBinderImpl implements RealmDataBinder {
 
         setTemplates(realmTO, realm);
 
-        for (String resourceKey : realmTO.getResources()) {
+        realmTO.getResources().forEach(resourceKey -> {
             ExternalResource resource = resourceDAO.find(resourceKey);
             if (resource == null) {
                 LOG.debug("Invalid " + ExternalResource.class.getSimpleName() + "{}, ignoring...", resourceKey);
             } else {
                 realm.add(resource);
             }
-        }
+        });
 
         return realm;
     }
@@ -184,7 +178,7 @@ public class RealmDataBinderImpl implements RealmDataBinder {
         setTemplates(realmTO, realm);
 
         final PropagationByResource propByRes = new PropagationByResource();
-        for (String resourceKey : realmTO.getResources()) {
+        realmTO.getResources().forEach(resourceKey -> {
             ExternalResource resource = resourceDAO.find(resourceKey);
             if (resource == null) {
                 LOG.debug("Invalid " + ExternalResource.class.getSimpleName() + "{}, ignoring...", resourceKey);
@@ -192,19 +186,16 @@ public class RealmDataBinderImpl implements RealmDataBinder {
                 realm.add(resource);
                 propByRes.add(ResourceOperation.CREATE, resource.getKey());
             }
-        }
-        // remove all resources not contained in the TO
-        CollectionUtils.filter(realm.getResources(), new Predicate<ExternalResource>() {
-
-            @Override
-            public boolean evaluate(final ExternalResource resource) {
-                boolean contained = realmTO.getResources().contains(resource.getKey());
-                if (!contained) {
-                    propByRes.add(ResourceOperation.DELETE, resource.getKey());
-                }
-                return contained;
-            }
         });
+        // remove all resources not contained in the TO
+        realm.getResources().removeAll(
+                realm.getResources().stream().filter(resource -> {
+                    boolean contained = realmTO.getResources().contains(resource.getKey());
+                    if (!contained) {
+                        propByRes.add(ResourceOperation.DELETE, resource.getKey());
+                    }
+                    return !contained;
+                }).collect(Collectors.toList()));
 
         return propByRes;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
index 9f8e75d..07ddf15 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ResourceDataBinderImpl.java
@@ -23,8 +23,8 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IteratorUtils;
+import java.util.stream.Collectors;
+import org.apache.syncope.common.lib.collections.IteratorChain;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
@@ -55,8 +55,6 @@ import org.apache.syncope.core.persistence.api.dao.ExternalResourceHistoryConfDA
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
-import org.apache.syncope.core.persistence.api.entity.DerSchema;
-import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.policy.PullPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResourceHistoryConf;
@@ -67,7 +65,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.api.IntAttrName;
 import org.apache.syncope.core.provisioning.api.data.ResourceDataBinder;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.slf4j.Logger;
@@ -158,13 +155,13 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resource.setRandomPwdIfNotProvided(resourceTO.isRandomPwdIfNotProvided());
 
         // 1. add or update all (valid) provisions from TO
-        for (ProvisionTO provisionTO : resourceTO.getProvisions()) {
+        resourceTO.getProvisions().forEach(provisionTO -> {
             AnyType anyType = anyTypeDAO.find(provisionTO.getAnyType());
             if (anyType == null) {
                 LOG.debug("Invalid {} specified {}, ignoring...",
                         AnyType.class.getSimpleName(), provisionTO.getAnyType());
             } else {
-                Provision provision = resource.getProvision(anyType);
+                Provision provision = resource.getProvision(anyType).orElse(null);
                 if (provision == null) {
                     provision = entityFactory.newEntity(Provision.class);
                     provision.setResource(resource);
@@ -209,20 +206,17 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                     }
 
                     AnyTypeClassTO allowedSchemas = new AnyTypeClassTO();
-                    for (Iterator<AnyTypeClass> itor = IteratorUtils.chainedIterator(
+                    for (Iterator<AnyTypeClass> itor = new IteratorChain<>(
                             provision.getAnyType().getClasses().iterator(),
                             provision.getAuxClasses().iterator()); itor.hasNext();) {
 
                         AnyTypeClass anyTypeClass = itor.next();
-                        allowedSchemas.getPlainSchemas().addAll(
-                                CollectionUtils.collect(anyTypeClass.getPlainSchemas(),
-                                        EntityUtils.<PlainSchema>keyTransformer()));
-                        allowedSchemas.getDerSchemas().addAll(
-                                CollectionUtils.collect(anyTypeClass.getDerSchemas(),
-                                        EntityUtils.<DerSchema>keyTransformer()));
-                        allowedSchemas.getVirSchemas().addAll(
-                                CollectionUtils.collect(anyTypeClass.getVirSchemas(),
-                                        EntityUtils.<VirSchema>keyTransformer()));
+                        allowedSchemas.getPlainSchemas().addAll(anyTypeClass.getPlainSchemas().stream().
+                                map(s -> s.getKey()).collect(Collectors.toList()));
+                        allowedSchemas.getDerSchemas().addAll(anyTypeClass.getDerSchemas().stream().
+                                map(s -> s.getKey()).collect(Collectors.toList()));
+                        allowedSchemas.getVirSchemas().addAll(anyTypeClass.getVirSchemas().stream().
+                                map(s -> s.getKey()).collect(Collectors.toList()));
                     }
 
                     populateMapping(
@@ -247,15 +241,15 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                     }
                 }
             }
-        }
+        });
 
         // 2. remove all provisions not contained in the TO
         for (Iterator<? extends Provision> itor = resource.getProvisions().iterator(); itor.hasNext();) {
             Provision provision = itor.next();
             if (resourceTO.getProvision(provision.getAnyType().getKey()) == null) {
-                for (VirSchema schema : virSchemaDAO.findByProvision(provision)) {
+                virSchemaDAO.findByProvision(provision).forEach(schema -> {
                     virSchemaDAO.delete(schema.getKey());
-                }
+                });
 
                 itor.remove();
             }
@@ -491,7 +485,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
     }
 
     private void populateItems(final List<? extends Item> items, final ItemContainerTO containerTO) {
-        for (Item item : items) {
+        items.forEach(item -> {
             ItemTO itemTO = new ItemTO();
             itemTO.setKey(item.getKey());
             BeanUtils.copyProperties(item, itemTO, ITEM_IGNORE_PROPERTIES);
@@ -501,7 +495,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
             } else {
                 containerTO.add(itemTO);
             }
-        }
+        });
     }
 
     @Override
@@ -518,13 +512,13 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
         resourceTO.setConnectorDisplayName(connector == null ? null : connector.getDisplayName());
 
         // set the provision information
-        for (Provision provision : resource.getProvisions()) {
+        resource.getProvisions().stream().map(provision -> {
             ProvisionTO provisionTO = new ProvisionTO();
             provisionTO.setKey(provision.getKey());
             provisionTO.setAnyType(provision.getAnyType().getKey());
             provisionTO.setObjectClass(provision.getObjectClass().getObjectClassValue());
-            provisionTO.getAuxClasses().addAll(CollectionUtils.collect(
-                    provision.getAuxClasses(), EntityUtils.<AnyTypeClass>keyTransformer()));
+            provisionTO.getAuxClasses().addAll(provision.getAuxClasses().stream().
+                    map(cls -> cls.getKey()).collect(Collectors.toList()));
             provisionTO.setSyncToken(provision.getSerializedSyncToken());
 
             if (provision.getMapping() != null) {
@@ -534,7 +528,7 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                 populateItems(provision.getMapping().getItems(), mappingTO);
             }
 
-            for (VirSchema virSchema : virSchemaDAO.findByProvision(provision)) {
+            virSchemaDAO.findByProvision(provision).forEach(virSchema -> {
                 provisionTO.getVirSchemas().add(virSchema.getKey());
 
                 MappingItem linkingMappingItem = virSchema.asLinkingMappingItem();
@@ -544,10 +538,11 @@ public class ResourceDataBinderImpl implements ResourceDataBinder {
                 BeanUtils.copyProperties(linkingMappingItem, itemTO, ITEM_IGNORE_PROPERTIES);
 
                 provisionTO.getMapping().getLinkingItems().add(itemTO);
-            }
-
+            });
+            return provisionTO;
+        }).forEachOrdered(provisionTO -> {
             resourceTO.getProvisions().add(provisionTO);
-        }
+        });
 
         if (resource.getOrgUnit() != null) {
             OrgUnit orgUnit = resource.getOrgUnit();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
index b907051..f15011e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java
@@ -18,8 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.RoleTO;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
@@ -34,7 +33,6 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership;
 import org.apache.syncope.core.provisioning.api.data.RoleDataBinder;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -135,15 +133,11 @@ public class RoleDataBinderImpl implements RoleDataBinder {
         roleTO.setKey(role.getKey());
         roleTO.getEntitlements().addAll(role.getEntitlements());
 
-        CollectionUtils.collect(role.getRealms(), new Transformer<Realm, String>() {
+        roleTO.getRealms().addAll(role.getRealms().stream().
+                map(r -> r.getFullPath()).collect(Collectors.toList()));
 
-            @Override
-            public String transform(final Realm input) {
-                return input.getFullPath();
-            }
-        }, roleTO.getRealms());
-
-        CollectionUtils.collect(role.getDynRealms(), EntityUtils.keyTransformer(), roleTO.getDynRealms());
+        roleTO.getDynRealms().addAll(role.getDynRealms().stream().
+                map(r -> r.getKey()).collect(Collectors.toList()));
 
         if (role.getDynMembership() != null) {
             roleTO.setDynMembershipCond(role.getDynMembership().getFIQLCond());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
index 10e4f73..dfa3a8e 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/SchemaDataBinderImpl.java
@@ -256,7 +256,7 @@ public class SchemaDataBinderImpl implements SchemaDataBinder {
             sce.getElements().add("AnyType " + schemaTO.getAnyType() + " not found");
             throw sce;
         }
-        Provision provision = resource.getProvision(anyType);
+        Provision provision = resource.getProvision(anyType).orElse(null);
         if (provision == null) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSchemaDefinition);
             sce.getElements().add("Provision for AnyType" + schemaTO.getAnyType()

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
index 09b5d12..646e950 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/TaskDataBinderImpl.java
@@ -18,15 +18,12 @@
  */
 package org.apache.syncope.core.provisioning.java.data;
 
-import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.syncope.core.provisioning.api.data.TaskDataBinder;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AbstractProvisioningTaskTO;
 import org.apache.syncope.common.lib.to.AbstractTaskTO;
-import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.to.PushTaskTO;
 import org.apache.syncope.common.lib.to.SchedTaskTO;
@@ -57,7 +54,6 @@ import org.apache.syncope.core.persistence.api.dao.RealmDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.EntityFactory;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.AnyTemplate;
 import org.apache.syncope.core.persistence.api.entity.task.AnyTemplatePullTask;
 import org.apache.syncope.core.persistence.api.entity.task.PullTask;
 import org.apache.syncope.core.provisioning.java.pushpull.PushJobDelegate;
@@ -123,12 +119,12 @@ public class TaskDataBinderImpl implements TaskDataBinder {
             pushTask.setUnmatchingRule(pushTaskTO.getUnmatchingRule() == null
                     ? UnmatchingRule.ASSIGN : pushTaskTO.getUnmatchingRule());
 
-            for (Map.Entry<String, String> entry : pushTaskTO.getFilters().entrySet()) {
+            pushTaskTO.getFilters().entrySet().forEach(entry -> {
                 AnyType type = anyTypeDAO.find(entry.getKey());
                 if (type == null) {
                     LOG.debug("Invalid AnyType {} specified, ignoring...", entry.getKey());
                 } else {
-                    PushTaskAnyFilter filter = pushTask.getFilter(type);
+                    PushTaskAnyFilter filter = pushTask.getFilter(type).orElse(null);
                     if (filter == null) {
                         filter = entityFactory.newEntity(PushTaskAnyFilter.class);
                         filter.setAnyType(anyTypeDAO.find(entry.getKey()));
@@ -137,15 +133,12 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                     }
                     filter.setFIQLCond(entry.getValue());
                 }
-            }
-            // remove all filters not contained in the TO
-            CollectionUtils.filter(pushTask.getFilters(), new Predicate<PushTaskAnyFilter>() {
-
-                @Override
-                public boolean evaluate(final PushTaskAnyFilter anyFilter) {
-                    return pushTaskTO.getFilters().containsKey(anyFilter.getAnyType().getKey());
-                }
             });
+            // remove all filters not contained in the TO
+            pushTask.getFilters().removeAll(
+                    pushTask.getFilters().stream().filter(anyFilter
+                            -> !pushTaskTO.getFilters().containsKey(anyFilter.getAnyType().getKey())).
+                            collect(Collectors.toList()));
         } else if (task instanceof PullTask && taskTO instanceof PullTaskTO) {
             PullTask pullTask = (PullTask) task;
             final PullTaskTO pullTaskTO = (PullTaskTO) taskTO;
@@ -164,12 +157,12 @@ public class TaskDataBinderImpl implements TaskDataBinder {
 
             // validate JEXL expressions from templates and proceed if fine
             templateUtils.check(pullTaskTO.getTemplates(), ClientExceptionType.InvalidPullTask);
-            for (Map.Entry<String, AnyTO> entry : pullTaskTO.getTemplates().entrySet()) {
+            pullTaskTO.getTemplates().entrySet().forEach(entry -> {
                 AnyType type = anyTypeDAO.find(entry.getKey());
                 if (type == null) {
                     LOG.debug("Invalid AnyType {} specified, ignoring...", entry.getKey());
                 } else {
-                    AnyTemplatePullTask anyTemplate = pullTask.getTemplate(type);
+                    AnyTemplatePullTask anyTemplate = pullTask.getTemplate(type).orElse(null);
                     if (anyTemplate == null) {
                         anyTemplate = entityFactory.newEntity(AnyTemplatePullTask.class);
                         anyTemplate.setAnyType(type);
@@ -179,15 +172,12 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                     }
                     anyTemplate.set(entry.getValue());
                 }
-            }
-            // remove all templates not contained in the TO
-            CollectionUtils.filter(pullTask.getTemplates(), new Predicate<AnyTemplate>() {
-
-                @Override
-                public boolean evaluate(final AnyTemplate anyTemplate) {
-                    return pullTaskTO.getTemplates().containsKey(anyTemplate.getAnyType().getKey());
-                }
             });
+            // remove all templates not contained in the TO
+            pullTask.getTemplates().removeAll(
+                    pullTask.getTemplates().stream().filter(anyTemplate
+                            -> !pullTaskTO.getTemplates().containsKey(anyTemplate.getAnyType().getKey())).
+                            collect(Collectors.toList()));
         }
 
         // 3. fill the remaining fields
@@ -313,11 +303,9 @@ public class TaskDataBinderImpl implements TaskDataBinder {
         }
 
         if (details) {
-            for (TaskExec execution : task.getExecs()) {
-                if (execution != null) {
-                    taskTO.getExecutions().add(getExecTO(execution));
-                }
-            }
+            task.getExecs().stream().
+                    filter(execution -> execution != null).
+                    forEachOrdered(execution -> taskTO.getExecutions().add(getExecTO(execution)));
         }
 
         switch (taskUtils.getType()) {
@@ -341,9 +329,9 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                 ((PullTaskTO) taskTO).setUnmatchingRule(((PullTask) task).getUnmatchingRule() == null
                         ? UnmatchingRule.PROVISION : ((PullTask) task).getUnmatchingRule());
 
-                for (AnyTemplate template : ((PullTask) task).getTemplates()) {
+                ((PullTask) task).getTemplates().forEach(template -> {
                     ((PullTaskTO) taskTO).getTemplates().put(template.getAnyType().getKey(), template.get());
-                }
+                });
                 break;
 
             case PUSH:
@@ -355,9 +343,9 @@ public class TaskDataBinderImpl implements TaskDataBinder {
                 ((PushTaskTO) taskTO).setUnmatchingRule(((PushTask) task).getUnmatchingRule() == null
                         ? UnmatchingRule.ASSIGN : ((PushTask) task).getUnmatchingRule());
 
-                for (PushTaskAnyFilter filter : ((PushTask) task).getFilters()) {
+                ((PushTask) task).getFilters().forEach(filter -> {
                     ((PushTaskTO) taskTO).getFilters().put(filter.getAnyType().getKey(), filter.getFIQLCond());
-                }
+                });
                 break;
 
             case NOTIFICATION:


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index fa9fa5f..5bae851 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -24,24 +24,18 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.SyncopeClientCompositeException;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.patch.AttrPatch;
-import org.apache.syncope.common.lib.patch.MembershipPatch;
 import org.apache.syncope.common.lib.patch.PasswordPatch;
-import org.apache.syncope.common.lib.patch.RelationshipPatch;
 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.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.AnyTypeKind;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
@@ -59,11 +53,11 @@ import org.apache.syncope.core.provisioning.api.data.UserDataBinder;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.Encryptor;
 import org.apache.syncope.core.spring.BeanUtils;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
 import org.apache.syncope.core.persistence.api.dao.RoleDAO;
 import org.apache.syncope.core.persistence.api.entity.AccessToken;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.RelationshipType;
@@ -71,7 +65,6 @@ import org.apache.syncope.core.persistence.api.entity.Role;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr;
@@ -189,14 +182,14 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
         user.setSecurityAnswer(userTO.getSecurityAnswer());
 
         // roles
-        for (String roleKey : userTO.getRoles()) {
+        userTO.getRoles().forEach(roleKey -> {
             Role role = roleDAO.find(roleKey);
             if (role == null) {
                 LOG.warn("Ignoring unknown role with id {}", roleKey);
             } else {
                 user.add(role);
             }
-        }
+        });
 
         // realm
         Realm realm = realmDAO.findByFullPath(userTO.getRealm());
@@ -210,11 +203,11 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
         AnyUtils anyUtils = anyUtilsFactory.getInstance(AnyTypeKind.USER);
         if (user.getRealm() != null) {
             // relationships
-            Collection<String> assignableAnyObjects = CollectionUtils.collect(
-                    searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT),
-                    EntityUtils.keyTransformer());
+            Collection<String> assignableAnyObjects =
+                    searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT).stream().
+                            map(a -> a.getKey()).collect(Collectors.toList());
 
-            for (RelationshipTO relationshipTO : userTO.getRelationships()) {
+            userTO.getRelationships().forEach(relationshipTO -> {
                 AnyObject otherEnd = anyObjectDAO.find(relationshipTO.getRightKey());
                 if (otherEnd == null) {
                     LOG.debug("Ignoring invalid anyObject " + relationshipTO.getRightKey());
@@ -239,14 +232,14 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
                     unassignabled.getElements().add("Cannot be assigned: " + otherEnd);
                     scce.addException(unassignabled);
                 }
-            }
+            });
 
             // memberships
-            Collection<String> assignableGroups = CollectionUtils.collect(
-                    searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.GROUP),
-                    EntityUtils.keyTransformer());
+            Collection<String> assignableGroups =
+                    searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.GROUP).stream().
+                            map(g -> g.getKey()).collect(Collectors.toList());
 
-            for (MembershipTO membershipTO : userTO.getMemberships()) {
+            userTO.getMemberships().forEach(membershipTO -> {
                 Group group = membershipTO.getRightKey() == null
                         ? groupDAO.findByName(membershipTO.getGroupName())
                         : groupDAO.find(membershipTO.getRightKey());
@@ -270,7 +263,7 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
                     unassignable.getElements().add("Cannot be assigned: " + group);
                     scce.addException(unassignable);
                 }
-            }
+            });
         }
 
         // attributes and resources
@@ -285,15 +278,9 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
     private boolean isPasswordMapped(final ExternalResource resource) {
         boolean result = false;
 
-        Provision provision = resource.getProvision(anyTypeDAO.findUser());
-        if (provision != null && provision.getMapping() != null) {
-            result = IterableUtils.matchesAny(provision.getMapping().getItems(), new Predicate<MappingItem>() {
-
-                @Override
-                public boolean evaluate(final MappingItem item) {
-                    return item.isPassword();
-                }
-            });
+        Optional<? extends Provision> provision = resource.getProvision(anyTypeDAO.findUser());
+        if (provision.isPresent() && provision.get().getMapping() != null) {
+            result = provision.get().getMapping().getItems().stream().anyMatch(item -> item.isPassword());
         }
 
         return result;
@@ -389,139 +376,136 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
         Set<String> toBeProvisioned = new HashSet<>();
 
         // relationships
-        Collection<String> assignableAnyObjects = CollectionUtils.collect(
-                searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT),
-                EntityUtils.keyTransformer());
-
-        for (RelationshipPatch patch : userPatch.getRelationships()) {
-            if (patch.getRelationshipTO() != null) {
-                RelationshipType relationshipType = relationshipTypeDAO.find(patch.getRelationshipTO().getType());
-                if (relationshipType == null) {
-                    LOG.debug("Ignoring invalid relationship type {}", patch.getRelationshipTO().getType());
-                } else {
-                    URelationship relationship =
-                            user.getRelationship(relationshipType, patch.getRelationshipTO().getRightKey());
-                    if (relationship != null) {
-                        user.getRelationships().remove(relationship);
-                        relationship.setLeftEnd(null);
-
-                        toBeDeprovisioned.addAll(
-                                anyObjectDAO.findAllResourceKeys(relationship.getRightEnd().getKey()));
-                    }
+        Collection<String> assignableAnyObjects =
+                searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.ANY_OBJECT).stream().
+                        map(a -> a.getKey()).collect(Collectors.toList());
+
+        userPatch.getRelationships().stream().
+                filter(patch -> patch.getRelationshipTO() != null).forEachOrdered((patch) -> {
+            RelationshipType relationshipType = relationshipTypeDAO.find(patch.getRelationshipTO().getType());
+            if (relationshipType == null) {
+                LOG.debug("Ignoring invalid relationship type {}", patch.getRelationshipTO().getType());
+            } else {
+                Optional<? extends URelationship> relationship =
+                        user.getRelationship(relationshipType, patch.getRelationshipTO().getRightKey());
+                if (relationship.isPresent()) {
+                    user.getRelationships().remove(relationship.get());
+                    relationship.get().setLeftEnd(null);
+
+                    toBeDeprovisioned.addAll(
+                            anyObjectDAO.findAllResourceKeys(relationship.get().getRightEnd().getKey()));
+                }
 
-                    if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
-                        AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
-                        if (otherEnd == null) {
-                            LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
-                        } else if (assignableAnyObjects.contains(otherEnd.getKey())) {
-                            relationship = entityFactory.newEntity(URelationship.class);
-                            relationship.setType(relationshipType);
-                            relationship.setRightEnd(otherEnd);
-                            relationship.setLeftEnd(user);
+                if (patch.getOperation() == PatchOperation.ADD_REPLACE) {
+                    AnyObject otherEnd = anyObjectDAO.find(patch.getRelationshipTO().getRightKey());
+                    if (otherEnd == null) {
+                        LOG.debug("Ignoring invalid any object {}", patch.getRelationshipTO().getRightKey());
+                    } else if (assignableAnyObjects.contains(otherEnd.getKey())) {
+                        URelationship newRelationship = entityFactory.newEntity(URelationship.class);
+                        newRelationship.setType(relationshipType);
+                        newRelationship.setRightEnd(otherEnd);
+                        newRelationship.setLeftEnd(user);
 
-                            user.add(relationship);
+                        user.add(newRelationship);
 
-                            toBeProvisioned.addAll(anyObjectDAO.findAllResourceKeys(otherEnd.getKey()));
-                        } else {
-                            LOG.error("{} cannot be assigned to {}", otherEnd, user);
+                        toBeProvisioned.addAll(anyObjectDAO.findAllResourceKeys(otherEnd.getKey()));
+                    } else {
+                        LOG.error("{} cannot be assigned to {}", otherEnd, user);
 
-                            SyncopeClientException unassignable =
-                                    SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
-                            unassignable.getElements().add("Cannot be assigned: " + otherEnd);
-                            scce.addException(unassignable);
-                        }
+                        SyncopeClientException unassignable =
+                                SyncopeClientException.build(ClientExceptionType.InvalidRelationship);
+                        unassignable.getElements().add("Cannot be assigned: " + otherEnd);
+                        scce.addException(unassignable);
                     }
                 }
             }
-        }
+        });
 
         Collection<ExternalResource> resources = userDAO.findAllResources(user);
         SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
         // memberships
-        Collection<String> assignableGroups = CollectionUtils.collect(
-                searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.GROUP),
-                EntityUtils.keyTransformer());
-
-        for (MembershipPatch membPatch : userPatch.getMemberships()) {
-            if (membPatch.getGroup() != null) {
-                UMembership membership = user.getMembership(membPatch.getGroup());
-                if (membership != null) {
-                    user.getMemberships().remove(membership);
-                    membership.setLeftEnd(null);
-                    for (UPlainAttr attr : user.getPlainAttrs(membership)) {
-                        user.remove(attr);
-                        attr.setOwner(null);
-                        attr.setMembership(null);
-                    }
+        Collection<String> assignableGroups =
+                searchDAO.searchAssignable(user.getRealm().getFullPath(), AnyTypeKind.GROUP).stream().
+                        map(g -> g.getKey()).collect(Collectors.toList());
+
+        userPatch.getMemberships().stream().
+                filter(membPatch -> membPatch.getGroup() != null).forEachOrdered((membPatch) -> {
+            Optional<? extends UMembership> membership = user.getMembership(membPatch.getGroup());
+            if (membership.isPresent()) {
+                user.getMemberships().remove(membership.get());
+                membership.get().setLeftEnd(null);
+                user.getPlainAttrs(membership.get()).forEach(attr -> {
+                    user.remove(attr);
+                    attr.setOwner(null);
+                    attr.setMembership(null);
+                });
+
+                toBeDeprovisioned.addAll(groupDAO.findAllResourceKeys(membership.get().getRightEnd().getKey()));
+            }
+            if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
+                Group group = groupDAO.find(membPatch.getGroup());
+                if (group == null) {
+                    LOG.debug("Ignoring invalid group {}", membPatch.getGroup());
+                } else if (assignableGroups.contains(group.getKey())) {
+                    UMembership newMembership = entityFactory.newEntity(UMembership.class);
+                    newMembership.setRightEnd(group);
+                    newMembership.setLeftEnd(user);
 
-                    toBeDeprovisioned.addAll(groupDAO.findAllResourceKeys(membership.getRightEnd().getKey()));
-                }
+                    user.add(newMembership);
 
-                if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    Group group = groupDAO.find(membPatch.getGroup());
-                    if (group == null) {
-                        LOG.debug("Ignoring invalid group {}", membPatch.getGroup());
-                    } else if (assignableGroups.contains(group.getKey())) {
-                        membership = entityFactory.newEntity(UMembership.class);
-                        membership.setRightEnd(group);
-                        membership.setLeftEnd(user);
-
-                        user.add(membership);
-
-                        for (AttrTO attrTO : membPatch.getPlainAttrs()) {
-                            PlainSchema schema = getPlainSchema(attrTO.getSchema());
-                            if (schema == null) {
-                                LOG.debug("Invalid " + PlainSchema.class.getSimpleName()
-                                        + "{}, ignoring...", attrTO.getSchema());
-                            } else {
-                                UPlainAttr attr = user.getPlainAttr(schema.getKey(), membership);
-                                if (attr == null) {
-                                    LOG.debug("No plain attribute found for {} and membership of {}",
-                                            schema, membership.getRightEnd());
-
-                                    attr = anyUtils.newPlainAttr();
-                                    attr.setOwner(user);
-                                    attr.setMembership(membership);
-                                    attr.setSchema(schema);
-                                    user.add(attr);
-
-                                    AttrPatch patch = new AttrPatch.Builder().attrTO(attrTO).build();
-                                    processAttrPatch(
-                                            user, patch, schema, attr, anyUtils,
-                                            resources, propByRes, invalidValues);
-                                }
+                    membPatch.getPlainAttrs().forEach(attrTO -> {
+                        PlainSchema schema = getPlainSchema(attrTO.getSchema());
+                        if (schema == null) {
+                            LOG.debug("Invalid " + PlainSchema.class.getSimpleName()
+                                    + "{}, ignoring...", attrTO.getSchema());
+                        } else {
+                            UPlainAttr attr = user.getPlainAttr(schema.getKey(), newMembership).orElse(null);
+                            if (attr == null) {
+                                LOG.debug("No plain attribute found for {} and membership of {}",
+                                        schema, newMembership.getRightEnd());
+
+                                attr = anyUtils.newPlainAttr();
+                                attr.setOwner(user);
+                                attr.setMembership(newMembership);
+                                attr.setSchema(schema);
+                                user.add(attr);
+
+                                AttrPatch patch = new AttrPatch.Builder().attrTO(attrTO).build();
+                                processAttrPatch(
+                                        user, patch, schema, attr, anyUtils,
+                                        resources, propByRes, invalidValues);
                             }
                         }
-                        if (!invalidValues.isEmpty()) {
-                            scce.addException(invalidValues);
-                        }
+                    });
+                    if (!invalidValues.isEmpty()) {
+                        scce.addException(invalidValues);
+                    }
 
-                        toBeProvisioned.addAll(groupDAO.findAllResourceKeys(group.getKey()));
+                    toBeProvisioned.addAll(groupDAO.findAllResourceKeys(group.getKey()));
 
-                        // SYNCOPE-686: if password is invertible and we are adding resources with password mapping,
-                        // ensure that they are counted for password propagation
-                        if (toBeUpdated.canDecodePassword()) {
-                            if (userPatch.getPassword() == null) {
-                                userPatch.setPassword(new PasswordPatch());
-                            }
-                            for (ExternalResource resource : group.getResources()) {
-                                if (isPasswordMapped(resource)) {
-                                    userPatch.getPassword().getResources().add(resource.getKey());
-                                }
-                            }
+                    // SYNCOPE-686: if password is invertible and we are adding resources with password mapping,
+                    // ensure that they are counted for password propagation
+                    if (toBeUpdated.canDecodePassword()) {
+                        if (userPatch.getPassword() == null) {
+                            userPatch.setPassword(new PasswordPatch());
                         }
-                    } else {
-                        LOG.error("{} cannot be assigned to {}", group, user);
-
-                        SyncopeClientException unassignabled =
-                                SyncopeClientException.build(ClientExceptionType.InvalidMembership);
-                        unassignabled.getElements().add("Cannot be assigned: " + group);
-                        scce.addException(unassignabled);
+                        group.getResources().stream().
+                                filter(resource -> isPasswordMapped(resource)).
+                                forEachOrdered(resource -> {
+                                    userPatch.getPassword().getResources().add(resource.getKey());
+                                });
                     }
+                } else {
+                    LOG.error("{} cannot be assigned to {}", group, user);
+
+                    SyncopeClientException unassignabled =
+                            SyncopeClientException.build(ClientExceptionType.InvalidMembership);
+                    unassignabled.getElements().add("Cannot be assigned: " + group);
+                    scce.addException(unassignabled);
                 }
             }
-        }
+        });
 
         propByRes.addAll(ResourceOperation.DELETE, toBeDeprovisioned);
         propByRes.addAll(ResourceOperation.UPDATE, toBeProvisioned);
@@ -535,14 +519,14 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
 
         // check if some connObjectKey was changed by the update above
         Map<String, String> newcCnnObjectKeys = getConnObjectKeys(user);
-        for (Map.Entry<String, String> entry : oldConnObjectKeys.entrySet()) {
-            if (newcCnnObjectKeys.containsKey(entry.getKey())
-                    && !entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))) {
+        oldConnObjectKeys.entrySet().stream().
+                filter(entry -> newcCnnObjectKeys.containsKey(entry.getKey())
+                && !entry.getValue().equals(newcCnnObjectKeys.get(entry.getKey()))).
+                forEach(entry -> {
 
-                propByRes.addOldConnObjectKey(entry.getKey(), entry.getValue());
-                propByRes.add(ResourceOperation.UPDATE, entry.getKey());
-            }
-        }
+                    propByRes.addOldConnObjectKey(entry.getKey(), entry.getValue());
+                    propByRes.add(ResourceOperation.UPDATE, entry.getKey());
+                });
 
         userDAO.save(user);
 
@@ -581,46 +565,33 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
             userTO.getDynRealms().addAll(userDAO.findDynRealms(user.getKey()));
 
             // roles
-            CollectionUtils.collect(user.getRoles(),
-                    EntityUtils.<Role>keyTransformer(), userTO.getRoles());
+            userTO.getRoles().addAll(user.getRoles().stream().map(r -> r.getKey()).collect(Collectors.toList()));
 
             // relationships
-            CollectionUtils.collect(user.getRelationships(), new Transformer<URelationship, RelationshipTO>() {
-
-                @Override
-                public RelationshipTO transform(final URelationship relationship) {
-                    return UserDataBinderImpl.this.getRelationshipTO(relationship);
-                }
-
-            }, userTO.getRelationships());
+            userTO.getRelationships().addAll(
+                    user.getRelationships().stream().map(relationship -> getRelationshipTO(relationship)).
+                            collect(Collectors.toList()));
 
             // memberships
-            CollectionUtils.collect(user.getMemberships(), new Transformer<UMembership, MembershipTO>() {
-
-                @Override
-                public MembershipTO transform(final UMembership membership) {
-                    return getMembershipTO(
-                            user.getPlainAttrs(membership),
-                            derAttrHandler.getValues(user, membership),
-                            virAttrHandler.getValues(user, membership),
-                            membership);
-                }
-            }, userTO.getMemberships());
+            userTO.getMemberships().addAll(
+                    user.getMemberships().stream().map(membership -> {
+                        return getMembershipTO(
+                                user.getPlainAttrs(membership),
+                                derAttrHandler.getValues(user, membership),
+                                virAttrHandler.getValues(user, membership),
+                                membership);
+                    }).collect(Collectors.toList()));
 
             // dynamic memberships
-            CollectionUtils.collect(userDAO.findDynRoles(user.getKey()),
-                    EntityUtils.<Role>keyTransformer(), userTO.getDynRoles());
-            CollectionUtils.collect(userDAO.findDynGroups(user.getKey()), new Transformer<Group, MembershipTO>() {
-
-                @Override
-                public MembershipTO transform(final Group group) {
-                    MembershipTO membershipTO = new MembershipTO.Builder().
-                            group(group.getKey(), group.getName()).
-                            build();
-                    return membershipTO;
-
-                }
-            }, userTO.getDynMemberships());
+            userTO.getDynRoles().addAll(
+                    userDAO.findDynRoles(user.getKey()).stream().map(Entity::getKey).collect(Collectors.toList()));
+
+            userTO.getDynMemberships().addAll(
+                    userDAO.findDynGroups(user.getKey()).stream().map(group -> {
+                        return new MembershipTO.Builder().
+                                group(group.getKey(), group.getName()).
+                                build();
+                    }).collect(Collectors.toList()));
         }
 
         return userTO;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/JexlUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/JexlUtils.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/JexlUtils.java
index f68ec60..62587e1 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/JexlUtils.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/JexlUtils.java
@@ -37,7 +37,6 @@ import org.apache.commons.jexl3.MapContext;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
 import org.apache.syncope.core.persistence.api.entity.Any;
@@ -168,27 +167,25 @@ public final class JexlUtils {
     public static void addPlainAttrsToContext(
             final Collection<? extends PlainAttr<?>> attrs, final JexlContext jexlContext) {
 
-        for (PlainAttr<?> attr : attrs) {
-            if (attr.getSchema() != null) {
-                List<String> attrValues = attr.getValuesAsStrings();
-                String expressionValue = attrValues.isEmpty()
-                        ? StringUtils.EMPTY
-                        : attrValues.get(0);
+        attrs.stream().filter(attr -> attr.getSchema() != null).forEachOrdered((attr) -> {
+            List<String> attrValues = attr.getValuesAsStrings();
+            String expressionValue = attrValues.isEmpty()
+                    ? StringUtils.EMPTY
+                    : attrValues.get(0);
 
-                LOG.debug("Add attribute {} with value {}", attr.getSchema().getKey(), expressionValue);
+            LOG.debug("Add attribute {} with value {}", attr.getSchema().getKey(), expressionValue);
 
-                jexlContext.set(attr.getSchema().getKey(), expressionValue);
-            }
-        }
+            jexlContext.set(attr.getSchema().getKey(), expressionValue);
+        });
     }
 
     public static void addDerAttrsToContext(final Any<?> any, final JexlContext jexlContext) {
         Map<DerSchema, String> derAttrs =
                 ApplicationContextProvider.getBeanFactory().getBean(DerAttrHandler.class).getValues(any);
 
-        for (Map.Entry<DerSchema, String> entry : derAttrs.entrySet()) {
+        derAttrs.entrySet().forEach(entry -> {
             jexlContext.set(entry.getKey().getKey(), entry.getValue());
-        }
+        });
     }
 
     public static boolean evaluateMandatoryCondition(final String mandatoryCondition, final Any<?> any) {
@@ -202,7 +199,7 @@ public final class JexlUtils {
     public static String evaluate(final String expression, final AnyTO anyTO, final JexlContext context) {
         addFieldsToContext(anyTO, context);
 
-        for (AttrTO plainAttr : anyTO.getPlainAttrs()) {
+        anyTO.getPlainAttrs().forEach(plainAttr -> {
             List<String> values = plainAttr.getValues();
             String expressionValue = values.isEmpty()
                     ? StringUtils.EMPTY
@@ -211,8 +208,8 @@ public final class JexlUtils {
             LOG.debug("Add plain attribute {} with value {}", plainAttr.getSchema(), expressionValue);
 
             context.set(plainAttr.getSchema(), expressionValue);
-        }
-        for (AttrTO derAttr : anyTO.getDerAttrs()) {
+        });
+        anyTO.getDerAttrs().forEach(derAttr -> {
             List<String> values = derAttr.getValues();
             String expressionValue = values.isEmpty()
                     ? StringUtils.EMPTY
@@ -221,8 +218,8 @@ public final class JexlUtils {
             LOG.debug("Add derived attribute {} with value {}", derAttr.getSchema(), expressionValue);
 
             context.set(derAttr.getSchema(), expressionValue);
-        }
-        for (AttrTO virAttr : anyTO.getVirAttrs()) {
+        });
+        anyTO.getVirAttrs().forEach(virAttr -> {
             List<String> values = virAttr.getValues();
             String expressionValue = values.isEmpty()
                     ? StringUtils.EMPTY
@@ -231,7 +228,7 @@ public final class JexlUtils {
             LOG.debug("Add virtual attribute {} with value {}", virAttr.getSchema(), expressionValue);
 
             context.set(virAttr.getSchema(), expressionValue);
-        }
+        });
 
         // Evaluate expression using the context prepared before
         return evaluate(expression, context);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/SyncopeJexlFunctions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/SyncopeJexlFunctions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/SyncopeJexlFunctions.java
index a3b5c36..684c021 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/SyncopeJexlFunctions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/jexl/SyncopeJexlFunctions.java
@@ -19,8 +19,8 @@
 package org.apache.syncope.core.provisioning.java.jexl;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.lang3.StringUtils;
 
 /**
@@ -61,7 +61,8 @@ public class SyncopeJexlFunctions {
         }
 
         List<String> headless = Arrays.asList(fullPathSplitted).subList(1, fullPathSplitted.length);
-        return prefix + attr + "=" + StringUtils.join(IterableUtils.reversedIterable(headless), "," + attr + "=");
+        Collections.reverse(headless);
+        return prefix + attr + "=" + StringUtils.join(headless, "," + attr + "=");
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
index 8b3f4e5..f9d310f 100755
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/IdentityRecertification.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.provisioning.java.job;
 
+import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyDAO;
 import org.apache.syncope.core.persistence.api.dao.ConfDAO;
@@ -47,15 +48,16 @@ public class IdentityRecertification extends AbstractSchedTaskJobDelegate {
     protected void init() {
         synchronized (this) {
             if (recertificationTime == -1) {
-                CPlainAttr recertificationTimeAttr = confDAO.find(RECERTIFICATION_TIME);
-                if (recertificationTimeAttr == null
-                        || recertificationTimeAttr.getValues().get(0).getLongValue() == null) {
+                Optional<? extends CPlainAttr> recertificationTimeAttr = confDAO.find(RECERTIFICATION_TIME);
+                if (!recertificationTimeAttr.isPresent()
+                        || recertificationTimeAttr.get().getValues().get(0).getLongValue() == null) {
 
                     recertificationTime = -1;
                     return;
                 }
 
-                recertificationTime = recertificationTimeAttr.getValues().get(0).getLongValue() * 1000 * 60 * 60 * 24;
+                recertificationTime = recertificationTimeAttr.get().getValues().
+                        get(0).getLongValue() * 1000 * 60 * 60 * 24;
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
index 1af62c5..f82c243 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/JobManagerImpl.java
@@ -26,9 +26,8 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
 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.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -53,7 +52,6 @@ import org.quartz.CronScheduleBuilder;
 import org.quartz.Job;
 import org.quartz.JobBuilder;
 import org.quartz.JobDataMap;
-import org.quartz.JobExecutionContext;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
@@ -100,14 +98,8 @@ public class JobManagerImpl implements JobManager, SyncopeLoader {
     }
 
     private boolean isRunningHere(final JobKey jobKey) throws SchedulerException {
-        return IterableUtils.matchesAny(scheduler.getScheduler().getCurrentlyExecutingJobs(),
-                new Predicate<JobExecutionContext>() {
-
-            @Override
-            public boolean evaluate(final JobExecutionContext jec) {
-                return jobKey.equals(jec.getJobDetail().getKey());
-            }
-        });
+        return scheduler.getScheduler().getCurrentlyExecutingJobs().stream().
+                anyMatch(jec -> jobKey.equals(jec.getJobDetail().getKey()));
     }
 
     private boolean isRunningElsewhere(final JobKey jobKey) throws SchedulerException {
@@ -299,54 +291,45 @@ public class JobManagerImpl implements JobManager, SyncopeLoader {
             }
         }
 
-        final Pair<String, Long> conf = AuthContextUtils.execWithAuthContext(
-                SyncopeConstants.MASTER_DOMAIN, new AuthContextUtils.Executable<Pair<String, Long>>() {
+        final Pair<String, Long> conf = AuthContextUtils.execWithAuthContext(SyncopeConstants.MASTER_DOMAIN, () -> {
+            String notificationJobCronExpression = StringUtils.EMPTY;
 
-            @Override
-            public Pair<String, Long> exec() {
-                String notificationJobCronExpression = StringUtils.EMPTY;
-
-                CPlainAttr notificationJobCronExp = confDAO.find("notificationjob.cronExpression");
-                if (notificationJobCronExp == null) {
-                    notificationJobCronExpression = NotificationJob.DEFAULT_CRON_EXP;
-                } else if (!notificationJobCronExp.getValuesAsStrings().isEmpty()) {
-                    notificationJobCronExpression = notificationJobCronExp.getValuesAsStrings().get(0);
-                }
+            Optional<? extends CPlainAttr> notificationJobCronExp = confDAO.find("notificationjob.cronExpression");
+            if (!notificationJobCronExp.isPresent()) {
+                notificationJobCronExpression = NotificationJob.DEFAULT_CRON_EXP;
+            } else if (!notificationJobCronExp.get().getValuesAsStrings().isEmpty()) {
+                notificationJobCronExpression = notificationJobCronExp.get().getValuesAsStrings().get(0);
+            }
 
-                long interruptMaxRetries = confDAO.find("tasks.interruptMaxRetries", 1L);
+            long interruptMaxRetries = confDAO.find("tasks.interruptMaxRetries", 1L);
 
-                return Pair.of(notificationJobCronExpression, interruptMaxRetries);
-            }
+            return Pair.of(notificationJobCronExpression, interruptMaxRetries);
         });
 
         for (String domain : domainsHolder.getDomains().keySet()) {
-            AuthContextUtils.execWithAuthContext(domain, new AuthContextUtils.Executable<Void>() {
-
-                @Override
-                public Void exec() {
-                    // 1. jobs for SchedTasks
-                    Set<SchedTask> tasks = new HashSet<>(taskDAO.<SchedTask>findAll(TaskType.SCHEDULED));
-                    tasks.addAll(taskDAO.<PullTask>findAll(TaskType.PULL));
-                    tasks.addAll(taskDAO.<PushTask>findAll(TaskType.PUSH));
-                    for (SchedTask task : tasks) {
-                        try {
-                            register(task, task.getStartAt(), conf.getRight());
-                        } catch (Exception e) {
-                            LOG.error("While loading job instance for task " + task.getKey(), e);
-                        }
+            AuthContextUtils.execWithAuthContext(domain, () -> {
+                // 1. jobs for SchedTasks
+                Set<SchedTask> tasks = new HashSet<>(taskDAO.<SchedTask>findAll(TaskType.SCHEDULED));
+                tasks.addAll(taskDAO.<PullTask>findAll(TaskType.PULL));
+                tasks.addAll(taskDAO.<PushTask>findAll(TaskType.PUSH));
+                tasks.forEach(task -> {
+                    try {
+                        register(task, task.getStartAt(), conf.getRight());
+                    } catch (Exception e) {
+                        LOG.error("While loading job instance for task " + task.getKey(), e);
                     }
-
-                    // 2. jobs for Reports
-                    for (Report report : reportDAO.findAll()) {
-                        try {
-                            register(report, null, conf.getRight());
-                        } catch (Exception e) {
-                            LOG.error("While loading job instance for report " + report.getName(), e);
-                        }
+                });
+
+                // 2. jobs for Reports
+                reportDAO.findAll().forEach(report -> {
+                    try {
+                        register(report, null, conf.getRight());
+                    } catch (Exception e) {
+                        LOG.error("While loading job instance for report " + report.getName(), e);
                     }
+                });
 
-                    return null;
-                }
+                return null;
             });
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
index 0328e62..2e973b0 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/ReconciliationReportlet.java
@@ -18,16 +18,15 @@
  */
 package org.apache.syncope.core.provisioning.java.job.report;
 
+import java.util.Base64;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -52,7 +51,6 @@ import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.AnyUtilsFactory;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.persistence.api.entity.user.User;
@@ -60,7 +58,6 @@ import org.apache.syncope.core.provisioning.api.Connector;
 import org.apache.syncope.core.provisioning.api.ConnectorFactory;
 import org.apache.syncope.core.provisioning.api.MappingManager;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
-import org.identityconnectors.common.Base64;
 import org.identityconnectors.framework.common.objects.Attribute;
 import org.identityconnectors.framework.common.objects.AttributeBuilder;
 import org.identityconnectors.framework.common.objects.ConnectorObject;
@@ -266,9 +263,9 @@ public class ReconciliationReportlet extends AbstractReportlet {
             values = Collections.emptySet();
         } else if (attr.getValue().get(0) instanceof byte[]) {
             values = new HashSet<>(attr.getValue().size());
-            for (Object single : attr.getValue()) {
-                values.add(Base64.encode((byte[]) single));
-            }
+            attr.getValue().forEach(single -> {
+                values.add(Base64.getMimeEncoder().encode((byte[]) single));
+            });
         } else {
             values = new HashSet<>(attr.getValue());
         }
@@ -287,18 +284,18 @@ public class ReconciliationReportlet extends AbstractReportlet {
             misaligned.clear();
 
             AnyUtils anyUtils = anyUtilsFactory.getInstance(any);
-            for (final ExternalResource resource : anyUtils.getAllResources(any)) {
-                Provision provision = resource.getProvision(any.getType());
-                MappingItem connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
-                final String connObjectKeyValue = connObjectKeyItem == null
-                        ? StringUtils.EMPTY
-                        : mappingManager.getConnObjectKeyValue(any, provision);
-                if (provision != null && connObjectKeyItem != null && StringUtils.isNotBlank(connObjectKeyValue)) {
+            anyUtils.getAllResources(any).forEach(resource -> {
+                Provision provision = resource.getProvision(any.getType()).orElse(null);
+                Optional<MappingItem> connObjectKeyItem = MappingUtils.getConnObjectKeyItem(provision);
+                final String connObjectKeyValue = connObjectKeyItem.isPresent()
+                        ? mappingManager.getConnObjectKeyValue(any, provision).get()
+                        : StringUtils.EMPTY;
+                if (provision != null && connObjectKeyItem.isPresent() && StringUtils.isNotBlank(connObjectKeyValue)) {
                     // 1. read from the underlying connector
                     Connector connector = connFactory.getConnector(resource);
                     ConnectorObject connectorObject = connector.getObject(
                             provision.getObjectClass(),
-                            AttributeBuilder.build(connObjectKeyItem.getExtAttrName(), connObjectKeyValue),
+                            AttributeBuilder.build(connObjectKeyItem.get().getExtAttrName(), connObjectKeyValue),
                             MappingUtils.buildOperationOptions(provision.getMapping().getItems().iterator()));
 
                     if (connectorObject == null) {
@@ -314,37 +311,33 @@ public class ReconciliationReportlet extends AbstractReportlet {
                         preparedAttrs.getRight().add(AttributeBuilder.build(
                                 Uid.NAME, preparedAttrs.getLeft()));
                         preparedAttrs.getRight().add(AttributeBuilder.build(
-                                connObjectKeyItem.getExtAttrName(), preparedAttrs.getLeft()));
+                                connObjectKeyItem.get().getExtAttrName(), preparedAttrs.getLeft()));
 
                         final Map<String, Set<Object>> syncopeAttrs = new HashMap<>();
-                        for (Attribute attr : preparedAttrs.getRight()) {
+                        preparedAttrs.getRight().forEach(attr -> {
                             syncopeAttrs.put(attr.getName(), getValues(attr));
-                        }
+                        });
 
                         final Map<String, Set<Object>> resourceAttrs = new HashMap<>();
-                        for (Attribute attr : connectorObject.getAttributes()) {
-                            if (!OperationalAttributes.PASSWORD_NAME.equals(attr.getName())
-                                    && !OperationalAttributes.ENABLE_NAME.equals(attr.getName())) {
-
-                                resourceAttrs.put(attr.getName(), getValues(attr));
-                            }
-                        }
-
-                        IterableUtils.forEach(CollectionUtils.subtract(syncopeAttrs.keySet(), resourceAttrs.keySet()),
-                                new Closure<String>() {
-
-                            @Override
-                            public void execute(final String name) {
-                                misaligned.add(new Misaligned(
-                                        resource.getKey(),
-                                        connObjectKeyValue,
-                                        name,
-                                        syncopeAttrs.get(name),
-                                        Collections.emptySet()));
-                            }
-                        });
+                        connectorObject.getAttributes().stream().
+                                filter(attr -> (!OperationalAttributes.PASSWORD_NAME.equals(attr.getName())
+                                && !OperationalAttributes.ENABLE_NAME.equals(attr.getName()))).
+                                forEachOrdered(attr -> {
+                                    resourceAttrs.put(attr.getName(), getValues(attr));
+                                });
+
+                        syncopeAttrs.keySet().stream().
+                                filter(syncopeAttr -> !resourceAttrs.containsKey(syncopeAttr)).
+                                forEach(name -> {
+                                    misaligned.add(new Misaligned(
+                                            resource.getKey(),
+                                            connObjectKeyValue,
+                                            name,
+                                            syncopeAttrs.get(name),
+                                            Collections.emptySet()));
+                                });
 
-                        for (Map.Entry<String, Set<Object>> entry : resourceAttrs.entrySet()) {
+                        resourceAttrs.entrySet().forEach(entry -> {
                             if (syncopeAttrs.containsKey(entry.getKey())) {
                                 if (!Objects.equals(syncopeAttrs.get(entry.getKey()), entry.getValue())) {
                                     misaligned.add(new Misaligned(
@@ -362,10 +355,10 @@ public class ReconciliationReportlet extends AbstractReportlet {
                                         Collections.emptySet(),
                                         entry.getValue()));
                             }
-                        }
+                        });
                     }
                 }
-            }
+            });
 
             if (!missing.isEmpty() || !misaligned.isEmpty()) {
                 doExtract(handler, any, missing, misaligned);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
index 2e4314d..a485672 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/UserReportlet.java
@@ -287,7 +287,7 @@ public class UserReportlet extends AbstractReportlet {
                     handler.startElement("", "", "membership", atts);
 
                     if (conf.getFeatures().contains(Feature.resources)) {
-                        UMembership actualMemb = user.getMembership(memb.getRightKey());
+                        UMembership actualMemb = user.getMembership(memb.getRightKey()).orElse(null);
                         if (actualMemb == null) {
                             LOG.warn("Unexpected: cannot find membership for group {} for user {}",
                                     memb.getRightKey(), user);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
index 5438cee..f2eeaf4 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/notification/NotificationManagerImpl.java
@@ -25,9 +25,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.commons.jexl3.MapContext;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -63,7 +62,6 @@ import org.apache.syncope.core.persistence.api.dao.AnySearchDAO;
 import org.apache.syncope.core.persistence.api.dao.DerSchemaDAO;
 import org.apache.syncope.core.persistence.api.dao.VirSchemaDAO;
 import org.apache.syncope.core.persistence.api.entity.Any;
-import org.apache.syncope.core.persistence.api.entity.AnyAbout;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.DerSchema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
@@ -196,7 +194,7 @@ public class NotificationManagerImpl implements NotificationManager {
 
         Set<String> recipientEmails = new HashSet<>();
         List<UserTO> recipientTOs = new ArrayList<>(recipients.size());
-        for (User recipient : recipients) {
+        recipients.forEach(recipient -> {
             virAttrHander.getValues(recipient);
 
             String email = getRecipientEmail(notification.getRecipientAttrName(), recipient);
@@ -206,7 +204,7 @@ public class NotificationManagerImpl implements NotificationManager {
                 recipientEmails.add(email);
                 recipientTOs.add(userDataBinder.getUserTO(recipient, true));
             }
-        }
+        });
 
         if (notification.getStaticRecipients() != null) {
             recipientEmails.addAll(notification.getStaticRecipients());
@@ -266,15 +264,10 @@ public class NotificationManagerImpl implements NotificationManager {
 
         final String successEvent = AuditLoggerName.buildEvent(type, category, subcategory, event, Result.SUCCESS);
         final String failureEvent = AuditLoggerName.buildEvent(type, category, subcategory, event, Result.FAILURE);
-        return IterableUtils.matchesAny(notificationDAO.findAll(), new Predicate<Notification>() {
-
-            @Override
-            public boolean evaluate(final Notification notification) {
-                return notification.isActive()
-                        && (notification.getEvents().contains(successEvent)
-                        || notification.getEvents().contains(failureEvent));
-            }
-        });
+        return notificationDAO.findAll().stream().
+                anyMatch(notification -> notification.isActive()
+                && (notification.getEvents().contains(successEvent)
+                || notification.getEvents().contains(failureEvent)));
     }
 
     @Override
@@ -339,9 +332,9 @@ public class NotificationManagerImpl implements NotificationManager {
         List<NotificationTask> notifications = new ArrayList<>();
         for (Notification notification : notificationDAO.findAll()) {
             if (LOG.isDebugEnabled()) {
-                for (AnyAbout about : notification.getAbouts()) {
+                notification.getAbouts().forEach(about -> {
                     LOG.debug("Notification about {} defined: {}", about.getAnyType(), about.get());
-                }
+                });
             }
 
             if (notification.isActive()) {
@@ -349,8 +342,9 @@ public class NotificationManagerImpl implements NotificationManager {
                 if (!notification.getEvents().contains(currentEvent)) {
                     LOG.debug("No events found about {}", any);
                 } else if (anyType == null || any == null
-                        || notification.getAbout(anyType) == null
-                        || searchDAO.matches(any, SearchCondConverter.convert(notification.getAbout(anyType).get()))) {
+                        || !notification.getAbout(anyType).isPresent()
+                        || searchDAO.matches(
+                                any, SearchCondConverter.convert(notification.getAbout(anyType).get().get()))) {
 
                     LOG.debug("Creating notification task for event {} about {}", currentEvent, any);
 
@@ -395,17 +389,19 @@ public class NotificationManagerImpl implements NotificationManager {
             if (intAttrName.getMembershipOfGroup() != null) {
                 Group group = groupDAO.findByName(intAttrName.getMembershipOfGroup());
                 if (group != null) {
-                    membership = user.getMembership(group.getKey());
+                    membership = user.getMembership(group.getKey()).orElse(null);
                 }
             }
 
             switch (intAttrName.getSchemaType()) {
                 case PLAIN:
-                    UPlainAttr attr = membership == null
+                    Optional<? extends UPlainAttr> attr = membership == null
                             ? user.getPlainAttr(recipientAttrName)
                             : user.getPlainAttr(recipientAttrName, membership);
-                    if (attr != null) {
-                        email = attr.getValuesAsStrings().isEmpty() ? null : attr.getValuesAsStrings().get(0);
+                    if (attr.isPresent()) {
+                        email = attr.get().getValuesAsStrings().isEmpty()
+                                ? null
+                                : attr.get().getValuesAsStrings().get(0);
                     }
                     break;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
index 395a5a8..833edfc 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/AbstractPropagationTaskExecutor.java
@@ -27,7 +27,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.IteratorUtils;
+import org.apache.syncope.common.lib.collections.IteratorChain;
 import org.apache.syncope.common.lib.to.ExecTO;
 import org.apache.syncope.common.lib.to.PropagationTaskTO;
 import org.apache.syncope.common.lib.types.AuditElements;
@@ -52,7 +52,6 @@ import org.apache.syncope.core.provisioning.java.utils.ConnObjectUtils;
 import org.apache.syncope.core.provisioning.api.utils.ExceptionUtils2;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 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.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
@@ -160,7 +159,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
         List<PropagationActions> result = new ArrayList<>();
 
         if (!resource.getPropagationActionsClassNames().isEmpty()) {
-            for (String className : resource.getPropagationActionsClassNames()) {
+            resource.getPropagationActionsClassNames().forEach(className -> {
                 try {
                     Class<?> actionsClass = Class.forName(className);
                     result.add((PropagationActions) ApplicationContextProvider.getBeanFactory().
@@ -168,7 +167,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                 } catch (ClassNotFoundException e) {
                     LOG.error("Invalid PropagationAction class name '{}' for resource {}", resource, className, e);
                 }
-            }
+            });
         }
 
         return result;
@@ -192,9 +191,9 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
      */
     private Map<String, Attribute> toMap(final Collection<? extends Attribute> attributes) {
         Map<String, Attribute> map = new HashMap<>();
-        for (Attribute attr : attributes) {
+        attributes.forEach(attr -> {
             map.put(attr.getName().toUpperCase(), attr);
-        }
+        });
         return map;
     }
 
@@ -254,9 +253,9 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
             // Only compare attribute from beforeObj that are also being updated
             Set<String> skipAttrNames = originalAttrMap.keySet();
             skipAttrNames.removeAll(updateAttrMap.keySet());
-            for (String attrName : new HashSet<>(skipAttrNames)) {
+            new HashSet<>(skipAttrNames).forEach(attrName -> {
                 originalAttrMap.remove(attrName);
-            }
+            });
 
             Set<Attribute> originalAttrs = new HashSet<>(originalAttrMap.values());
 
@@ -267,11 +266,10 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                 LOG.debug("Attributes that would be updated {}", attributes);
 
                 Set<Attribute> strictlyModified = new HashSet<>();
-                for (Attribute attr : attributes) {
-                    if (!originalAttrs.contains(attr)) {
-                        strictlyModified.add(attr);
-                    }
-                }
+                attributes.stream().filter(attr -> (!originalAttrs.contains(attr))).
+                        forEachOrdered(attr -> {
+                            strictlyModified.add(attr);
+                        });
 
                 // 3. provision entry
                 LOG.debug("Update {} on {}", strictlyModified, task.getResource().getKey());
@@ -377,7 +375,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
         Connector connector = null;
         Result result;
         try {
-            provision = task.getResource().getProvision(new ObjectClass(task.getObjectClassName()));
+            provision = task.getResource().getProvision(new ObjectClass(task.getObjectClassName())).orElse(null);
             orgUnit = task.getResource().getOrgUnit();
             connector = connFactory.getConnector(task.getResource());
 
@@ -439,9 +437,9 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
 
             propagationAttempted[0] = true;
 
-            for (PropagationActions action : actions) {
+            actions.forEach(action -> {
                 action.onError(task, execution, e);
-            }
+            });
         } finally {
             // Try to read remote object AFTER any actual operation
             if (connector != null) {
@@ -602,17 +600,17 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
                 : task.getOldConnObjectKey();
 
         List<MappingItem> linkingMappingItems = new ArrayList<>();
-        for (VirSchema schema : virSchemaDAO.findByProvision(provision)) {
+        virSchemaDAO.findByProvision(provision).forEach(schema -> {
             linkingMappingItems.add(schema.asLinkingMappingItem());
-        }
+        });
 
         ConnectorObject obj = null;
         try {
             obj = connector.getObject(
                     new ObjectClass(task.getObjectClassName()),
                     AttributeBuilder.build(
-                            MappingUtils.getConnObjectKeyItem(provision).getExtAttrName(), connObjectKey),
-                    MappingUtils.buildOperationOptions(IteratorUtils.chainedIterator(
+                            MappingUtils.getConnObjectKeyItem(provision).get().getExtAttrName(), connObjectKey),
+                    MappingUtils.buildOperationOptions(new IteratorChain<>(
                             MappingUtils.getPropagationItems(provision).iterator(),
                             linkingMappingItems.iterator())));
 
@@ -658,7 +656,7 @@ public abstract class AbstractPropagationTaskExecutor implements PropagationTask
         ConnectorObject obj = null;
         try {
             obj = connector.getObject(new ObjectClass(task.getObjectClassName()),
-                    AttributeBuilder.build(orgUnit.getConnObjectKeyItem().getExtAttrName(), connObjectKey),
+                    AttributeBuilder.build(orgUnit.getConnObjectKeyItem().get().getExtAttrName(), connObjectKey),
                     MappingUtils.buildOperationOptions(MappingUtils.getPropagationItems(orgUnit).iterator()));
         } catch (TimeoutException toe) {
             LOG.debug("Request timeout", toe);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
index 7d81f11..a40d9b2 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DBPasswordPropagationActions.java
@@ -19,9 +19,8 @@
 package org.apache.syncope.core.provisioning.java.propagation;
 
 import java.util.HashSet;
+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.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
@@ -86,19 +85,13 @@ public class DBPasswordPropagationActions implements PropagationActions {
     }
 
     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;
     }
 
     private boolean cipherAlgorithmMatches(final String connectorAlgorithm, final CipherAlgorithm userAlgorithm) {
@@ -111,11 +104,7 @@ public class DBPasswordPropagationActions implements PropagationActions {
         }
 
         // Special check for "SHA" (user sync'd from LDAP)
-        if ("SHA1".equals(connectorAlgorithm) && "SHA".equals(userAlgorithm.name())) {
-            return true;
-        }
-
-        return false;
+        return "SHA1".equals(connectorAlgorithm) && "SHA".equals(userAlgorithm.name());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationReporter.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationReporter.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationReporter.java
index 635c015..6e58281 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationReporter.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/DefaultPropagationReporter.java
@@ -22,8 +22,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
@@ -44,13 +43,7 @@ public class DefaultPropagationReporter implements PropagationReporter {
     protected final List<PropagationStatus> statuses = new ArrayList<>();
 
     protected boolean add(final PropagationStatus status) {
-        return IterableUtils.matchesAny(statuses, new Predicate<PropagationStatus>() {
-
-            @Override
-            public boolean evaluate(final PropagationStatus item) {
-                return item.getResource().equals(status.getResource());
-            }
-        })
+        return statuses.stream().anyMatch(item -> item.getResource().equals(status.getResource()))
                 ? false
                 : statuses.add(status);
     }
@@ -83,23 +76,18 @@ public class DefaultPropagationReporter implements PropagationReporter {
     public void onPriorityResourceFailure(final String failingResource, final Collection<PropagationTask> tasks) {
         LOG.debug("Propagation error: {} priority resource failed to propagate", failingResource);
 
-        final PropagationTask propagationTask = IterableUtils.find(tasks, new Predicate<PropagationTask>() {
-
-            @Override
-            public boolean evaluate(final PropagationTask task) {
-                return task.getResource().getKey().equals(failingResource);
-            }
-        });
+        Optional<PropagationTask> propagationTask = tasks.stream().
+                filter(task -> task.getResource().getKey().equals(failingResource)).findFirst();
 
-        if (propagationTask == null) {
-            LOG.error("Could not find {} for {}", PropagationTask.class.getName(), failingResource);
-        } else {
+        if (propagationTask.isPresent()) {
             PropagationStatus status = new PropagationStatus();
-            status.setResource(propagationTask.getResource().getKey());
+            status.setResource(propagationTask.get().getResource().getKey());
             status.setStatus(PropagationTaskExecStatus.FAILURE);
             status.setFailureReason(
                     "Propagation error: " + failingResource + " priority resource failed to propagate.");
             add(status);
+        } else {
+            LOG.error("Could not find {} for {}", PropagationTask.class.getName(), failingResource);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
index b3d05f4..58fc0d3 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPMembershipPropagationActions.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.provisioning.java.propagation;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.jexl3.JexlContext;
 import org.apache.commons.jexl3.MapContext;
@@ -75,32 +76,30 @@ public class LDAPMembershipPropagationActions implements PropagationActions {
     @Transactional(readOnly = true)
     @Override
     public void before(final PropagationTask task, final ConnectorObject beforeObj) {
-        Provision provision = task.getResource().getProvision(anyTypeDAO.findGroup());
+        Optional<? extends Provision> provision = task.getResource().getProvision(anyTypeDAO.findGroup());
         if (AnyTypeKind.USER == task.getAnyTypeKind()
-                && provision != null && provision.getMapping() != null
-                && StringUtils.isNotBlank(provision.getMapping().getConnObjectLink())) {
+                && provision.isPresent() && provision.get().getMapping() != null
+                && StringUtils.isNotBlank(provision.get().getMapping().getConnObjectLink())) {
 
             User user = userDAO.find(task.getEntityKey());
             if (user != null) {
                 List<String> groupConnObjectLinks = new ArrayList<>();
-                for (String groupKey : userDAO.findAllGroupKeys(user)) {
+                userDAO.findAllGroupKeys(user).forEach(groupKey -> {
                     Group group = groupDAO.find(groupKey);
                     if (group != null && groupDAO.findAllResourceKeys(groupKey).contains(task.getResource().getKey())) {
                         LOG.debug("Evaluating connObjectLink for {}", group);
-
                         JexlContext jexlContext = new MapContext();
                         JexlUtils.addFieldsToContext(group, jexlContext);
                         JexlUtils.addPlainAttrsToContext(group.getPlainAttrs(), jexlContext);
                         JexlUtils.addDerAttrsToContext(group, jexlContext);
-
                         String groupConnObjectLinkLink =
-                                JexlUtils.evaluate(provision.getMapping().getConnObjectLink(), jexlContext);
+                                JexlUtils.evaluate(provision.get().getMapping().getConnObjectLink(), jexlContext);
                         LOG.debug("ConnObjectLink for {} is '{}'", group, groupConnObjectLinkLink);
                         if (StringUtils.isNotBlank(groupConnObjectLinkLink)) {
                             groupConnObjectLinks.add(groupConnObjectLinkLink);
                         }
                     }
-                }
+                });
                 LOG.debug("Group connObjectLinks to propagate for membership: {}", groupConnObjectLinks);
 
                 Set<Attribute> attributes = new HashSet<>(task.getAttributes());
@@ -108,9 +107,9 @@ public class LDAPMembershipPropagationActions implements PropagationActions {
                 Set<String> groups = new HashSet<>(groupConnObjectLinks);
                 Attribute ldapGroups = AttributeUtil.find(getGroupMembershipAttrName(), attributes);
                 if (ldapGroups != null) {
-                    for (Object obj : ldapGroups.getValue()) {
+                    ldapGroups.getValue().forEach(obj -> {
                         groups.add(obj.toString());
-                    }
+                    });
                     attributes.remove(ldapGroups);
                 }
                 attributes.add(AttributeBuilder.build(getGroupMembershipAttrName(), groups));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
index 5dcdf98..ea4f37d 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/LDAPPasswordPropagationActions.java
@@ -19,9 +19,8 @@
 package org.apache.syncope.core.provisioning.java.propagation;
 
 import java.util.HashSet;
+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.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
@@ -92,19 +91,13 @@ public class LDAPPasswordPropagationActions implements PropagationActions {
     }
 
     private String getCipherAlgorithm(final ConnInstance connInstance) {
-        ConnConfProperty cipherAlgorithm =
-                IterableUtils.find(connInstance.getConf(), new Predicate<ConnConfProperty>() {
-
-                    @Override
-                    public boolean evaluate(final ConnConfProperty property) {
-                        return "passwordHashAlgorithm".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 -> "passwordHashAlgorithm".equals(property.getSchema().getName())
+                && property.getValues() != null && !property.getValues().isEmpty()).findFirst();
+
+        return cipherAlgorithm.isPresent()
+                ? (String) cipherAlgorithm.get().getValues().get(0)
+                : CLEARTEXT;
     }
 
     private boolean cipherAlgorithmMatches(final String connectorAlgorithm, final CipherAlgorithm userAlgorithm) {
@@ -117,11 +110,7 @@ public class LDAPPasswordPropagationActions implements PropagationActions {
         }
 
         // Special check for "SHA" (user sync'd from LDAP)
-        if ("SHA".equals(connectorAlgorithm) && "SHA1".equals(userAlgorithm.name())) {
-            return true;
-        }
-
-        return false;
+        return "SHA".equals(connectorAlgorithm) && "SHA1".equals(userAlgorithm.name());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
index 5fc32e1..8322635 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/propagation/PriorityPropagationTaskExecutor.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.provisioning.java.propagation;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
@@ -32,9 +31,8 @@ import java.util.concurrent.CompletionService;
 import java.util.concurrent.ExecutorCompletionService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.PropagationTaskExecStatus;
 import org.apache.syncope.core.spring.ApplicationContextProvider;
 import org.apache.syncope.core.persistence.api.entity.task.PropagationTask;
@@ -84,21 +82,17 @@ public class PriorityPropagationTaskExecutor extends AbstractPropagationTaskExec
             final PropagationReporter reporter,
             final boolean nullPriorityAsync) {
 
-        List<PropagationTask> prioritizedTasks = CollectionUtils.select(tasks, new Predicate<PropagationTask>() {
-
-            @Override
-            public boolean evaluate(final PropagationTask task) {
-                return task.getResource().getPropagationPriority() != null;
-            }
-        }, new ArrayList<PropagationTask>());
+        List<PropagationTask> prioritizedTasks = tasks.stream().
+                filter(task -> task.getResource().getPropagationPriority() != null).collect(Collectors.toList());
         Collections.sort(prioritizedTasks, new PriorityComparator());
         LOG.debug("Propagation tasks sorted by priority, for serial execution: {}", prioritizedTasks);
 
-        Collection<PropagationTask> concurrentTasks = CollectionUtils.subtract(tasks, prioritizedTasks);
+        Collection<PropagationTask> concurrentTasks = tasks.stream().
+                filter(task -> !prioritizedTasks.contains(task)).collect(Collectors.toSet());
         LOG.debug("Propagation tasks for concurrent execution: {}", concurrentTasks);
 
         // first process priority resources sequentially and fail as soon as any propagation failure is reported
-        for (PropagationTask task : prioritizedTasks) {
+        prioritizedTasks.forEach(task -> {
             TaskExec execution = null;
             PropagationTaskExecStatus execStatus;
             try {
@@ -112,12 +106,12 @@ public class PriorityPropagationTaskExecutor extends AbstractPropagationTaskExec
                 throw new PropagationException(
                         task.getResource().getKey(), execution == null ? null : execution.getMessage());
             }
-        }
+        });
 
         // then process non-priority resources concurrently...
         final CompletionService<TaskExec> completionService = new ExecutorCompletionService<>(executor);
         Map<PropagationTask, Future<TaskExec>> nullPriority = new HashMap<>(concurrentTasks.size());
-        for (PropagationTask task : concurrentTasks) {
+        concurrentTasks.forEach(task -> {
             try {
                 nullPriority.put(
                         task,
@@ -125,36 +119,32 @@ public class PriorityPropagationTaskExecutor extends AbstractPropagationTaskExec
             } catch (Exception e) {
                 LOG.error("Unexpected exception", e);
             }
-        }
+        });
         // ...waiting for all callables to complete, if async processing was not required
         if (!nullPriority.isEmpty()) {
             if (nullPriorityAsync) {
-                for (Map.Entry<PropagationTask, Future<TaskExec>> entry : nullPriority.entrySet()) {
+                nullPriority.entrySet().forEach(entry -> {
                     reporter.onSuccessOrNonPriorityResourceFailures(
                             entry.getKey(), PropagationTaskExecStatus.CREATED, null, null, null);
-                }
+                });
             } else {
                 final Set<Future<TaskExec>> nullPriorityFutures = new HashSet<>(nullPriority.values());
                 try {
-                    executor.submit(new Runnable() {
-
-                        @Override
-                        public void run() {
-                            while (!nullPriorityFutures.isEmpty()) {
-                                try {
-                                    nullPriorityFutures.remove(completionService.take());
-                                } catch (Exception e) {
-                                    LOG.error("Unexpected exception", e);
-                                }
+                    executor.submit(() -> {
+                        while (!nullPriorityFutures.isEmpty()) {
+                            try {
+                                nullPriorityFutures.remove(completionService.take());
+                            } catch (Exception e) {
+                                LOG.error("Unexpected exception", e);
                             }
                         }
                     }).get(60, TimeUnit.SECONDS);
                 } catch (Exception e) {
                     LOG.error("Unexpected exception", e);
                 } finally {
-                    for (Future<TaskExec> future : nullPriorityFutures) {
+                    nullPriorityFutures.forEach(future -> {
                         future.cancel(true);
-                    }
+                    });
                     nullPriorityFutures.clear();
                     nullPriority.clear();
                 }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
index ba70562..1ea375d 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/policy/JPAPasswordPolicy.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity.policy;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
@@ -28,8 +29,6 @@ import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.policy.PasswordRuleConf;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 
@@ -91,12 +90,6 @@ public class JPAPasswordPolicy extends AbstractPolicy implements PasswordPolicy
 
     @Override
     public List<PasswordRuleConf> getRuleConfs() {
-        return CollectionUtils.collect(ruleConfs, new Transformer<JPAPasswordRuleConfInstance, PasswordRuleConf>() {
-
-            @Override
-            public PasswordRuleConf transform(final JPAPasswordRuleConfInstance input) {
-                return input.getInstance();
-            }
-        }, new ArrayList<PasswordRuleConf>());
+        return ruleConfs.stream().map(input -> input.getInstance()).collect(Collectors.toList());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
index 30462ce..511b586 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAExternalResource.java
@@ -19,8 +19,10 @@
 package org.apache.syncope.core.persistence.jpa.entity.resource;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
@@ -40,9 +42,6 @@ import javax.persistence.Table;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
@@ -208,25 +207,13 @@ public class JPAExternalResource extends AbstractProvidedKeyEntity implements Ex
     }
 
     @Override
-    public Provision getProvision(final ObjectClass objectClass) {
-        return IterableUtils.find(provisions, new Predicate<Provision>() {
-
-            @Override
-            public boolean evaluate(final Provision provision) {
-                return provision.getObjectClass().equals(objectClass);
-            }
-        });
+    public Optional<? extends Provision> getProvision(final ObjectClass objectClass) {
+        return provisions.stream().filter(provision -> provision.getObjectClass().equals(objectClass)).findFirst();
     }
 
     @Override
-    public Provision getProvision(final AnyType anyType) {
-        return IterableUtils.find(provisions, new Predicate<Provision>() {
-
-            @Override
-            public boolean evaluate(final Provision provision) {
-                return provision.getAnyType().equals(anyType);
-            }
-        });
+    public Optional<? extends Provision> getProvision(final AnyType anyType) {
+        return provisions.stream().filter(provision -> provision.getAnyType().equals(anyType)).findFirst();
     }
 
     @Override
@@ -343,7 +330,7 @@ public class JPAExternalResource extends AbstractProvidedKeyEntity implements Ex
     public Set<ConnConfProperty> getConfOverride() {
         Set<ConnConfProperty> confOverride = new HashSet<>();
         if (!StringUtils.isBlank(jsonConf)) {
-            CollectionUtils.addAll(confOverride, POJOHelper.deserialize(jsonConf, ConnConfProperty[].class));
+            confOverride.addAll(Arrays.asList(POJOHelper.deserialize(jsonConf, ConnConfProperty[].class)));
         }
 
         return confOverride;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
index bac3955..d0d6ede 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAMapping.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity.resource;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
@@ -27,8 +28,6 @@ import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.Provision;
@@ -77,14 +76,8 @@ public class JPAMapping extends AbstractGeneratedKeyEntity implements Mapping {
     }
 
     @Override
-    public MappingItem getConnObjectKeyItem() {
-        return IterableUtils.find(getItems(), new Predicate<MappingItem>() {
-
-            @Override
-            public boolean evaluate(final MappingItem item) {
-                return item.isConnObjectKey();
-            }
-        });
+    public Optional<? extends MappingItem> getConnObjectKeyItem() {
+        return getItems().stream().filter(MappingItem::isConnObjectKey).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnit.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnit.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnit.java
index ab4398d..6a76358 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnit.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/resource/JPAOrgUnit.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.entity.resource;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import javax.persistence.Cacheable;
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
@@ -29,8 +30,6 @@ import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnitItem;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
@@ -125,14 +124,8 @@ public class JPAOrgUnit extends AbstractGeneratedKeyEntity implements OrgUnit {
     }
 
     @Override
-    public OrgUnitItem getConnObjectKeyItem() {
-        return IterableUtils.find(getItems(), new Predicate<OrgUnitItem>() {
-
-            @Override
-            public boolean evaluate(final OrgUnitItem item) {
-                return item.isConnObjectKey();
-            }
-        });
+    public Optional<? extends OrgUnitItem> getConnObjectKeyItem() {
+        return getItems().stream().filter(OrgUnitItem::isConnObjectKey).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
index 7b415ff..ce029d8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPropagationTask.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.jpa.entity.task;
 
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 import javax.persistence.DiscriminatorValue;
@@ -26,7 +27,6 @@ import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ResourceOperation;
@@ -113,7 +113,7 @@ public class JPAPropagationTask extends AbstractTask implements PropagationTask
     public Set<Attribute> getAttributes() {
         Set<Attribute> result = new HashSet<>();
         if (StringUtils.isNotBlank(this.attributes)) {
-            CollectionUtils.addAll(result, POJOHelper.deserialize(this.attributes, Attribute[].class));
+            result.addAll(Arrays.asList(POJOHelper.deserialize(this.attributes, Attribute[].class)));
         }
 
         return result;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
index 7dca06c..54f70cf 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPullTask.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.entity.task;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.persistence.CascadeType;
 import javax.persistence.CollectionTable;
@@ -35,12 +36,9 @@ import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
 import javax.validation.constraints.NotNull;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.PullMode;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.AnyTemplate;
 import org.apache.syncope.core.persistence.jpa.entity.JPARealm;
 import org.apache.syncope.core.persistence.api.entity.task.PullTask;
 import org.apache.syncope.core.persistence.api.entity.task.AnyTemplatePullTask;
@@ -113,14 +111,10 @@ public class JPAPullTask extends AbstractProvisioningTask implements PullTask {
     }
 
     @Override
-    public AnyTemplatePullTask getTemplate(final AnyType anyType) {
-        return IterableUtils.find(templates, new Predicate<AnyTemplate>() {
-
-            @Override
-            public boolean evaluate(final AnyTemplate template) {
-                return anyType != null && anyType.equals(template.getAnyType());
-            }
-        });
+    public Optional<? extends AnyTemplatePullTask> getTemplate(final AnyType anyType) {
+        return templates.stream().
+                filter(template -> anyType != null && anyType.equals(template.getAnyType())).
+                findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
index 1ef12a4..efa84b7 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/task/JPAPushTask.java
@@ -21,6 +21,7 @@ package org.apache.syncope.core.persistence.jpa.entity.task;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.persistence.CascadeType;
 import javax.persistence.CollectionTable;
@@ -32,8 +33,6 @@ import javax.persistence.FetchType;
 import javax.persistence.JoinColumn;
 import javax.persistence.ManyToOne;
 import javax.persistence.OneToMany;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 import org.apache.syncope.core.persistence.api.entity.task.PushTask;
@@ -82,14 +81,8 @@ public class JPAPushTask extends AbstractProvisioningTask implements PushTask {
     }
 
     @Override
-    public PushTaskAnyFilter getFilter(final AnyType anyType) {
-        return IterableUtils.find(filters, new Predicate<PushTaskAnyFilter>() {
-
-            @Override
-            public boolean evaluate(final PushTaskAnyFilter filter) {
-                return anyType != null && anyType.equals(filter.getAnyType());
-            }
-        });
+    public Optional<? extends PushTaskAnyFilter> getFilter(final AnyType anyType) {
+        return filters.stream().filter(filter -> anyType != null && anyType.equals(filter.getAnyType())).findFirst();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
index 0dddb77..dcf205e 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUser.java
@@ -374,7 +374,7 @@ public class JPAUser
 
     @Override
     public Integer getFailedLogins() {
-        return failedLogins == null ? Integer.valueOf(0) : failedLogins;
+        return failedLogins == null ? 0 : failedLogins;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
index 691f5e4..7d8883a 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/spring/DomainTransactionInterceptor.java
@@ -43,18 +43,14 @@ public class DomainTransactionInterceptor extends TransactionInterceptor {
     public TransactionAttributeSource getTransactionAttributeSource() {
         final TransactionAttributeSource origTxAttrSource = super.getTransactionAttributeSource();
 
-        return new TransactionAttributeSource() {
+        return (final Method method, final Class<?> targetClass) -> {
+            TransactionAttribute txAttr = origTxAttrSource.getTransactionAttribute(method, targetClass);
 
-            @Override
-            public TransactionAttribute getTransactionAttribute(final Method method, final Class<?> targetClass) {
-                TransactionAttribute txAttr = origTxAttrSource.getTransactionAttribute(method, targetClass);
-
-                if (txAttr instanceof DefaultTransactionAttribute) {
-                    ((DefaultTransactionAttribute) txAttr).setQualifier(AuthContextUtils.getDomain());
-                }
-
-                return txAttr;
+            if (txAttr instanceof DefaultTransactionAttribute) {
+                ((DefaultTransactionAttribute) txAttr).setQualifier(AuthContextUtils.getDomain());
             }
+
+            return txAttr;
         };
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
index 719a240..5bedb07 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ExternalResourceValidator.java
@@ -22,8 +22,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import javax.validation.ConstraintValidatorContext;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
@@ -31,7 +29,6 @@ import org.apache.syncope.core.persistence.api.entity.resource.Item;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
 import org.apache.syncope.core.persistence.api.entity.resource.MappingItem;
 import org.apache.syncope.core.persistence.api.entity.resource.OrgUnit;
-import org.apache.syncope.core.persistence.api.entity.resource.Provision;
 import org.apache.syncope.core.provisioning.api.propagation.PropagationActions;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.apache.syncope.core.provisioning.api.data.ItemTransformer;
@@ -39,13 +36,7 @@ import org.apache.syncope.core.provisioning.api.data.ItemTransformer;
 public class ExternalResourceValidator extends AbstractValidator<ExternalResourceCheck, ExternalResource> {
 
     private boolean isValid(final List<? extends Item> items, final ConstraintValidatorContext context) {
-        long connObjectKeys = IterableUtils.countMatches(items, new Predicate<Item>() {
-
-            @Override
-            public boolean evaluate(final Item item) {
-                return item.isConnObjectKey();
-            }
-        });
+        long connObjectKeys = items.stream().filter(Item::isConnObjectKey).count();
         if (connObjectKeys != 1) {
             context.buildConstraintViolationWithTemplate(
                     getTemplate(EntityViolationType.InvalidMapping, "Single ConnObjectKey mapping is required")).
@@ -94,13 +85,7 @@ public class ExternalResourceValidator extends AbstractValidator<ExternalResourc
 
         boolean isValid = true;
 
-        long passwords = IterableUtils.countMatches(mapping.getItems(), new Predicate<MappingItem>() {
-
-            @Override
-            public boolean evaluate(final MappingItem item) {
-                return item.isPassword();
-            }
-        });
+        long passwords = mapping.getItems().stream().filter(MappingItem::isPassword).count();
         if (passwords > 1) {
             context.buildConstraintViolationWithTemplate(
                     getTemplate(EntityViolationType.InvalidMapping, "One password mapping is allowed at most")).
@@ -144,16 +129,12 @@ public class ExternalResourceValidator extends AbstractValidator<ExternalResourc
 
         final Set<AnyType> anyTypes = new HashSet<>();
         final Set<String> objectClasses = new HashSet<>();
-        boolean validMappings = IterableUtils.matchesAll(resource.getProvisions(), new Predicate<Provision>() {
-
-            @Override
-            public boolean evaluate(final Provision provision) {
-                anyTypes.add(provision.getAnyType());
-                if (provision.getObjectClass() != null) {
-                    objectClasses.add(provision.getObjectClass().getObjectClassValue());
-                }
-                return isValid(provision.getMapping(), context);
+        boolean validMappings = resource.getProvisions().stream().allMatch(provision -> {
+            anyTypes.add(provision.getAnyType());
+            if (provision.getObjectClass() != null) {
+                objectClasses.add(provision.getObjectClass().getObjectClassValue());
             }
+            return isValid(provision.getMapping(), context);
         });
         validMappings &= isValid(resource.getOrgUnit(), context);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ReportValidator.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ReportValidator.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ReportValidator.java
index e05dee8..b6cfd26 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ReportValidator.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/validation/entity/ReportValidator.java
@@ -19,11 +19,9 @@
 package org.apache.syncope.core.persistence.jpa.validation.entity;
 
 import java.text.ParseException;
-import java.util.HashSet;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.validation.ConstraintValidatorContext;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.report.ReportletConf;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.core.persistence.api.entity.Report;
@@ -50,14 +48,8 @@ public class ReportValidator extends AbstractValidator<ReportCheck, Report> {
             }
         }
 
-        Set<String> reportletNames = CollectionUtils.collect(object.getReportletConfs(),
-                new Transformer<ReportletConf, String>() {
-
-                    @Override
-                    public String transform(final ReportletConf input) {
-                        return input.getName();
-                    }
-                }, new HashSet<String>());
+        Set<String> reportletNames = object.getReportletConfs().stream().
+                map(ReportletConf::getName).collect(Collectors.toSet());
         if (reportletNames.size() != object.getReportletConfs().size()) {
             LOG.error("Reportlet name must be unique");
             isValid = false;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
index 1ba9913..a6bcf52 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
@@ -25,11 +25,9 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -50,8 +48,8 @@ import org.apache.syncope.core.persistence.api.dao.search.AssignableCond;
 import org.apache.syncope.core.persistence.api.dao.search.MemberCond;
 import org.apache.syncope.core.persistence.api.dao.search.RelationshipCond;
 import org.apache.syncope.core.persistence.api.dao.search.RelationshipTypeCond;
-import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
@@ -203,10 +201,7 @@ public class AnySearchTest extends AbstractTest {
         assertNotNull(users);
         assertEquals(4, users.size());
 
-        Set<String> ids = new HashSet<>(users.size());
-        for (User user : users) {
-            ids.add(user.getKey());
-        }
+        Set<String> ids = users.stream().map(Entity::getKey).collect(Collectors.toSet());
         assertTrue(ids.contains("1417acbe-cbf6-4277-9372-e75e04f97000"));
         assertTrue(ids.contains("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee"));
     }
@@ -224,10 +219,7 @@ public class AnySearchTest extends AbstractTest {
         assertNotNull(users);
         assertEquals(4, users.size());
 
-        Set<String> ids = new HashSet<>(users.size());
-        for (User user : users) {
-            ids.add(user.getKey());
-        }
+        Set<String> ids = users.stream().map(Entity::getKey).collect(Collectors.toSet());
         assertTrue(ids.contains("1417acbe-cbf6-4277-9372-e75e04f97000"));
         assertTrue(ids.contains("b3cbc78d-32e6-4bd4-92e0-bbe07566a2ee"));
     }
@@ -484,36 +476,18 @@ public class AnySearchTest extends AbstractTest {
                 SearchCond.getLeafCond(relationshipTypeCond), SearchCond.getLeafCond(tcond));
         assertTrue(searchCondition.isValid());
 
-        List<AnyObject> matching = searchDAO.search(searchCondition, AnyTypeKind.ANY_OBJECT);
-        assertNotNull(matching);
-        assertEquals(2, matching.size());
-        assertTrue(IterableUtils.matchesAny(matching, new Predicate<AnyObject>() {
-
-            @Override
-            public boolean evaluate(final AnyObject any) {
-                return "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(any.getKey());
-            }
-        }));
-        assertTrue(IterableUtils.matchesAny(matching, new Predicate<AnyObject>() {
-
-            @Override
-            public boolean evaluate(final AnyObject any) {
-                return "8559d14d-58c2-46eb-a2d4-a7d35161e8f8".equals(any.getKey());
-            }
-        }));
+        List<AnyObject> anyObjects = searchDAO.search(searchCondition, AnyTypeKind.ANY_OBJECT);
+        assertNotNull(anyObjects);
+        assertEquals(2, anyObjects.size());
+        assertTrue(anyObjects.stream().anyMatch(any -> "fc6dbc3a-6c07-4965-8781-921e7401a4a5".equals(any.getKey())));
+        assertTrue(anyObjects.stream().anyMatch(any -> "8559d14d-58c2-46eb-a2d4-a7d35161e8f8".equals(any.getKey())));
 
         // 2. search for users involved in "neighborhood" relationship
         searchCondition = SearchCond.getLeafCond(relationshipTypeCond);
-        matching = searchDAO.search(searchCondition, AnyTypeKind.USER);
-        assertNotNull(matching);
-        assertEquals(1, matching.size());
-        assertTrue(IterableUtils.matchesAny(matching, new Predicate<Any<?>>() {
-
-            @Override
-            public boolean evaluate(final Any<?> any) {
-                return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(any.getKey());
-            }
-        }));
+        List<User> users = searchDAO.search(searchCondition, AnyTypeKind.USER);
+        assertNotNull(users);
+        assertEquals(1, users.size());
+        assertTrue(users.stream().anyMatch(any -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(any.getKey())));
     }
 
     @Test
@@ -569,20 +543,8 @@ public class AnySearchTest extends AbstractTest {
         assertTrue(searchCondition.isValid());
 
         List<Group> groups = searchDAO.search(searchCondition, AnyTypeKind.GROUP);
-        assertTrue(IterableUtils.matchesAny(groups, new Predicate<Group>() {
-
-            @Override
-            public boolean evaluate(final Group group) {
-                return "additional".equals(group.getName());
-            }
-        }));
-        assertFalse(IterableUtils.matchesAny(groups, new Predicate<Group>() {
-
-            @Override
-            public boolean evaluate(final Group group) {
-                return "fake".equals(group.getName());
-            }
-        }));
+        assertTrue(groups.stream().anyMatch(group -> "additional".equals(group.getName())));
+        assertFalse(groups.stream().anyMatch(group -> "fake".equals(group.getName())));
 
         assignableCond = new AssignableCond();
         assignableCond.setRealmFullPath("/odd");
@@ -590,13 +552,8 @@ public class AnySearchTest extends AbstractTest {
         assertTrue(searchCondition.isValid());
 
         List<AnyObject> anyObjects = searchDAO.search(searchCondition, AnyTypeKind.ANY_OBJECT);
-        assertFalse(IterableUtils.matchesAny(anyObjects, new Predicate<AnyObject>() {
-
-            @Override
-            public boolean evaluate(final AnyObject anyObject) {
-                return "9e1d130c-d6a3-48b1-98b3-182477ed0688".equals(anyObject.getKey());
-            }
-        }));
+        assertFalse(anyObjects.stream().
+                anyMatch(anyObject -> "9e1d130c-d6a3-48b1-98b3-182477ed0688".equals(anyObject.getKey())));
     }
 
     @Test
@@ -627,13 +584,7 @@ public class AnySearchTest extends AbstractTest {
         List<User> users = searchDAO.search(searchCondition, AnyTypeKind.USER);
         assertNotNull(users);
         assertEquals(2, users.size());
-        assertTrue(IterableUtils.matchesAny(users, new Predicate<User>() {
-
-            @Override
-            public boolean evaluate(final User user) {
-                return "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey());
-            }
-        }));
+        assertTrue(users.stream().anyMatch(user -> "c9b2dec2-00a7-4855-97c0-d854842b4b24".equals(user.getKey())));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
index 511a359..d72ea14 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConfTest.java
@@ -19,11 +19,11 @@
 package org.apache.syncope.core.persistence.jpa.inner;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import java.util.Optional;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
@@ -49,16 +49,16 @@ public class ConfTest extends AbstractTest {
 
     @Test
     public void read() {
-        CPlainAttr conf = confDAO.find("selfRegistration.allowed");
-        assertNotNull(conf);
-        assertTrue(conf.getValues().get(0).getBooleanValue());
+        Optional<? extends CPlainAttr> conf = confDAO.find("selfRegistration.allowed");
+        assertTrue(conf.isPresent());
+        assertTrue(conf.get().getValues().get(0).getBooleanValue());
 
         conf = confDAO.find("authentication.statuses");
-        assertNotNull(conf);
-        assertEquals(2, conf.getValues().size());
+        assertTrue(conf.isPresent());
+        assertEquals(2, conf.get().getValues().size());
 
         conf = confDAO.find("non.existing");
-        assertNull(conf);
+        assertFalse(conf.isPresent());
     }
 
     private void add(final CPlainAttr newAttr, final String value) {
@@ -88,8 +88,8 @@ public class ConfTest extends AbstractTest {
         add(newConf, "2014-06-20");
         confDAO.save(newConf);
 
-        CPlainAttr actual = confDAO.find("useless");
-        assertEquals(actual.getValuesAsStrings(), newConf.getValuesAsStrings());
+        Optional<? extends CPlainAttr> actual = confDAO.find("useless");
+        assertEquals(actual.get().getValuesAsStrings(), newConf.getValuesAsStrings());
 
         // 3. update conf
         newConf.getValues().clear();
@@ -97,11 +97,11 @@ public class ConfTest extends AbstractTest {
         confDAO.save(newConf);
 
         actual = confDAO.find("useless");
-        assertEquals(actual.getValuesAsStrings(), newConf.getValuesAsStrings());
+        assertEquals(actual.get().getValuesAsStrings(), newConf.getValuesAsStrings());
 
         // 4. delete conf
         confDAO.delete("useless");
-        assertNull(confDAO.find("useless"));
+        assertFalse(confDAO.find("useless").isPresent());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
index 5020adb..fd47175 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ConnInstanceTest.java
@@ -26,12 +26,10 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.io.File;
-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.types.ConnConfPropSchema;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
@@ -57,14 +55,9 @@ public class ConnInstanceTest extends AbstractTest {
 
     @Test
     public void findAll() {
-        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(

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
index c3ef956..6a4057b 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/GroupTest.java
@@ -59,7 +59,7 @@ public class GroupTest extends AbstractTest {
         group = groupDAO.findByName("additional");
         assertNotNull(group);
         assertEquals(1, group.getTypeExtensions().size());
-        assertEquals(2, group.getTypeExtension(anyTypeDAO.findUser()).getAuxClasses().size());
+        assertEquals(2, group.getTypeExtension(anyTypeDAO.findUser()).get().getAuxClasses().size());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
index 80077a7..5ca623c 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/MultitenancyTest.java
@@ -23,10 +23,8 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.util.ArrayList;
 import java.util.List;
-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.types.CipherAlgorithm;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -60,14 +58,9 @@ public class MultitenancyTest 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(

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
index 3eda5ed..c80caaf 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/PlainAttrTest.java
@@ -190,7 +190,7 @@ public class PlainAttrTest extends AbstractTest {
 
         userDAO.save(user);
 
-        UPlainAttr obscure = user.getPlainAttr("obscure");
+        UPlainAttr obscure = user.getPlainAttr("obscure").get();
         assertNotNull(obscure);
         assertEquals(1, obscure.getValues().size());
         assertEquals(Encryptor.getInstance(obscureSchema.getSecretKey()).
@@ -217,10 +217,10 @@ public class PlainAttrTest extends AbstractTest {
 
         userDAO.save(user);
 
-        UPlainAttr obscure = user.getPlainAttr("photo");
-        assertNotNull(obscure);
-        assertEquals(1, obscure.getValues().size());
-        assertTrue(Arrays.equals(bytes, obscure.getValues().get(0).getBinaryValue()));
+        UPlainAttr photo = user.getPlainAttr("photo").get();
+        assertNotNull(photo);
+        assertEquals(1, photo.getValues().size());
+        assertTrue(Arrays.equals(bytes, photo.getValues().get(0).getBinaryValue()));
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
index d8d853a..2e8d215 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/RealmTest.java
@@ -26,7 +26,6 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
@@ -93,12 +92,6 @@ public class RealmTest extends AbstractTest {
     }
 
     @Test
-    public void findDescendants() {
-        assertTrue(CollectionUtils.disjunction(realmDAO.findAll(), realmDAO.findDescendants(realmDAO.getRoot())).
-                isEmpty());
-    }
-
-    @Test
     public void findAll() {
         List<Realm> list = realmDAO.findAll();
         assertNotNull(list);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
index 9439827..a1fe83e 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/ResourceTest.java
@@ -25,12 +25,8 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 import org.apache.syncope.common.lib.types.MappingPurpose;
@@ -75,16 +71,11 @@ public class ResourceTest extends AbstractTest {
                 "net.tirasa.connid.bundles.soap.WebServiceConnector", connector.getConnectorName());
         assertEquals("invalid bundle name", "net.tirasa.connid.bundles.soap", connector.getBundleName());
 
-        Mapping mapping = resource.getProvision(anyTypeDAO.findUser()).getMapping();
+        Mapping mapping = resource.getProvision(anyTypeDAO.findUser()).get().getMapping();
         assertFalse("no mapping specified", mapping.getItems().isEmpty());
 
-        assertTrue(IterableUtils.matchesAny(mapping.getItems(), new Predicate<MappingItem>() {
-
-            @Override
-            public boolean evaluate(final MappingItem item) {
-                return "7f55b09c-b573-41dc-a9eb-ccd80bd3ea7a".equals(item.getKey());
-            }
-        }));
+        assertTrue(mapping.getItems().stream().
+                anyMatch(item -> "7f55b09c-b573-41dc-a9eb-ccd80bd3ea7a".equals(item.getKey())));
 
         try {
             resourceDAO.authFind("ws-target-resource-1");
@@ -103,14 +94,9 @@ public class ResourceTest extends AbstractTest {
 
     @Test
     public void findAll() {
-        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(
@@ -131,8 +117,8 @@ public class ResourceTest extends AbstractTest {
     public void getConnObjectKey() {
         ExternalResource resource = resourceDAO.find("ws-target-resource-2");
         assertNotNull(resource);
-        assertEquals("fullname",
-                resource.getProvision(anyTypeDAO.findUser()).getMapping().getConnObjectKeyItem().getIntAttrName());
+        assertEquals("fullname", resource.getProvision(anyTypeDAO.findUser()).get().
+                getMapping().getConnObjectKeyItem().get().getIntAttrName());
     }
 
     @Test
@@ -165,8 +151,8 @@ public class ResourceTest extends AbstractTest {
 
         assertNotNull(actual);
         assertNotNull(actual.getConnector());
-        assertNotNull(actual.getProvision(anyTypeDAO.findUser()).getMapping());
-        assertFalse(actual.getProvision(anyTypeDAO.findUser()).getMapping().getItems().isEmpty());
+        assertNotNull(actual.getProvision(anyTypeDAO.findUser()).get().getMapping());
+        assertFalse(actual.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().isEmpty());
         assertEquals(Integer.valueOf(2), actual.getPropagationPriority());
     }
 
@@ -335,7 +321,7 @@ public class ResourceTest extends AbstractTest {
         ExternalResource actual = resourceDAO.save(resource);
         assertNotNull(actual);
 
-        assertEquals(3, actual.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+        assertEquals(3, actual.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().size());
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
index 192ef0f..e6b0410 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/VirSchemaTest.java
@@ -62,7 +62,7 @@ public class VirSchemaTest extends AbstractTest {
     @Test
     public void save() {
         ExternalResource csv = resourceDAO.find("resource-csv");
-        Provision provision = csv.getProvision(ObjectClass.ACCOUNT);
+        Provision provision = csv.getProvision(ObjectClass.ACCOUNT).get();
         assertNotNull(provision);
 
         VirSchema virSchema = entityFactory.newEntity(VirSchema.class);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConfTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConfTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConfTest.java
index f9bcff1..c5559df 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConfTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ConfTest.java
@@ -53,7 +53,7 @@ public class ConfTest extends AbstractTest {
 
     @Test
     public void update() {
-        CPlainAttr expireTime = confDAO.find("token.expireTime");
+        CPlainAttr expireTime = confDAO.find("token.expireTime").get();
         assertNotNull(expireTime);
         long value = expireTime.getValues().get(0).getLongValue();
         value++;
@@ -65,7 +65,7 @@ public class ConfTest extends AbstractTest {
         confDAO.save(expireTime);
         confDAO.flush();
 
-        CPlainAttr actual = confDAO.find("token.expireTime");
+        CPlainAttr actual = confDAO.find("token.expireTime").get();
         assertEquals(expireTime, actual);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
index fc359e3..bf00361 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java
@@ -29,9 +29,8 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.stream.Collectors;
 import javax.persistence.Query;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
@@ -146,7 +145,7 @@ public class GroupTest extends AbstractTest {
         group = groupDAO.findByName("new");
         assertNotNull(group);
         assertEquals(1, group.getTypeExtensions().size());
-        assertEquals(2, group.getTypeExtension(anyTypeDAO.findUser()).getAuxClasses().size());
+        assertEquals(2, group.getTypeExtension(anyTypeDAO.findUser()).get().getAuxClasses().size());
     }
 
     @Test
@@ -179,22 +178,23 @@ public class GroupTest extends AbstractTest {
      * required for avoiding creating of a new transaction - good for general use case but bad for the way how
      * this test class is architected.
      */
-    private List<Group> findDynGroups(final User user) {
+    @SuppressWarnings("unchecked")
+    public List<Group> findDynGroups(final User user) {
         Query query = entityManager().createNativeQuery(
                 "SELECT group_id FROM " + JPAGroupDAO.UDYNMEMB_TABLE + " WHERE any_id=?");
         query.setParameter(1, user.getKey());
 
         List<Group> result = new ArrayList<>();
-        for (Object key : query.getResultList()) {
-            String actualKey = key instanceof Object[]
-                    ? (String) ((Object[]) key)[0]
-                    : ((String) key);
-
-            Group group = groupDAO.find(actualKey);
-            if (group != null && !result.contains(group)) {
-                result.add(group);
-            }
-        }
+        query.getResultList().stream().map(resultKey -> resultKey instanceof Object[]
+                ? (String) ((Object[]) resultKey)[0]
+                : ((String) resultKey)).
+                forEachOrdered(actualKey -> {
+                    Group group = groupDAO.find(actualKey.toString());
+                    if (group == null) {
+                    } else if (!result.contains(group)) {
+                        result.add(group);
+                    }
+                });
         return result;
     }
 
@@ -279,22 +279,23 @@ public class GroupTest extends AbstractTest {
      * required for avoiding creating of a new transaction - good for general use case but bad for the way how
      * this test class is architected.
      */
-    private List<Group> findDynGroups(final AnyObject anyObject) {
+    @SuppressWarnings("unchecked")
+    public List<Group> findDynGroups(final AnyObject anyObject) {
         Query query = entityManager().createNativeQuery(
                 "SELECT group_id FROM " + JPAGroupDAO.ADYNMEMB_TABLE + " WHERE any_id=?");
         query.setParameter(1, anyObject.getKey());
 
         List<Group> result = new ArrayList<>();
-        for (Object key : query.getResultList()) {
-            String actualKey = key instanceof Object[]
-                    ? (String) ((Object[]) key)[0]
-                    : ((String) key);
-
-            Group group = groupDAO.find(actualKey);
-            if (group != null && !result.contains(group)) {
-                result.add(group);
-            }
-        }
+        query.getResultList().stream().map(resultKey -> resultKey instanceof Object[]
+                ? (String) ((Object[]) resultKey)[0]
+                : ((String) resultKey)).
+                forEachOrdered(actualKey -> {
+                    Group group = groupDAO.find(actualKey.toString());
+                    if (group == null) {
+                    } else if (!result.contains(group)) {
+                        result.add(group);
+                    }
+                });
         return result;
     }
 
@@ -336,18 +337,13 @@ public class GroupTest extends AbstractTest {
         // 2. verify that dynamic membership is there
         actual = groupDAO.find(actual.getKey());
         assertNotNull(actual);
-        assertNotNull(actual.getADynMembership(anyTypeDAO.find("PRINTER")));
-        assertNotNull(actual.getADynMembership(anyTypeDAO.find("PRINTER")).getKey());
-        assertEquals(actual, actual.getADynMembership(anyTypeDAO.find("PRINTER")).getGroup());
+        assertNotNull(actual.getADynMembership(anyTypeDAO.find("PRINTER")).get());
+        assertNotNull(actual.getADynMembership(anyTypeDAO.find("PRINTER")).get().getKey());
+        assertEquals(actual, actual.getADynMembership(anyTypeDAO.find("PRINTER")).get().getGroup());
 
         // 3. verify that expected any objects have the created group dynamically assigned
-        List<String> members = CollectionUtils.select(groupDAO.findADynMembers(actual), new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String object) {
-                return "PRINTER".equals(anyObjectDAO.find(object).getType().getKey());
-            }
-        }, new ArrayList<String>());
+        List<String> members = groupDAO.findADynMembers(actual).stream().filter(object
+                -> "PRINTER".equals(anyObjectDAO.find(object).getType().getKey())).collect(Collectors.toList());
         assertEquals(2, members.size());
         assertEquals(
                 new HashSet<>(Arrays.asList("fc6dbc3a-6c07-4965-8781-921e7401a4a5", newAnyObjectKey)),
@@ -357,7 +353,7 @@ public class GroupTest extends AbstractTest {
         assertNotNull(anyObject);
         Collection<Group> dynGroupMemberships = findDynGroups(anyObject);
         assertEquals(1, dynGroupMemberships.size());
-        assertTrue(dynGroupMemberships.contains(actual.getADynMembership(anyTypeDAO.find("PRINTER")).getGroup()));
+        assertTrue(dynGroupMemberships.contains(actual.getADynMembership(anyTypeDAO.find("PRINTER")).get().getGroup()));
 
         // 4. delete the new any object and verify that dynamic membership was updated
         anyObjectDAO.delete(newAnyObjectKey);
@@ -365,18 +361,13 @@ public class GroupTest extends AbstractTest {
         anyObjectDAO.flush();
 
         actual = groupDAO.find(actual.getKey());
-        members = CollectionUtils.select(groupDAO.findADynMembers(actual), new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String object) {
-                return "PRINTER".equals(anyObjectDAO.find(object).getType().getKey());
-            }
-        }, new ArrayList<String>());
+        members = groupDAO.findADynMembers(actual).stream().filter(object
+                -> "PRINTER".equals(anyObjectDAO.find(object).getType().getKey())).collect(Collectors.toList());
         assertEquals(1, members.size());
         assertEquals("fc6dbc3a-6c07-4965-8781-921e7401a4a5", members.get(0));
 
         // 5. delete group and verify that dynamic membership was also removed
-        String dynMembershipKey = actual.getADynMembership(anyTypeDAO.find("PRINTER")).getKey();
+        String dynMembershipKey = actual.getADynMembership(anyTypeDAO.find("PRINTER")).get().getKey();
 
         groupDAO.delete(actual);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
index 5d8f021..16a80df 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/PlainSchemaTest.java
@@ -25,14 +25,12 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
+import java.util.stream.Collectors;
 import javax.persistence.EntityExistsException;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -81,14 +79,9 @@ public class PlainSchemaTest 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(
@@ -124,7 +117,7 @@ public class PlainSchemaTest extends AbstractTest {
         // fullname is mapped as ConnObjectKey for ws-target-resource-2, need to swap it otherwise validation errors 
         // will be raised
         for (MappingItem item : resourceDAO.find("ws-target-resource-2").
-                getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                getProvision(anyTypeDAO.findUser()).get().getMapping().getItems()) {
 
             if ("fullname".equals(item.getIntAttrName())) {
                 item.setConnObjectKey(false);
@@ -140,10 +133,10 @@ public class PlainSchemaTest extends AbstractTest {
         // check for associated mappings
         Set<MappingItem> mapItems = new HashSet<>();
         for (ExternalResource resource : resourceDAO.findAll()) {
-            if (resource.getProvision(anyTypeDAO.findUser()) != null
-                    && resource.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+            if (resource.getProvision(anyTypeDAO.findUser()).isPresent()
+                    && resource.getProvision(anyTypeDAO.findUser()).get().getMapping() != null) {
 
-                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems()) {
                     if (schema.getKey().equals(mapItem.getIntAttrName())) {
                         mapItems.add(mapItem);
                     }
@@ -166,10 +159,10 @@ public class PlainSchemaTest extends AbstractTest {
         // check for mappings deletion
         mapItems = new HashSet<>();
         for (ExternalResource resource : resourceDAO.findAll()) {
-            if (resource.getProvision(anyTypeDAO.findUser()) != null
-                    && resource.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+            if (resource.getProvision(anyTypeDAO.findUser()).isPresent()
+                    && resource.getProvision(anyTypeDAO.findUser()).get().getMapping() != null) {
 
-                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems()) {
                     if ("fullname".equals(mapItem.getIntAttrName())) {
                         mapItems.add(mapItem);
                     }
@@ -180,8 +173,8 @@ public class PlainSchemaTest extends AbstractTest {
 
         assertNull(plainAttrDAO.find("01f22fbd-b672-40af-b528-686d9b27ebc4", UPlainAttr.class));
         assertNull(plainAttrDAO.find(UUID.randomUUID().toString(), UPlainAttr.class));
-        assertNull(userDAO.findByUsername("rossini").getPlainAttr("fullname"));
-        assertNull(userDAO.findByUsername("vivaldi").getPlainAttr("fullname"));
+        assertFalse(userDAO.findByUsername("rossini").getPlainAttr("fullname").isPresent());
+        assertFalse(userDAO.findByUsername("vivaldi").getPlainAttr("fullname").isPresent());
     }
 
     @Test
@@ -193,10 +186,10 @@ public class PlainSchemaTest extends AbstractTest {
         // check for associated mappings
         Set<MappingItem> mappings = new HashSet<>();
         for (ExternalResource resource : resourceDAO.findAll()) {
-            if (resource.getProvision(anyTypeDAO.findUser()) != null
-                    && resource.getProvision(anyTypeDAO.findUser()).getMapping() != null) {
+            if (resource.getProvision(anyTypeDAO.findUser()).isPresent()
+                    && resource.getProvision(anyTypeDAO.findUser()).get().getMapping() != null) {
 
-                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems()) {
+                for (MappingItem mapItem : resource.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems()) {
                     if (schema.getKey().equals(mapItem.getIntAttrName())) {
                         mappings.add(mapItem);
                     }
@@ -218,7 +211,7 @@ public class PlainSchemaTest extends AbstractTest {
     @Test
     public void deleteFirstname() {
         assertEquals(5, resourceDAO.find("resource-db-pull").
-                getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+                getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().size());
 
         plainSchemaDAO.delete("firstname");
         assertNull(plainSchemaDAO.find("firstname"));
@@ -226,6 +219,6 @@ public class PlainSchemaTest extends AbstractTest {
         plainSchemaDAO.flush();
 
         assertEquals(4, resourceDAO.find("resource-db-pull").
-                getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+                getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().size());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
index f027930..de6d911 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/ResourceTest.java
@@ -24,11 +24,10 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.types.MappingPurpose;
 import org.apache.syncope.common.lib.types.TaskType;
 import org.apache.syncope.core.persistence.api.dao.AnyTypeDAO;
@@ -40,7 +39,7 @@ 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.dao.search.OrderByClause;
 import org.apache.syncope.core.persistence.api.entity.ConnInstance;
-import org.apache.syncope.core.persistence.api.entity.VirSchema;
+import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
 import org.apache.syncope.core.persistence.api.entity.resource.Mapping;
@@ -156,7 +155,7 @@ public class ResourceTest extends AbstractTest {
         // save the resource
         ExternalResource actual = resourceDAO.save(resource);
         assertNotNull(actual);
-        assertNotNull(actual.getProvision(anyTypeDAO.findUser()).getMapping());
+        assertNotNull(actual.getProvision(anyTypeDAO.findUser()).get().getMapping());
 
         resourceDAO.flush();
         resourceDAO.detach(actual);
@@ -184,7 +183,7 @@ public class ResourceTest extends AbstractTest {
         assertTrue(resource.getConnector().equals(connector));
 
         // check mappings
-        List<? extends MappingItem> items = resource.getProvision(anyTypeDAO.findUser()).getMapping().getItems();
+        List<? extends MappingItem> items = resource.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems();
         assertNotNull(items);
         assertEquals(5, items.size());
 
@@ -213,10 +212,7 @@ public class ResourceTest extends AbstractTest {
         List<User> users = userDAO.findByResource(resource);
         assertNotNull(users);
 
-        Set<String> userKeys = new HashSet<>();
-        for (User user : users) {
-            userKeys.add(user.getKey());
-        }
+        Set<String> userKeys = users.stream().map(Entity::getKey).collect(Collectors.toSet());
         // -------------------------------------
 
         // Get tasks
@@ -235,57 +231,50 @@ public class ResourceTest extends AbstractTest {
         assertNull("delete did not work", actual);
 
         // resource must be not referenced any more from users
-        for (String key : userKeys) {
-            User actualUser = userDAO.find(key);
-            assertNotNull(actualUser);
-            for (ExternalResource res : userDAO.findAllResources(actualUser)) {
-                assertFalse(res.getKey().equalsIgnoreCase(resource.getKey()));
-            }
-        }
+        userKeys.stream().
+                map(key -> userDAO.find(key)).
+                map(actualUser -> {
+                    assertNotNull(actualUser);
+                    return actualUser;
+                }).forEachOrdered((actualUser) -> {
+            userDAO.findAllResources(actualUser).
+                    forEach(res -> assertFalse(res.getKey().equalsIgnoreCase(resource.getKey())));
+        });
 
         // resource must be not referenced any more from the connector
         ConnInstance actualConnector = connInstanceDAO.find(connector.getKey());
         assertNotNull(actualConnector);
-        for (ExternalResource res : actualConnector.getResources()) {
-            assertFalse(res.getKey().equalsIgnoreCase(resource.getKey()));
-        }
+        actualConnector.getResources().
+                forEach(res -> assertFalse(res.getKey().equalsIgnoreCase(resource.getKey())));
 
         // there must be no tasks
-        for (PropagationTask task : propagationTasks) {
-            assertNull(taskDAO.find(task.getKey()));
-        }
+        propagationTasks.forEach(task -> assertNull(taskDAO.find(task.getKey())));
     }
 
     @Test
     public void emptyMapping() {
         ExternalResource ldap = resourceDAO.find("resource-ldap");
         assertNotNull(ldap);
-        assertNotNull(ldap.getProvision(anyTypeDAO.findUser()).getMapping());
-        assertNotNull(ldap.getProvision(anyTypeDAO.findGroup()).getMapping());
+        assertNotNull(ldap.getProvision(anyTypeDAO.findUser()).get().getMapping());
+        assertNotNull(ldap.getProvision(anyTypeDAO.findGroup()).get().getMapping());
 
         // need to avoid any class not defined in this Maven module
         ldap.getPropagationActionsClassNames().clear();
 
-        List<? extends MappingItem> items = ldap.getProvision(anyTypeDAO.findGroup()).getMapping().getItems();
+        List<? extends MappingItem> items = ldap.getProvision(anyTypeDAO.findGroup()).get().getMapping().getItems();
         assertNotNull(items);
         assertFalse(items.isEmpty());
-        List<String> itemKeys = new ArrayList<>(items.size());
-        for (MappingItem item : items) {
-            itemKeys.add(item.getKey());
-        }
+        List<String> itemKeys = items.stream().map(Entity::getKey).collect(Collectors.toList());
 
-        Provision groupProvision = ldap.getProvision(anyTypeDAO.findGroup());
-        for (VirSchema schema : virSchemaDAO.findByProvision(groupProvision)) {
-            virSchemaDAO.delete(schema.getKey());
-        }
+        Provision groupProvision = ldap.getProvision(anyTypeDAO.findGroup()).get();
+        virSchemaDAO.findByProvision(groupProvision).
+                forEach(schema -> virSchemaDAO.delete(schema.getKey()));
         ldap.getProvisions().remove(groupProvision);
 
         resourceDAO.save(ldap);
         resourceDAO.flush();
 
-        for (String itemKey : itemKeys) {
-            assertNull(entityManager().find(JPAMappingItem.class, itemKey));
-        }
+        itemKeys.forEach(itemKey -> assertNull(entityManager().find(JPAMappingItem.class, itemKey)));
     }
 
     @Test
@@ -314,19 +303,19 @@ public class ResourceTest extends AbstractTest {
         ExternalResource csv = resourceDAO.find("resource-csv");
         assertNotNull(csv);
 
-        int origMapItems = csv.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size();
+        int origMapItems = csv.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().size();
 
         MappingItem newMapItem = entityFactory.newEntity(MappingItem.class);
         newMapItem.setIntAttrName("TEST");
         newMapItem.setExtAttrName("TEST");
         newMapItem.setPurpose(MappingPurpose.PROPAGATION);
-        csv.getProvision(anyTypeDAO.findUser()).getMapping().add(newMapItem);
+        csv.getProvision(anyTypeDAO.findUser()).get().getMapping().add(newMapItem);
 
         resourceDAO.save(csv);
         resourceDAO.flush();
 
         csv = resourceDAO.find("resource-csv");
         assertNotNull(csv);
-        assertEquals(origMapItems + 1, csv.getProvision(anyTypeDAO.findUser()).getMapping().getItems().size());
+        assertEquals(origMapItems + 1, csv.getProvision(anyTypeDAO.findUser()).get().getMapping().getItems().size());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
index ede95f7..074488f 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/UserTest.java
@@ -28,8 +28,6 @@ import static org.junit.Assert.fail;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.persistence.api.attrvalue.validation.InvalidEntityException;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
@@ -181,8 +179,8 @@ public class UserTest extends AbstractTest {
 
         // replace 'artDirector' with 'additional', which defines type extension with class 'other' and 'csv':
         // now it works
-        membership = user.getMembership(groupDAO.findByName("artDirector").getKey());
-        user.remove(user.getPlainAttr("obscure", membership));
+        membership = user.getMembership(groupDAO.findByName("artDirector").getKey()).get();
+        user.remove(user.getPlainAttr("obscure", membership).get());
         user.getMemberships().remove(membership);
         membership.setLeftEnd(null);
 
@@ -204,26 +202,14 @@ public class UserTest extends AbstractTest {
         user = userDAO.findByUsername("vivaldi");
         assertEquals(1, user.getMemberships().size());
 
-        final UMembership newM = user.getMembership(groupDAO.findByName("additional").getKey());
+        final UMembership newM = user.getMembership(groupDAO.findByName("additional").getKey()).get();
         assertEquals(1, user.getPlainAttrs(newM).size());
 
-        assertNull(user.getPlainAttr("obscure").getMembership());
+        assertNull(user.getPlainAttr("obscure").get().getMembership());
         assertEquals(2, user.getPlainAttrs("obscure").size());
-        assertTrue(user.getPlainAttrs("obscure").contains(user.getPlainAttr("obscure")));
-        assertTrue(IterableUtils.matchesAny(user.getPlainAttrs("obscure"), new Predicate<UPlainAttr>() {
-
-            @Override
-            public boolean evaluate(final UPlainAttr object) {
-                return object.getMembership() == null;
-            }
-        }));
-        assertTrue(IterableUtils.matchesAny(user.getPlainAttrs("obscure"), new Predicate<UPlainAttr>() {
-
-            @Override
-            public boolean evaluate(final UPlainAttr object) {
-                return newM.equals(object.getMembership());
-            }
-        }));
+        assertTrue(user.getPlainAttrs("obscure").contains(user.getPlainAttr("obscure").get()));
+        assertTrue(user.getPlainAttrs("obscure").stream().anyMatch(plainAttr -> plainAttr.getMembership() == null));
+        assertTrue(user.getPlainAttrs("obscure").stream().anyMatch(plainAttr -> newM.equals(plainAttr.getMembership())));
     }
 
     /**
@@ -251,7 +237,7 @@ public class UserTest extends AbstractTest {
         User owner = userDAO.findByUsername("vivaldi");
         assertNotNull("did not get expected user", owner);
 
-        String firstname = owner.getPlainAttr("firstname").getValuesAsStrings().iterator().next();
+        String firstname = owner.getPlainAttr("firstname").get().getValuesAsStrings().iterator().next();
         assertNotNull(firstname);
 
         // search by ksuffix derived attribute

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
index 7b00f82..21d9c5a 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/VirSchemaTest.java
@@ -48,7 +48,7 @@ public class VirSchemaTest extends AbstractTest {
 
     @Test
     public void deal() {
-        Provision provision = resourceDAO.find("ws-target-resource-1").getProvision(anyTypeDAO.findUser());
+        Provision provision = resourceDAO.find("ws-target-resource-1").getProvision(anyTypeDAO.findUser()).get();
         assertNotNull(provision);
         assertTrue(virSchemaDAO.findByProvision(provision).isEmpty());
 
@@ -66,7 +66,7 @@ public class VirSchemaTest extends AbstractTest {
         assertTrue(virSchema.isReadonly());
         assertEquals("EXT_ATTR", virSchema.getExtAttrName());
 
-        provision = resourceDAO.find("ws-target-resource-1").getProvision(anyTypeDAO.findUser());
+        provision = resourceDAO.find("ws-target-resource-1").getProvision(anyTypeDAO.findUser()).get();
         assertNotNull(provision);
         assertFalse(virSchemaDAO.findByProvision(provision).isEmpty());
         assertTrue(virSchemaDAO.findByProvision(provision).contains(virSchema));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/XMLContentExporterTest.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/XMLContentExporterTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/XMLContentExporterTest.java
index 84bc767..9f085d4 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/XMLContentExporterTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/XMLContentExporterTest.java
@@ -22,10 +22,8 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.nio.charset.Charset;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.output.ByteArrayOutputStream;
 import org.apache.commons.lang3.StringUtils;
@@ -50,15 +48,9 @@ public class XMLContentExporterTest extends AbstractTest {
         String exported = baos.toString(Charset.defaultCharset());
         assertTrue(StringUtils.isNotBlank(exported));
 
-        List<String> realms = CollectionUtils.select(
-                IOUtils.readLines(IOUtils.toInputStream(exported, Charset.defaultCharset()), Charset.defaultCharset()),
-                new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String row) {
-                return row.startsWith("<REALM");
-            }
-        }, new ArrayList<String>());
+        List<String> realms = IOUtils.readLines(
+                IOUtils.toInputStream(exported, Charset.defaultCharset()), Charset.defaultCharset()).stream().
+                filter(row -> row.startsWith("<REALM")).collect(Collectors.toList());
         assertEquals(4, realms.size());
         assertTrue(realms.get(0).contains("NAME=\"/\""));
         assertTrue(realms.get(1).contains("NAME=\"two\""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 59bef19..90a5d9e 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1331,15 +1331,15 @@ we are happy to inform you that the password request was successfully executed f
 &lt;/html&gt;"/>
   <MailTemplate id="test"/>
   <MailTemplate id="optin"
-                textTemplate="Hi ${user.getPlainAttr(&quot;firstname&quot;).values[0]} ${user.getPlainAttr(&quot;surname&quot;).values[0]}, welcome to Syncope!
+                textTemplate="Hi ${user.getPlainAttr(&quot;firstname&quot;).get().values[0]} ${user.getPlainAttr(&quot;surname&quot;).get().values[0]}, welcome to Syncope!
 
 Your username is ${user.username}.
-Your email address is ${user.getPlainAttr(&quot;email&quot;).values[0]}.
-Your email address inside a link: http://localhost/?email=${user.getPlainAttr(&quot;email&quot;).values[0].replace('@', '%40')}
+Your email address is ${user.getPlainAttr(&quot;email&quot;).get().values[0]}.
+Your email address inside a link: http://localhost/?email=${user.getPlainAttr(&quot;email&quot;).get().values[0].replace('@', '%40')}
 
 This message was sent to the following recipients:&#10;
 $$ for (recipient: recipients) {&#10;
-  * ${recipient.getPlainAttr(&quot;email&quot;).values[0]}&#10;
+  * ${recipient.getPlainAttr(&quot;email&quot;).get().values[0]}&#10;
 $$ }&#10;
 &#10;
 because one of the following events occurred:&#10;
@@ -1355,19 +1355,19 @@ $$ }&#10;
 $$ }&#10;"
                 htmlTemplate="&lt;html&gt;
 &lt;body&gt;
-&lt;h3&gt;Hi ${user.getPlainAttr(&quot;firstname&quot;).values[0]} ${user.getPlainAttr(&quot;surname&quot;).values[0]}, welcome to Syncope!&lt;/h3&gt;
+&lt;h3&gt;Hi ${user.getPlainAttr(&quot;firstname&quot;).get().values[0]} ${user.getPlainAttr(&quot;surname&quot;).get().values[0]}, welcome to Syncope!&lt;/h3&gt;
 
 &lt;p&gt;
    Your username is ${user.username}.&lt;br/&gt;
-   Your email address is ${user.getPlainAttr(&quot;email&quot;).values[0]}.
-   Your email address inside a &lt;a href=&quot;http://localhost/?email=${user.getPlainAttr(&quot;email&quot;).values[0].replace('@', '%40')}&quot;&gt;link&lt;/a&gt;.
+   Your email address is ${user.getPlainAttr(&quot;email&quot;).get().values[0]}.
+   Your email address inside a &lt;a href=&quot;http://localhost/?email=${user.getPlainAttr(&quot;email&quot;).get().values[0].replace('@', '%40')}&quot;&gt;link&lt;/a&gt;.
 &lt;/p&gt;
 
 &lt;p&gt;
     This message was sent to the following recipients:
 &lt;ul&gt;&#10;
 $$ for (recipient: recipients) {&#10;Na
-  &lt;li&gt;${recipient.getPlainAttr(&quot;email&quot;).values[0]}&lt;/li&gt;&#10;
+  &lt;li&gt;${recipient.getPlainAttr(&quot;email&quot;).get().values[0]}&lt;/li&gt;&#10;
 $$ }&#10;
 &lt;/ul&gt;&#10;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/MappingManager.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/MappingManager.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/MappingManager.java
index daa09e2..338a94e 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/MappingManager.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/MappingManager.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.provisioning.api;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -42,7 +43,7 @@ public interface MappingManager {
      * @param provision provision information
      * @return connObjectKey internal value
      */
-    String getConnObjectKeyValue(Any<?> any, Provision provision);
+    Optional<String> getConnObjectKeyValue(Any<?> any, Provision provision);
 
     /**
      * Get connObjectKey internal value.

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/EntityUtils.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/EntityUtils.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/EntityUtils.java
deleted file mode 100644
index 264df5d..0000000
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/utils/EntityUtils.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.core.provisioning.api.utils;
-
-import org.apache.commons.collections4.Transformer;
-import org.apache.syncope.core.persistence.api.entity.Entity;
-
-public final class EntityUtils {
-
-    public static <E extends Entity> Transformer<E, String> keyTransformer() {
-        return new Transformer<E, String>() {
-
-            @Override
-            public String transform(final E input) {
-                return input.getKey();
-            }
-        };
-    }
-
-    /**
-     * Private default constructor, for static-only classes.
-     */
-    private EntityUtils() {
-    }
-}


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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java b/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
index c0b211f..f180ed0 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/AnyOperations.java
@@ -21,11 +21,8 @@ package org.apache.syncope.common.lib;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
-import org.apache.commons.collections4.Closure;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -115,16 +112,18 @@ public final class AnyOperations {
         result.getAuxClasses().clear();
 
         if (!incremental) {
-            for (String auxClass : CollectionUtils.subtract(original.getAuxClasses(), updated.getAuxClasses())) {
-                result.getAuxClasses().add(
-                        new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(auxClass).build());
-            }
+            original.getAuxClasses().stream().filter(auxClass -> !updated.getAuxClasses().contains(auxClass)).
+                    forEach(auxClass -> {
+                        result.getAuxClasses().add(new StringPatchItem.Builder().
+                                operation(PatchOperation.DELETE).value(auxClass).build());
+                    });
         }
 
-        for (String auxClass : CollectionUtils.subtract(updated.getAuxClasses(), original.getAuxClasses())) {
-            result.getAuxClasses().add(
-                    new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(auxClass).build());
-        }
+        updated.getAuxClasses().stream().filter(auxClass -> !original.getAuxClasses().contains(auxClass)).
+                forEach(auxClass -> {
+                    result.getAuxClasses().add(new StringPatchItem.Builder().
+                            operation(PatchOperation.ADD_REPLACE).value(auxClass).build());
+                });
 
         // 3. plain attributes
         Map<String, AttrTO> updatedAttrs = EntityTOUtils.buildAttrMap(updated.getPlainAttrs());
@@ -133,20 +132,16 @@ public final class AnyOperations {
         result.getPlainAttrs().clear();
 
         if (!incremental) {
-            IterableUtils.forEach(CollectionUtils.subtract(originalAttrs.keySet(), updatedAttrs.keySet()),
-                    new Closure<String>() {
-
-                @Override
-                public void execute(final String schema) {
-                    result.getPlainAttrs().add(new AttrPatch.Builder().
-                            operation(PatchOperation.DELETE).
-                            attrTO(new AttrTO.Builder().schema(schema).build()).
-                            build());
-                }
-            });
+            originalAttrs.keySet().stream().filter(attr -> !updatedAttrs.containsKey(attr)).
+                    forEach(schema -> {
+                        result.getPlainAttrs().add(new AttrPatch.Builder().
+                                operation(PatchOperation.DELETE).
+                                attrTO(new AttrTO.Builder().schema(schema).build()).
+                                build());
+                    });
         }
 
-        for (AttrTO attrTO : updatedAttrs.values()) {
+        updatedAttrs.values().forEach(attrTO -> {
             if (attrTO.getValues().isEmpty()) {
                 if (!incremental) {
                     result.getPlainAttrs().add(new AttrPatch.Builder().
@@ -163,7 +158,7 @@ public final class AnyOperations {
                     result.getPlainAttrs().add(patch);
                 }
             }
-        }
+        });
 
         // 4. virtual attributes
         result.getVirAttrs().clear();
@@ -173,16 +168,18 @@ public final class AnyOperations {
         result.getResources().clear();
 
         if (!incremental) {
-            for (String resource : CollectionUtils.subtract(original.getResources(), updated.getResources())) {
-                result.getResources().add(
-                        new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build());
-            }
+            original.getResources().stream().filter(resource -> !updated.getResources().contains(resource)).
+                    forEach(resource -> {
+                        result.getResources().add(new StringPatchItem.Builder().
+                                operation(PatchOperation.DELETE).value(resource).build());
+                    });
         }
 
-        for (String resource : CollectionUtils.subtract(updated.getResources(), original.getResources())) {
-            result.getResources().add(
-                    new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build());
-        }
+        updated.getResources().stream().filter(resource -> !original.getResources().contains(resource)).
+                forEach(resource -> {
+                    result.getResources().add(new StringPatchItem.Builder().
+                            operation(PatchOperation.ADD_REPLACE).value(resource).build());
+                });
     }
 
     /**
@@ -209,38 +206,41 @@ public final class AnyOperations {
         Map<Pair<String, String>, RelationshipTO> originalRels =
                 EntityTOUtils.buildRelationshipMap(original.getRelationships());
 
-        for (Map.Entry<Pair<String, String>, RelationshipTO> entry : updatedRels.entrySet()) {
-            if (!originalRels.containsKey(entry.getKey())) {
-                result.getRelationships().add(new RelationshipPatch.Builder().
-                        operation(PatchOperation.ADD_REPLACE).
-                        relationshipTO(entry.getValue()).build());
-            }
-        }
+        updatedRels.entrySet().stream().
+                filter(entry -> (!originalRels.containsKey(entry.getKey()))).
+                forEachOrdered(entry -> {
+                    result.getRelationships().add(new RelationshipPatch.Builder().
+                            operation(PatchOperation.ADD_REPLACE).
+                            relationshipTO(entry.getValue()).build());
+                });
 
         if (!incremental) {
-            for (Pair<String, String> key : CollectionUtils.subtract(originalRels.keySet(), updatedRels.keySet())) {
-                result.getRelationships().add(new RelationshipPatch.Builder().
-                        operation(PatchOperation.DELETE).
-                        relationshipTO(originalRels.get(key)).build());
-            }
+            originalRels.keySet().stream().filter(relationship -> !updatedRels.containsKey(relationship)).
+                    forEach(key -> {
+                        result.getRelationships().add(new RelationshipPatch.Builder().
+                                operation(PatchOperation.DELETE).
+                                relationshipTO(originalRels.get(key)).build());
+                    });
         }
 
         // 3. memberships
         Map<String, MembershipTO> updatedMembs = EntityTOUtils.buildMembershipMap(updated.getMemberships());
         Map<String, MembershipTO> originalMembs = EntityTOUtils.buildMembershipMap(original.getMemberships());
 
-        for (Map.Entry<String, MembershipTO> entry : updatedMembs.entrySet()) {
-            if (!originalMembs.containsKey(entry.getKey())) {
-                result.getMemberships().add(new MembershipPatch.Builder().
-                        operation(PatchOperation.ADD_REPLACE).group(entry.getValue().getGroupKey()).build());
-            }
-        }
+        updatedMembs.entrySet().stream().
+                filter(entry -> (!originalMembs.containsKey(entry.getKey()))).
+                forEachOrdered(entry -> {
+                    result.getMemberships().add(new MembershipPatch.Builder().
+                            operation(PatchOperation.ADD_REPLACE).group(entry.getValue().getGroupKey()).
+                            build());
+                });
 
         if (!incremental) {
-            for (String key : CollectionUtils.subtract(originalMembs.keySet(), updatedMembs.keySet())) {
-                result.getMemberships().add(new MembershipPatch.Builder().
-                        operation(PatchOperation.DELETE).group(originalMembs.get(key).getGroupKey()).build());
-            }
+            originalMembs.keySet().stream().filter(membership -> !updatedMembs.containsKey(membership)).
+                    forEach(key -> {
+                        result.getMemberships().add(new MembershipPatch.Builder().
+                                operation(PatchOperation.DELETE).group(originalMembs.get(key).getGroupKey()).build());
+                    });
         }
 
         return result;
@@ -290,16 +290,18 @@ public final class AnyOperations {
 
         // 4. roles
         if (!incremental) {
-            for (String toRemove : CollectionUtils.subtract(original.getRoles(), updated.getRoles())) {
-                result.getRoles().add(
-                        new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(toRemove).build());
-            }
+            original.getRoles().stream().filter(role -> !updated.getRoles().contains(role)).
+                    forEach(toRemove -> {
+                        result.getRoles().add(new StringPatchItem.Builder().
+                                operation(PatchOperation.DELETE).value(toRemove).build());
+                    });
         }
 
-        for (String toAdd : CollectionUtils.subtract(updated.getRoles(), original.getRoles())) {
-            result.getRoles().add(
-                    new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(toAdd).build());
-        }
+        updated.getRoles().stream().filter(role -> !original.getRoles().contains(role)).
+                forEach(toAdd -> {
+                    result.getRoles().add(new StringPatchItem.Builder().
+                            operation(PatchOperation.ADD_REPLACE).value(toAdd).build());
+                });
 
         // 5. relationships
         Map<Pair<String, String>, RelationshipTO> updatedRels =
@@ -307,48 +309,52 @@ public final class AnyOperations {
         Map<Pair<String, String>, RelationshipTO> originalRels =
                 EntityTOUtils.buildRelationshipMap(original.getRelationships());
 
-        for (Map.Entry<Pair<String, String>, RelationshipTO> entry : updatedRels.entrySet()) {
-            if (!originalRels.containsKey(entry.getKey())) {
-                result.getRelationships().add(new RelationshipPatch.Builder().
-                        operation(PatchOperation.ADD_REPLACE).
-                        relationshipTO(entry.getValue()).build());
-            }
-        }
+        updatedRels.entrySet().stream().
+                filter(entry -> (!originalRels.containsKey(entry.getKey()))).
+                forEachOrdered(entry -> {
+                    result.getRelationships().add(new RelationshipPatch.Builder().
+                            operation(PatchOperation.ADD_REPLACE).
+                            relationshipTO(entry.getValue()).build());
+                });
 
         if (!incremental) {
-            for (Pair<String, String> key : CollectionUtils.subtract(originalRels.keySet(), updatedRels.keySet())) {
-                result.getRelationships().add(new RelationshipPatch.Builder().
-                        operation(PatchOperation.DELETE).
-                        relationshipTO(originalRels.get(key)).build());
-            }
+            originalRels.keySet().stream().filter(relationship -> !updatedRels.containsKey(relationship)).
+                    forEach(key -> {
+                        result.getRelationships().add(new RelationshipPatch.Builder().
+                                operation(PatchOperation.DELETE).
+                                relationshipTO(originalRels.get(key)).build());
+                    });
         }
 
         // 6. memberships
         Map<String, MembershipTO> updatedMembs = EntityTOUtils.buildMembershipMap(updated.getMemberships());
         Map<String, MembershipTO> originalMembs = EntityTOUtils.buildMembershipMap(original.getMemberships());
 
-        for (Map.Entry<String, MembershipTO> entry : updatedMembs.entrySet()) {
-            MembershipPatch membershipPatch = new MembershipPatch.Builder().
-                    operation(PatchOperation.ADD_REPLACE).group(entry.getValue().getGroupKey()).build();
-
-            MembershipTO omemb;
-            if (originalMembs.containsKey(entry.getKey())) {
-                // get the original membership
-                omemb = originalMembs.get(entry.getKey());
-            } else {
-                // create an empty one to generate the patch
-                omemb = new MembershipTO.Builder().group(entry.getKey()).build();
-            }
-
-            diff(entry.getValue(), omemb, membershipPatch, incremental);
-            result.getMemberships().add(membershipPatch);
-        }
+        updatedMembs.entrySet().stream().
+                map(entry -> {
+                    MembershipPatch membershipPatch = new MembershipPatch.Builder().
+                            operation(PatchOperation.ADD_REPLACE).group(entry.getValue().getGroupKey()).build();
+                    MembershipTO omemb;
+                    if (originalMembs.containsKey(entry.getKey())) {
+                        // get the original membership
+                        omemb = originalMembs.get(entry.getKey());
+                    } else {
+                        // create an empty one to generate the patch
+                        omemb = new MembershipTO.Builder().group(entry.getKey()).build();
+                    }
+                    diff(entry.getValue(), omemb, membershipPatch, incremental);
+                    return membershipPatch;
+                }).
+                forEachOrdered(membershipPatch -> {
+                    result.getMemberships().add(membershipPatch);
+                });
 
         if (!incremental) {
-            for (String key : CollectionUtils.subtract(originalMembs.keySet(), updatedMembs.keySet())) {
-                result.getMemberships().add(new MembershipPatch.Builder().
-                        operation(PatchOperation.DELETE).group(originalMembs.get(key).getGroupKey()).build());
-            }
+            originalMembs.keySet().stream().filter(membership -> !updatedMembs.containsKey(membership)).
+                    forEach(key -> {
+                        result.getMemberships().add(new MembershipPatch.Builder().
+                                operation(PatchOperation.DELETE).group(originalMembs.get(key).getGroupKey()).build());
+                    });
         }
 
         return result;
@@ -403,7 +409,7 @@ public final class AnyOperations {
 
     private static Collection<AttrTO> patch(final Map<String, AttrTO> attrs, final Set<AttrPatch> attrPatches) {
         Map<String, AttrTO> rwattrs = new HashMap<>(attrs);
-        for (AttrPatch patch : attrPatches) {
+        attrPatches.forEach(patch -> {
             if (patch.getAttrTO() == null) {
                 LOG.warn("Invalid {} specified: {}", AttrPatch.class.getName(), patch);
             } else {
@@ -412,7 +418,7 @@ public final class AnyOperations {
                     rwattrs.put(patch.getAttrTO().getSchema(), patch.getAttrTO());
                 }
             }
-        }
+        });
 
         return rwattrs.values();
     }
@@ -496,46 +502,44 @@ public final class AnyOperations {
         }
 
         // 1. relationships
-        for (RelationshipPatch relPatch : anyObjectPatch.getRelationships()) {
-            if (relPatch.getRelationshipTO() == null) {
-                LOG.warn("Invalid {} specified: {}", RelationshipPatch.class.getName(), relPatch);
-            } else {
-                result.getRelationships().remove(relPatch.getRelationshipTO());
-                if (relPatch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    result.getRelationships().add(relPatch.getRelationshipTO());
-                }
-            }
-        }
+        anyObjectPatch.getRelationships().
+                forEach(relPatch -> {
+                    if (relPatch.getRelationshipTO() == null) {
+                        LOG.warn("Invalid {} specified: {}", RelationshipPatch.class.getName(), relPatch);
+                    } else {
+                        result.getRelationships().remove(relPatch.getRelationshipTO());
+                        if (relPatch.getOperation() == PatchOperation.ADD_REPLACE) {
+                            result.getRelationships().add(relPatch.getRelationshipTO());
+                        }
+                    }
+                });
 
         // 2. memberships
-        for (final MembershipPatch membPatch : anyObjectPatch.getMemberships()) {
-            if (membPatch.getGroup() == null) {
-                LOG.warn("Invalid {} specified: {}", MembershipPatch.class.getName(), membPatch);
-            } else {
-                MembershipTO memb = IterableUtils.find(result.getMemberships(), new Predicate<MembershipTO>() {
-
-                    @Override
-                    public boolean evaluate(final MembershipTO object) {
-                        return membPatch.getGroup().equals(object.getGroupKey());
+        anyObjectPatch.getMemberships().
+                forEach(membPatch -> {
+                    if (membPatch.getGroup() == null) {
+                        LOG.warn("Invalid {} specified: {}", MembershipPatch.class.getName(), membPatch);
+                    } else {
+                        Optional<MembershipTO> memb = result.getMemberships().stream().
+                                filter(membership -> membPatch.getGroup().equals(membership.getGroupKey())).findFirst();
+                        if (memb.isPresent()) {
+                            result.getMemberships().remove(memb.get());
+                        }
+
+                        if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
+                            MembershipTO newMembershipTO =
+                                    new MembershipTO.Builder().group(membPatch.getGroup()).build();
+
+                            // 3. plain attributes
+                            newMembershipTO.getPlainAttrs().addAll(membPatch.getPlainAttrs());
+
+                            // 4. virtual attributes
+                            newMembershipTO.getVirAttrs().addAll(membPatch.getVirAttrs());
+
+                            result.getMemberships().add(newMembershipTO);
+                        }
                     }
                 });
-                if (memb != null) {
-                    result.getMemberships().remove(memb);
-                }
-
-                if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    MembershipTO newMembershipTO = new MembershipTO.Builder().group(membPatch.getGroup()).build();
-
-                    // 3. plain attributes
-                    newMembershipTO.getPlainAttrs().addAll(membPatch.getPlainAttrs());
-
-                    // 4. virtual attributes
-                    newMembershipTO.getVirAttrs().addAll(membPatch.getVirAttrs());
-
-                    result.getMemberships().add(newMembershipTO);
-                }
-            }
-        }
 
         return result;
     }
@@ -555,46 +559,44 @@ public final class AnyOperations {
         }
 
         // 3. relationships
-        for (RelationshipPatch relPatch : userPatch.getRelationships()) {
-            if (relPatch.getRelationshipTO() == null) {
-                LOG.warn("Invalid {} specified: {}", RelationshipPatch.class.getName(), relPatch);
-            } else {
-                result.getRelationships().remove(relPatch.getRelationshipTO());
-                if (relPatch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    result.getRelationships().add(relPatch.getRelationshipTO());
-                }
-            }
-        }
+        userPatch.getRelationships().
+                forEach(relPatch -> {
+                    if (relPatch.getRelationshipTO() == null) {
+                        LOG.warn("Invalid {} specified: {}", RelationshipPatch.class.getName(), relPatch);
+                    } else {
+                        result.getRelationships().remove(relPatch.getRelationshipTO());
+                        if (relPatch.getOperation() == PatchOperation.ADD_REPLACE) {
+                            result.getRelationships().add(relPatch.getRelationshipTO());
+                        }
+                    }
+                });
 
         // 4. memberships
-        for (final MembershipPatch membPatch : userPatch.getMemberships()) {
-            if (membPatch.getGroup() == null) {
-                LOG.warn("Invalid {} specified: {}", MembershipPatch.class.getName(), membPatch);
-            } else {
-                MembershipTO memb = IterableUtils.find(result.getMemberships(), new Predicate<MembershipTO>() {
-
-                    @Override
-                    public boolean evaluate(final MembershipTO object) {
-                        return membPatch.getGroup().equals(object.getGroupKey());
+        userPatch.getMemberships().
+                forEach(membPatch -> {
+                    if (membPatch.getGroup() == null) {
+                        LOG.warn("Invalid {} specified: {}", MembershipPatch.class.getName(), membPatch);
+                    } else {
+                        Optional<MembershipTO> memb = result.getMemberships().stream().
+                                filter(membership -> membPatch.getGroup().equals(membership.getGroupKey())).findFirst();
+                        if (memb.isPresent()) {
+                            result.getMemberships().remove(memb.get());
+                        }
+
+                        if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
+                            MembershipTO newMembershipTO =
+                                    new MembershipTO.Builder().group(membPatch.getGroup()).build();
+
+                            // 3. plain attributes
+                            newMembershipTO.getPlainAttrs().addAll(membPatch.getPlainAttrs());
+
+                            // 4. virtual attributes
+                            newMembershipTO.getVirAttrs().addAll(membPatch.getVirAttrs());
+
+                            result.getMemberships().add(newMembershipTO);
+                        }
                     }
                 });
-                if (memb != null) {
-                    result.getMemberships().remove(memb);
-                }
-
-                if (membPatch.getOperation() == PatchOperation.ADD_REPLACE) {
-                    MembershipTO newMembershipTO = new MembershipTO.Builder().group(membPatch.getGroup()).build();
-
-                    // 3. plain attributes
-                    newMembershipTO.getPlainAttrs().addAll(membPatch.getPlainAttrs());
-
-                    // 4. virtual attributes
-                    newMembershipTO.getVirAttrs().addAll(membPatch.getVirAttrs());
-
-                    result.getMemberships().add(newMembershipTO);
-                }
-            }
-        }
 
         // 5. roles
         for (StringPatchItem rolePatch : userPatch.getRoles()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java b/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
index dfc0a1e..38f5202 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/EntityTOUtils.java
@@ -22,30 +22,16 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.to.AttrTO;
-import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.RelationshipTO;
 
 public final class EntityTOUtils {
 
-    public static <E extends EntityTO> Transformer<E, String> keyTransformer() {
-        return new Transformer<E, String>() {
-
-            @Override
-            public String transform(final E input) {
-                return input.getKey();
-            }
-        };
-    }
-
     public static Map<String, AttrTO> buildAttrMap(final Collection<AttrTO> attrs) {
         Map<String, AttrTO> result = new HashMap<>(attrs.size());
-        for (AttrTO attributeTO : attrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+        attrs.forEach(attrTO -> result.put(attrTO.getSchema(), attrTO));
 
         return Collections.unmodifiableMap(result);
     }
@@ -54,18 +40,15 @@ public final class EntityTOUtils {
             final Collection<RelationshipTO> relationships) {
 
         Map<Pair<String, String>, RelationshipTO> result = new HashMap<>(relationships.size());
-        for (RelationshipTO relationship : relationships) {
-            result.put(Pair.of(relationship.getType(), relationship.getRightKey()), relationship);
-        }
+        relationships.forEach(
+                relationship -> result.put(Pair.of(relationship.getType(), relationship.getRightKey()), relationship));
 
         return Collections.unmodifiableMap(result);
     }
 
     public static Map<String, MembershipTO> buildMembershipMap(final Collection<MembershipTO> memberships) {
         Map<String, MembershipTO> result = new HashMap<>(memberships.size());
-        for (MembershipTO membership : memberships) {
-            result.put(membership.getRightKey(), membership);
-        }
+        memberships.forEach(membership -> result.put(membership.getRightKey(), membership));
 
         return Collections.unmodifiableMap(result);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/SyncopeClientCompositeException.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/SyncopeClientCompositeException.java b/common/lib/src/main/java/org/apache/syncope/common/lib/SyncopeClientCompositeException.java
index b338df8..3e7bc0c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/SyncopeClientCompositeException.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/SyncopeClientCompositeException.java
@@ -20,9 +20,8 @@ package org.apache.syncope.common.lib;
 
 import java.util.HashSet;
 import java.util.Iterator;
+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.types.ClientExceptionType;
 
 public class SyncopeClientCompositeException extends SyncopeClientException {
@@ -68,17 +67,12 @@ public class SyncopeClientCompositeException extends SyncopeClientException {
                     + ClientExceptionType.class.getName() + " set");
         }
 
-        SyncopeClientException alreadyAdded = IterableUtils.find(exceptions, new Predicate<SyncopeClientException>() {
+        Optional<SyncopeClientException> alreadyAdded =
+                exceptions.stream().filter(ex -> ex.getType() == exception.getType()).findFirst();
 
-            @Override
-            public boolean evaluate(final SyncopeClientException ex) {
-                return ex.getType() == exception.getType();
-            }
-        });
-
-        return alreadyAdded == null
-                ? exceptions.add(exception)
-                : alreadyAdded.getElements().addAll(exception.getElements());
+        return alreadyAdded.isPresent()
+                ? alreadyAdded.get().getElements().addAll(exception.getElements())
+                : exceptions.add(exception);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/collections/CircularFifoQueue.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/collections/CircularFifoQueue.java b/common/lib/src/main/java/org/apache/syncope/common/lib/collections/CircularFifoQueue.java
new file mode 100644
index 0000000..1977a7e
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/collections/CircularFifoQueue.java
@@ -0,0 +1,427 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.collections;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.AbstractCollection;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Queue;
+
+/**
+ * CircularFifoQueue is a first-in first-out queue with a fixed size that
+ * replaces its oldest element if full.
+ *
+ * The removal order of a {@link CircularFifoQueue} is based on the
+ * insertion order; elements are removed in the same order in which they
+ * were added. The iteration order is the same as the removal order.
+ *
+ * The {@link #add(Object)}, {@link #remove()}, {@link #peek()}, {@link #poll},
+ * {@link #offer(Object)} operations all perform in constant time.
+ * All other operations perform in linear time or worse.
+ *
+ * This queue prevents null objects from being added.
+ *
+ * @param <E> the type of elements held in this collection
+ */
+public class CircularFifoQueue<E> extends AbstractCollection<E> implements Queue<E>, Serializable {
+
+    private static final long serialVersionUID = -8423413834657610406L;
+
+    /** Underlying storage array. */
+    private transient E[] elements;
+
+    /** Array index of first (oldest) queue element. */
+    private transient int start = 0;
+
+    /**
+     * Index mod maxElements of the array position following the last queue
+     * element. Queue elements start at elements[start] and "wrap around"
+     * elements[maxElements-1], ending at elements[decrement(end)].
+     * For example, elements = {c,a,b}, start=1, end=1 corresponds to
+     * the queue [a,b,c].
+     */
+    private transient int end = 0;
+
+    /** Flag to indicate if the queue is currently full. */
+    private transient boolean full = false;
+
+    /** Capacity of the queue. */
+    private final int maxElements;
+
+    /**
+     * Constructor that creates a queue with the default size of 32.
+     */
+    public CircularFifoQueue() {
+        this(32);
+    }
+
+    /**
+     * Constructor that creates a queue with the specified size.
+     *
+     * @param size the size of the queue (cannot be changed)
+     * @throws IllegalArgumentException if the size is &lt; 1
+     */
+    @SuppressWarnings("unchecked")
+    public CircularFifoQueue(final int size) {
+        if (size <= 0) {
+            throw new IllegalArgumentException("The size must be greater than 0");
+        }
+        elements = (E[]) new Object[size];
+        maxElements = elements.length;
+    }
+
+    /**
+     * Constructor that creates a queue from the specified collection.
+     * The collection size also sets the queue size.
+     *
+     * @param coll the collection to copy into the queue, may not be null
+     * @throws NullPointerException if the collection is null
+     */
+    public CircularFifoQueue(final Collection<? extends E> coll) {
+        this(coll.size());
+        addAll(coll);
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Write the queue out using a custom routine.
+     *
+     * @param out the output stream
+     * @throws IOException if an I/O error occurs while writing to the output stream
+     */
+    private void writeObject(final ObjectOutputStream out) throws IOException {
+        out.defaultWriteObject();
+        out.writeInt(size());
+        for (final E e : this) {
+            out.writeObject(e);
+        }
+    }
+
+    /**
+     * Read the queue in using a custom routine.
+     *
+     * @param in the input stream
+     * @throws IOException if an I/O error occurs while writing to the output stream
+     * @throws ClassNotFoundException if the class of a serialized object can not be found
+     */
+    @SuppressWarnings("unchecked")
+    private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
+        in.defaultReadObject();
+        elements = (E[]) new Object[maxElements];
+        final int size = in.readInt();
+        for (int i = 0; i < size; i++) {
+            elements[i] = (E) in.readObject();
+        }
+        start = 0;
+        full = size == maxElements;
+        if (full) {
+            end = 0;
+        } else {
+            end = size;
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Returns the number of elements stored in the queue.
+     *
+     * @return this queue's size
+     */
+    @Override
+    public int size() {
+        int size;
+
+        if (end < start) {
+            size = maxElements - start + end;
+        } else if (end == start) {
+            size = full ? maxElements : 0;
+        } else {
+            size = end - start;
+        }
+
+        return size;
+    }
+
+    /**
+     * Returns true if this queue is empty; false otherwise.
+     *
+     * @return true if this queue is empty
+     */
+    @Override
+    public boolean isEmpty() {
+        return size() == 0;
+    }
+
+    /**
+     * {@inheritDoc}
+     * <p>
+     * A {@code CircularFifoQueue} can never be full, thus this returns always
+     * {@code false}.
+     *
+     * @return always returns {@code false}
+     */
+    public boolean isFull() {
+        return false;
+    }
+
+    /**
+     * Returns {@code true} if the capacity limit of this queue has been reached,
+     * i.e. the number of elements stored in the queue equals its maximum size.
+     *
+     * @return {@code true} if the capacity limit has been reached, {@code false} otherwise
+     * @since 4.1
+     */
+    public boolean isAtFullCapacity() {
+        return size() == maxElements;
+    }
+
+    /**
+     * Gets the maximum size of the collection (the bound).
+     *
+     * @return the maximum number of elements the collection can hold
+     */
+    public int maxSize() {
+        return maxElements;
+    }
+
+    /**
+     * Clears this queue.
+     */
+    @Override
+    public void clear() {
+        full = false;
+        start = 0;
+        end = 0;
+        Arrays.fill(elements, null);
+    }
+
+    /**
+     * Adds the given element to this queue. If the queue is full, the least recently added
+     * element is discarded so that a new element can be inserted.
+     *
+     * @param element the element to add
+     * @return true, always
+     * @throws NullPointerException if the given element is null
+     */
+    @Override
+    public boolean add(final E element) {
+        if (null == element) {
+            throw new NullPointerException("Attempted to add null object to queue");
+        }
+
+        if (isAtFullCapacity()) {
+            remove();
+        }
+
+        elements[end++] = element;
+
+        if (end >= maxElements) {
+            end = 0;
+        }
+
+        if (end == start) {
+            full = true;
+        }
+
+        return true;
+    }
+
+    /**
+     * Returns the element at the specified position in this queue.
+     *
+     * @param index the position of the element in the queue
+     * @return the element at position {@code index}
+     * @throws NoSuchElementException if the requested position is outside the range [0, size)
+     */
+    public E get(final int index) {
+        final int sz = size();
+        if (index < 0 || index >= sz) {
+            throw new NoSuchElementException(
+                    String.format("The specified index (%1$d) is outside the available range [0, %2$d)",
+                            index, Integer.valueOf(sz)));
+        }
+
+        final int idx = (start + index) % maxElements;
+        return elements[idx];
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Adds the given element to this queue. If the queue is full, the least recently added
+     * element is discarded so that a new element can be inserted.
+     *
+     * @param element the element to add
+     * @return true, always
+     * @throws NullPointerException if the given element is null
+     */
+    @Override
+    public boolean offer(final E element) {
+        return add(element);
+    }
+
+    @Override
+    public E poll() {
+        if (isEmpty()) {
+            return null;
+        }
+        return remove();
+    }
+
+    @Override
+    public E element() {
+        if (isEmpty()) {
+            throw new NoSuchElementException("queue is empty");
+        }
+        return peek();
+    }
+
+    @Override
+    public E peek() {
+        if (isEmpty()) {
+            return null;
+        }
+        return elements[start];
+    }
+
+    @Override
+    public E remove() {
+        if (isEmpty()) {
+            throw new NoSuchElementException("queue is empty");
+        }
+
+        final E element = elements[start];
+        if (null != element) {
+            elements[start++] = null;
+
+            if (start >= maxElements) {
+                start = 0;
+            }
+            full = false;
+        }
+        return element;
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Increments the internal index.
+     *
+     * @param index the index to increment
+     * @return the updated index
+     */
+    private int increment(final int index) {
+        int result = index;
+        result++;
+        if (result >= maxElements) {
+            result = 0;
+        }
+        return result;
+    }
+
+    /**
+     * Decrements the internal index.
+     *
+     * @param index the index to decrement
+     * @return the updated index
+     */
+    private int decrement(final int index) {
+        int result = index;
+        result--;
+        if (result < 0) {
+            result = maxElements - 1;
+        }
+        return result;
+    }
+
+    /**
+     * Returns an iterator over this queue's elements.
+     *
+     * @return an iterator over this queue's elements
+     */
+    @Override
+    public Iterator<E> iterator() {
+        return new Iterator<E>() {
+
+            private int index = start;
+
+            private int lastReturnedIndex = -1;
+
+            private boolean isFirst = full;
+
+            @Override
+            public boolean hasNext() {
+                return isFirst || index != end;
+            }
+
+            @Override
+            public E next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+                isFirst = false;
+                lastReturnedIndex = index;
+                index = increment(index);
+                return elements[lastReturnedIndex];
+            }
+
+            @Override
+            public void remove() {
+                if (lastReturnedIndex == -1) {
+                    throw new IllegalStateException();
+                }
+
+                // First element can be removed quickly
+                if (lastReturnedIndex == start) {
+                    CircularFifoQueue.this.remove();
+                    lastReturnedIndex = -1;
+                    return;
+                }
+
+                int pos = lastReturnedIndex + 1;
+                if (start < lastReturnedIndex && pos < end) {
+                    // shift in one part
+                    System.arraycopy(elements, pos, elements, lastReturnedIndex, end - pos);
+                } else {
+                    // Other elements require us to shift the subsequent elements
+                    while (pos != end) {
+                        if (pos >= maxElements) {
+                            elements[pos - 1] = elements[0];
+                            pos = 0;
+                        } else {
+                            elements[decrement(pos)] = elements[pos];
+                            pos = increment(pos);
+                        }
+                    }
+                }
+
+                lastReturnedIndex = -1;
+                end = decrement(end);
+                elements[end] = null;
+                full = false;
+                index = decrement(index);
+            }
+
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/collections/IteratorChain.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/collections/IteratorChain.java b/common/lib/src/main/java/org/apache/syncope/common/lib/collections/IteratorChain.java
new file mode 100644
index 0000000..c26de2a
--- /dev/null
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/collections/IteratorChain.java
@@ -0,0 +1,282 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib.collections;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.Queue;
+
+/**
+ * An IteratorChain is an Iterator that wraps a number of Iterators.
+ *
+ * This class makes multiple iterators look like one to the caller. When any
+ * method from the Iterator interface is called, the IteratorChain will delegate
+ * to a single underlying Iterator. The IteratorChain will invoke the Iterators
+ * in sequence until all Iterators are exhausted.
+ *
+ * Under many circumstances, linking Iterators together in this manner is more
+ * efficient (and convenient) than reading out the contents of each Iterator
+ * into a List and creating a new Iterator.
+ *
+ * Calling a method that adds new Iterator <i>after a method in the Iterator
+ * interface has been called</i> will result in an UnsupportedOperationException.
+ *
+ * NOTE: As from version 3.0, the IteratorChain may contain no iterators. In
+ * this case the class will function as an empty iterator.
+ *
+ * NOTE: As from version 4.0, the IteratorChain stores the iterators in a queue
+ * and removes any reference to them as soon as they are not used anymore. Thus
+ * the methods {@code setIterator(Iterator)} and {@code getIterators()} have been
+ * removed and {@link #size()} will return the number of remaining iterators in
+ * the queue.
+ *
+ * @param <E> the type of elements held in this collection
+ */
+public class IteratorChain<E> implements Iterator<E> {
+
+    /** The chain of iterators. */
+    private final Queue<Iterator<? extends E>> iteratorChain = new LinkedList<>();
+
+    /** The current iterator. */
+    private Iterator<? extends E> currentIterator = null;
+
+    /**
+     * The "last used" Iterator is the Iterator upon which next() or hasNext()
+     * was most recently called used for the remove() operation only.
+     */
+    private Iterator<? extends E> lastUsedIterator = null;
+
+    /**
+     * ComparatorChain is "locked" after the first time compare(Object,Object)
+     * is called.
+     */
+    private boolean isLocked = false;
+
+    //-----------------------------------------------------------------------
+    /**
+     * Construct an IteratorChain with no Iterators.
+     *
+     * You will normally use {@link #addIterator(Iterator)} to add some
+     * iterators after using this constructor.
+     */
+    public IteratorChain() {
+        super();
+    }
+
+    /**
+     * Construct an IteratorChain with a single Iterator.
+     *
+     * This method takes one iterator. The newly constructed iterator will
+     * iterate through that iterator. Thus calling this constructor on its own
+     * will have no effect other than decorating the input iterator.
+     *
+     * You will normally use {@link #addIterator(Iterator)} to add some more
+     * iterators after using this constructor.
+     *
+     * @param iterator the first child iterator in the IteratorChain, not null
+     * @throws NullPointerException if the iterator is null
+     */
+    public IteratorChain(final Iterator<? extends E> iterator) {
+        super();
+        addIterator(iterator);
+    }
+
+    /**
+     * Constructs a new <code>IteratorChain</code> over the two given iterators.
+     *
+     * This method takes two iterators. The newly constructed iterator will
+     * iterate through each one of the input iterators in turn.
+     *
+     * @param first the first child iterator in the IteratorChain, not null
+     * @param second the second child iterator in the IteratorChain, not null
+     * @throws NullPointerException if either iterator is null
+     */
+    public IteratorChain(final Iterator<? extends E> first, final Iterator<? extends E> second) {
+        super();
+        addIterator(first);
+        addIterator(second);
+    }
+
+    /**
+     * Constructs a new <code>IteratorChain</code> over the array of iterators.
+     *
+     * This method takes an array of iterators. The newly constructed iterator
+     * will iterate through each one of the input iterators in turn.
+     *
+     * @param iteratorChain the array of iterators, not null
+     * @throws NullPointerException if iterators array is or contains null
+     */
+    public IteratorChain(final Iterator<? extends E>... iteratorChain) {
+        super();
+        for (final Iterator<? extends E> element : iteratorChain) {
+            addIterator(element);
+        }
+    }
+
+    /**
+     * Constructs a new <code>IteratorChain</code> over the collection of
+     * iterators.
+     *
+     * This method takes a collection of iterators. The newly constructed
+     * iterator will iterate through each one of the input iterators in turn.
+     *
+     * @param iteratorChain the collection of iterators, not null
+     * @throws NullPointerException if iterators collection is or contains null
+     * @throws ClassCastException if iterators collection doesn't contain an
+     * iterator
+     */
+    public IteratorChain(final Collection<Iterator<? extends E>> iteratorChain) {
+        super();
+        for (final Iterator<? extends E> iterator : iteratorChain) {
+            addIterator(iterator);
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Add an Iterator to the end of the chain
+     *
+     * @param iterator Iterator to add
+     * @throws IllegalStateException if I've already started iterating
+     * @throws NullPointerException if the iterator is null
+     */
+    public void addIterator(final Iterator<? extends E> iterator) {
+        checkLocked();
+        if (iterator == null) {
+            throw new NullPointerException("Iterator must not be null");
+        }
+        iteratorChain.add(iterator);
+    }
+
+    /**
+     * Returns the remaining number of Iterators in the current IteratorChain.
+     *
+     * @return Iterator count
+     */
+    public int size() {
+        return iteratorChain.size();
+    }
+
+    /**
+     * Determine if modifications can still be made to the IteratorChain.
+     * IteratorChains cannot be modified once they have executed a method from
+     * the Iterator interface.
+     *
+     * @return true if IteratorChain cannot be modified, false if it can
+     */
+    public boolean isLocked() {
+        return isLocked;
+    }
+
+    /**
+     * Checks whether the iterator chain is now locked and in use.
+     */
+    private void checkLocked() {
+        if (isLocked) {
+            throw new UnsupportedOperationException(
+                    "IteratorChain cannot be changed after the first use of a method from the Iterator interface");
+        }
+    }
+
+    /**
+     * Lock the chain so no more iterators can be added. This must be called
+     * from all Iterator interface methods.
+     */
+    private void lockChain() {
+        if (!isLocked) {
+            isLocked = true;
+        }
+    }
+
+    /**
+     * Updates the current iterator field to ensure that the current Iterator is
+     * not exhausted
+     */
+    protected void updateCurrentIterator() {
+        if (currentIterator == null) {
+            if (iteratorChain.isEmpty()) {
+                currentIterator = Collections.emptyListIterator();
+            } else {
+                currentIterator = iteratorChain.remove();
+            }
+            // set last used iterator here, in case the user calls remove
+            // before calling hasNext() or next() (although they shouldn't)
+            lastUsedIterator = currentIterator;
+        }
+
+        while (!currentIterator.hasNext() && !iteratorChain.isEmpty()) {
+            currentIterator = iteratorChain.remove();
+        }
+    }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Return true if any Iterator in the IteratorChain has a remaining element.
+     *
+     * @return true if elements remain
+     */
+    @Override
+    public boolean hasNext() {
+        lockChain();
+        updateCurrentIterator();
+        lastUsedIterator = currentIterator;
+
+        return currentIterator.hasNext();
+    }
+
+    /**
+     * Returns the next Object of the current Iterator
+     *
+     * @return Object from the current Iterator
+     * @throws java.util.NoSuchElementException if all the Iterators are
+     * exhausted
+     */
+    @Override
+    public E next() {
+        lockChain();
+        updateCurrentIterator();
+        lastUsedIterator = currentIterator;
+
+        return currentIterator.next();
+    }
+
+    /**
+     * Removes from the underlying collection the last element returned by the
+     * Iterator. As with next() and hasNext(), this method calls remove() on the
+     * underlying Iterator. Therefore, this method may throw an
+     * UnsupportedOperationException if the underlying Iterator does not support
+     * this method.
+     *
+     * @throws UnsupportedOperationException if the remove operator is not
+     * supported by the underlying Iterator
+     * @throws IllegalStateException if the next method has not yet been called,
+     * or the remove method has already been called after the last call to the
+     * next method.
+     */
+    @Override
+    public void remove() {
+        lockChain();
+        if (currentIterator == null) {
+            updateCurrentIterator();
+        }
+        lastUsedIterator.remove();
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java b/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
index 2a0f1f4..216316b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/info/SystemInfo.java
@@ -24,8 +24,8 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.queue.CircularFifoQueue;
 import org.apache.syncope.common.lib.AbstractBaseBean;
+import org.apache.syncope.common.lib.collections.CircularFifoQueue;
 
 @XmlRootElement(name = "systemInfo")
 @XmlType

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java
index e57a401..48dca0b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/GenericMapType.java
@@ -28,9 +28,7 @@ public class GenericMapType<K, V> {
     }
 
     public GenericMapType(final Map<K, V> map) {
-        for (Map.Entry<K, V> e : map.entrySet()) {
-            entry.add(new GenericMapEntryType<>(e));
-        }
+        map.entrySet().forEach(e -> entry.add(new GenericMapEntryType<>(e)));
     }
 
     public List<GenericMapEntryType<K, V>> getEntry() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java b/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java
index 1855164..63d6825 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/jaxb/XmlGenericMapAdapter.java
@@ -26,9 +26,7 @@ public class XmlGenericMapAdapter<K, V> extends XmlAdapter<GenericMapType<K, V>,
     public Map<K, V> unmarshal(final GenericMapType<K, V> v) throws Exception {
         Map<K, V> map = new HashMap<>();
 
-        for (GenericMapEntryType<K, V> mapEntryType : v.getEntry()) {
-            map.put(mapEntryType.getKey(), mapEntryType.getValue());
-        }
+        v.getEntry().forEach(mapEntryType -> map.put(mapEntryType.getKey(), mapEntryType.getValue()));
 
         return map;
     }
@@ -37,12 +35,12 @@ public class XmlGenericMapAdapter<K, V> extends XmlAdapter<GenericMapType<K, V>,
     public GenericMapType<K, V> marshal(final Map<K, V> v) throws Exception {
         GenericMapType<K, V> mapType = new GenericMapType<>();
 
-        for (Map.Entry<K, V> entry : v.entrySet()) {
+        v.entrySet().stream().map(entry -> {
             GenericMapEntryType<K, V> mapEntryType = new GenericMapEntryType<>();
             mapEntryType.setKey(entry.getKey());
             mapEntryType.setValue(entry.getValue());
-            mapType.getEntry().add(mapEntryType);
-        }
+            return mapEntryType;
+        }).forEachOrdered(mapEntryType -> mapType.getEntry().add(mapEntryType));
 
         return mapType;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
index 0cf5f31..3bfaeab 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
@@ -24,13 +24,12 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.to.TypeExtensionTO;
 
@@ -92,14 +91,9 @@ public class GroupPatch extends AnyPatch {
     }
 
     @JsonIgnore
-    public TypeExtensionTO getTypeExtension(final String anyType) {
-        return IterableUtils.find(typeExtensions, new Predicate<TypeExtensionTO>() {
-
-            @Override
-            public boolean evaluate(final TypeExtensionTO typeExtension) {
-                return anyType != null && anyType.equals(typeExtension.getAnyType());
-            }
-        });
+    public Optional<TypeExtensionTO> getTypeExtension(final String anyType) {
+        return typeExtensions.stream().filter(
+                typeExtension -> anyType != null && anyType.equals(typeExtension.getAnyType())).findFirst();
     }
 
     @XmlElementWrapper(name = "typeExtensions")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
index 93e6b9e..b02e52e 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/PasswordPatch.java
@@ -27,7 +27,6 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.CollectionUtils;
 
 @XmlRootElement(name = "passwordPatch")
 @XmlType
@@ -56,7 +55,9 @@ public class PasswordPatch extends StringReplacePatchItem {
         }
 
         public Builder resources(final String... resources) {
-            CollectionUtils.addAll(getInstance().getResources(), resources);
+            for (String resource : resources) {
+                getInstance().getResources().add(resource);
+            }
             return this;
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java b/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
index c744169..1a90376 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/search/SpecialAttr.java
@@ -19,8 +19,7 @@
 package org.apache.syncope.common.lib.search;
 
 import java.util.Arrays;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
 
 public enum SpecialAttr {
 
@@ -79,14 +78,8 @@ public enum SpecialAttr {
         return literal;
     }
 
-    public static SpecialAttr fromString(final String value) {
-        return IterableUtils.find(Arrays.asList(values()), new Predicate<SpecialAttr>() {
-
-            @Override
-            public boolean evaluate(final SpecialAttr specialAttr) {
-                return specialAttr.literal.equals(value);
-            }
-        });
+    public static Optional<SpecialAttr> fromString(final String value) {
+        return Arrays.stream(values()).filter(specialAttr -> specialAttr.literal.equals(value)).findFirst();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
index af8b0ea..7641687 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyObjectTO.java
@@ -22,12 +22,11 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 
 @XmlRootElement(name = "anyObject")
 @XmlType
@@ -53,14 +52,10 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public RelationshipTO getRelationship(final String type, final String rightKey) {
-        return IterableUtils.find(relationships, new Predicate<RelationshipTO>() {
-
-            @Override
-            public boolean evaluate(final RelationshipTO object) {
-                return type.equals(object.getType()) && rightKey.equals(object.getRightKey());
-            }
-        });
+    public Optional<RelationshipTO> getRelationship(final String type, final String rightKey) {
+        return relationships.stream().filter(
+                relationship -> type.equals(relationship.getType()) && rightKey.equals(relationship.getRightKey())).
+                findFirst();
     }
 
     @XmlElementWrapper(name = "relationships")
@@ -73,14 +68,8 @@ public class AnyObjectTO extends AnyTO implements GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public MembershipTO getMembership(final String groupKey) {
-        return IterableUtils.find(memberships, new Predicate<MembershipTO>() {
-
-            @Override
-            public boolean evaluate(final MembershipTO object) {
-                return groupKey.equals(object.getGroupKey());
-            }
-        });
+    public Optional<MembershipTO> getMembership(final String groupKey) {
+        return memberships.stream().filter(membership -> groupKey.equals(membership.getGroupKey())).findFirst();
     }
 
     @XmlElementWrapper(name = "memberships")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
index 7796b62..e411e1a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AnyTO.java
@@ -24,13 +24,12 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlSeeAlso;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 
 @XmlType
 @XmlSeeAlso({ UserTO.class, GroupTO.class, AnyObjectTO.class })
@@ -117,14 +116,8 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public AttrTO getPlainAttr(final String schema) {
-        return IterableUtils.find(plainAttrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getPlainAttr(final String schema) {
+        return plainAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
     @XmlElementWrapper(name = "derAttrs")
@@ -137,14 +130,8 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public AttrTO getDerAttr(final String schema) {
-        return IterableUtils.find(derAttrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getDerAttr(final String schema) {
+        return derAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
     @XmlElementWrapper(name = "virAttrs")
@@ -157,14 +144,8 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public AttrTO getVirAttr(final String schema) {
-        return IterableUtils.find(virAttrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getVirAttr(final String schema) {
+        return virAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
     @XmlElementWrapper(name = "resources")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
index 7822a6b..0c71ca6 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
@@ -28,7 +28,6 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.CollectionUtils;
 
 @XmlRootElement(name = "attribute")
 @XmlType
@@ -56,7 +55,9 @@ public class AttrTO extends AbstractBaseBean {
         }
 
         public Builder values(final String... values) {
-            CollectionUtils.addAll(instance.getValues(), values);
+            for (String value : values) {
+                instance.getValues().add(value);
+            }
             return this;
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttributableTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttributableTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttributableTO.java
index 79e57b8..d0f900c 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttributableTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttributableTO.java
@@ -18,19 +18,20 @@
  */
 package org.apache.syncope.common.lib.to;
 
+import java.util.Optional;
 import java.util.Set;
 
 public interface AttributableTO {
 
     Set<AttrTO> getPlainAttrs();
 
-    AttrTO getPlainAttr(String schema);
+    Optional<AttrTO> getPlainAttr(String schema);
 
     Set<AttrTO> getDerAttrs();
 
-    AttrTO getDerAttr(String schema);
+    Optional<AttrTO> getDerAttr(String schema);
 
     Set<AttrTO> getVirAttrs();
 
-    AttrTO getVirAttr(String schema);
+    Optional<AttrTO> getVirAttr(String schema);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/BulkActionResult.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/BulkActionResult.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/BulkActionResult.java
index c2e67f4..6458fdb 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/BulkActionResult.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/BulkActionResult.java
@@ -69,11 +69,9 @@ public class BulkActionResult extends AbstractBaseBean {
     public List<String> getResultByStatus(final Status status) {
         final List<String> result = new ArrayList<>();
 
-        for (Map.Entry<String, Status> entry : results.entrySet()) {
-            if (entry.getValue() == status) {
-                result.add(entry.getKey());
-            }
-        }
+        results.entrySet().stream().
+                filter((entry) -> (entry.getValue() == status)).
+                forEachOrdered(entry -> result.add(entry.getKey()));
 
         return Collections.unmodifiableList(result);
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
index 23fb590..76424fe 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnInstanceTO.java
@@ -23,14 +23,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
@@ -122,14 +121,8 @@ public class ConnInstanceTO extends AbstractBaseBean implements EntityTO {
     }
 
     @JsonIgnore
-    public ConnConfProperty getConf(final String schemaName) {
-        return IterableUtils.find(conf, new Predicate<ConnConfProperty>() {
-
-            @Override
-            public boolean evaluate(final ConnConfProperty object) {
-                return object.getSchema().getName().equals(schemaName);
-            }
-        });
+    public Optional<ConnConfProperty> getConf(final String schemaName) {
+        return conf.stream().filter(property -> property.getSchema().getName().equals(schemaName)).findFirst();
     }
 
     @XmlElementWrapper(name = "capabilities")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
index 6301d68..6086066 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ConnObjectTO.java
@@ -21,13 +21,12 @@ package org.apache.syncope.common.lib.to;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.LinkedHashSet;
+import java.util.Optional;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "connObject")
@@ -46,13 +45,7 @@ public class ConnObjectTO extends AbstractBaseBean {
     }
 
     @JsonIgnore
-    public AttrTO getAttr(final String schema) {
-        return IterableUtils.find(attrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getAttr(final String schema) {
+        return attrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
index 0ae0885..c531840 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupTO.java
@@ -24,13 +24,12 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.jaxb.XmlGenericMapAdapter;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
@@ -102,14 +101,10 @@ public class GroupTO extends AnyTO {
     }
 
     @JsonIgnore
-    public TypeExtensionTO getTypeExtension(final String anyType) {
-        return IterableUtils.find(typeExtensions, new Predicate<TypeExtensionTO>() {
-
-            @Override
-            public boolean evaluate(final TypeExtensionTO typeExtension) {
-                return anyType != null && anyType.equals(typeExtension.getAnyType());
-            }
-        });
+    public Optional<TypeExtensionTO> getTypeExtension(final String anyType) {
+        return typeExtensions.stream().filter(
+                typeExtension -> anyType != null && anyType.equals(typeExtension.getAnyType())).
+                findFirst();
     }
 
     @XmlElementWrapper(name = "typeExtensions")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
index f2b8dbc..37fcb3a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/GroupableRelatableTO.java
@@ -19,16 +19,17 @@
 package org.apache.syncope.common.lib.to;
 
 import java.util.List;
+import java.util.Optional;
 
 public interface GroupableRelatableTO {
 
-    MembershipTO getMembership(String groupKey);
+    Optional<MembershipTO> getMembership(String groupKey);
 
     List<MembershipTO> getMemberships();
 
     List<MembershipTO> getDynMemberships();
 
-    RelationshipTO getRelationship(String type, String rightKey);
+    Optional<RelationshipTO> getRelationship(String type, String rightKey);
 
     List<RelationshipTO> getRelationships();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
index 23c91ac..c3be6f2 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MappingTO.java
@@ -25,8 +25,6 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "mapping")
@@ -51,13 +49,7 @@ public class MappingTO extends AbstractBaseBean implements ItemContainerTO {
 
     @Override
     public ItemTO getConnObjectKeyItem() {
-        return IterableUtils.find(getItems(), new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO item) {
-                return item.isConnObjectKey();
-            }
-        });
+        return getItems().stream().filter(item -> item.isConnObjectKey()).findFirst().get();
     }
 
     protected boolean addConnObjectKeyItem(final ItemTO connObjectItem) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
index 5737c7f..9163aba 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/MembershipTO.java
@@ -21,13 +21,12 @@ package org.apache.syncope.common.lib.to;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.HashSet;
+import java.util.Optional;
 import java.util.Set;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
 @XmlRootElement(name = "membership")
@@ -111,14 +110,8 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public AttrTO getPlainAttr(final String schema) {
-        return IterableUtils.find(plainAttrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getPlainAttr(final String schema) {
+        return plainAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
     @XmlElementWrapper(name = "derAttrs")
@@ -131,14 +124,8 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public AttrTO getDerAttr(final String schema) {
-        return IterableUtils.find(derAttrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getDerAttr(final String schema) {
+        return derAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 
     @XmlElementWrapper(name = "virAttrs")
@@ -151,13 +138,7 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public AttrTO getVirAttr(final String schema) {
-        return IterableUtils.find(virAttrs, new Predicate<AttrTO>() {
-
-            @Override
-            public boolean evaluate(final AttrTO object) {
-                return object.getSchema().equals(schema);
-            }
-        });
+    public Optional<AttrTO> getVirAttr(final String schema) {
+        return virAttrs.stream().filter(attr -> attr.getSchema().equals(schema)).findFirst();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
index c18b05e..ae4255f 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/OrgUnitTO.java
@@ -25,8 +25,6 @@ import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 
 @XmlRootElement(name = "orgUnit")
@@ -81,13 +79,7 @@ public class OrgUnitTO extends AbstractBaseBean implements EntityTO, ItemContain
 
     @Override
     public ItemTO getConnObjectKeyItem() {
-        return IterableUtils.find(getItems(), new Predicate<ItemTO>() {
-
-            @Override
-            public boolean evaluate(final ItemTO item) {
-                return item.isConnObjectKey();
-            }
-        });
+        return getItems().stream().filter(item -> item.isConnObjectKey()).findFirst().get();
     }
 
     protected boolean addConnObjectKeyItem(final ItemTO connObjectItem) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
index 4bc9c0d..6286e93 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/ResourceTO.java
@@ -23,14 +23,13 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import java.util.ArrayList;
 import java.util.EnumSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.ws.rs.PathParam;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
@@ -186,14 +185,10 @@ public class ResourceTO extends AbstractBaseBean implements EntityTO {
     }
 
     @JsonIgnore
-    public ProvisionTO getProvision(final String anyType) {
-        return IterableUtils.find(provisions, new Predicate<ProvisionTO>() {
-
-            @Override
-            public boolean evaluate(final ProvisionTO provisionTO) {
-                return anyType != null && anyType.equals(provisionTO.getAnyType());
-            }
-        });
+    public Optional<ProvisionTO> getProvision(final String anyType) {
+        return provisions.stream().filter(
+                provision -> anyType != null && anyType.equals(provision.getAnyType())).
+                findFirst();
     }
 
     @XmlElementWrapper(name = "provisions")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
index 6deab32..3e9cd4d 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/UserTO.java
@@ -24,12 +24,11 @@ import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Optional;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -197,14 +196,10 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public RelationshipTO getRelationship(final String type, final String rightKey) {
-        return IterableUtils.find(relationships, new Predicate<RelationshipTO>() {
-
-            @Override
-            public boolean evaluate(final RelationshipTO object) {
-                return type.equals(object.getType()) && rightKey.equals(object.getRightKey());
-            }
-        });
+    public Optional<RelationshipTO> getRelationship(final String type, final String rightKey) {
+        return relationships.stream().filter(
+                relationship -> type.equals(relationship.getType()) && rightKey.equals(relationship.getRightKey())).
+                findFirst();
     }
 
     @XmlElementWrapper(name = "relationships")
@@ -217,14 +212,8 @@ public class UserTO extends AnyTO implements GroupableRelatableTO {
 
     @JsonIgnore
     @Override
-    public MembershipTO getMembership(final String groupKey) {
-        return IterableUtils.find(memberships, new Predicate<MembershipTO>() {
-
-            @Override
-            public boolean evaluate(final MembershipTO object) {
-                return groupKey.equals(object.getGroupKey());
-            }
-        });
+    public Optional<MembershipTO> getMembership(final String groupKey) {
+        return memberships.stream().filter(membership -> groupKey.equals(membership.getGroupKey())).findFirst();
     }
 
     @XmlElementWrapper(name = "memberships")

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

Posted by il...@apache.org.
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());
                 }
             }
         }

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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
index a5a1a6e..7a2b4ed 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletDirectoryPanel.java
@@ -26,9 +26,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -104,7 +102,7 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
     protected List<IColumn<ReportletWrapper, String>> getColumns() {
         final List<IColumn<ReportletWrapper, String>> columns = new ArrayList<>();
 
-        columns.add(new PropertyColumn<ReportletWrapper, String>(
+        columns.add(new PropertyColumn<>(
                 new StringResourceModel("reportlet", this), "name", "name"));
 
         columns.add(new AbstractColumn<ReportletWrapper, String>(
@@ -117,6 +115,7 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
                     final Item<ICellPopulator<ReportletWrapper>> cellItem,
                     final String componentId,
                     final IModel<ReportletWrapper> rowModel) {
+
                 cellItem.add(new Label(componentId, rowModel.getObject().getConf().getClass().getName()));
             }
         });
@@ -164,13 +163,8 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
                 final ReportletConf reportlet = model.getObject().getConf();
                 try {
                     final ReportTO actual = restClient.read(report);
-                    CollectionUtils.filter(actual.getReportletConfs(), new Predicate<ReportletConf>() {
-
-                        @Override
-                        public boolean evaluate(final ReportletConf object) {
-                            return !object.getName().equals(reportlet.getName());
-                        }
-                    });
+                    actual.getReportletConfs().removeAll(actual.getReportletConfs().stream().
+                            filter(conf -> conf.getName().equals(reportlet.getName())).collect(Collectors.toList()));
                     restClient.update(actual);
                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     customActionOnFinishCallback(target);
@@ -239,15 +233,9 @@ public class ReportletDirectoryPanel extends DirectoryPanel<
         public Iterator<ReportletWrapper> iterator(final long first, final long count) {
             final ReportTO actual = restClient.read(report);
 
-            final ArrayList<ReportletWrapper> reportlets = CollectionUtils.collect(
-                    actual.getReportletConfs(),
-                    new Transformer<AbstractReportletConf, ReportletWrapper>() {
-
-                @Override
-                public ReportletWrapper transform(final AbstractReportletConf input) {
-                    return new ReportletWrapper(input.getName()).setName(input.getName()).setConf(input);
-                }
-            }, new ArrayList<ReportletWrapper>());
+            final List<ReportletWrapper> reportlets = actual.getReportletConfs().stream().
+                    map(conf -> new ReportletWrapper(conf.getName()).setName(conf.getName()).setConf(conf)).
+                    collect(Collectors.toList());
 
             Collections.sort(reportlets, comparator);
             return reportlets.subList((int) first, (int) (first + count)).iterator();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
index 7156acf..cf69215 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportletWizardBuilder.java
@@ -20,14 +20,9 @@ package org.apache.syncope.client.console.reports;
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.lang3.tuple.Pair;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.panels.BeanPanel;
-import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.console.rest.ReportRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
@@ -41,7 +36,6 @@ import org.apache.wicket.extensions.wizard.WizardStep;
 import org.apache.wicket.model.PropertyModel;
 import org.springframework.beans.BeanWrapper;
 import org.springframework.beans.PropertyAccessorFactory;
-import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
 import org.apache.wicket.model.LoadableDetachableModel;
 
 public class ReportletWizardBuilder extends AjaxWizardBuilder<ReportletDirectoryPanel.ReportletWrapper> {
@@ -69,23 +63,18 @@ public class ReportletWizardBuilder extends AjaxWizardBuilder<ReportletDirectory
         if (modelObject.isNew()) {
             reportTO.getReportletConfs().add(modelObject.getConf());
         } else {
-            CollectionUtils.filter(
-                    reportTO.getReportletConfs(), new Predicate<AbstractReportletConf>() {
-
-                @Override
-                public boolean evaluate(final AbstractReportletConf object) {
-                    return !object.getName().equals(modelObject.getOldName());
-                }
-            });
+            reportTO.getReportletConfs().removeAll(
+                    reportTO.getReportletConfs().stream().
+                            filter(object -> object.getName().equals(modelObject.getOldName())).
+                            collect(Collectors.toList()));
             reportTO.getReportletConfs().add(modelObject.getConf());
         }
 
         BeanWrapper wrapper = PropertyAccessorFactory.forBeanPropertyAccess(modelObject.getConf());
-        for (Map.Entry<String, Pair<AbstractFiqlSearchConditionBuilder, List<SearchClause>>> entry
-                : modelObject.getSCondWrapper().entrySet()) {
+        modelObject.getSCondWrapper().entrySet().forEach(entry -> {
             wrapper.setPropertyValue(entry.getKey(),
                     SearchUtils.buildFIQL(entry.getValue().getRight(), entry.getValue().getLeft()));
-        }
+        });
 
         restClient.update(reportTO);
         return modelObject;
@@ -106,7 +95,7 @@ public class ReportletWizardBuilder extends AjaxWizardBuilder<ReportletDirectory
         public Profile(final ReportletDirectoryPanel.ReportletWrapper reportlet) {
 
             final AjaxTextFieldPanel name = new AjaxTextFieldPanel(
-                    "name", "reportlet", new PropertyModel<String>(reportlet, "name"), false);
+                    "name", "reportlet", new PropertyModel<>(reportlet, "name"), false);
             name.addRequiredLabel();
             name.setEnabled(true);
             add(name);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/resources/AbstractWorkflowResource.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/resources/AbstractWorkflowResource.java b/client/console/src/main/java/org/apache/syncope/client/console/resources/AbstractWorkflowResource.java
index 85a2cbc..b76bd9e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/resources/AbstractWorkflowResource.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/resources/AbstractWorkflowResource.java
@@ -19,8 +19,6 @@
 package org.apache.syncope.client.console.resources;
 
 import javax.ws.rs.NotFoundException;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.WorkflowRestClient;
 import org.apache.syncope.common.lib.to.WorkflowDefinitionTO;
@@ -42,13 +40,8 @@ abstract class AbstractWorkflowResource extends AbstractResource {
                 attributes.getRequest().getQueryParameters().getParameterValue(Constants.MODEL_ID_PARAM);
 
         WorkflowDefinitionTO workflowDefinition = modelId == null || modelId.isNull() ? null
-                : IterableUtils.find(restClient.getDefinitions(), new Predicate<WorkflowDefinitionTO>() {
-
-                    @Override
-                    public boolean evaluate(final WorkflowDefinitionTO object) {
-                        return modelId.toString().equals(object.getModelId());
-                    }
-                });
+                : restClient.getDefinitions().stream().
+                        filter(object -> modelId.toString().equals(object.getModelId())).findAny().orElse(null);
         if (workflowDefinition == null) {
             throw new NotFoundException("Workflow definition with modelId " + modelId);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
index fc1e004..5db9f07 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/AnyTypeRestClient.java
@@ -22,7 +22,7 @@ import java.io.Serializable;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import org.apache.commons.collections4.ComparatorUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
@@ -94,7 +94,7 @@ public class AnyTypeRestClient extends BaseRestClient {
             if (o2.getKind() == AnyTypeKind.GROUP) {
                 return 1;
             }
-            return ComparatorUtils.<String>naturalComparator().compare(o1.getKey(), o2.getKey());
+            return ObjectUtils.compare(o1.getKey(), o2.getKey());
         }
     }
 
@@ -122,7 +122,7 @@ public class AnyTypeRestClient extends BaseRestClient {
             if (AnyTypeKind.GROUP.name().equals(2)) {
                 return 1;
             }
-            return ComparatorUtils.<String>naturalComparator().compare(o1, o2);
+            return ObjectUtils.compare(o1, o2);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
index 5f1d41b..729ea53 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ConnectorRestClient.java
@@ -22,11 +22,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -71,14 +69,8 @@ public class ConnectorRestClient extends BaseRestClient {
         ConnectorService service = getService(ConnectorService.class);
         ConnInstanceTO connInstance = service.read(connectorKey, SyncopeConsoleSession.get().getLocale().getLanguage());
         if (connInstance != null) {
-            CollectionUtils.collect(service.buildObjectClassInfo(connInstance, true),
-                    new Transformer<ConnIdObjectClassTO, String>() {
-
-                @Override
-                public String transform(final ConnIdObjectClassTO input) {
-                    return input.getType();
-                }
-            }, result);
+            result.addAll(service.buildObjectClassInfo(connInstance, true).stream().
+                    map(input -> input.getType()).collect(Collectors.toList()));
         }
 
         return result;
@@ -92,16 +84,11 @@ public class ConnectorRestClient extends BaseRestClient {
         connInstanceTO.getConf().addAll(conf);
 
         // SYNCOPE-156: use provided info to give schema names (and type!) by ObjectClass
-        ConnIdObjectClassTO connIdObjectClass = IterableUtils.find(
-                buildObjectClassInfo(connInstanceTO, false), new Predicate<ConnIdObjectClassTO>() {
+        Optional<ConnIdObjectClassTO> connIdObjectClass = buildObjectClassInfo(connInstanceTO, false).stream().
+                filter(object -> object.getType().equalsIgnoreCase(objectClass)).
+                findAny();
 
-            @Override
-            public boolean evaluate(final ConnIdObjectClassTO object) {
-                return object.getType().equalsIgnoreCase(objectClass);
-            }
-        });
-
-        return connIdObjectClass == null ? new ArrayList<String>() : connIdObjectClass.getAttributes();
+        return connIdObjectClass.isPresent() ? connIdObjectClass.get().getAttributes() : new ArrayList<>();
     }
 
     /**
@@ -152,22 +139,23 @@ public class ConnectorRestClient extends BaseRestClient {
     private List<ConnConfProperty> filterProperties(final Collection<ConnConfProperty> properties) {
         List<ConnConfProperty> newProperties = new ArrayList<>();
 
-        for (ConnConfProperty property : properties) {
+        properties.stream().map(property -> {
             ConnConfProperty prop = new ConnConfProperty();
             prop.setSchema(property.getSchema());
             prop.setOverridable(property.isOverridable());
-
             final List<Object> parsed = new ArrayList<>();
             if (property.getValues() != null) {
-                for (Object obj : property.getValues()) {
-                    if (obj != null && !obj.toString().isEmpty()) {
-                        parsed.add(obj);
-                    }
-                }
+                property.getValues().stream().
+                        filter(obj -> (obj != null && !obj.toString().isEmpty())).
+                        forEachOrdered((obj) -> {
+                            parsed.add(obj);
+                        });
             }
             prop.getValues().addAll(parsed);
+            return prop;
+        }).forEachOrdered(prop -> {
             newProperties.add(prop);
-        }
+        });
         return newProperties;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
index 818a8d2..a4c7825 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/LoggerRestClient.java
@@ -25,9 +25,8 @@ 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.ComparatorUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.syncope.common.lib.log.EventCategoryTO;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -43,37 +42,25 @@ public class LoggerRestClient extends BaseRestClient {
     private static final long serialVersionUID = 4579786978763032240L;
 
     public List<String> listMemoryAppenders() {
-        return CollectionUtils.collect(getService(LoggerService.class).memoryAppenders(),
-                new Transformer<LogAppender, String>() {
-
-            @Override
-            public String transform(final LogAppender input) {
-                return input.getName();
-            }
-        }, new ArrayList<String>());
+        return getService(LoggerService.class).memoryAppenders().stream().
+                map(LogAppender::getName).collect(Collectors.toList());
     }
 
     public List<LogStatementTO> getLastLogStatements(final String appender, final long lastStatementTime) {
         List<LogStatementTO> result = new ArrayList<>();
-        for (LogStatementTO statement : getService(LoggerService.class).getLastLogStatements(appender)) {
-            if (statement.getTimeMillis() > lastStatementTime) {
-                result.add(statement);
-            }
-        }
+        getService(LoggerService.class).getLastLogStatements(appender).stream().
+                filter(statement -> statement.getTimeMillis() > lastStatementTime).
+                forEachOrdered(statement -> {
+                    result.add(statement);
+                });
 
         return result;
     }
 
     public List<LoggerTO> listLogs() {
         List<LoggerTO> logs = getService(LoggerService.class).list(LoggerType.LOG);
-        Collections.sort(logs, ComparatorUtils.transformedComparator(
-                ComparatorUtils.<String>naturalComparator(), new Transformer<LoggerTO, String>() {
+        Collections.sort(logs, (o1, o2) -> ObjectUtils.compare(o1.getKey(), o2.getKey()));
 
-            @Override
-            public String transform(final LoggerTO input) {
-                return input.getKey();
-            }
-        }));
         return logs;
     }
 
@@ -83,13 +70,13 @@ public class LoggerRestClient extends BaseRestClient {
 
     public Map<String, Set<AuditLoggerName>> listAuditsByCategory() {
         Map<String, Set<AuditLoggerName>> result = new HashMap<>();
-        for (AuditLoggerName audit : listAudits()) {
+        listAudits().forEach(audit -> {
             if (!result.containsKey(audit.getCategory())) {
-                result.put(audit.getCategory(), new HashSet<AuditLoggerName>());
+                result.put(audit.getCategory(), new HashSet<>());
             }
 
             result.get(audit.getCategory()).add(audit);
-        }
+        });
 
         return result;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
index d3b6903..e1f8f78 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/ResourceRestClient.java
@@ -20,10 +20,9 @@ package org.apache.syncope.client.console.rest;
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
 import javax.ws.rs.core.Response;
-import org.apache.commons.collections4.ComparatorUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.patch.ResourceDeassociationPatch;
 import org.apache.syncope.common.lib.to.BulkActionResult;
@@ -95,13 +94,7 @@ public class ResourceRestClient extends BaseRestClient {
         List<ResourceTO> resources = Collections.emptyList();
         try {
             resources = getService(ResourceService.class).list();
-            Collections.sort(resources, new Comparator<ResourceTO>() {
-
-                @Override
-                public int compare(final ResourceTO o1, final ResourceTO o2) {
-                    return ComparatorUtils.<String>naturalComparator().compare(o1.getKey(), o2.getKey());
-                }
-            });
+            Collections.sort(resources, (o1, o2) -> ObjectUtils.compare(o1.getKey(), o2.getKey()));
         } catch (Exception e) {
             LOG.error("Could not fetch the Resource list", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
index 600afb3..c64846d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/rest/SchemaRestClient.java
@@ -19,13 +19,14 @@
 package org.apache.syncope.client.console.rest;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.SyncopeClientException;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.VirSchemaTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
@@ -99,11 +100,10 @@ public class SchemaRestClient extends BaseRestClient {
     }
 
     public List<String> getSchemaNames(final SchemaType schemaType) {
-        List<String> schemaNames = new ArrayList<>();
+        List<String> schemaNames = Collections.emptyList();
 
         try {
-            CollectionUtils.collect(getSchemas(schemaType),
-                    EntityTOUtils.<AbstractSchemaTO>keyTransformer(), schemaNames);
+            schemaNames = getSchemas(schemaType).stream().map(EntityTO::getKey).collect(Collectors.toList());
         } catch (SyncopeClientException e) {
             LOG.error("While getting all user schema names", e);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java b/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
index 18bdd0f..0596ea3 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/status/ResourceStatusModal.java
@@ -18,13 +18,11 @@
  */
 package org.apache.syncope.client.console.status;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.DirectoryDataProvider;
-import org.apache.syncope.client.console.commons.SerializableTransformer;
 import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.panels.DirectoryPanel;
 import org.apache.syncope.client.console.panels.MultilevelPanel;
@@ -52,14 +50,8 @@ public class ResourceStatusModal extends StatusModal<ResourceTO> {
 
         super(baseModal, pageReference, resource, null, false);
 
-        List<String> availableAnyTypes = CollectionUtils.collect(
-                resource.getProvisions(), new SerializableTransformer<ProvisionTO, String>() {
-
-            @Override
-            public String transform(final ProvisionTO provision) {
-                return provision.getAnyType();
-            }
-        }, new ArrayList<String>());
+        List<String> availableAnyTypes = resource.getProvisions().stream().
+                map(ProvisionTO::getAnyType).collect(Collectors.toList());
         Collections.sort(availableAnyTypes, new AnyTypeRestClient.AnyTypeKeyComparator());
 
         AjaxDropDownChoicePanel<String> anyTypes =

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
index 0b35971..0bded4b 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/PushTaskWrapper.java
@@ -22,7 +22,6 @@ import java.io.Serializable;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.SearchUtils;
 import org.apache.syncope.client.lib.SyncopeClient;
@@ -57,7 +56,7 @@ public class PushTaskWrapper implements Serializable {
         Map<String, String> filters = new HashMap<>();
 
         for (Map.Entry<String, List<SearchClause>> entry : getFilterClauses().entrySet()) {
-            if (CollectionUtils.isNotEmpty(entry.getValue())) {
+            if (!entry.getValue().isEmpty()) {
                 AbstractFiqlSearchConditionBuilder bld;
                 switch (entry.getKey()) {
                     case "USER":

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
index dccc22a..368b419 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/tasks/SchedTaskWizardBuilder.java
@@ -23,8 +23,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.RealmRestClient;
@@ -69,15 +68,8 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
 
         @Override
         protected List<String> load() {
-            List<String> result = CollectionUtils.collect(
-                    new RealmRestClient().list(), new Transformer<RealmTO, String>() {
-
-                @Override
-                public String transform(final RealmTO realm) {
-                    return realm.getFullPath();
-                }
-            }, new ArrayList<String>());
-
+            List<String> result = new RealmRestClient().list().stream().
+                    map(RealmTO::getFullPath).collect(Collectors.toList());
             Collections.sort(result);
 
             return result;
@@ -160,24 +152,24 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
         };
 
         public Profile(final SchedTaskTO taskTO) {
-            AjaxTextFieldPanel name = new AjaxTextFieldPanel("name", "name", new PropertyModel<String>(taskTO, "name"),
+            AjaxTextFieldPanel name = new AjaxTextFieldPanel("name", "name", new PropertyModel<>(taskTO, "name"),
                     false);
             name.addRequiredLabel();
             name.setEnabled(true);
             add(name);
 
             AjaxTextFieldPanel description = new AjaxTextFieldPanel(
-                    "description", "description", new PropertyModel<String>(taskTO, "description"), false);
+                    "description", "description", new PropertyModel<>(taskTO, "description"), false);
             description.setEnabled(true);
             add(description);
 
-            AjaxCheckBoxPanel active = new AjaxCheckBoxPanel("active", "active", new PropertyModel<Boolean>(taskTO,
-                    "active"), false);
+            AjaxCheckBoxPanel active = new AjaxCheckBoxPanel("active", "active", new PropertyModel<>(taskTO, "active"),
+                    false);
             add(active);
 
             AjaxDropDownChoicePanel<String> jobDelegateClassName = new AjaxDropDownChoicePanel<>(
                     "jobDelegateClassName", "jobDelegateClassName",
-                    new PropertyModel<String>(taskTO, "jobDelegateClassName"), false);
+                    new PropertyModel<>(taskTO, "jobDelegateClassName"), false);
             jobDelegateClassName.setChoices(taskJobClasses.getObject());
             jobDelegateClassName.addRequiredLabel();
             jobDelegateClassName.setEnabled(taskTO.getKey() == null);
@@ -198,7 +190,7 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
             }
 
             final AjaxDropDownChoicePanel<PullMode> pullMode = new AjaxDropDownChoicePanel<>(
-                    "pullMode", "pullMode", new PropertyModel<PullMode>(taskTO, "pullMode"), false);
+                    "pullMode", "pullMode", new PropertyModel<>(taskTO, "pullMode"), false);
             pullMode.setChoices(Arrays.asList(PullMode.values()));
             if (taskTO instanceof PullTaskTO) {
                 pullMode.addRequiredLabel();
@@ -208,7 +200,7 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
 
             final AjaxDropDownChoicePanel<String> reconciliationFilterBuilderClassName = new AjaxDropDownChoicePanel<>(
                     "reconciliationFilterBuilderClassName", "reconciliationFilterBuilderClassName",
-                    new PropertyModel<String>(taskTO, "reconciliationFilterBuilderClassName"), false);
+                    new PropertyModel<>(taskTO, "reconciliationFilterBuilderClassName"), false);
             reconciliationFilterBuilderClassName.setChoices(reconciliationFilterBuilderClasses.getObject());
             reconciliationFilterBuilderClassName.setStyleSheet("ui-widget-content ui-corner-all long_dynamicsize");
             reconciliationFilterBuilderClassName.setEnabled(isFiltered);
@@ -281,30 +273,30 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
             provisioningTaskSpecifics.add(actionsClassNames);
 
             AjaxDropDownChoicePanel<MatchingRule> matchingRule = new AjaxDropDownChoicePanel<>(
-                    "matchingRule", "matchingRule", new PropertyModel<MatchingRule>(taskTO, "matchingRule"), false);
+                    "matchingRule", "matchingRule", new PropertyModel<>(taskTO, "matchingRule"), false);
             matchingRule.setChoices(Arrays.asList(MatchingRule.values()));
             provisioningTaskSpecifics.add(matchingRule);
 
             AjaxDropDownChoicePanel<UnmatchingRule> unmatchingRule = new AjaxDropDownChoicePanel<>(
-                    "unmatchingRule", "unmatchingRule", new PropertyModel<UnmatchingRule>(taskTO, "unmatchingRule"),
+                    "unmatchingRule", "unmatchingRule", new PropertyModel<>(taskTO, "unmatchingRule"),
                     false);
             unmatchingRule.setChoices(Arrays.asList(UnmatchingRule.values()));
             provisioningTaskSpecifics.add(unmatchingRule);
 
             AjaxCheckBoxPanel performCreate = new AjaxCheckBoxPanel(
-                    "performCreate", "performCreate", new PropertyModel<Boolean>(taskTO, "performCreate"), false);
+                    "performCreate", "performCreate", new PropertyModel<>(taskTO, "performCreate"), false);
             provisioningTaskSpecifics.add(performCreate);
 
             AjaxCheckBoxPanel performUpdate = new AjaxCheckBoxPanel(
-                    "performUpdate", "performUpdate", new PropertyModel<Boolean>(taskTO, "performUpdate"), false);
+                    "performUpdate", "performUpdate", new PropertyModel<>(taskTO, "performUpdate"), false);
             provisioningTaskSpecifics.add(performUpdate);
 
             AjaxCheckBoxPanel performDelete = new AjaxCheckBoxPanel(
-                    "performDelete", "performDelete", new PropertyModel<Boolean>(taskTO, "performDelete"), false);
+                    "performDelete", "performDelete", new PropertyModel<>(taskTO, "performDelete"), false);
             provisioningTaskSpecifics.add(performDelete);
 
             AjaxCheckBoxPanel syncStatus = new AjaxCheckBoxPanel(
-                    "syncStatus", "syncStatus", new PropertyModel<Boolean>(taskTO, "syncStatus"), false);
+                    "syncStatus", "syncStatus", new PropertyModel<>(taskTO, "syncStatus"), false);
             provisioningTaskSpecifics.add(syncStatus);
         }
     }
@@ -315,7 +307,7 @@ public class SchedTaskWizardBuilder<T extends SchedTaskTO> extends AjaxWizardBui
 
         public Schedule(final SchedTaskTO taskTO) {
             crontabPanel = new CrontabPanel(
-                    "schedule", new PropertyModel<String>(taskTO, "cronExpression"), taskTO.getCronExpression());
+                    "schedule", new PropertyModel<>(taskTO, "cronExpression"), taskTO.getCronExpression());
             add(crontabPanel);
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index 071da87..c92f0ea 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -28,7 +28,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
@@ -42,8 +42,8 @@ import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.Component;
@@ -372,7 +372,7 @@ public class Topology extends BasePage {
         // -----------------------------------------
         final Collection<String> administrableConns = new HashSet<>();
         for (List<ConnInstanceTO> connInstances : connModel.getObject().values()) {
-            administrableConns.addAll(CollectionUtils.collect(connInstances, EntityTOUtils.keyTransformer()));
+            administrableConns.addAll(connInstances.stream().map(EntityTO::getKey).collect(Collectors.toList()));
         }
 
         final List<String> connToBeProcessed = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AttrColumn.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AttrColumn.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AttrColumn.java
index 1341791..d562805 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AttrColumn.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/AttrColumn.java
@@ -54,15 +54,15 @@ public class AttrColumn<T extends AttributableTO> extends AbstractColumn<T, Stri
         AttrTO attr = null;
         switch (schemaType) {
             case PLAIN:
-                attr = rowModel.getObject().getPlainAttr(name);
+                attr = rowModel.getObject().getPlainAttr(name).get();
                 break;
 
             case DERIVED:
-                attr = rowModel.getObject().getDerAttr(name);
+                attr = rowModel.getObject().getDerAttr(name).get();
                 break;
 
             case VIRTUAL:
-                attr = rowModel.getObject().getVirAttr(name);
+                attr = rowModel.getObject().getVirAttr(name).get();
                 break;
 
             default:

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ConnObjectAttrColumn.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ConnObjectAttrColumn.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ConnObjectAttrColumn.java
index 5d9dbd4..c0373b0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ConnObjectAttrColumn.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/extensions/markup/html/repeater/data/table/ConnObjectAttrColumn.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator;
@@ -48,8 +49,8 @@ public class ConnObjectAttrColumn extends AbstractColumn<ConnObjectTO, String> {
             final String componentId,
             final IModel<ConnObjectTO> rowModel) {
 
-        AttrTO attr = rowModel.getObject().getAttr(name);
-        List<String> values = attr == null ? null : attr.getValues();
+        Optional<AttrTO> attr = rowModel.getObject().getAttr(name);
+        List<String> values = attr.isPresent() ? attr.get().getValues() : null;
 
         if (values == null || values.isEmpty()) {
             cellItem.add(new Label(componentId, ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
index 968cb57..b9eb922 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/bootstrap/dialog/BaseModal.java
@@ -24,8 +24,7 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.behavior.Draggable
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
 import org.apache.syncope.client.console.panels.AbstractModalPanel;
 import org.apache.syncope.client.console.panels.ModalPanel;
 import org.apache.syncope.client.console.panels.NotificationPanel;
@@ -230,13 +229,11 @@ public class BaseModal<T extends Serializable> extends Modal<T> {
             throw new IllegalStateException();
         }
 
-        CollectionUtils.filterInverse(this.components, new Predicate<Component>() {
-
-            @Override
-            public boolean evaluate(final Component component) {
-                return SUBMIT.equals(component.getId());
-            }
-        });
+        Optional<Component> button =
+                this.components.stream().filter(component -> SUBMIT.equals(component.getId())).findAny();
+        if (button.isPresent()) {
+            this.components.remove(button.get());
+        }
 
         submitButton = null;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
index 4f1f714..e5fafb0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxPalettePanel.java
@@ -120,13 +120,12 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
                         final List<T> unselected = new ArrayList<>(choices.size());
                         final List<String> ids = Arrays.asList(getValue().split(","));
 
-                        for (final T choice : choices) {
+                        choices.forEach(choice -> {
                             final String choiceId = renderer.getIdValue(choice, 0);
-
                             if (!ids.contains(choiceId)) {
                                 unselected.add(choice);
                             }
-                        }
+                        });
 
                         return unselected;
                     }
@@ -139,9 +138,9 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
 
                         // reduce number of method calls by building a lookup table
                         final Map<T, String> idForChoice = new HashMap<>(choices.size());
-                        for (final T choice : choices) {
+                        choices.forEach(choice -> {
                             idForChoice.put(choice, renderer.getIdValue(choice, 0));
-                        }
+                        });
 
                         final String value = getValue();
                         int start = value.indexOf(';') + 1;
@@ -320,9 +319,9 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
             final List<T> selected = new ArrayList<>();
 
             final Map<T, String> idForChoice = new HashMap<>();
-            for (final T choice : choices) {
+            choices.forEach(choice -> {
                 idForChoice.put(choice, renderer.getIdValue(choice, 0));
-            }
+            });
 
             for (final String id : Strings.split(selection, ',')) {
                 final Iterator<T> iter = choices.iterator();
@@ -345,18 +344,18 @@ public class AjaxPalettePanel<T extends Serializable> extends AbstractFieldPanel
             final List<T> selected = new ArrayList<>(choices.size());
 
             final Map<T, String> idForChoice = new HashMap<>();
-            for (final T choice : choices) {
+            choices.forEach(choice -> {
                 idForChoice.put(choice, renderer.getIdValue(choice, 0));
-            }
+            });
 
             final Pattern pattern = Pattern.compile(filter, Pattern.CASE_INSENSITIVE);
 
-            for (T choice : choices) {
+            choices.forEach(choice -> {
                 final String idValue = idForChoice.get(choice);
                 if (pattern.matcher(idValue).matches()) {
                     selected.add(choice);
                 }
-            }
+            });
 
             return selected;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxSpinnerFieldPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxSpinnerFieldPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxSpinnerFieldPanel.java
index ae8729a..1621c9e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxSpinnerFieldPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/AjaxSpinnerFieldPanel.java
@@ -25,7 +25,6 @@ import com.googlecode.wicket.jquery.ui.form.spinner.SpinnerAdapter;
 import com.googlecode.wicket.jquery.ui.form.spinner.SpinnerBehavior;
 import java.io.Serializable;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
 import org.apache.syncope.client.console.commons.Constants;
@@ -98,8 +97,9 @@ public final class AjaxSpinnerFieldPanel<T extends Number> extends FieldPanel<T>
             public T getObject() {
                 T value = null;
 
-                if (CollectionUtils.isNotEmpty(list)
+                if (list != null && !list.isEmpty()
                         && list.get(0) != null && StringUtils.isNotBlank(list.get(0).toString())) {
+
                     value = reference.equals(Integer.class)
                             ? reference.cast(NumberUtils.toInt(list.get(0).toString()))
                             : reference.equals(Long.class)
@@ -175,8 +175,7 @@ public final class AjaxSpinnerFieldPanel<T extends Number> extends FieldPanel<T>
 
     @Override
     public AjaxSpinnerFieldPanel<T> clone() {
-        final AjaxSpinnerFieldPanel<T> panel
-                = new AjaxSpinnerFieldPanel<>(getId(), name, reference, model, options, false);
+        AjaxSpinnerFieldPanel<T> panel = new AjaxSpinnerFieldPanel<>(getId(), name, reference, model, options, false);
 
         panel.setRequired(isRequired());
         panel.setReadOnly(isReadOnly());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/SelectChoiceRenderer.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/SelectChoiceRenderer.java b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/SelectChoiceRenderer.java
index 82e5354..ddd40fb 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/SelectChoiceRenderer.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wicket/markup/html/form/SelectChoiceRenderer.java
@@ -19,8 +19,6 @@
 package org.apache.syncope.client.console.wicket.markup.html.form;
 
 import java.util.List;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.wicket.markup.html.form.IChoiceRenderer;
 import org.apache.wicket.model.IModel;
 
@@ -44,12 +42,8 @@ public class SelectChoiceRenderer<T> implements IChoiceRenderer<T> {
 
     @Override
     public T getObject(final String id, final IModel<? extends List<? extends T>> choices) {
-        return IterableUtils.find(choices.getObject(), new Predicate<T>() {
-
-            @Override
-            public boolean evaluate(final T object) {
-                return id != null && id.equals(getIdValue(object, 0));
-            }
-        });
+        return choices.getObject().stream().
+                filter(object -> id != null && id.equals(getIdValue(object, 0))).
+                findAny().orElse(null);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
index edce805..86aefed 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/ReconciliationWidget.java
@@ -28,11 +28,9 @@ import java.util.Date;
 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.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-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.client.console.SyncopeConsoleApplication;
@@ -124,15 +122,10 @@ public class ReconciliationWidget extends BaseWidget {
             protected void onTimer(final AjaxRequestTarget target) {
                 if (isCheckReconciliationJob()) {
                     try {
-                        JobTO reportJobTO = IterableUtils.find(restClient.listJobs(), new Predicate<JobTO>() {
-
-                            @Override
-                            public boolean evaluate(final JobTO jobTO) {
-                                return SyncopeConsoleApplication.get().
-                                        getReconciliationReportKey().equals(jobTO.getRefKey());
-                            }
-                        });
-                        if (reportJobTO != null && !reportJobTO.isRunning()) {
+                        Optional<JobTO> reportJobTO = restClient.listJobs().stream().
+                                filter(jobTO -> SyncopeConsoleApplication.get().
+                                getReconciliationReportKey().equals(jobTO.getRefKey())).findAny();
+                        if (reportJobTO.isPresent() && !reportJobTO.get().isRunning()) {
                             LOG.debug("Report {} is not running",
                                     SyncopeConsoleApplication.get().getReconciliationReportKey());
 
@@ -271,23 +264,19 @@ public class ReconciliationWidget extends BaseWidget {
         List<ProgressBean> beans = Collections.emptyList();
         ReconciliationReport report = null;
 
-        ExecTO exec = null;
+        Optional<ExecTO> exec = Optional.empty();
         if (SyncopeConsoleSession.get().owns(StandardEntitlement.REPORT_LIST)) {
-            exec = IterableUtils.find(restClient.listRecentExecutions(ROWS), new Predicate<ExecTO>() {
-
-                @Override
-                public boolean evaluate(final ExecTO exec) {
-                    return reconciliationReportKey.equals(exec.getRefKey());
-                }
-            });
+            exec = restClient.listRecentExecutions(ROWS).stream().
+                    filter(e -> reconciliationReportKey.equals(e.getRefKey())).findAny();
         }
-        if (exec == null) {
+        if (!exec.isPresent()) {
             LOG.error("Could not find the last execution of reconciliation report");
         } else {
-            Object entity = restClient.exportExecutionResult(exec.getKey(), ReportExecExportFormat.XML).getEntity();
+            Object entity = restClient.exportExecutionResult(
+                    exec.get().getKey(), ReportExecExportFormat.XML).getEntity();
             if (entity instanceof InputStream) {
                 try {
-                    report = ReconciliationReportParser.parse(exec.getEnd(), (InputStream) entity);
+                    report = ReconciliationReportParser.parse(exec.get().getEnd(), (InputStream) entity);
 
                     beans = new ArrayList<>();
 
@@ -385,22 +374,12 @@ public class ReconciliationWidget extends BaseWidget {
             });
 
             final Set<String> resources = new HashSet<>();
-            for (Any any : anys.getAnys()) {
-                resources.addAll(CollectionUtils.collect(any.getMissing(), new Transformer<Missing, String>() {
-
-                    @Override
-                    public String transform(final Missing input) {
-                        return input.getResource();
-                    }
-                }));
-                resources.addAll(CollectionUtils.collect(any.getMisaligned(), new Transformer<Misaligned, String>() {
-
-                    @Override
-                    public String transform(final Misaligned input) {
-                        return input.getResource();
-                    }
-                }));
-            }
+            anys.getAnys().forEach(any -> {
+                resources.addAll(any.getMissing().stream().
+                        map(Missing::getResource).collect(Collectors.toList()));
+                resources.addAll(any.getMisaligned().stream().
+                        map(Misaligned::getResource).collect(Collectors.toList()));
+            });
             for (final String resource : resources) {
                 columns.add(new AbstractColumn<Any, String>(Model.of(resource)) {
 
@@ -414,24 +393,14 @@ public class ReconciliationWidget extends BaseWidget {
 
                         final Any any = rowModel.getObject();
 
-                        Missing missing = IterableUtils.find(any.getMissing(), new Predicate<Missing>() {
+                        Optional<Missing> missing =
+                                any.getMissing().stream().
+                                        filter(object -> resource.equals(object.getResource())).findAny();
+                        List<Misaligned> misaligned = any.getMisaligned().stream().
+                                filter(object -> resource.equals(object.getResource())).collect(Collectors.toList());
 
-                            @Override
-                            public boolean evaluate(final Missing object) {
-                                return resource.equals(object.getResource());
-                            }
-                        });
-                        final List<Misaligned> misaligned = CollectionUtils.select(
-                                any.getMisaligned(), new Predicate<Misaligned>() {
-
-                            @Override
-                            public boolean evaluate(final Misaligned object) {
-                                return resource.equals(object.getResource());
-                            }
-                        }, new ArrayList<Misaligned>());
                         Component content;
-
-                        if (missing == null) {
+                        if (!missing.isPresent()) {
                             if (misaligned == null || misaligned.isEmpty()) {
                                 content = new Label(componentId, StringUtils.EMPTY);
                             } else {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReportParser.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReportParser.java b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReportParser.java
index b73b4ba..da5e76d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReportParser.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/widgets/reconciliation/ReconciliationReportParser.java
@@ -23,12 +23,11 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 
 public final class ReconciliationReportParser {
@@ -96,13 +95,12 @@ public final class ReconciliationReportParser {
                         anyObject.setType(lastAnyType);
                         anyObject.setKey(streamReader.getAttributeValue("", "key"));
                         final String anyType = lastAnyType;
-                        IterableUtils.find(report.getAnyObjects(), new Predicate<Anys>() {
-
-                            @Override
-                            public boolean evaluate(final Anys anys) {
-                                return anyType.equals(anys.getAnyType());
-                            }
-                        }).getAnys().add(anyObject);
+                        Optional<Anys> anyReport = report.getAnyObjects().stream().
+                                filter(anys -> anyType.equals(anys.getAnyType())).
+                                findFirst();
+                        if (anyReport.isPresent()) {
+                            anyReport.get().getAnys().add(anyObject);
+                        }
                         break;
 
                     case "missing":

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
index 88a792c..2d9ec68 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AbstractAttrs.java
@@ -26,17 +26,15 @@ import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.cxf.common.util.StringUtils;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.syncope.common.lib.to.AnyTO;
-import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.types.SchemaType;
@@ -90,8 +88,10 @@ public abstract class AbstractAttrs<S extends AbstractSchemaTO> extends WizardSt
     }
 
     private List<AttrTO> loadAttrTOs() {
-        setSchemas(CollectionUtils.collect(anyTypeClassRestClient.list(anyTO.getAuxClasses()),
-                EntityTOUtils.<AnyTypeClassTO>keyTransformer(), new ArrayList<>(anyTypeClasses)));
+        List<String> classes = new ArrayList<>(anyTypeClasses);
+        classes.addAll(anyTypeClassRestClient.list(anyTO.getAuxClasses()).stream().
+                map(EntityTO::getKey).collect(Collectors.toList()));
+        setSchemas(classes);
         setAttrs();
         return AbstractAttrs.this.getAttrsFromTO();
     }
@@ -104,10 +104,9 @@ public abstract class AbstractAttrs<S extends AbstractSchemaTO> extends WizardSt
 
             for (MembershipTO membership : (List<MembershipTO>) PropertyResolver.getPropertyField(
                     "memberships", anyTO).get(anyTO)) {
-                setSchemas(membership.getGroupKey(), CollectionUtils.collect(
-                        anyTypeClassRestClient.list(getMembershipAuxClasses(membership, anyTO.getType())),
-                        EntityTOUtils.<AnyTypeClassTO>keyTransformer(),
-                        new ArrayList<String>()));
+                setSchemas(membership.getGroupKey(),
+                        anyTypeClassRestClient.list(getMembershipAuxClasses(membership, anyTO.getType())).
+                                stream().map(EntityTO::getKey).collect(Collectors.toList()));
                 setAttrs(membership);
 
                 if (AbstractAttrs.this instanceof PlainAttrs && !membership.getPlainAttrs().isEmpty()) {
@@ -159,38 +158,29 @@ public abstract class AbstractAttrs<S extends AbstractSchemaTO> extends WizardSt
 
         if (reoderSchemas()) {
             // 1. remove attributes not selected for display
-            CollectionUtils.filter(allSchemas, new Predicate<S>() {
-
-                @Override
-                public boolean evaluate(final S schemaTO) {
-                    return whichAttrs.contains(schemaTO.getKey());
-                }
-            });
+            allSchemas.removeAll(allSchemas.stream().
+                    filter(schemaTO -> !whichAttrs.contains(schemaTO.getKey())).collect(Collectors.toSet()));
 
             // 2. sort remainig attributes according to configuration, e.g. attrLayout
             final Map<String, Integer> attrLayoutMap = new HashMap<>(whichAttrs.size());
             for (int i = 0; i < whichAttrs.size(); i++) {
                 attrLayoutMap.put(whichAttrs.get(i), i);
             }
-            Collections.sort(allSchemas, new Comparator<S>() {
-
-                @Override
-                public int compare(final S schema1, final S schema2) {
-                    int value = 0;
+            Collections.sort(allSchemas, (schema1, schema2) -> {
+                int value = 0;
 
-                    if (attrLayoutMap.get(schema1.getKey()) > attrLayoutMap.get(schema2.getKey())) {
-                        value = 1;
-                    } else if (attrLayoutMap.get(schema1.getKey()) < attrLayoutMap.get(schema2.getKey())) {
-                        value = -1;
-                    }
-
-                    return value;
+                if (attrLayoutMap.get(schema1.getKey()) > attrLayoutMap.get(schema2.getKey())) {
+                    value = 1;
+                } else if (attrLayoutMap.get(schema1.getKey()) < attrLayoutMap.get(schema2.getKey())) {
+                    value = -1;
                 }
+
+                return value;
             });
         }
-        for (S schemaTO : allSchemas) {
+        allSchemas.forEach(schemaTO -> {
             scs.put(schemaTO.getKey(), schemaTO);
-        }
+        });
     }
 
     @Override
@@ -215,7 +205,7 @@ public abstract class AbstractAttrs<S extends AbstractSchemaTO> extends WizardSt
     protected List<String> getMembershipAuxClasses(final MembershipTO membershipTO, final String anyType) {
         try {
             final GroupTO groupTO = groupRestClient.read(membershipTO.getRightKey());
-            return groupTO.getTypeExtension(anyType).getAuxClasses();
+            return groupTO.getTypeExtension(anyType).get().getAuxClasses();
         } catch (Exception e) {
             return Collections.emptyList();
         }
@@ -225,14 +215,11 @@ public abstract class AbstractAttrs<S extends AbstractSchemaTO> extends WizardSt
     public boolean evaluate() {
         this.attrTOs.setObject(loadAttrTOs());
         this.membershipTOs.setObject(loadMembershipAttrTOs());
-        return CollectionUtils.isNotEmpty(attrTOs.getObject()) || CollectionUtils.isNotEmpty(membershipTOs.getObject());
+        return !attrTOs.getObject().isEmpty() || !membershipTOs.getObject().isEmpty();
     }
 
     protected static class AttrComparator implements Comparator<AttrTO>, Serializable {
 
-        /**
-         *
-         */
         private static final long serialVersionUID = -5105030477767941060L;
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
index 2c75dae..4ebd393 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/ConnObjectPanel.java
@@ -22,9 +22,9 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -66,20 +66,8 @@ public class ConnObjectPanel extends Panel {
                         : connObjectTOs.getLeft().getAttrs());
 
                 final List<String> schemas = ListUtils.sum(
-                        CollectionUtils.collect(right, new Transformer<AttrTO, String>() {
-
-                            @Override
-                            public String transform(final AttrTO input) {
-                                return input.getSchema();
-                            }
-                        }, new ArrayList<String>()),
-                        CollectionUtils.collect(left, new Transformer<AttrTO, String>() {
-
-                            @Override
-                            public String transform(final AttrTO input) {
-                                return input.getSchema();
-                            }
-                        }, new ArrayList<String>()));
+                        right.stream().map(AttrTO::getSchema).collect(Collectors.toList()),
+                        left.stream().map(AttrTO::getSchema).collect(Collectors.toList()));
 
                 Collections.sort(schemas);
 
@@ -126,6 +114,7 @@ public class ConnObjectPanel extends Panel {
                         || (CollectionUtils.isNotEmpty(after.getValues())
                         && CollectionUtils.isNotEmpty(before.getValues())
                         && !after.getValues().equals(before.getValues()))) {
+
                     valueFragment.add(new Behavior() {
 
                         private static final long serialVersionUID = 3109256773218160485L;
@@ -152,9 +141,9 @@ public class ConnObjectPanel extends Panel {
     private Panel getValuePanel(final String id, final String schemaName, final AttrTO attrTO) {
         Panel field;
         if (attrTO == null) {
-            field = new AjaxTextFieldPanel(id, schemaName, new Model<String>());
+            field = new AjaxTextFieldPanel(id, schemaName, new Model<>());
         } else if (CollectionUtils.isEmpty(attrTO.getValues())) {
-            field = new AjaxTextFieldPanel(id, schemaName, new Model<String>());
+            field = new AjaxTextFieldPanel(id, schemaName, new Model<>());
         } else if (ConnIdSpecialName.PASSWORD.equals(schemaName)) {
             field = new AjaxTextFieldPanel(id, schemaName, new Model<>("********"));
         } else if (attrTO.getValues().size() == 1) {
@@ -163,7 +152,7 @@ public class ConnObjectPanel extends Panel {
             field = new MultiFieldPanel.Builder<>(new ListModel<>(attrTO.getValues())).build(
                     id,
                     schemaName,
-                    new AjaxTextFieldPanel("panel", schemaName, new Model<String>()));
+                    new AjaxTextFieldPanel("panel", schemaName, new Model<>()));
         }
 
         field.setEnabled(false);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
index a7dd79a..65de432 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Details.java
@@ -20,8 +20,7 @@ package org.apache.syncope.client.console.wizards.any;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.pages.Realms;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
@@ -57,29 +56,23 @@ public class Details<T extends AnyTO> extends WizardStep {
 
         if (templateMode) {
             realm = new AjaxTextFieldPanel(
-                    "destinationRealm", "destinationRealm", new PropertyModel<String>(inner, "realm"), false);
+                    "destinationRealm", "destinationRealm", new PropertyModel<>(inner, "realm"), false);
             AjaxTextFieldPanel.class.cast(realm).enableJexlHelp();
         } else {
             final List<AbstractLink> realmLinks = Realms.class.cast(pageRef.getPage()).getRealmChoicePanel().getLinks();
             final List<RealmTO> realms = new ArrayList<>();
-            for (AbstractLink link : realmLinks) {
-                Object obj = link.getDefaultModelObject();
-                if (obj instanceof RealmTO) {
-                    realms.add((RealmTO) obj);
-                }
-            }
+            realmLinks.stream().
+                    map(link -> link.getDefaultModelObject()).
+                    filter(obj -> (obj instanceof RealmTO)).
+                    forEachOrdered(obj -> {
+                        realms.add((RealmTO) obj);
+                    });
 
             realm = new AjaxDropDownChoicePanel<>(
-                    "destinationRealm", "destinationRealm", new PropertyModel<String>(inner, "realm"), false);
+                    "destinationRealm", "destinationRealm", new PropertyModel<>(inner, "realm"), false);
 
-            ((AjaxDropDownChoicePanel<String>) realm).setChoices(CollectionUtils.collect(
-                    realms, new Transformer<RealmTO, String>() {
-
-                @Override
-                public String transform(final RealmTO input) {
-                    return input.getFullPath();
-                }
-            }, new ArrayList<String>()));
+            ((AjaxDropDownChoicePanel<String>) realm).setChoices(
+                    realms.stream().map(RealmTO::getFullPath).collect(Collectors.toList()));
         }
         add(realm);
         add(getGeneralStatusInformation("generalStatusInformation", inner).

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
index 5da9273..da95dac 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DynamicMemberships.java
@@ -18,15 +18,12 @@
  */
 package org.apache.syncope.client.console.wizards.any;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.panels.search.AnyObjectSearchPanel;
 import org.apache.syncope.client.console.panels.search.MapOfListModel;
-import org.apache.syncope.client.console.panels.search.SearchClause;
 import org.apache.syncope.client.console.panels.search.UserSearchPanel;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
@@ -59,13 +56,9 @@ public class DynamicMemberships extends WizardStep {
 
             @Override
             protected List<AnyTypeTO> load() {
-                return CollectionUtils.select(anyTypeRestClient.listAnyTypes(), new Predicate<AnyTypeTO>() {
-
-                    @Override
-                    public boolean evaluate(final AnyTypeTO t) {
-                        return AnyTypeKind.USER != t.getKind() && AnyTypeKind.GROUP != t.getKind();
-                    }
-                }, new ArrayList<AnyTypeTO>());
+                return anyTypeRestClient.listAnyTypes().stream().
+                        filter(type -> AnyTypeKind.USER != type.getKind() && AnyTypeKind.GROUP != type.getKind()).
+                        collect(Collectors.toList());
             }
         };
 
@@ -79,7 +72,7 @@ public class DynamicMemberships extends WizardStep {
 
             @Override
             public Panel getPanel(final String panelId) {
-                return new UserSearchPanel.Builder(new PropertyModel<List<SearchClause>>(groupWrapper, "uDynClauses")).
+                return new UserSearchPanel.Builder(new PropertyModel<>(groupWrapper, "uDynClauses")).
                         required(true).build(panelId);
             }
         }), Model.of(StringUtils.isBlank(groupWrapper.getUDynMembershipCond()) ? -1 : 0)).setOutputMarkupId(true));
@@ -104,7 +97,7 @@ public class DynamicMemberships extends WizardStep {
                     @Override
                     public Panel getPanel(final String panelId) {
                         return new AnyObjectSearchPanel.Builder(
-                                key, new MapOfListModel<SearchClause>(groupWrapper, "aDynClauses", key)).
+                                key, new MapOfListModel<>(groupWrapper, "aDynClauses", key)).
                                 required(false).build(panelId);
                     }
                 }), Model.of(StringUtils.isBlank(groupWrapper.getADynMembershipConds().get(key)) ? -1 : 0))

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
index 499bc26..fe9e226 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/Groups.java
@@ -22,11 +22,8 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.collections4.ListUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.cxf.jaxrs.ext.search.client.CompleteCondition;
 import org.apache.syncope.client.console.SyncopeConsoleApplication;
@@ -35,10 +32,10 @@ import org.apache.syncope.client.console.rest.GroupRestClient;
 import org.apache.syncope.client.console.wicket.ajax.markup.html.LabelInfo;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.lib.SyncopeClient;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.search.GroupFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.DynRealmTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.wicket.extensions.markup.html.repeater.util.SortParam;
@@ -123,13 +120,8 @@ public class Groups extends WizardStep implements ICondition {
                         public MembershipTO getObject(
                                 final String id, final IModel<? extends List<? extends MembershipTO>> choices) {
 
-                            return IterableUtils.find(choices.getObject(), new Predicate<MembershipTO>() {
-
-                                @Override
-                                public boolean evaluate(final MembershipTO object) {
-                                    return id.equalsIgnoreCase(object.getGroupName());
-                                }
-                            });
+                            return choices.getObject().stream().
+                                    filter(object -> id.equalsIgnoreCase(object.getGroupName())).findAny().orElse(null);
                         }
                     });
 
@@ -149,25 +141,20 @@ public class Groups extends WizardStep implements ICondition {
 
                 @Override
                 public List<MembershipTO> execute(final String filter) {
-                    return CollectionUtils.collect(
-                            StringUtils.isEmpty(filter) || "*".equals(filter)
+                    return (StringUtils.isEmpty(filter) || "*".equals(filter)
                             ? groupsModel.getObject()
                             : groupRestClient.search(
                                     anyTO.getRealm(),
                                     SyncopeClient.getGroupSearchConditionBuilder().
-                                    isAssignable().and().is("name").equalTo(filter).query(),
+                                            isAssignable().and().is("name").equalTo(filter).query(),
                                     1, MAX_GROUP_LIST_CARDINALITY,
                                     new SortParam<>("name", true),
-                                    null),
-                            new Transformer<GroupTO, MembershipTO>() {
+                                    null)).stream().map(input -> {
 
-                        @Override
-                        public MembershipTO transform(final GroupTO input) {
-                            return new MembershipTO.Builder().
-                                    group(input.getKey(), input.getName()).
-                                    build();
-                        }
-                    }, new ArrayList<MembershipTO>());
+                                return new MembershipTO.Builder().
+                                        group(input.getKey(), input.getName()).
+                                        build();
+                            }).collect(Collectors.toList());
                 }
             }).hideLabel().setOutputMarkupId(true));
 
@@ -181,25 +168,15 @@ public class Groups extends WizardStep implements ICondition {
                     return Groups.this.groupsModel.getDynMemberships();
                 }
 
-            }, new ListModel<>(CollectionUtils.collect(groupsModel.getObject(),
-                            new Transformer<GroupTO, String>() {
-
-                        @Override
-                        public String transform(final GroupTO input) {
-                            return input.getName();
-                        }
-                    }, new ArrayList<String>()))).
+            }, new ListModel<>(groupsModel.getObject().stream().map(GroupTO::getName).collect(Collectors.toList()))).
                     hideLabel().setEnabled(false).setOutputMarkupId(true));
 
             // ---------------------------------
         }
 
-        add(new AjaxPalettePanel.Builder<String>().build("dynrealms",
-                new PropertyModel<List<String>>(anyTO, "dynRealms"),
-                new ListModel<>(
-                        CollectionUtils.collect(allDynRealms,
-                                EntityTOUtils.keyTransformer(),
-                                new ArrayList<String>()))).
+        add(new AjaxPalettePanel.Builder<>().build("dynrealms",
+                new PropertyModel<>(anyTO, "dynRealms"),
+                new ListModel<>(allDynRealms.stream().map(EntityTO::getKey).collect(Collectors.toList()))).
                 hideLabel().setEnabled(false).setOutputMarkupId(true));
 
         // ------------------
@@ -219,11 +196,11 @@ public class Groups extends WizardStep implements ICondition {
 
     @Override
     public boolean evaluate() {
-        return ((anyTO instanceof GroupTO)
-                ? CollectionUtils.isNotEmpty(allDynRealms)
-                : CollectionUtils.isNotEmpty(allDynRealms) || CollectionUtils.isNotEmpty(groupsModel.getObject()))
+        return (anyTO instanceof GroupTO
+                ? !allDynRealms.isEmpty()
+                : !allDynRealms.isEmpty() || !groupsModel.getObject().isEmpty())
                 && SyncopeConsoleApplication.get().getSecuritySettings().getAuthorizationStrategy().
-                isActionAuthorized(this, RENDER);
+                        isActionAuthorized(this, RENDER);
     }
 
     private class GroupsModel extends ListModel<GroupTO> {
@@ -270,32 +247,33 @@ public class Groups extends WizardStep implements ICondition {
             GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder();
 
             List<CompleteCondition> conditions = new ArrayList<>();
-            for (MembershipTO membershipTO : GroupableRelatableTO.class.cast(anyTO).getMemberships()) {
+            GroupableRelatableTO.class.cast(anyTO).getMemberships().forEach(membershipTO -> {
                 conditions.add(searchConditionBuilder.is("key").equalTo(membershipTO.getGroupKey()).wrap());
-            }
+            });
 
             Map<String, GroupTO> assignedGroups = new HashMap<>();
             if (!conditions.isEmpty()) {
-                for (GroupTO group : groupRestClient.search(
+                groupRestClient.search(
                         realm,
                         searchConditionBuilder.isAssignable().and().or(conditions).query(),
                         -1,
                         -1,
                         new SortParam<>("name", true),
-                        null)) {
-                    assignedGroups.put(group.getKey(), group);
-                }
+                        null).
+                        forEach(group -> {
+                            assignedGroups.put(group.getKey(), group);
+                        });
             }
 
             // set group names in membership TOs and remove membership not assignable
             List<MembershipTO> toBeRemoved = new ArrayList<>();
-            for (MembershipTO membership : GroupableRelatableTO.class.cast(anyTO).getMemberships()) {
+            GroupableRelatableTO.class.cast(anyTO).getMemberships().forEach(membership -> {
                 if (assignedGroups.containsKey(membership.getRightKey())) {
                     membership.setGroupName(assignedGroups.get(membership.getRightKey()).getName());
                 } else {
                     toBeRemoved.add(membership);
                 }
-            }
+            });
             GroupableRelatableTO.class.cast(anyTO).getMemberships().removeAll(toBeRemoved);
 
             memberships = GroupableRelatableTO.class.cast(anyTO).getMemberships();
@@ -313,30 +291,25 @@ public class Groups extends WizardStep implements ICondition {
             GroupFiqlSearchConditionBuilder searchConditionBuilder = SyncopeClient.getGroupSearchConditionBuilder();
 
             ArrayList<CompleteCondition> conditions = new ArrayList<>();
-            for (MembershipTO membership : GroupableRelatableTO.class.cast(anyTO).getDynMemberships()) {
+            GroupableRelatableTO.class.cast(anyTO).getDynMemberships().forEach(membership -> {
                 conditions.add(searchConditionBuilder.is("key").equalTo(membership.getGroupKey()).wrap());
-            }
+            });
 
             Map<String, GroupTO> assignedGroups = new HashMap<>();
             if (!conditions.isEmpty()) {
-                for (GroupTO group : groupRestClient.search(
+                groupRestClient.search(
                         "/",
                         searchConditionBuilder.or(conditions).query(),
                         -1,
                         -1,
                         new SortParam<>("name", true),
-                        null)) {
-                    assignedGroups.put(group.getKey(), group);
-                }
+                        null).
+                        forEach(group -> {
+                            assignedGroups.put(group.getKey(), group);
+                        });
             }
 
-            dynMemberships = CollectionUtils.collect(assignedGroups.values(), new Transformer<GroupTO, String>() {
-
-                @Override
-                public String transform(final GroupTO input) {
-                    return input.getName();
-                }
-            }, new ArrayList<String>());
+            dynMemberships = assignedGroups.values().stream().map(GroupTO::getName).collect(Collectors.toList());
         }
 
         /**


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

Posted by il...@apache.org.
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),

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

Posted by il...@apache.org.
[SYNCOPE-938] Switching from commons-collections to Java 8 features


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

Branch: refs/heads/master
Commit: 74ee038a4b52bb58954900c3ad6692eb1d6176c1
Parents: fa093b3
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Tue Aug 22 17:05:28 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Tue Aug 22 17:05:28 2017 +0200

----------------------------------------------------------------------
 .../commands/connector/ConnectorDetails.java    |   4 +-
 .../cli/commands/domain/DomainDetails.java      |   4 +-
 .../client/cli/commands/group/GroupDetails.java |   4 +-
 .../cli/commands/logger/LoggerDetails.java      |   4 +-
 .../logger/LoggerSyncopeOperations.java         |  12 +-
 .../cli/commands/policy/PolicyDetails.java      |   4 +-
 .../client/cli/commands/realm/RealmDetails.java |   4 +-
 .../cli/commands/report/ReportDetails.java      |   4 +-
 .../cli/commands/resource/ResourceDetails.java  |   4 +-
 .../client/cli/commands/role/RoleDetails.java   |   4 +-
 .../cli/commands/schema/SchemaDetails.java      |   4 +-
 .../client/cli/commands/task/TaskDetails.java   |   4 +-
 .../client/cli/commands/user/UserDetails.java   |   4 +-
 .../console/SyncopeConsoleApplication.java      |  20 +-
 .../client/console/SyncopeConsoleSession.java   |  18 +-
 .../client/console/bulk/BulkContent.java        |  35 +-
 .../commons/ResourceStatusDataProvider.java     |  30 +-
 .../commons/SerializableTransformer.java        |  33 --
 .../commons/SortableAnyProviderComparator.java  |   8 +-
 .../console/commons/status/StatusUtils.java     |  13 +-
 .../console/events/EventCategoryPanel.java      |  56 ++-
 .../init/ClassPathScanImplementationLookup.java |  36 +-
 .../NotificationWizardBuilder.java              |  53 +--
 .../notifications/NotificationWrapper.java      |   8 +-
 .../syncope/client/console/pages/LogViewer.java |  14 +-
 .../console/panels/AnyDirectoryPanel.java       |  98 ++---
 .../panels/AnyTypeClassDetailsPanel.java        |  32 +-
 .../console/panels/AnyTypeDetailsPanel.java     |   9 +-
 .../client/console/panels/BeanPanel.java        |  25 +-
 .../console/panels/ConnObjectListViewPanel.java |  17 +-
 .../client/console/panels/ConnObjects.java      |  16 +-
 .../client/console/panels/ConsoleLogPanel.java  |  16 +-
 .../console/panels/HistoryConfDetails.java      |  37 +-
 .../client/console/panels/ListViewPanel.java    |  17 +-
 .../console/panels/MembersTogglePanel.java      |  14 +-
 .../syncope/client/console/panels/Realm.java    |  14 +-
 .../client/console/panels/RealmChoicePanel.java |  52 +--
 .../client/console/panels/RealmDetails.java     |  21 +-
 .../client/console/panels/SchemaTypePanel.java  |  26 +-
 .../client/console/panels/VirSchemaDetails.java |  36 +-
 .../panels/search/AbstractSearchPanel.java      |   9 +-
 .../panels/search/SearchClausePanel.java        |  29 +-
 .../console/panels/search/UserSearchPanel.java  |  13 +-
 .../policies/PolicyModalPanelBuilder.java       |  21 +-
 .../policies/PolicyRuleDirectoryPanel.java      |  27 +-
 .../policies/PolicyRuleWizardBuilder.java       |  14 +-
 .../console/policies/PolicySpecModalPanel.java  |  54 +--
 .../console/reports/ReportWizardBuilder.java    |  24 +-
 .../reports/ReportletDirectoryPanel.java        |  28 +-
 .../console/reports/ReportletWizardBuilder.java |  27 +-
 .../resources/AbstractWorkflowResource.java     |  11 +-
 .../client/console/rest/AnyTypeRestClient.java  |   6 +-
 .../console/rest/ConnectorRestClient.java       |  46 +-
 .../client/console/rest/LoggerRestClient.java   |  39 +-
 .../client/console/rest/ResourceRestClient.java |  11 +-
 .../client/console/rest/SchemaRestClient.java   |  10 +-
 .../console/status/ResourceStatusModal.java     |  14 +-
 .../client/console/tasks/PushTaskWrapper.java   |   3 +-
 .../console/tasks/SchedTaskWizardBuilder.java   |  42 +-
 .../client/console/topology/Topology.java       |   6 +-
 .../html/repeater/data/table/AttrColumn.java    |   6 +-
 .../data/table/ConnObjectAttrColumn.java        |   5 +-
 .../markup/html/bootstrap/dialog/BaseModal.java |  15 +-
 .../markup/html/form/AjaxPalettePanel.java      |  21 +-
 .../markup/html/form/AjaxSpinnerFieldPanel.java |   7 +-
 .../markup/html/form/SelectChoiceRenderer.java  |  12 +-
 .../console/widgets/ReconciliationWidget.java   |  81 ++--
 .../ReconciliationReportParser.java             |  16 +-
 .../console/wizards/any/AbstractAttrs.java      |  59 +--
 .../console/wizards/any/ConnObjectPanel.java    |  25 +-
 .../client/console/wizards/any/Details.java     |  29 +-
 .../console/wizards/any/DynamicMemberships.java |  19 +-
 .../client/console/wizards/any/Groups.java      |  99 ++---
 .../client/console/wizards/any/PlainAttrs.java  |  70 ++-
 .../console/wizards/any/Relationships.java      |  95 ++---
 .../client/console/wizards/any/Resources.java   |  16 +-
 .../client/console/wizards/any/Roles.java       |  12 +-
 .../client/console/wizards/any/StatusPanel.java |  28 +-
 .../wizards/any/TypeExtensionWizardBuilder.java |  34 +-
 .../resources/AbstractConnConfPanel.java        |   3 +-
 .../wizards/resources/ConnectorConfPanel.java   |  55 +--
 .../resources/ConnectorDetailsPanel.java        |  69 +--
 .../resources/ConnectorWizardBuilder.java       |  30 +-
 .../resources/ProvisionWizardBuilder.java       |  27 +-
 .../resources/ResourceProvisionPanel.java       |  80 ++--
 .../console/wizards/role/RoleWizardBuilder.java |  36 +-
 .../enduser/util/UserRequestValidatorTest.java  |   6 +-
 .../client/lib/RestClientExceptionMapper.java   |   4 +-
 .../syncope/client/lib/SyncopeClient.java       |   2 +-
 .../client/lib/SyncopeClientFactoryBean.java    |   4 +-
 common/lib/pom.xml                              |   4 -
 .../syncope/common/lib/AnyOperations.java       | 340 +++++++--------
 .../syncope/common/lib/EntityTOUtils.java       |  25 +-
 .../lib/SyncopeClientCompositeException.java    |  18 +-
 .../lib/collections/CircularFifoQueue.java      | 427 +++++++++++++++++++
 .../common/lib/collections/IteratorChain.java   | 282 ++++++++++++
 .../syncope/common/lib/info/SystemInfo.java     |   2 +-
 .../syncope/common/lib/jaxb/GenericMapType.java |   4 +-
 .../common/lib/jaxb/XmlGenericMapAdapter.java   |  10 +-
 .../syncope/common/lib/patch/GroupPatch.java    |  14 +-
 .../syncope/common/lib/patch/PasswordPatch.java |   5 +-
 .../syncope/common/lib/search/SpecialAttr.java  |  13 +-
 .../syncope/common/lib/to/AnyObjectTO.java      |  25 +-
 .../org/apache/syncope/common/lib/to/AnyTO.java |  33 +-
 .../apache/syncope/common/lib/to/AttrTO.java    |   5 +-
 .../syncope/common/lib/to/AttributableTO.java   |   7 +-
 .../syncope/common/lib/to/BulkActionResult.java |   8 +-
 .../syncope/common/lib/to/ConnInstanceTO.java   |  13 +-
 .../syncope/common/lib/to/ConnObjectTO.java     |  13 +-
 .../apache/syncope/common/lib/to/GroupTO.java   |  15 +-
 .../common/lib/to/GroupableRelatableTO.java     |   5 +-
 .../apache/syncope/common/lib/to/MappingTO.java |  10 +-
 .../syncope/common/lib/to/MembershipTO.java     |  33 +-
 .../apache/syncope/common/lib/to/OrgUnitTO.java |  10 +-
 .../syncope/common/lib/to/ResourceTO.java       |  15 +-
 .../apache/syncope/common/lib/to/UserTO.java    |  25 +-
 .../syncope/common/lib/to/WorkflowFormTO.java   |  13 +-
 .../syncope/core/logic/AbstractAnyLogic.java    |  20 +-
 .../syncope/core/logic/AccessTokenLogic.java    |  14 +-
 .../syncope/core/logic/AnyObjectLogic.java      |  54 +--
 .../syncope/core/logic/AnyTypeClassLogic.java   |  13 +-
 .../apache/syncope/core/logic/AnyTypeLogic.java |  12 +-
 .../syncope/core/logic/ConfigurationLogic.java  |  13 +-
 .../core/logic/ConnectorHistoryLogic.java       |  15 +-
 .../syncope/core/logic/ConnectorLogic.java      |  80 ++--
 .../apache/syncope/core/logic/DomainLogic.java  |  12 +-
 .../syncope/core/logic/DynRealmLogic.java       |  13 +-
 .../apache/syncope/core/logic/GroupLogic.java   |  92 ++--
 .../apache/syncope/core/logic/LoggerLogic.java  |  83 ++--
 .../syncope/core/logic/MailTemplateLogic.java   |  24 +-
 .../syncope/core/logic/MemoryAppender.java      |   2 +-
 .../syncope/core/logic/NotificationLogic.java   |  13 +-
 .../apache/syncope/core/logic/PolicyLogic.java  |  13 +-
 .../apache/syncope/core/logic/RealmLogic.java   |  21 +-
 .../core/logic/RelationshipTypeLogic.java       |  14 +-
 .../apache/syncope/core/logic/ReportLogic.java  |  35 +-
 .../syncope/core/logic/ReportTemplateLogic.java |  25 +-
 .../core/logic/ResourceHistoryLogic.java        |  14 +-
 .../syncope/core/logic/ResourceLogic.java       |  67 ++-
 .../apache/syncope/core/logic/RoleLogic.java    |  12 +-
 .../apache/syncope/core/logic/SchemaLogic.java  |  61 ++-
 .../core/logic/SecurityQuestionLogic.java       |  14 +-
 .../apache/syncope/core/logic/SyncopeLogic.java |  74 ++--
 .../apache/syncope/core/logic/TaskLogic.java    |  39 +-
 .../apache/syncope/core/logic/UserLogic.java    |  64 +--
 .../core/migration/MigrationPullActions.java    |   5 +-
 .../validation/InvalidEntityException.java      |  14 +-
 .../persistence/api/dao/AllowedSchemas.java     |  32 +-
 .../core/persistence/api/dao/ConfDAO.java       |   3 +-
 .../core/persistence/api/dao/GroupDAO.java      |   3 +
 .../core/persistence/api/entity/Any.java        |   3 +-
 .../api/entity/GroupableRelatable.java          |  26 +-
 .../persistence/api/entity/Notification.java    |   3 +-
 .../core/persistence/api/entity/Realm.java      |   3 +-
 .../persistence/api/entity/group/Group.java     |   7 +-
 .../api/entity/policy/AccountPolicy.java        |   2 +-
 .../api/entity/resource/ExternalResource.java   |   5 +-
 .../api/entity/resource/Mapping.java            |   3 +-
 .../api/entity/resource/OrgUnit.java            |   3 +-
 .../persistence/api/entity/task/PullTask.java   |   3 +-
 .../persistence/api/entity/task/PushTask.java   |   3 +-
 .../api/search/SearchCondVisitor.java           |  15 +-
 .../jpa/content/ContentLoaderHandler.java       |  26 +-
 .../jpa/content/XMLContentExporter.java         |  11 +-
 .../persistence/jpa/dao/AbstractAnyDAO.java     | 101 +++--
 .../jpa/dao/AbstractAnySearchDAO.java           |  50 +--
 .../persistence/jpa/dao/DefaultAccountRule.java |  47 +-
 .../jpa/dao/DefaultPasswordRule.java            |  47 +-
 .../persistence/jpa/dao/JPAAnyObjectDAO.java    |  90 ++--
 .../persistence/jpa/dao/JPAAnySearchDAO.java    |  10 +-
 .../core/persistence/jpa/dao/JPAConfDAO.java    |  33 +-
 .../persistence/jpa/dao/JPAConnInstanceDAO.java |  53 +--
 .../jpa/dao/JPAExternalResourceDAO.java         | 106 ++---
 .../core/persistence/jpa/dao/JPAGroupDAO.java   | 133 +++---
 .../persistence/jpa/dao/JPANotificationDAO.java |  16 +-
 .../core/persistence/jpa/dao/JPARealmDAO.java   |  38 +-
 .../jpa/dao/JPARelationshipTypeDAO.java         |  15 +-
 .../core/persistence/jpa/dao/JPATaskDAO.java    |  18 +-
 .../core/persistence/jpa/dao/JPAUserDAO.java    | 145 +++----
 .../jpa/entity/AbstractGroupableRelatable.java  | 118 ++---
 .../jpa/entity/AbstractPlainAttr.java           |  12 +-
 .../persistence/jpa/entity/JPAConnInstance.java |   4 +-
 .../persistence/jpa/entity/JPANotification.java |  13 +-
 .../core/persistence/jpa/entity/JPARealm.java   |  22 +-
 .../core/persistence/jpa/entity/JPAReport.java  |  11 +-
 .../persistence/jpa/entity/conf/JPAConf.java    |  16 +-
 .../persistence/jpa/entity/group/JPAGroup.java  |  38 +-
 .../jpa/entity/policy/JPAAccountPolicy.java     |  17 +-
 .../jpa/entity/policy/JPAPasswordPolicy.java    |  11 +-
 .../entity/resource/JPAExternalResource.java    |  27 +-
 .../jpa/entity/resource/JPAMapping.java         |  13 +-
 .../jpa/entity/resource/JPAOrgUnit.java         |  13 +-
 .../jpa/entity/task/JPAPropagationTask.java     |   4 +-
 .../jpa/entity/task/JPAPullTask.java            |  16 +-
 .../jpa/entity/task/JPAPushTask.java            |  13 +-
 .../persistence/jpa/entity/user/JPAUser.java    |   2 +-
 .../spring/DomainTransactionInterceptor.java    |  16 +-
 .../entity/ExternalResourceValidator.java       |  33 +-
 .../jpa/validation/entity/ReportValidator.java  |  14 +-
 .../persistence/jpa/inner/AnySearchTest.java    |  85 +---
 .../core/persistence/jpa/inner/ConfTest.java    |  24 +-
 .../persistence/jpa/inner/ConnInstanceTest.java |  15 +-
 .../core/persistence/jpa/inner/GroupTest.java   |   2 +-
 .../persistence/jpa/inner/MultitenancyTest.java |  15 +-
 .../persistence/jpa/inner/PlainAttrTest.java    |  10 +-
 .../core/persistence/jpa/inner/RealmTest.java   |   7 -
 .../persistence/jpa/inner/ResourceTest.java     |  38 +-
 .../persistence/jpa/inner/VirSchemaTest.java    |   2 +-
 .../core/persistence/jpa/outer/ConfTest.java    |   4 +-
 .../core/persistence/jpa/outer/GroupTest.java   |  79 ++--
 .../persistence/jpa/outer/PlainSchemaTest.java  |  43 +-
 .../persistence/jpa/outer/ResourceTest.java     |  67 ++-
 .../core/persistence/jpa/outer/UserTest.java    |  30 +-
 .../persistence/jpa/outer/VirSchemaTest.java    |   4 +-
 .../jpa/outer/XMLContentExporterTest.java       |  16 +-
 .../test/resources/domains/MasterContent.xml    |  16 +-
 .../core/provisioning/api/MappingManager.java   |   3 +-
 .../provisioning/api/utils/EntityUtils.java     |  41 --
 .../core/provisioning/api/utils/RealmUtils.java |  29 +-
 .../provisioning/java/ConnectorFacadeProxy.java |  27 +-
 .../DefaultAnyObjectProvisioningManager.java    |  11 +-
 .../java/DefaultGroupProvisioningManager.java   |  54 +--
 .../java/DefaultUserProvisioningManager.java    |  40 +-
 .../provisioning/java/MappingManagerImpl.java   | 109 ++---
 .../provisioning/java/VirAttrHandlerImpl.java   |  28 +-
 .../java/data/AbstractAnyDataBinder.java        | 268 ++++++------
 .../java/data/AnyObjectDataBinderImpl.java      | 311 +++++++-------
 .../java/data/AnyTypeDataBinderImpl.java        |  24 +-
 .../java/data/ConnInstanceDataBinderImpl.java   |  15 +-
 .../java/data/GroupDataBinderImpl.java          |  72 ++--
 .../java/data/NotificationDataBinderImpl.java   |  57 ++-
 .../java/data/PolicyDataBinderImpl.java         |   2 +-
 .../java/data/RealmDataBinderImpl.java          |  49 +--
 .../java/data/ResourceDataBinderImpl.java       |  53 ++-
 .../java/data/RoleDataBinderImpl.java           |  16 +-
 .../java/data/SchemaDataBinderImpl.java         |   2 +-
 .../java/data/TaskDataBinderImpl.java           |  56 +--
 .../java/data/UserDataBinderImpl.java           | 337 +++++++--------
 .../core/provisioning/java/jexl/JexlUtils.java  |  35 +-
 .../java/jexl/SyncopeJexlFunctions.java         |   5 +-
 .../java/job/IdentityRecertification.java       |  10 +-
 .../provisioning/java/job/JobManagerImpl.java   |  83 ++--
 .../job/report/ReconciliationReportlet.java     |  79 ++--
 .../java/job/report/UserReportlet.java          |   2 +-
 .../notification/NotificationManagerImpl.java   |  40 +-
 .../AbstractPropagationTaskExecutor.java        |  40 +-
 .../DBPasswordPropagationActions.java           |  29 +-
 .../propagation/DefaultPropagationReporter.java |  28 +-
 .../LDAPMembershipPropagationActions.java       |  19 +-
 .../LDAPPasswordPropagationActions.java         |  29 +-
 .../PriorityPropagationTaskExecutor.java        |  48 +--
 .../propagation/PropagationManagerImpl.java     |  83 ++--
 .../AbstractProvisioningJobDelegate.java        |  11 +-
 .../pushpull/AbstractPullResultHandler.java     |   2 +-
 .../pushpull/AbstractPushResultHandler.java     |  23 +-
 .../java/pushpull/DBPasswordPullActions.java    |  23 +-
 .../pushpull/LDAPMembershipPullActions.java     |  43 +-
 .../java/pushpull/PullJobDelegate.java          |  36 +-
 .../provisioning/java/pushpull/PullUtils.java   |  66 ++-
 .../java/pushpull/PushJobDelegate.java          |  13 +-
 .../pushpull/RealmPushResultHandlerImpl.java    |   7 +-
 .../java/utils/ConnObjectUtils.java             |  59 ++-
 .../provisioning/java/utils/MappingUtils.java   |  59 ++-
 .../provisioning/java/utils/TemplateUtils.java  |  62 +--
 .../provisioning/java/ConnectorManagerTest.java |  12 +-
 .../provisioning/java/MailTemplateTest.java     |   4 +-
 .../core/provisioning/java/MappingTest.java     |   2 +-
 .../java/ResourceDataBinderTest.java            |  31 +-
 .../syncope/core/rest/cxf/WadlGenerator.java    |  32 +-
 .../rest/cxf/service/AbstractAnyService.java    |  54 +--
 .../core/spring/security/AuthContextUtils.java  |  26 +-
 .../core/spring/security/AuthDataAccessor.java  |  83 ++--
 .../security/MustChangePasswordFilter.java      |  15 +-
 .../security/SyncopeGrantedAuthority.java       |  15 +-
 .../activiti/ActivitiUserWorkflowAdapter.java   |  98 ++---
 .../core/workflow/activiti/ActivitiUtils.java   |  12 +-
 .../activiti/SyncopeGroupQueryImpl.java         |  13 +-
 .../workflow/activiti/SyncopeUserQueryImpl.java |  24 +-
 .../java/DefaultUserWorkflowAdapter.java        |   6 +-
 .../syncope/core/logic/CamelRouteLogic.java     |  12 +-
 .../provisioning/camel/SyncopeCamelContext.java |  11 +-
 .../camel/producer/CreateProducer.java          |   7 +-
 .../camel/producer/DeprovisionProducer.java     |  11 +-
 .../camel/producer/ProvisionProducer.java       |  16 +-
 .../client/ElasticsearchUtils.java              |  64 +--
 .../jpa/dao/ElasticsearchAnySearchDAO.java      |  38 +-
 .../syncope/common/lib/to/SAML2IdPTO.java       |  10 +-
 .../common/lib/to/SAML2LoginResponseTO.java     |  13 +-
 .../syncope/core/logic/SAML2IdPLogic.java       |  11 +-
 .../apache/syncope/core/logic/SAML2SPLogic.java |  20 +-
 .../core/logic/saml2/SAML2UserManager.java      |  51 +--
 .../core/persistence/api/entity/SAML2IdP.java   |   3 +-
 .../persistence/jpa/entity/JPASAML2IdP.java     |  13 +-
 .../validation/entity/SAML2IdPValidator.java    |  18 +-
 .../java/data/SAML2IdPDataBinderImpl.java       |  21 +-
 .../fit/core/reference/TestPullActions.java     |  22 +-
 .../org/apache/syncope/fit/AbstractITCase.java  |  12 +-
 .../org/apache/syncope/fit/cli/CLIITCase.java   |  39 +-
 .../syncope/fit/core/AnyObjectITCase.java       |  12 +-
 .../syncope/fit/core/AuthenticationITCase.java  |  42 +-
 .../syncope/fit/core/CamelRouteITCase.java      |  12 +-
 .../syncope/fit/core/ConnectorITCase.java       |  73 +---
 .../apache/syncope/fit/core/DynRealmITCase.java |  27 +-
 .../apache/syncope/fit/core/GroupITCase.java    |  64 ++-
 .../fit/core/IdentityRecertificationITCase.java |   2 +-
 .../apache/syncope/fit/core/LoggerITCase.java   |  21 +-
 .../syncope/fit/core/MembershipITCase.java      |  76 ++--
 .../syncope/fit/core/MigrationITCase.java       |  56 ++-
 .../syncope/fit/core/PlainSchemaITCase.java     |  30 +-
 .../syncope/fit/core/PropagationTaskITCase.java |  31 +-
 .../apache/syncope/fit/core/PullTaskITCase.java |  92 ++--
 .../apache/syncope/fit/core/PushTaskITCase.java |  13 +-
 .../apache/syncope/fit/core/RealmITCase.java    |  36 +-
 .../apache/syncope/fit/core/ResourceITCase.java |  83 ++--
 .../syncope/fit/core/SchedTaskITCase.java       |  32 +-
 .../apache/syncope/fit/core/SearchITCase.java   | 158 ++-----
 .../org/apache/syncope/fit/core/UserITCase.java |  36 +-
 .../syncope/fit/core/UserIssuesITCase.java      |  76 ++--
 .../apache/syncope/fit/core/UserSelfITCase.java |   6 +-
 .../syncope/fit/core/UserWorkflowITCase.java    |   8 +-
 .../apache/syncope/fit/core/VirAttrITCase.java  |  80 ++--
 .../apache/syncope/fit/core/WorkflowITCase.java |  17 +-
 ide/pom.xml                                     |   4 +-
 pom.xml                                         |   7 -
 324 files changed, 4587 insertions(+), 6306 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorDetails.java
index dee5e7a..ac3072c 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/connector/ConnectorDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.connector;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
@@ -43,7 +43,7 @@ public class ConnectorDetails extends AbstractConnectorCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<ConnInstanceTO> connInstanceTOs = connectorSyncopeOperations.list();
                 int withCreateCapability = 0;
                 int withDeleteCapability = 0;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/domain/DomainDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/domain/DomainDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/domain/DomainDetails.java
index 9e280d8..061b8f3 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/domain/DomainDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/domain/DomainDetails.java
@@ -18,8 +18,8 @@
  */
 package org.apache.syncope.client.cli.commands.domain;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.slf4j.Logger;
@@ -40,7 +40,7 @@ public class DomainDetails extends AbstractDomainCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 details.put("Total number", String.valueOf(domainSyncopeOperations.list().size()));
                 domainResultManager.printDetails(details);
             } catch (final SyncopeClientException ex) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupDetails.java
index 583c765..26da0e9 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.group;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -43,7 +43,7 @@ public class GroupDetails extends AbstractGroupCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<GroupTO> groupTOs = groupSyncopeOperations.list();
                 int withoudResources = 0;
                 int withoudAttributes = 0;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerDetails.java
index a14cf7b..3a2006c 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.logger;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.log.LoggerTO;
@@ -42,7 +42,7 @@ public class LoggerDetails extends AbstractLoggerCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<LoggerTO> loggerTOs = loggerSyncopeOperations.list();
                 int debugLevel = 0;
                 int errorLevel = 0;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
index 0f1f15c..b1d52bf 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/logger/LoggerSyncopeOperations.java
@@ -18,10 +18,8 @@
  */
 package org.apache.syncope.client.cli.commands.logger;
 
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.cli.SyncopeServices;
 import org.apache.syncope.common.lib.log.LogAppender;
 import org.apache.syncope.common.lib.log.LogStatementTO;
@@ -34,13 +32,7 @@ public class LoggerSyncopeOperations {
     private final LoggerService loggerService = SyncopeServices.get(LoggerService.class);
 
     public List<String> listMemoryAppenders() {
-        return CollectionUtils.collect(loggerService.memoryAppenders(), new Transformer<LogAppender, String>() {
-
-            @Override
-            public String transform(final LogAppender input) {
-                return input.getName();
-            }
-        }, new ArrayList<String>());
+        return loggerService.memoryAppenders().stream().map(LogAppender::getName).collect(Collectors.toList());
     }
 
     public List<LogStatementTO> getLastLogStatements(final String appender) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyDetails.java
index faa8270..bc4b5cf 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/policy/PolicyDetails.java
@@ -18,8 +18,8 @@
  */
 package org.apache.syncope.client.cli.commands.policy;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.slf4j.Logger;
@@ -40,7 +40,7 @@ public class PolicyDetails extends AbstractPolicyCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final int accountPolicySize = policySyncopeOperations.list(PolicyType.ACCOUNT.name()).size();
                 final int passwordPolicySize = policySyncopeOperations.list(PolicyType.PASSWORD.name()).size();
                 final int pullPolicySize = policySyncopeOperations.list(PolicyType.PULL.name()).size();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/realm/RealmDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/realm/RealmDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/realm/RealmDetails.java
index b1007c2..1468aa3 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/realm/RealmDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/realm/RealmDetails.java
@@ -18,8 +18,8 @@
  */
 package org.apache.syncope.client.cli.commands.realm;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.slf4j.Logger;
@@ -40,7 +40,7 @@ public class RealmDetails extends AbstractRealmCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 details.put("Total number", String.valueOf(realmSyncopeOperations.list().size()));
                 realmResultManager.printDetails(details);
             } catch (final SyncopeClientException ex) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportDetails.java
index e7cff76..a0ed5c2 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/report/ReportDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.report;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ReportTO;
@@ -42,7 +42,7 @@ public class ReportDetails extends AbstractReportCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<ReportTO> reportTOs = reportSyncopeOperations.list();
                 int withoutExecutions = 0;
                 for (final ReportTO reportTO : reportTOs) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/resource/ResourceDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/resource/ResourceDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/resource/ResourceDetails.java
index be0029c..af58864 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/resource/ResourceDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/resource/ResourceDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.resource;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.ResourceTO;
@@ -42,7 +42,7 @@ public class ResourceDetails extends AbstractResourceCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<ResourceTO> resourceTOs = resourceSyncopeOperations.list();
                 details.put("Total number", String.valueOf(resourceTOs.size()));
                 resourceResultManager.printDetails(details);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/role/RoleDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/role/RoleDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/role/RoleDetails.java
index 1206adf..76bef86 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/role/RoleDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/role/RoleDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.role;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.RoleTO;
@@ -42,7 +42,7 @@ public class RoleDetails extends AbstractRoleCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<RoleTO> roleTOs = roleSyncopeOperations.list();
                 int withoutEntitlements = 0;
                 for (final RoleTO roleTO : roleTOs) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/schema/SchemaDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/schema/SchemaDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/schema/SchemaDetails.java
index bfdcdd6..7f58fc3 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/schema/SchemaDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/schema/SchemaDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.schema;
 
+import java.util.LinkedHashMap;
 import java.util.Map;
 import javax.xml.ws.WebServiceException;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.slf4j.Logger;
@@ -41,7 +41,7 @@ public class SchemaDetails extends AbstractSchemaCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final int plainSchemaSize = schemaSyncopeOperations.listPlain().size();
                 final int derivedSchemaSize = schemaSyncopeOperations.listDerived().size();
                 final int virtualSchemaSize = schemaSyncopeOperations.listVirtual().size();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskDetails.java
index bb00255..8e5d387 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/task/TaskDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.task;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.client.cli.util.CommandUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -51,7 +51,7 @@ public class TaskDetails extends AbstractTaskCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<AbstractTaskTO> notificationTaskTOs =
                         taskSyncopeOperations.list(TaskType.NOTIFICATION.name());
                 final List<AbstractTaskTO> propagationTaskTOs = taskSyncopeOperations.list(TaskType.PROPAGATION.name());

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java
index d9110eb..59bbf3a 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserDetails.java
@@ -18,9 +18,9 @@
  */
 package org.apache.syncope.client.cli.commands.user;
 
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.map.LinkedMap;
 import org.apache.syncope.client.cli.Input;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.UserTO;
@@ -42,7 +42,7 @@ public class UserDetails extends AbstractUserCommand {
     public void details() {
         if (input.parameterNumber() == 0) {
             try {
-                final Map<String, String> details = new LinkedMap<>();
+                final Map<String, String> details = new LinkedHashMap<>();
                 final List<UserTO> usersTOs = userSyncopeOperations.list().getResult();
                 int withoutResource = 0;
                 int withoutRole = 0;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
index 9d04645..6c6b6e4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleApplication.java
@@ -22,7 +22,6 @@ import de.agilecoders.wicket.core.Bootstrap;
 import de.agilecoders.wicket.core.settings.BootstrapSettings;
 import de.agilecoders.wicket.core.settings.IBootstrapSettings;
 import de.agilecoders.wicket.core.settings.SingleThemeProvider;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
@@ -31,7 +30,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.collections4.ListUtils;
 import org.apache.commons.lang3.BooleanUtils;
 import org.apache.commons.lang3.ClassUtils;
@@ -48,10 +47,9 @@ import org.apache.syncope.client.console.resources.WorkflowDefPUTResource;
 import org.apache.syncope.client.console.themes.AdminLTE;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeClientFactoryBean;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.PropertyUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
-import org.apache.syncope.common.lib.to.DomainTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.syncope.common.rest.api.service.DomainService;
 import org.apache.wicket.Page;
@@ -182,9 +180,8 @@ public class SyncopeConsoleApplication extends AuthenticatedWebApplication {
 
         ClassPathScanImplementationLookup lookup = (ClassPathScanImplementationLookup) getServletContext().
                 getAttribute(ConsoleInitializer.CLASSPATH_LOOKUP);
-        for (Class<? extends BasePage> clazz : lookup.getPageClasses()) {
-            MetaDataRoleAuthorizationStrategy.authorize(clazz, SyncopeConsoleSession.AUTHENTICATED);
-        }
+        lookup.getPageClasses().
+                forEach(cls -> MetaDataRoleAuthorizationStrategy.authorize(cls, SyncopeConsoleSession.AUTHENTICATED));
 
         getMarkupSettings().setStripWicketTags(true);
         getMarkupSettings().setCompressWhitespace(true);
@@ -292,12 +289,11 @@ public class SyncopeConsoleApplication extends AuthenticatedWebApplication {
     public List<String> getDomains() {
         synchronized (LOG) {
             if (domains == null) {
-                domains = new ArrayList<>();
-                domains.add(SyncopeConstants.MASTER_DOMAIN);
-                CollectionUtils.collect(newClientFactory().create(
+                domains = newClientFactory().create(
                         new AnonymousAuthenticationHandler(anonymousUser, anonymousKey)).
-                        getService(DomainService.class).list(),
-                        EntityTOUtils.<DomainTO>keyTransformer(), domains);
+                        getService(DomainService.class).list().stream().map(EntityTO::getKey).
+                        collect(Collectors.toList());
+                domains.add(0, SyncopeConstants.MASTER_DOMAIN);
                 domains = ListUtils.unmodifiableList(domains);
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
index ab84d10..9bba50c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/SyncopeConsoleSession.java
@@ -30,8 +30,6 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import javax.ws.rs.core.EntityTag;
 import javax.ws.rs.core.MediaType;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.collections4.list.SetUniqueList;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.time.FastDateFormat;
@@ -81,7 +79,7 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
 
     private String domain;
 
-    private final Map<Class<?>, Object> services = Collections.synchronizedMap(new HashMap<Class<?>, Object>());
+    private final Map<Class<?>, Object> services = Collections.synchronizedMap(new HashMap<>());
 
     private final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(5, THREAD_POOL_FACTORY);
 
@@ -221,9 +219,9 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
     public List<String> getAuthRealms() {
         List<String> sortable = new ArrayList<>();
         List<String> available = SetUniqueList.setUniqueList(sortable);
-        for (Map.Entry<String, Set<String>> entitlement : auth.entrySet()) {
+        auth.entrySet().forEach(entitlement -> {
             available.addAll(entitlement.getValue());
-        }
+        });
         Collections.sort(sortable);
         return sortable;
     }
@@ -238,14 +236,8 @@ public class SyncopeConsoleSession extends AuthenticatedWebSession {
         }
 
         for (String entitlement : entitlements.split(",")) {
-            if (auth != null && auth.containsKey(entitlement)
-                    && (realm == null || IterableUtils.matchesAny(auth.get(entitlement), new Predicate<String>() {
-
-                        @Override
-                        public boolean evaluate(final String ownedRealm) {
-                            return realm.startsWith(ownedRealm);
-                        }
-                    }))) {
+            if (auth != null && auth.containsKey(entitlement) && (realm == null
+                    || auth.get(entitlement).stream().anyMatch(ownedRealm -> realm.startsWith(ownedRealm)))) {
                 return true;
             }
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
index d40cf37..7d52f16 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/bulk/BulkContent.java
@@ -26,7 +26,6 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.status.StatusBean;
@@ -124,13 +123,13 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
 
                 @Override
                 protected boolean statusCondition(final Serializable modelObject) {
-                    return CollectionUtils.isNotEmpty(items);
+                    return items != null && !items.isEmpty();
                 }
 
                 @Override
                 public void onClick(final AjaxRequestTarget target, final Serializable ignore) {
                     try {
-                        if (CollectionUtils.isEmpty(items)) {
+                        if (items == null || items.isEmpty()) {
                             throw new IllegalArgumentException("Invalid items");
                         }
 
@@ -144,16 +143,16 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
 
                             final BulkAction bulkAction = new BulkAction();
                             bulkAction.setType(BulkAction.Type.valueOf(actionToBeAddresed.name()));
-                            for (T item : items) {
+                            items.forEach(item -> {
                                 try {
                                     bulkAction.getTargets().add(getTargetId(item, keyFieldName).toString());
                                 } catch (IllegalAccessException | InvocationTargetException e) {
                                     LOG.error("Error retrieving item id {}", keyFieldName, e);
                                 }
-                            }
+                            });
                             res = BulkActionResult.class.cast(
                                     bulkActionExecutor.getClass().getMethod("bulkAction", BulkAction.class).invoke(
-                                    bulkActionExecutor, bulkAction));
+                                            bulkActionExecutor, bulkAction));
                         } catch (IllegalArgumentException biae) {
                             if (!(items.iterator().next() instanceof StatusBean)) {
                                 throw new IllegalArgumentException("Invalid items");
@@ -168,17 +167,17 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
 
                             // Group bean information by anyKey
                             final Map<String, List<StatusBean>> beans = new HashMap<>();
-                            for (T bean : items) {
-                                final StatusBean sb = StatusBean.class.cast(bean);
-                                final List<StatusBean> sblist;
-                                if (beans.containsKey(sb.getKey())) {
-                                    sblist = beans.get(sb.getKey());
-                                } else {
-                                    sblist = new ArrayList<>();
-                                    beans.put(sb.getKey(), sblist);
-                                }
-                                sblist.add(sb);
-                            }
+                            items.stream().map(bean -> StatusBean.class.cast(bean)).
+                                    forEachOrdered(sb -> {
+                                        final List<StatusBean> sblist;
+                                        if (beans.containsKey(sb.getKey())) {
+                                            sblist = beans.get(sb.getKey());
+                                        } else {
+                                            sblist = new ArrayList<>();
+                                            beans.put(sb.getKey(), sblist);
+                                        }
+                                        sblist.add(sb);
+                                    });
 
                             for (Map.Entry<String, List<StatusBean>> entry : beans.entrySet()) {
                                 final String etag = anyRestClient.read(entry.getKey()).getETagValue();
@@ -222,7 +221,7 @@ public class BulkContent<T extends Serializable, S> extends MultilevelPanel.Seco
                         }
 
                         final List<IColumn<T, S>> newColumnList = new ArrayList<>(columns);
-                        newColumnList.add(newColumnList.size(), new BulkActionResultColumn<T, S>(res, fieldName));
+                        newColumnList.add(newColumnList.size(), new BulkActionResultColumn<>(res, fieldName));
 
                         container.addOrReplace(new AjaxFallbackDefaultDataTable<>(
                                 "selectedObjects",

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
index 0d936a5..f925271 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/ResourceStatusDataProvider.java
@@ -18,12 +18,10 @@
  */
 package org.apache.syncope.client.console.commons;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-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.syncope.client.console.commons.status.ConnObjectWrapper;
 import org.apache.syncope.client.console.commons.status.StatusBean;
@@ -109,23 +107,19 @@ public class ResourceStatusDataProvider extends DirectoryDataProvider<StatusBean
         List<? extends AnyTO> result =
                 restClient.search(realm, fiql, (page < 0 ? 0 : page) + 1, paginatorRows, getSort(), type);
 
-        List<StatusBean> res = CollectionUtils.collect(result, new Transformer<AnyTO, StatusBean>() {
+        List<StatusBean> statuses = result.stream().map(any -> {
+            List<ConnObjectWrapper> connObjects =
+                    statusUtils.getConnectorObjects(any, Collections.singletonList(resource));
 
-            @Override
-            public StatusBean transform(final AnyTO input) {
-                final List<ConnObjectWrapper> connObjects =
-                        statusUtils.getConnectorObjects(input, Collections.singletonList(resource));
+            return statusUtils.getStatusBean(
+                    any,
+                    resource,
+                    connObjects.isEmpty() ? null : connObjects.iterator().next().getConnObjectTO(),
+                    any instanceof GroupTO);
+        }).collect(Collectors.toList());
 
-                return statusUtils.getStatusBean(
-                        input,
-                        resource,
-                        connObjects.isEmpty() ? null : connObjects.iterator().next().getConnObjectTO(),
-                        input instanceof GroupTO);
-            }
-        }, new ArrayList<StatusBean>());
-
-        Collections.sort(res, comparator);
-        return res.iterator();
+        Collections.sort(statuses, comparator);
+        return statuses.iterator();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/commons/SerializableTransformer.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/SerializableTransformer.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/SerializableTransformer.java
deleted file mode 100644
index d8be863..0000000
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/SerializableTransformer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.syncope.client.console.commons;
-
-import java.io.Serializable;
-import org.apache.commons.collections4.Transformer;
-
-/**
- * Serializable transformer.
- *
- * @param <I> input type.
- * @param <O> output type.
- */
-public interface SerializableTransformer<I extends Serializable, O extends Serializable>
-        extends Transformer<I, O>, Serializable {
-
-}

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/commons/SortableAnyProviderComparator.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/SortableAnyProviderComparator.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/SortableAnyProviderComparator.java
index 0eb370d..e405921 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/SortableAnyProviderComparator.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/SortableAnyProviderComparator.java
@@ -83,20 +83,20 @@ public class SortableAnyProviderComparator<T extends AnyTO> extends SortableData
 
             final AttrTO attr;
             if (schemaType == null) {
-                attr = this.anyTO.getPlainAttr(schema);
+                attr = this.anyTO.getPlainAttr(schema).get();
             } else {
                 switch (schemaType) {
                     case PLAIN:
                     default:
-                        attr = this.anyTO.getPlainAttr(schema);
+                        attr = this.anyTO.getPlainAttr(schema).get();
                         break;
 
                     case DERIVED:
-                        attr = this.anyTO.getDerAttr(schema);
+                        attr = this.anyTO.getDerAttr(schema).get();
                         break;
 
                     case VIRTUAL:
-                        attr = this.anyTO.getVirAttr(schema);
+                        attr = this.anyTO.getVirAttr(schema).get();
                         break;
                 }
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
index 8a9aa09..38fbb6e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/commons/status/StatusUtils.java
@@ -22,6 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.console.commons.Constants;
@@ -137,16 +138,16 @@ public class StatusUtils implements Serializable {
     }
 
     private Boolean isEnabled(final ConnObjectTO objectTO) {
-        final AttrTO status = objectTO.getAttr(ConnIdSpecialName.ENABLE);
-        return status != null && status.getValues() != null && !status.getValues().isEmpty()
-                ? Boolean.valueOf(status.getValues().get(0))
+        Optional<AttrTO> status = objectTO.getAttr(ConnIdSpecialName.ENABLE);
+        return status.isPresent() && status.get().getValues() != null && !status.get().getValues().isEmpty()
+                ? Boolean.valueOf(status.get().getValues().get(0))
                 : Boolean.FALSE;
     }
 
     private String getConnObjectLink(final ConnObjectTO objectTO) {
-        final AttrTO name = objectTO == null ? null : objectTO.getAttr(ConnIdSpecialName.NAME);
-        return name != null && name.getValues() != null && !name.getValues().isEmpty()
-                ? name.getValues().get(0)
+        Optional<AttrTO> name = objectTO == null ? null : objectTO.getAttr(ConnIdSpecialName.NAME);
+        return name.isPresent() && name.get().getValues() != null && !name.get().getValues().isEmpty()
+                ? name.get().getValues().get(0)
                 : null;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
index 0661456..e31ffdc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/events/EventCategoryPanel.java
@@ -26,8 +26,6 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.commons.Constants;
@@ -108,7 +106,7 @@ public abstract class EventCategoryPanel extends Panel {
         type = new AjaxDropDownChoicePanel<>(
                 "type",
                 "type",
-                new PropertyModel<EventCategoryType>(eventCategoryTO, "type"),
+                new PropertyModel<>(eventCategoryTO, "type"),
                 false);
         type.setChoices(Arrays.asList(EventCategoryType.values()));
         type.setStyleSheet("ui-widget-content ui-corner-all");
@@ -129,13 +127,7 @@ public abstract class EventCategoryPanel extends Panel {
             @Override
             public EventCategoryType getObject(
                     final String id, final IModel<? extends List<? extends EventCategoryType>> choices) {
-                return IterableUtils.find(choices.getObject(), new Predicate<EventCategoryType>() {
-
-                    @Override
-                    public boolean evaluate(final EventCategoryType object) {
-                        return object.name().equals(id);
-                    }
-                });
+                return choices.getObject().stream().filter(object -> object.name().equals(id)).findAny().orElse(null);
             }
         });
         categoryContainer.add(type);
@@ -153,7 +145,7 @@ public abstract class EventCategoryPanel extends Panel {
         category = new AjaxDropDownChoicePanel<>(
                 "category",
                 "category",
-                new PropertyModel<String>(eventCategoryTO, "category"),
+                new PropertyModel<>(eventCategoryTO, "category"),
                 false);
         category.setChoices(filter(eventCategoryTOs, type.getModelObject()));
         categoryContainer.add(category);
@@ -171,7 +163,7 @@ public abstract class EventCategoryPanel extends Panel {
         subcategory = new AjaxDropDownChoicePanel<>(
                 "subcategory",
                 "subcategory",
-                new PropertyModel<String>(eventCategoryTO, "subcategory"),
+                new PropertyModel<>(eventCategoryTO, "subcategory"),
                 false);
         subcategory.setChoices(filter(eventCategoryTOs, type.getModelObject(), category.getModelObject()));
         categoryContainer.add(subcategory);
@@ -188,13 +180,13 @@ public abstract class EventCategoryPanel extends Panel {
 
         categoryContainer.add(new Label("customLabel", new ResourceModel("custom", "custom")).setVisible(false));
 
-        custom = new AjaxTextFieldPanel("custom", "custom", new Model<String>(null));
+        custom = new AjaxTextFieldPanel("custom", "custom", new Model<>(null));
         custom.setVisible(false);
         custom.setEnabled(false);
 
         categoryContainer.add(custom.hideLabel());
 
-        actionsPanel = new ActionsPanel<EventCategoryTO>("customActions", null);
+        actionsPanel = new ActionsPanel<>("customActions", null);
         actionsPanel.add(new ActionLink<EventCategoryTO>() {
 
             private static final long serialVersionUID = -3722207913631435501L;
@@ -210,7 +202,7 @@ public abstract class EventCategoryPanel extends Panel {
                             null,
                             null,
                             parsed.getKey().getEvents().isEmpty()
-                                    ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
+                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
                             parsed.getValue());
 
                     custom.setModelObject(StringUtils.EMPTY);
@@ -237,7 +229,7 @@ public abstract class EventCategoryPanel extends Panel {
                             null,
                             null,
                             parsed.getKey().getEvents().isEmpty()
-                                    ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
+                            ? StringUtils.EMPTY : parsed.getKey().getEvents().iterator().next(),
                             parsed.getValue());
 
                     custom.setModelObject(StringUtils.EMPTY);
@@ -270,11 +262,11 @@ public abstract class EventCategoryPanel extends Panel {
     private List<String> filter(final List<EventCategoryTO> eventCategoryTOs, final EventCategoryType type) {
         Set<String> res = new HashSet<>();
 
-        for (EventCategoryTO eventCategory : eventCategoryTOs) {
-            if (type == eventCategory.getType() && StringUtils.isNotEmpty(eventCategory.getCategory())) {
-                res.add(eventCategory.getCategory());
-            }
-        }
+        eventCategoryTOs.stream().filter(eventCategory
+                -> type == eventCategory.getType() && StringUtils.isNotEmpty(eventCategory.getCategory())).
+                forEachOrdered(eventCategory -> {
+                    res.add(eventCategory.getCategory());
+                });
 
         List<String> filtered = new ArrayList<>(res);
         Collections.sort(filtered);
@@ -286,12 +278,12 @@ public abstract class EventCategoryPanel extends Panel {
 
         Set<String> res = new HashSet<>();
 
-        for (EventCategoryTO eventCategory : eventCategoryTOs) {
-            if (type == eventCategory.getType() && StringUtils.equals(category, eventCategory.getCategory())
-                    && StringUtils.isNotEmpty(eventCategory.getSubcategory())) {
-                res.add(eventCategory.getSubcategory());
-            }
-        }
+        eventCategoryTOs.stream().filter(eventCategory
+                -> type == eventCategory.getType() && StringUtils.equals(category, eventCategory.getCategory())
+                && StringUtils.isNotEmpty(eventCategory.getSubcategory())).
+                forEachOrdered(eventCategory -> {
+                    res.add(eventCategory.getSubcategory());
+                });
 
         List<String> filtered = new ArrayList<>(res);
         Collections.sort(filtered);
@@ -373,7 +365,7 @@ public abstract class EventCategoryPanel extends Panel {
                         categoryEvent.getKey().getCategory(),
                         categoryEvent.getKey().getSubcategory(),
                         categoryEvent.getKey().getEvents().isEmpty()
-                                ? StringUtils.EMPTY : categoryEvent.getKey().getEvents().iterator().next(),
+                        ? StringUtils.EMPTY : categoryEvent.getKey().getEvents().iterator().next(),
                         categoryEvent.getValue()));
 
                 category.setEnabled(false);
@@ -439,16 +431,16 @@ public abstract class EventCategoryPanel extends Panel {
     }
 
     private void authorizeList() {
-        for (String role : getListAuthRoles()) {
+        getListAuthRoles().forEach(role -> {
             MetaDataRoleAuthorizationStrategy.authorize(selectedEventsPanel, RENDER, role);
-        }
+        });
     }
 
     private void authorizeChanges() {
-        for (String role : getChangeAuthRoles()) {
+        getChangeAuthRoles().forEach(role -> {
             MetaDataRoleAuthorizationStrategy.authorize(categoryContainer, RENDER, role);
             MetaDataRoleAuthorizationStrategy.authorize(eventsContainer, RENDER, role);
-        }
+        });
     }
 
     private void updateEventsContainer(final AjaxRequestTarget target) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java b/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
index d9ee460..7a39743 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/init/ClassPathScanImplementationLookup.java
@@ -21,10 +21,9 @@ package org.apache.syncope.client.console.init;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
-import org.apache.commons.collections4.ComparatorUtils;
 import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.syncope.client.console.pages.BaseExtPage;
 import org.apache.syncope.client.console.annotations.BinaryPreview;
 import org.apache.syncope.client.console.annotations.ExtPage;
@@ -35,7 +34,6 @@ import org.apache.syncope.client.console.wicket.markup.html.form.preview.Abstrac
 import org.apache.syncope.client.console.widgets.BaseExtWidget;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.config.BeanDefinition;
 import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
 import org.springframework.core.type.filter.AssignableTypeFilter;
 import org.springframework.util.ClassUtils;
@@ -80,7 +78,7 @@ public class ClassPathScanImplementationLookup {
         scanner.addIncludeFilter(new AssignableTypeFilter(BaseExtWidget.class));
         scanner.addIncludeFilter(new AssignableTypeFilter(SSOLoginFormPanel.class));
 
-        for (BeanDefinition bd : scanner.findCandidateComponents(getBasePackage())) {
+        scanner.findCandidateComponents(getBasePackage()).forEach(bd -> {
             try {
                 Class<?> clazz = ClassUtils.resolveClassName(
                         bd.getBeanClassName(), ClassUtils.getDefaultClassLoader());
@@ -112,36 +110,20 @@ public class ClassPathScanImplementationLookup {
             } catch (Throwable t) {
                 LOG.warn("Could not inspect class {}", bd.getBeanClassName(), t);
             }
-        }
+        });
         pages = Collections.unmodifiableList(pages);
         previewers = Collections.unmodifiableList(previewers);
 
-        Collections.sort(extPages, new Comparator<Class<? extends BaseExtPage>>() {
-
-            @Override
-            public int compare(
-                    final Class<? extends BaseExtPage> o1,
-                    final Class<? extends BaseExtPage> o2) {
-
-                return ComparatorUtils.<Integer>naturalComparator().compare(
+        Collections.sort(extPages, (o1, o2)
+                -> ObjectUtils.compare(
                         o1.getAnnotation(ExtPage.class).priority(),
-                        o2.getAnnotation(ExtPage.class).priority());
-            }
-        });
+                        o2.getAnnotation(ExtPage.class).priority()));
         extPages = Collections.unmodifiableList(extPages);
 
-        Collections.sort(extWidgets, new Comparator<Class<? extends BaseExtWidget>>() {
-
-            @Override
-            public int compare(
-                    final Class<? extends BaseExtWidget> o1,
-                    final Class<? extends BaseExtWidget> o2) {
-
-                return ComparatorUtils.<Integer>naturalComparator().compare(
+        Collections.sort(extWidgets, (o1, o2)
+                -> ObjectUtils.compare(
                         o1.getAnnotation(ExtWidget.class).priority(),
-                        o2.getAnnotation(ExtWidget.class).priority());
-            }
-        });
+                        o2.getAnnotation(ExtWidget.class).priority()));
         extWidgets = Collections.unmodifiableList(extWidgets);
 
         ssoLoginFormPanels = Collections.unmodifiableList(ssoLoginFormPanels);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
index 7000c4c..d3063d4 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWizardBuilder.java
@@ -24,8 +24,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
@@ -44,9 +43,8 @@ import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPa
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
-import org.apache.syncope.common.lib.to.MailTemplateTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.NotificationTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
 import org.apache.syncope.common.lib.to.VirSchemaTO;
@@ -122,40 +120,34 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationWra
             boolean createFlag = notificationTO.getKey() == null;
 
             AjaxTextFieldPanel sender = new AjaxTextFieldPanel("sender", getString("sender"),
-                    new PropertyModel<String>(notificationTO, "sender"));
+                    new PropertyModel<>(notificationTO, "sender"));
             sender.addRequiredLabel();
             sender.addValidator(EmailAddressValidator.getInstance());
             add(sender);
 
             AjaxTextFieldPanel subject = new AjaxTextFieldPanel("subject", getString("subject"),
-                    new PropertyModel<String>(notificationTO, "subject"));
+                    new PropertyModel<>(notificationTO, "subject"));
             subject.addRequiredLabel();
             add(subject);
 
             AjaxDropDownChoicePanel<String> template = new AjaxDropDownChoicePanel<>(
                     "template", getString("template"),
-                    new PropertyModel<String>(notificationTO, "template"));
-            template.setChoices(CollectionUtils.collect(
-                    restClient.listTemplates(), new Transformer<MailTemplateTO, String>() {
-
-                @Override
-                public String transform(final MailTemplateTO input) {
-                    return input.getKey();
-                }
-            }, new ArrayList<String>()));
+                    new PropertyModel<>(notificationTO, "template"));
+            template.setChoices(restClient.listTemplates().stream().
+                    map(EntityTO::getKey).collect(Collectors.toList()));
 
             template.addRequiredLabel();
             add(template);
 
             AjaxDropDownChoicePanel<TraceLevel> traceLevel = new AjaxDropDownChoicePanel<>(
                     "traceLevel", getString("traceLevel"),
-                    new PropertyModel<TraceLevel>(notificationTO, "traceLevel"));
+                    new PropertyModel<>(notificationTO, "traceLevel"));
             traceLevel.setChoices(Arrays.asList(TraceLevel.values()));
             traceLevel.addRequiredLabel();
             add(traceLevel);
 
             final AjaxCheckBoxPanel isActive = new AjaxCheckBoxPanel("isActive",
-                    getString("isActive"), new PropertyModel<Boolean>(notificationTO, "active"));
+                    getString("isActive"), new PropertyModel<>(notificationTO, "active"));
             if (createFlag) {
                 isActive.getField().setDefaultModelObject(Boolean.TRUE);
             }
@@ -297,7 +289,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationWra
 
                 @Override
                 protected Pair<String, List<SearchClause>> newModelObject() {
-                    return Pair.<String, List<SearchClause>>of(AnyTypeKind.USER.name(), new ArrayList<SearchClause>());
+                    return Pair.<String, List<SearchClause>>of(AnyTypeKind.USER.name(), new ArrayList<>());
                 }
 
                 @Override
@@ -349,7 +341,7 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationWra
 
             AjaxTextFieldPanel recipientAttrName = new AjaxTextFieldPanel(
                     "recipientAttrName", new ResourceModel("recipientAttrName", "recipientAttrName").getObject(),
-                    new PropertyModel<String>(notificationTO, "recipientAttrName"));
+                    new PropertyModel<>(notificationTO, "recipientAttrName"));
             recipientAttrName.setChoices(getSchemaNames());
             recipientAttrName.addRequiredLabel();
             recipientAttrName.setTitle(getString("intAttrNameInfo.help")
@@ -361,24 +353,24 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationWra
             add(recipientAttrName);
 
             AjaxTextFieldPanel staticRecipientsFieldPanel =
-                    new AjaxTextFieldPanel("panel", "staticRecipients", new Model<String>());
+                    new AjaxTextFieldPanel("panel", "staticRecipients", new Model<>());
             staticRecipientsFieldPanel.addValidator(EmailAddressValidator.getInstance());
             add(new MultiFieldPanel.Builder<>(
                     new PropertyModel<List<String>>(notificationTO, "staticRecipients")).
                     build("staticRecipients", "staticRecipients", staticRecipientsFieldPanel).hideLabel());
 
             add(new UserSearchPanel.Builder(
-                    new PropertyModel<List<SearchClause>>(modelObject, "recipientClauses")).
+                    new PropertyModel<>(modelObject, "recipientClauses")).
                     required(false).build("recipients"));
 
             AjaxDropDownChoicePanel<String> recipientsProviderClassName = new AjaxDropDownChoicePanel<>(
                     "recipientsProviderClassName", "recipientsProviderClassName",
-                    new PropertyModel<String>(notificationTO, "recipientsProviderClassName"), false);
+                    new PropertyModel<>(notificationTO, "recipientsProviderClassName"), false);
             recipientsProviderClassName.setChoices(recipientProviders.getObject());
             add(recipientsProviderClassName);
 
             AjaxCheckBoxPanel selfAsRecipient = new AjaxCheckBoxPanel("selfAsRecipient",
-                    getString("selfAsRecipient"), new PropertyModel<Boolean>(notificationTO, "selfAsRecipient"));
+                    getString("selfAsRecipient"), new PropertyModel<>(notificationTO, "selfAsRecipient"));
             if (notificationTO.getKey() == null) {
                 selfAsRecipient.getField().setDefaultModelObject(Boolean.FALSE);
             }
@@ -390,15 +382,12 @@ public class NotificationWizardBuilder extends AjaxWizardBuilder<NotificationWra
         List<String> result = new ArrayList<>();
         result.add("username");
 
-        CollectionUtils.collect(
-                schemaRestClient.<PlainSchemaTO>getSchemas(SchemaType.PLAIN, AnyTypeKind.USER.name()),
-                EntityTOUtils.<PlainSchemaTO>keyTransformer(), result);
-        CollectionUtils.collect(
-                schemaRestClient.<DerSchemaTO>getSchemas(SchemaType.DERIVED, AnyTypeKind.USER.name()),
-                EntityTOUtils.<DerSchemaTO>keyTransformer(), result);
-        CollectionUtils.collect(
-                schemaRestClient.<VirSchemaTO>getSchemas(SchemaType.VIRTUAL, AnyTypeKind.USER.name()),
-                EntityTOUtils.<VirSchemaTO>keyTransformer(), result);
+        result.addAll(schemaRestClient.<PlainSchemaTO>getSchemas(SchemaType.PLAIN, AnyTypeKind.USER.name()).
+                stream().map(EntityTO::getKey).collect(Collectors.toList()));
+        result.addAll(schemaRestClient.<DerSchemaTO>getSchemas(SchemaType.DERIVED, AnyTypeKind.USER.name()).
+                stream().map(EntityTO::getKey).collect(Collectors.toList()));
+        result.addAll(schemaRestClient.<VirSchemaTO>getSchemas(SchemaType.VIRTUAL, AnyTypeKind.USER.name()).
+                stream().map(EntityTO::getKey).collect(Collectors.toList()));
 
         Collections.sort(result);
         return result;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
index 1d6ee77..cc3e74e 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/notifications/NotificationWrapper.java
@@ -52,10 +52,10 @@ public class NotificationWrapper implements Serializable {
     public List<Pair<String, List<SearchClause>>> getAboutClauses() {
         if (this.aboutClauses == null) {
             this.aboutClauses = new ArrayList<>();
-            for (Map.Entry<String, List<SearchClause>> entry
-                    : SearchUtils.getSearchClauses(this.notificationTO.getAbouts()).entrySet()) {
-                this.aboutClauses.add(Pair.of(entry.getKey(), (entry.getValue())));
-            }
+            SearchUtils.getSearchClauses(this.notificationTO.getAbouts()).entrySet().
+                    forEach(entry -> {
+                        this.aboutClauses.add(Pair.of(entry.getKey(), (entry.getValue())));
+                    });
         }
 
         return this.aboutClauses;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java b/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
index 22f2fc5..ed08b11 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/pages/LogViewer.java
@@ -39,13 +39,9 @@ import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
 import org.apache.wicket.model.util.ListModel;
 import org.apache.wicket.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class LogViewer extends WebPage {
 
-    private static final Logger LOG = LoggerFactory.getLogger(LogViewer.class);
-
     private static final int MAX_STATEMENTS_PER_APPENDER = 50;
 
     private static final long serialVersionUID = -7578329899052708105L;
@@ -58,7 +54,7 @@ public class LogViewer extends WebPage {
         add(viewer);
 
         final AjaxDropDownChoicePanel<String> appenders = new AjaxDropDownChoicePanel<>(
-                "appenders", "Appender", new Model<String>(), false);
+                "appenders", "Appender", new Model<>(), false);
         MetaDataRoleAuthorizationStrategy.authorize(appenders, ENABLE, StandardEntitlement.LOG_READ);
         appenders.setChoices(restClient.listMemoryAppenders());
         viewer.add(appenders);
@@ -68,7 +64,7 @@ public class LogViewer extends WebPage {
         viewer.add(stContainer);
 
         final Model<Long> lastTimeInMillis = Model.of(0L);
-        final IModel<List<LogStatementTO>> statementViewModel = new ListModel<>(new ArrayList<LogStatementTO>());
+        final IModel<List<LogStatementTO>> statementViewModel = new ListModel<>(new ArrayList<>());
         final ListView<LogStatementTO> statementView = new ListView<LogStatementTO>("statements", statementViewModel) {
 
             private static final long serialVersionUID = -9180479401817023838L;
@@ -93,7 +89,7 @@ public class LogViewer extends WebPage {
                         String.format("window.scrollTop = $('#%s').scrollTop();", stContainer.getMarkupId()));
 
                 List<LogStatementTO> recentLogStatements = appenders.getModelObject() == null
-                        ? new ArrayList<LogStatementTO>()
+                        ? new ArrayList<>()
                         : restClient.getLastLogStatements(appenders.getModelObject(), lastTimeInMillis.getObject());
                 if (!recentLogStatements.isEmpty()) {
                     lastTimeInMillis.setObject(recentLogStatements.get(recentLogStatements.size() - 1).getTimeMillis());
@@ -102,7 +98,7 @@ public class LogViewer extends WebPage {
                     int recentSize = recentLogStatements.size();
 
                     List<LogStatementTO> newModelObject = SetUniqueList.<LogStatementTO>setUniqueList(
-                            new ArrayList<LogStatementTO>(MAX_STATEMENTS_PER_APPENDER));
+                            new ArrayList<>(MAX_STATEMENTS_PER_APPENDER));
                     if (currentSize <= MAX_STATEMENTS_PER_APPENDER - recentSize) {
                         newModelObject.addAll(statementView.getModelObject());
                     } else {
@@ -129,7 +125,7 @@ public class LogViewer extends WebPage {
             @Override
             protected void onUpdate(final AjaxRequestTarget target) {
                 List<LogStatementTO> lastStatements = appenders.getModelObject() == null
-                        ? new ArrayList<LogStatementTO>()
+                        ? new ArrayList<>()
                         : restClient.getLastLogStatements(appenders.getModelObject(), 0);
                 statementViewModel.setObject(lastStatements);
                 target.add(stContainer);

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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
index ad02b53..828a698 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyDirectoryPanel.java
@@ -26,14 +26,12 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.AnyDataProvider;
 import org.apache.syncope.client.console.commons.Constants;
-import org.apache.syncope.client.console.commons.SerializableTransformer;
 import org.apache.syncope.client.console.commons.status.ConnObjectWrapper;
-import org.apache.syncope.client.console.commons.status.StatusBean;
 import org.apache.syncope.client.console.rest.AbstractAnyRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
 import org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table.AttrColumn;
@@ -50,7 +48,6 @@ import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
-import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.wicket.PageReference;
@@ -118,16 +115,16 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
         altDefaultModal.size(Modal.Size.Large);
 
         this.pSchemaNames = new ArrayList<>();
-        for (AnyTypeClassTO anyTypeClassTO : AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs()) {
+        AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs().forEach(anyTypeClassTO -> {
             this.pSchemaNames.addAll(anyTypeClassTO.getPlainSchemas());
-        }
+        });
         this.dSchemaNames = new ArrayList<>();
-        for (AnyTypeClassTO anyTypeClassTO : AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs()) {
+        AnyDirectoryPanelBuilder.class.cast(builder).getAnyTypeClassTOs().forEach(anyTypeClassTO -> {
             this.dSchemaNames.addAll(anyTypeClassTO.getDerSchemas());
-        }
+        });
 
         initResultTable();
-        
+
         // cahnge close callback in order to update header after model update
         modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
 
@@ -149,32 +146,29 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
         final List<IColumn<A, String>> columns = new ArrayList<>();
         final List<IColumn<A, String>> prefcolumns = new ArrayList<>();
 
-        columns.add(new KeyPropertyColumn<A>(
+        columns.add(new KeyPropertyColumn<>(
                 new ResourceModel(Constants.KEY_FIELD_NAME, Constants.KEY_FIELD_NAME), Constants.KEY_FIELD_NAME));
 
-        for (String name : prefMan.getList(
-                getRequest(), DisplayAttributesModalPanel.getPrefDetailView(type))) {
-            if (!Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)) {
-                addPropertyColumn(
-                        name,
-                        ReflectionUtils.findField(DisplayAttributesModalPanel.getTOClass(type), name),
-                        prefcolumns);
-            }
-        }
-
-        for (String name : prefMan.getList(
-                getRequest(), DisplayAttributesModalPanel.getPrefPlainAttributeView(type))) {
-            if (pSchemaNames.contains(name)) {
-                prefcolumns.add(new AttrColumn<A>(name, SchemaType.PLAIN));
-            }
-        }
-
-        for (String name : prefMan.getList(
-                getRequest(), DisplayAttributesModalPanel.getPrefDerivedAttributeView(type))) {
-            if (dSchemaNames.contains(name)) {
-                prefcolumns.add(new AttrColumn<A>(name, SchemaType.DERIVED));
-            }
-        }
+        prefMan.getList(getRequest(), DisplayAttributesModalPanel.getPrefDetailView(type)).stream().
+                filter(name -> !Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)).
+                forEachOrdered(name -> {
+                    addPropertyColumn(
+                            name,
+                            ReflectionUtils.findField(DisplayAttributesModalPanel.getTOClass(type), name),
+                            prefcolumns);
+                });
+
+        prefMan.getList(getRequest(), DisplayAttributesModalPanel.getPrefPlainAttributeView(type)).stream().
+                filter(name -> pSchemaNames.contains(name)).
+                forEachOrdered(name -> {
+                    prefcolumns.add(new AttrColumn<>(name, SchemaType.PLAIN));
+                });
+
+        prefMan.getList(getRequest(), DisplayAttributesModalPanel.getPrefDerivedAttributeView(type)).stream().
+                filter(name -> (dSchemaNames.contains(name))).
+                forEachOrdered(name -> {
+                    prefcolumns.add(new AttrColumn<>(name, SchemaType.DERIVED));
+                });
 
         // Add defaults in case of no selection
         if (prefcolumns.isEmpty()) {
@@ -201,17 +195,17 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
             final List<IColumn<A, String>> columns) {
 
         if (Constants.KEY_FIELD_NAME.equalsIgnoreCase(name)) {
-            columns.add(new KeyPropertyColumn<A>(new ResourceModel(name, name), name, name));
+            columns.add(new KeyPropertyColumn<>(new ResourceModel(name, name), name, name));
         } else if (Constants.DEFAULT_TOKEN_FIELD_NAME.equalsIgnoreCase(name)) {
-            columns.add(new TokenColumn<A>(new ResourceModel(name, name), name));
+            columns.add(new TokenColumn<>(new ResourceModel(name, name), name));
         } else if (field != null
                 && (field.getType().equals(Boolean.class) || field.getType().equals(boolean.class))) {
 
-            columns.add(new BooleanPropertyColumn<A>(new ResourceModel(name, name), name, name));
+            columns.add(new BooleanPropertyColumn<>(new ResourceModel(name, name), name, name));
         } else if (field != null && field.getType().equals(Date.class)) {
-            columns.add(new DatePropertyColumn<A>(new ResourceModel(name, name), name, name));
+            columns.add(new DatePropertyColumn<>(new ResourceModel(name, name), name, name));
         } else {
-            columns.add(new PropertyColumn<A, String>(new ResourceModel(name, name), name, name));
+            columns.add(new PropertyColumn<>(new ResourceModel(name, name), name, name));
         }
     }
 
@@ -291,24 +285,16 @@ public abstract class AnyDirectoryPanel<A extends AnyTO, E extends AbstractAnyRe
         return new StatusPanel(
                 panelId,
                 ((ProvisioningResult<A>) result).getEntity(),
-                new ListModel<>(new ArrayList<StatusBean>()),
-                CollectionUtils.collect(
-                        ((ProvisioningResult<A>) result).getPropagationStatuses(),
-                        new SerializableTransformer<PropagationStatus, Pair<ConnObjectTO, ConnObjectWrapper>>() {
-
-                    private static final long serialVersionUID = -4931455531906427515L;
-
-                    @Override
-                    public Pair<ConnObjectTO, ConnObjectWrapper> transform(final PropagationStatus input) {
-                        ConnObjectTO before = input.getBeforeObj();
-                        ConnObjectWrapper afterObjWrapper = new ConnObjectWrapper(
-                                ((ProvisioningResult<A>) result).getEntity(),
-                                input.getResource(),
-                                input.getAfterObj());
-                        return Pair.of(before, afterObjWrapper);
-                    }
-
-                }, new ArrayList<Pair<ConnObjectTO, ConnObjectWrapper>>()),
+                new ListModel<>(new ArrayList<>()),
+                ((ProvisioningResult<A>) result).getPropagationStatuses().stream().
+                        map(input -> {
+                            ConnObjectTO before = input.getBeforeObj();
+                            ConnObjectWrapper afterObjWrapper = new ConnObjectWrapper(
+                                    ((ProvisioningResult<A>) result).getEntity(),
+                                    input.getResource(),
+                                    input.getAfterObj());
+                            return Pair.of(before, afterObjWrapper);
+                        }).collect(Collectors.toList()),
                 pageRef);
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
index 7d0867a..bb809be 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeClassDetailsPanel.java
@@ -18,11 +18,9 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.rest.ConfRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
@@ -66,7 +64,7 @@ public class AnyTypeClassDetailsPanel extends Panel {
         antTypeClassForm.setOutputMarkupId(true);
         add(antTypeClassForm);
 
-        final AjaxTextFieldPanel key = new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<String>(
+        final AjaxTextFieldPanel key = new AjaxTextFieldPanel("key", getString("key"), new PropertyModel<>(
                 this.anyTypeClassTO, "key"));
         key.addRequiredLabel();
         key.setEnabled(anyTypeClassTO.getKey() == null || this.anyTypeClassTO.getKey().isEmpty());
@@ -109,22 +107,16 @@ public class AnyTypeClassDetailsPanel extends Panel {
 
     private void buildAvailableSchemas(final String key) {
 
-        List<String> configurationSchemas = new ArrayList<>();
-        CollectionUtils.collect(new ConfRestClient().list(), new Transformer<AttrTO, String>() {
-
-            @Override
-            public String transform(final AttrTO attrTO) {
-                return attrTO.getSchema();
-            }
-        }, configurationSchemas);
-
-        for (AnyTypeClassTO item : new AnyTypeClassRestClient().list()) {
-            if (key == null || !item.getKey().equals(key)) {
-                availablePlainSchemas.removeAll(item.getPlainSchemas());
-                availableDerSchemas.removeAll(item.getDerSchemas());
-                availableVirSchemas.removeAll(item.getVirSchemas());
-            }
-        }
+        List<String> configurationSchemas = new ConfRestClient().list().stream().
+                map(AttrTO::getSchema).collect(Collectors.toList());
+
+        new AnyTypeClassRestClient().list().stream().
+                filter(item -> key == null || !item.getKey().equals(key)).
+                forEach(item -> {
+                    availablePlainSchemas.removeAll(item.getPlainSchemas());
+                    availableDerSchemas.removeAll(item.getDerSchemas());
+                    availableVirSchemas.removeAll(item.getVirSchemas());
+                });
 
         availablePlainSchemas.removeAll(configurationSchemas);
         availablePlainSchemas.removeAll(LAYOUT_PARAMETERS);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
index 7cf3b33..582dc9f 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/AnyTypeDetailsPanel.java
@@ -18,17 +18,15 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.rest.AnyTypeClassRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
-import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
@@ -74,7 +72,6 @@ public class AnyTypeDetailsPanel extends Panel {
     }
 
     private List<String> getAvailableAnyTypeClasses() {
-        return CollectionUtils.collect(new AnyTypeClassRestClient().list(),
-                EntityTOUtils.<AnyTypeClassTO>keyTransformer(), new ArrayList<String>());
+        return new AnyTypeClassRestClient().list().stream().map(EntityTO::getKey).collect(Collectors.toList());
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
index c09fb43..d30bdbe 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/BeanPanel.java
@@ -26,8 +26,7 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-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.client.console.panels.search.AnyObjectSearchPanel;
@@ -50,6 +49,7 @@ import org.apache.syncope.common.lib.report.Schema;
 import org.apache.syncope.common.lib.report.SearchCondition;
 import org.apache.syncope.common.lib.search.AbstractFiqlSearchConditionBuilder;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.list.ListItem;
@@ -209,26 +209,19 @@ public class BeanPanel<T extends Serializable> extends Panel {
                             }
                         }
 
-                        panel = new AjaxPalettePanel.Builder<String>().setName(fieldName).build(
+                        panel = new AjaxPalettePanel.Builder<>().setName(fieldName).build(
                                 "value",
-                                new PropertyModel<List<String>>(bean.getObject(), fieldName),
-                                new ListModel<>(
-                                        CollectionUtils.collect(
-                                                choices, new Transformer<AbstractSchemaTO, String>() {
-
-                                            @Override
-                                            public String transform(final AbstractSchemaTO input) {
-                                                return input.getKey();
-                                            }
-                                        }, new ArrayList<String>()))).hideLabel();
+                                new PropertyModel<>(bean.getObject(), fieldName),
+                                new ListModel<>(choices.stream().map(EntityTO::getKey).collect(Collectors.toList()))).
+                                hideLabel();
                     } else if (listItemType.isEnum()) {
-                        panel = new AjaxPalettePanel.Builder<String>().setName(fieldName).build(
+                        panel = new AjaxPalettePanel.Builder<>().setName(fieldName).build(
                                 "value",
-                                new PropertyModel<List<String>>(bean.getObject(), fieldName),
+                                new PropertyModel<>(bean.getObject(), fieldName),
                                 new ListModel(Arrays.asList(listItemType.getEnumConstants()))).hideLabel();
                     } else {
                         panel = new MultiFieldPanel.Builder<>(
-                                new PropertyModel<List<String>>(bean.getObject(), fieldName)).build(
+                                new PropertyModel<>(bean.getObject(), fieldName)).build(
                                 "value",
                                 fieldName,
                                 buildSinglePanel(bean.getObject(), field.getType(), fieldName, "panel")).hideLabel();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
index 1399c3e..1f01e59 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjectListViewPanel.java
@@ -20,9 +20,7 @@ package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
@@ -68,17 +66,12 @@ public abstract class ConnObjectListViewPanel extends Panel {
 
             @Override
             protected Component getValueComponent(final String key, final ConnObjectTO bean) {
-                final AttrTO attrTO = IterableUtils.find(bean.getAttrs(), new Predicate<AttrTO>() {
+                Optional<AttrTO> attrTO =
+                        bean.getAttrs().stream().filter(object -> object.getSchema().equals(key)).findAny();
 
-                    @Override
-                    public boolean evaluate(final AttrTO object) {
-                        return object.getSchema().equals(key);
-                    }
-                });
-
-                return attrTO == null || CollectionUtils.isEmpty(attrTO.getValues())
+                return !attrTO.isPresent() || attrTO.get().getValues().isEmpty()
                         ? new Label("field", StringUtils.EMPTY)
-                        : new CollectionPanel("field", attrTO.getValues());
+                        : new CollectionPanel("field", attrTO.get().getValues());
             }
 
         };

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
index d29ce1a..fc8318d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConnObjects.java
@@ -18,11 +18,9 @@
  */
 package org.apache.syncope.client.console.panels;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.dialog.BaseModal;
@@ -50,20 +48,14 @@ public class ConnObjects extends Panel implements ModalPanel {
     public ConnObjects(final ResourceTO resource, final PageReference pageRef) {
         super(BaseModal.CONTENT_ID);
 
-        List<String> availableAnyTypes = CollectionUtils.collect(
-                resource.getProvisions(), new Transformer<ProvisionTO, String>() {
-
-            @Override
-            public String transform(final ProvisionTO provision) {
-                return provision.getAnyType();
-            }
-        }, new ArrayList<String>());
+        List<String> availableAnyTypes = resource.getProvisions().stream().
+                map(ProvisionTO::getAnyType).collect(Collectors.toList());
         Collections.sort(availableAnyTypes, new AnyTypeRestClient.AnyTypeKeyComparator());
         if (resource.getOrgUnit() != null) {
             availableAnyTypes.add(0, SyncopeConstants.REALM_ANYTYPE);
         }
 
-        anyTypes = new AjaxDropDownChoicePanel<>("anyTypes", "anyTypes", new Model<String>());
+        anyTypes = new AjaxDropDownChoicePanel<>("anyTypes", "anyTypes", new Model<>());
         anyTypes.setChoices(availableAnyTypes);
         anyTypes.hideLabel();
         anyTypes.setNullValid(false);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
index 5dd4de5..f1e9dc2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ConsoleLogPanel.java
@@ -22,8 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.ComparatorUtils;
-import org.apache.commons.collections4.Transformer;
+import org.apache.commons.lang3.ObjectUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.config.LoggerConfig;
@@ -55,7 +54,7 @@ public class ConsoleLogPanel extends AbstractLogsPanel<LoggerTO> {
             LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
 
             List<LoggerTO> result = new ArrayList<>();
-            for (final LoggerConfig logger : ctx.getConfiguration().getLoggers().values()) {
+            ctx.getConfiguration().getLoggers().values().forEach(logger -> {
                 String loggerName = LogManager.ROOT_LOGGER_NAME.equals(logger.getName())
                         ? SyncopeConstants.ROOT_LOGGER : logger.getName();
                 if (logger.getLevel() != null) {
@@ -64,15 +63,8 @@ public class ConsoleLogPanel extends AbstractLogsPanel<LoggerTO> {
                     loggerTO.setLevel(LoggerLevel.fromLevel(logger.getLevel()));
                     result.add(loggerTO);
                 }
-            }
-            Collections.sort(result, ComparatorUtils.transformedComparator(
-                    ComparatorUtils.<String>naturalComparator(), new Transformer<LoggerTO, String>() {
-
-                @Override
-                public String transform(final LoggerTO input) {
-                    return input.getKey();
-                }
-            }));
+            });
+            Collections.sort(result, (o1, o2) -> ObjectUtils.compare(o1.getKey(), o2.getKey()));
 
             return result;
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java
index 00d95b3..563641c 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/HistoryConfDetails.java
@@ -24,9 +24,7 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
@@ -66,14 +64,8 @@ public class HistoryConfDetails<T extends AbstractHistoryConf> extends Multileve
         super();
 
         // remove selected conf from list
-        CollectionUtils.filter(availableHistoryConfTOs, new Predicate<T>() {
-
-            @Override
-            public boolean evaluate(final T object) {
-                return !object.getKey().equals(selectedHistoryConfTO.getKey());
-            }
-        });
-        this.availableHistoryConfTOs = availableHistoryConfTOs;
+        this.availableHistoryConfTOs = availableHistoryConfTOs.stream().
+                filter(object -> object.getKey().equals(selectedHistoryConfTO.getKey())).collect(Collectors.toList());
         this.selectedHistoryConfTO = selectedHistoryConfTO;
 
         // add current conf to list
@@ -81,11 +73,7 @@ public class HistoryConfDetails<T extends AbstractHistoryConf> extends Multileve
 
         Form<?> form = initDropdownDiffConfForm();
         add(form);
-        if (availableHistoryConfTOs.isEmpty()) {
-            form.setVisible(false);
-        } else {
-            form.setVisible(true);
-        }
+        form.setVisible(!availableHistoryConfTOs.isEmpty());
 
         showConfigurationSinglePanel();
     }
@@ -109,9 +97,9 @@ public class HistoryConfDetails<T extends AbstractHistoryConf> extends Multileve
 
     private void showConfigurationDiffPanel(final List<T> historyConfTOs) {
         List<Pair<String, String>> infos = new ArrayList<>();
-        for (T historyConfTO : historyConfTOs) {
+        historyConfTOs.forEach(historyConfTO -> {
             infos.add(getJSONInfo(historyConfTO));
-        }
+        });
 
         jsonPanel = new JsonDiffPanel(null, new PropertyModel<String>(infos.get(0), "value"),
                 new PropertyModel<String>(infos.get(1), "value"), null) {
@@ -170,7 +158,7 @@ public class HistoryConfDetails<T extends AbstractHistoryConf> extends Multileve
         return historyConfMap;
     }
 
-    private Form initDropdownDiffConfForm() {
+    private Form<?> initDropdownDiffConfForm() {
         final Form<T> form = new Form<>("form");
         form.setModel(new CompoundPropertyModel<>(selectedHistoryConfTO));
         form.setOutputMarkupId(true);
@@ -181,7 +169,7 @@ public class HistoryConfDetails<T extends AbstractHistoryConf> extends Multileve
         final AjaxDropDownChoicePanel<String> dropdownElem = new AjaxDropDownChoicePanel<>(
                 "compareDropdown",
                 getString("compare"),
-                new PropertyModel<String>(selectedHistoryConfTO, "key"),
+                new PropertyModel<>(selectedHistoryConfTO, "key"),
                 false);
         dropdownElem.setChoices(keys);
         dropdownElem.setChoiceRenderer(new IChoiceRenderer<String>() {
@@ -217,13 +205,8 @@ public class HistoryConfDetails<T extends AbstractHistoryConf> extends Multileve
                 final String selectedKey = dropdownElem.getModelObject();
                 if (selectedKey != null) {
                     if (!selectedKey.isEmpty()) {
-                        T confToCompare = IterableUtils.find(availableHistoryConfTOs, new Predicate<T>() {
-
-                            @Override
-                            public boolean evaluate(final T object) {
-                                return object.getKey().equals(selectedKey);
-                            }
-                        });
+                        T confToCompare = availableHistoryConfTOs.stream().
+                                filter(object -> object.getKey().equals(selectedKey)).findAny().orElse(null);
                         elemsToCompare.add(confToCompare);
                         showConfigurationDiffPanel(elemsToCompare);
                     } else {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
index 6dce4eb..06729c9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/ListViewPanel.java
@@ -22,12 +22,9 @@ import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.IteratorUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormChoiceComponentUpdatingBehavior;
@@ -139,7 +136,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
         final List<String> toBeIncluded;
         if (includes == null || includes.isEmpty()) {
             toBeIncluded = new ArrayList<>();
-            for (Field field : Arrays.asList(reference.getDeclaredFields())) {
+            for (Field field : reference.getDeclaredFields()) {
                 toBeIncluded.add(field.getName());
             }
         } else {
@@ -155,9 +152,9 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
         } else {
             listOfItems = list;
             if (LOG.isDebugEnabled()) {
-                for (String field : toBeIncluded) {
+                toBeIncluded.forEach(field -> {
                     LOG.debug("Show field {}", field);
-                }
+                });
             }
         }
 
@@ -396,13 +393,7 @@ public abstract class ListViewPanel<T extends Serializable> extends WizardMgtPan
         protected T getActualItem(final T item, final List<T> list) {
             return item == null
                     ? null
-                    : IteratorUtils.find(list.iterator(), new Predicate<T>() {
-
-                        @Override
-                        public boolean evaluate(final T object) {
-                            return item.equals(object);
-                        }
-                    });
+                    : list.stream().filter(object -> item.equals(object)).findAny().orElse(null);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
index 70d2dda..81167d8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/MembersTogglePanel.java
@@ -20,8 +20,7 @@ package org.apache.syncope.client.console.panels;
 
 import java.io.Serializable;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.pages.BasePage;
@@ -54,15 +53,8 @@ public abstract class MembersTogglePanel extends TogglePanel<Serializable> {
 
         @Override
         protected List<String> load() {
-            List<String> result = new AnyTypeRestClient().list();
-            CollectionUtils.filter(result, new Predicate<String>() {
-
-                @Override
-                public boolean evaluate(final String anyType) {
-                    return !AnyTypeKind.GROUP.name().equals(anyType);
-                }
-            });
-            return result;
+            return new AnyTypeRestClient().list().stream().
+                    filter(anyType -> !AnyTypeKind.GROUP.name().equals(anyType)).collect(Collectors.toList());
         }
     };
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
index fe708f8..f8ea7bc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/Realm.java
@@ -24,7 +24,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
@@ -42,10 +42,10 @@ import org.apache.syncope.client.console.wicket.markup.html.form.ActionLink;
 import org.apache.syncope.client.console.wicket.markup.html.form.ActionsPanel;
 import org.apache.syncope.client.console.wizards.WizardMgtPanel;
 import org.apache.syncope.client.console.wizards.any.ConnObjectPanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PropagationStatus;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
 import org.apache.syncope.common.lib.to.RealmTO;
@@ -167,7 +167,7 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
         });
 
         final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo =
-                FormLayoutInfoUtils.fetch(CollectionUtils.collect(anyTypes, EntityTOUtils.keyTransformer()));
+                FormLayoutInfoUtils.fetch(anyTypes.stream().map(EntityTO::getKey).collect(Collectors.toList()));
 
         for (final AnyTypeTO anyType : anyTypes) {
             tabs.add(new ITabComponent(
@@ -221,11 +221,11 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
                     ConnObjectTO afterObj = bean.getAfterObj();
                     String remoteId = afterObj == null
                             || afterObj.getAttrs().isEmpty()
-                            || afterObj.getAttr(ConnIdSpecialName.NAME) == null
-                            || afterObj.getAttr(ConnIdSpecialName.NAME).getValues() == null
-                            || afterObj.getAttr(ConnIdSpecialName.NAME).getValues().isEmpty()
+                            || !afterObj.getAttr(ConnIdSpecialName.NAME).isPresent()
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues() == null
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().isEmpty()
                             ? StringUtils.EMPTY
-                            : afterObj.getAttr(ConnIdSpecialName.NAME).getValues().get(0);
+                            : afterObj.getAttr(ConnIdSpecialName.NAME).get().getValues().get(0);
 
                     return new Label("field", remoteId);
                 } else if ("status".equalsIgnoreCase(key)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
index 79c3322..7e74241 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmChoicePanel.java
@@ -33,8 +33,6 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -100,10 +98,10 @@ public class RealmChoicePanel extends Panel {
 
                 if (tree.containsKey(key)) {
                     Pair<RealmTO, List<RealmTO>> subtree = tree.get(key);
-                    for (RealmTO child : subtree.getValue()) {
+                    subtree.getValue().forEach(child -> {
                         full.add(Pair.of(indent + child.getName(), child));
                         getChildren(full, child.getKey(), tree, "     " + indent + (indent.isEmpty() ? "|--- " : ""));
-                    }
+                    });
                 }
             }
 
@@ -124,20 +122,17 @@ public class RealmChoicePanel extends Panel {
 
             @Override
             protected List<DynRealmTO> load() {
-                final List<DynRealmTO> dynRealms = realmRestClient.listDynReams();
-                dynRealms.sort(new Comparator<DynRealmTO>() {
-
-                    @Override
-                    public int compare(final DynRealmTO left, final DynRealmTO right) {
-                        if (left == null) {
-                            return -1;
-                        } else if (right == null) {
-                            return 1;
-                        } else {
-                            return left.getKey().compareTo(right.getKey());
-                        }
+                List<DynRealmTO> dynRealms = realmRestClient.listDynReams();
+                dynRealms.sort((left, right) -> {
+                    if (left == null) {
+                        return -1;
+                    } else if (right == null) {
+                        return 1;
+                    } else {
+                        return left.getKey().compareTo(right.getKey());
                     }
                 });
+
                 return dynRealms;
             }
         };
@@ -221,13 +216,8 @@ public class RealmChoicePanel extends Panel {
 
                         @Override
                         public boolean isEnabled() {
-                            return IterableUtils.matchesAny(availableRealms, new Predicate<String>() {
-
-                                @Override
-                                public boolean evaluate(final String availableRealm) {
-                                    return realmTO.getFullPath().startsWith(availableRealm);
-                                }
-                            });
+                            return availableRealms.stream().
+                                    anyMatch(availableRealm -> realmTO.getFullPath().startsWith(availableRealm));
                         }
                     });
                 }
@@ -283,13 +273,9 @@ public class RealmChoicePanel extends Panel {
 
                             @Override
                             public boolean isEnabled() {
-                                return IterableUtils.matchesAny(availableRealms, new Predicate<String>() {
-
-                                    @Override
-                                    public boolean evaluate(final String availableRealm) {
-                                        return SyncopeConstants.ROOT_REALM.equals(availableRealm)
-                                                || realmTO.getKey().equals(availableRealm);
-                                    }
+                                return availableRealms.stream().anyMatch(availableRealm -> {
+                                    return SyncopeConstants.ROOT_REALM.equals(availableRealm)
+                                            || realmTO.getKey().equals(availableRealm);
                                 });
                             }
                         });
@@ -328,11 +314,11 @@ public class RealmChoicePanel extends Panel {
 
     private Map<String, Pair<RealmTO, List<RealmTO>>> reloadRealmParentMap(final List<RealmTO> realms) {
         tree.clear();
-        tree.put(null, Pair.<RealmTO, List<RealmTO>>of(realms.get(0), new ArrayList<RealmTO>()));
+        tree.put(null, Pair.<RealmTO, List<RealmTO>>of(realms.get(0), new ArrayList<>()));
 
         final Map<String, List<RealmTO>> cache = new HashMap<>();
 
-        for (RealmTO realm : realms) {
+        realms.forEach(realm -> {
             final List<RealmTO> children = new ArrayList<>();
             tree.put(realm.getKey(), Pair.<RealmTO, List<RealmTO>>of(realm, children));
 
@@ -348,7 +334,7 @@ public class RealmChoicePanel extends Panel {
             } else {
                 cache.put(realm.getParent(), new ArrayList<>(Collections.singleton(realm)));
             }
-        }
+        });
 
         return tree;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
index 4f48c3c..ddd903a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/RealmDetails.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.rest.PolicyRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
@@ -32,11 +32,10 @@ import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePane
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.PolicyRenderer;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.RealmTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.PolicyType;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.DropDownChoice;
@@ -119,19 +118,19 @@ public class RealmDetails extends Panel {
         container.add(generics.setVisible(unwrapped));
 
         FieldPanel<String> name = new AjaxTextFieldPanel(
-                "name", "name", new PropertyModel<String>(realmTO, "name"), false);
+                "name", "name", new PropertyModel<>(realmTO, "name"), false);
         name.addRequiredLabel();
         generics.add(name);
 
         FieldPanel<String> fullPath = new AjaxTextFieldPanel(
-                "fullPath", "fullPath", new PropertyModel<String>(realmTO, "fullPath"), false);
+                "fullPath", "fullPath", new PropertyModel<>(realmTO, "fullPath"), false);
         fullPath.setEnabled(false);
         generics.add(fullPath);
 
         AjaxDropDownChoicePanel<String> accountPolicy = new AjaxDropDownChoicePanel<>(
                 "accountPolicy",
                 new ResourceModel("accountPolicy", "accountPolicy").getObject(),
-                new PropertyModel<String>(realmTO, "accountPolicy"),
+                new PropertyModel<>(realmTO, "accountPolicy"),
                 false);
         accountPolicy.setChoiceRenderer(new PolicyRenderer(accountPolicies));
         accountPolicy.setChoices(new ArrayList<>(accountPolicies.getObject().keySet()));
@@ -141,7 +140,7 @@ public class RealmDetails extends Panel {
         AjaxDropDownChoicePanel<String> passwordPolicy = new AjaxDropDownChoicePanel<>(
                 "passwordPolicy",
                 new ResourceModel("passwordPolicy", "passwordPolicy").getObject(),
-                new PropertyModel<String>(realmTO, "passwordPolicy"),
+                new PropertyModel<>(realmTO, "passwordPolicy"),
                 false);
         passwordPolicy.setChoiceRenderer(new PolicyRenderer(passwordPolicies));
         passwordPolicy.setChoices(new ArrayList<>(passwordPolicies.getObject().keySet()));
@@ -156,10 +155,10 @@ public class RealmDetails extends Panel {
         actionsClassNames.setOutputMarkupId(true);
         container.add(actionsClassNames);
 
-        container.add(new AjaxPalettePanel.Builder<String>().build("resources",
-                new PropertyModel<List<String>>(realmTO, "resources"),
-                new ListModel<>(CollectionUtils.collect(new ResourceRestClient().list(),
-                        EntityTOUtils.<ResourceTO>keyTransformer(), new ArrayList<String>()))).
+        container.add(new AjaxPalettePanel.Builder<>().build("resources",
+                new PropertyModel<>(realmTO, "resources"),
+                new ListModel<>(new ResourceRestClient().list().stream().
+                        map(EntityTO::getKey).collect(Collectors.toList()))).
                 setOutputMarkupId(true).
                 setEnabled(!SyncopeConstants.ROOT_REALM.equals(realmTO.getName())).
                 setVisible(!SyncopeConstants.ROOT_REALM.equals(realmTO.getName())));

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
index af1b84c..c4596e6 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/SchemaTypePanel.java
@@ -27,8 +27,7 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-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.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
@@ -156,7 +155,7 @@ public class SchemaTypePanel extends TypesDirectoryPanel<AbstractSchemaTO, Schem
 
             if (clazzField != null) {
                 if (clazzField.getType().equals(Boolean.class) || clazzField.getType().equals(boolean.class)) {
-                    columns.add(new BooleanPropertyColumn<AbstractSchemaTO>(new ResourceModel(field), field, field));
+                    columns.add(new BooleanPropertyColumn<>(new ResourceModel(field), field, field));
                 } else {
                     final IColumn<AbstractSchemaTO, String> column = new PropertyColumn<AbstractSchemaTO, String>(
                             new ResourceModel(field), field, field) {
@@ -254,22 +253,15 @@ public class SchemaTypePanel extends TypesDirectoryPanel<AbstractSchemaTO, Schem
             Collections.sort(list, comparator);
 
             if (SchemaType.PLAIN == this.schemaType) {
-                final List<String> configurations = new ArrayList<>();
-
-                CollectionUtils.collect(confRestClient.list(), new Transformer<AttrTO, String>() {
-
-                    @Override
-                    public String transform(final AttrTO attrTO) {
-                        return attrTO.getSchema();
-                    }
-                }, configurations);
+                final List<String> configurations = confRestClient.list().stream().
+                        map(AttrTO::getSchema).collect(Collectors.toList());
 
                 final List<AbstractSchemaTO> res = new ArrayList<>();
-                for (AbstractSchemaTO item : list) {
-                    if (!configurations.contains(item.getKey())) {
-                        res.add(item);
-                    }
-                }
+                list.stream().
+                        filter(item -> !configurations.contains(item.getKey())).
+                        forEachOrdered(item -> {
+                            res.add(item);
+                        });
                 return res.subList((int) first, (int) first + (int) count).iterator();
             } else {
                 return list.subList((int) first, (int) first + (int) count).iterator();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java
index ceb51be..e5d72ea 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/VirSchemaDetails.java
@@ -23,9 +23,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.rest.ConnectorRestClient;
@@ -34,11 +33,10 @@ import org.apache.syncope.client.console.wicket.ajax.form.IndicatorAjaxFormCompo
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AbstractSchemaTO;
 import org.apache.syncope.common.lib.to.ConnIdObjectClassTO;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
-import org.apache.syncope.common.lib.to.ProvisionTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
 import org.apache.wicket.PageReference;
@@ -66,14 +64,13 @@ public class VirSchemaDetails extends AbstractSchemaDetailsPanel {
         super(id, pageReference, schemaTO);
 
         AjaxCheckBoxPanel readonly = new AjaxCheckBoxPanel("readonly", getString("readonly"),
-                new PropertyModel<Boolean>(schemaTO, "readonly"));
+                new PropertyModel<>(schemaTO, "readonly"));
         schemaForm.add(readonly);
 
         final AjaxDropDownChoicePanel<String> resource = new AjaxDropDownChoicePanel<>(
                 "resource", getString("resource"), new PropertyModel<String>(schemaTO, "resource"), false).
                 setNullValid(false);
-        resource.setChoices(CollectionUtils.collect(resourceRestClient.list(),
-                EntityTOUtils.<ResourceTO>keyTransformer(), new ArrayList<String>()));
+        resource.setChoices(resourceRestClient.list().stream().map(EntityTO::getKey).collect(Collectors.toList()));
         resource.setOutputMarkupId(true);
         resource.addRequiredLabel();
         if (resource.getModelObject() != null) {
@@ -94,7 +91,7 @@ public class VirSchemaDetails extends AbstractSchemaDetailsPanel {
         schemaForm.add(anyType);
 
         final AjaxTextFieldPanel extAttrName = new AjaxTextFieldPanel(
-                "extAttrName", getString("extAttrName"), new PropertyModel<String>(schemaTO, "extAttrName"));
+                "extAttrName", getString("extAttrName"), new PropertyModel<>(schemaTO, "extAttrName"));
         extAttrName.setOutputMarkupId(true);
         extAttrName.addRequiredLabel();
         if (selectedResource != null) {
@@ -158,9 +155,9 @@ public class VirSchemaDetails extends AbstractSchemaDetailsPanel {
 
             if (SyncopeConsoleSession.get().owns(StandardEntitlement.RESOURCE_READ, adminRealm)) {
                 selectedResource = resource;
-                for (ProvisionTO provisionTO : selectedResource.getProvisions()) {
+                selectedResource.getProvisions().forEach(provisionTO -> {
                     anyTypes.put(provisionTO.getAnyType(), provisionTO.getObjectClass());
-                }
+                });
             }
         }
     }
@@ -170,17 +167,12 @@ public class VirSchemaDetails extends AbstractSchemaDetailsPanel {
         connInstanceTO.setKey(selectedResource.getConnector());
         connInstanceTO.getConf().addAll(selectedResource.getConfOverride());
 
-        ConnIdObjectClassTO connIdObjectClass = IterableUtils.find(
-                connRestClient.buildObjectClassInfo(connInstanceTO, false), new Predicate<ConnIdObjectClassTO>() {
-
-            @Override
-            public boolean evaluate(final ConnIdObjectClassTO object) {
-                return object.getType().equals(anyTypes.get(anyType.getModelObject()));
-            }
-        });
+        Optional<ConnIdObjectClassTO> connIdObjectClass = connRestClient.buildObjectClassInfo(connInstanceTO, false).
+                stream().filter(object -> object.getType().equals(anyTypes.get(anyType.getModelObject()))).
+                findAny();
 
-        return connIdObjectClass == null
-                ? Collections.<String>emptyList()
-                : connIdObjectClass.getAttributes();
+        return connIdObjectClass.isPresent()
+                ? connIdObjectClass.get().getAttributes()
+                : Collections.<String>emptyList();
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
index 050896f..f96da97 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/AbstractSearchPanel.java
@@ -19,19 +19,17 @@
 package org.apache.syncope.client.console.panels.search;
 
 import java.io.Serializable;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.rest.AnyTypeRestClient;
 import org.apache.syncope.client.console.rest.ResourceRestClient;
 import org.apache.syncope.client.console.rest.SchemaRestClient;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
-import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.search.SearchableFields;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.SchemaType;
 import org.apache.wicket.event.IEventSink;
@@ -192,8 +190,7 @@ public abstract class AbstractSearchPanel extends Panel {
 
             @Override
             protected List<String> load() {
-                return CollectionUtils.collect(resourceRestClient.list(),
-                        EntityTOUtils.<ResourceTO>keyTransformer(), new ArrayList<String>());
+                return resourceRestClient.list().stream().map(EntityTO::getKey).collect(Collectors.toList());
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
index 28958ee..cc66d40 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
@@ -26,9 +26,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
-import org.apache.commons.collections4.functors.StringValueTransformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.panels.search.SearchClause.Comparator;
@@ -110,7 +108,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
 
         super(id, name, clause);
 
-        this.clause = clause == null ? new Model<SearchClause>(null) : clause;
+        this.clause = clause == null ? new Model<>(null) : clause;
 
         this.required = required;
         this.types = types;
@@ -201,9 +199,8 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                         return names;
 
                     case GROUP_MEMBERSHIP:
-                        final List<String> groups = CollectionUtils.collect(groupNames.getObject().keySet(),
-                                StringValueTransformer.<String>stringValueTransformer(), new ArrayList<String>());
-
+                        final List<String> groups = groupNames.getObject().keySet().
+                                stream().collect(Collectors.toList());
                         Collections.sort(groups);
                         return groups;
 
@@ -218,14 +215,8 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                         return resources;
 
                     case RELATIONSHIP:
-                        final List<String> relations = CollectionUtils.collect(
-                                new RelationshipTypeRestClient().list(), new Transformer<RelationshipTypeTO, String>() {
-
-                            @Override
-                            public String transform(final RelationshipTypeTO input) {
-                                return input.getKey();
-                            }
-                        }, new ArrayList<String>());
+                        final List<String> relations = new RelationshipTypeRestClient().list().stream().
+                                map(RelationshipTypeTO::getKey).collect(Collectors.toList());
                         return relations;
 
                     default:
@@ -364,7 +355,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
         }
 
         final AjaxDropDownChoicePanel<String> property = new AjaxDropDownChoicePanel<>(
-                "property", "property", new PropertyModel<String>(searchClause, "property"));
+                "property", "property", new PropertyModel<>(searchClause, "property"));
         property.hideLabel().setRequired(required).setOutputMarkupId(true);
         property.setChoices(properties);
         property.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {
@@ -378,7 +369,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
         field.add(property);
 
         final AjaxDropDownChoicePanel<SearchClause.Comparator> comparator = new AjaxDropDownChoicePanel<>(
-                "comparator", "comparator", new PropertyModel<SearchClause.Comparator>(searchClause, "comparator"));
+                "comparator", "comparator", new PropertyModel<>(searchClause, "comparator"));
         comparator.setChoices(comparators);
         comparator.setNullValid(false).hideLabel().setOutputMarkupId(true);
         comparator.setRequired(required);
@@ -386,7 +377,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
         field.add(comparator);
 
         final AjaxTextFieldPanel value = new AjaxTextFieldPanel(
-                "value", "value", new PropertyModel<String>(searchClause, "value"), false);
+                "value", "value", new PropertyModel<>(searchClause, "value"), false);
         value.hideLabel().setOutputMarkupId(true);
         field.add(value);
 
@@ -426,7 +417,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
         });
 
         final AjaxDropDownChoicePanel<SearchClause.Type> type = new AjaxDropDownChoicePanel<>(
-                "type", "type", new PropertyModel<SearchClause.Type>(searchClause, "type"));
+                "type", "type", new PropertyModel<>(searchClause, "type"));
         type.setChoices(types).hideLabel().setRequired(required).setOutputMarkupId(true);
         type.setNullValid(false);
         type.getField().add(new IndicatorAjaxFormComponentUpdatingBehavior(Constants.ON_CHANGE) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSearchPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSearchPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSearchPanel.java
index faaecb8..efc9de8 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSearchPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/UserSearchPanel.java
@@ -20,10 +20,9 @@ package org.apache.syncope.client.console.panels.search;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.rest.RoleRestClient;
-import org.apache.syncope.common.lib.to.RoleTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.LoadableDetachableModel;
@@ -62,13 +61,7 @@ public final class UserSearchPanel extends AnyObjectSearchPanel {
 
             @Override
             protected List<String> load() {
-                return CollectionUtils.collect(roleRestClient.list(), new Transformer<RoleTO, String>() {
-
-                    @Override
-                    public String transform(final RoleTO input) {
-                        return input.getKey();
-                    }
-                }, new ArrayList<String>());
+                return roleRestClient.list().stream().map(EntityTO::getKey).collect(Collectors.toList());
             }
         };
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
index 7507d04..91b24d0 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyModalPanelBuilder.java
@@ -20,8 +20,7 @@ package org.apache.syncope.client.console.policies;
 
 import java.util.ArrayList;
 import java.util.List;
-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.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
@@ -41,7 +40,7 @@ import org.apache.syncope.client.console.wizards.AjaxWizard;
 import org.apache.syncope.common.lib.policy.AbstractPolicyTO;
 import org.apache.syncope.common.lib.policy.AccountPolicyTO;
 import org.apache.syncope.common.lib.policy.PasswordPolicyTO;
-import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.wicket.Component;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.ajax.AjaxRequestTarget;
@@ -82,15 +81,7 @@ public class PolicyModalPanelBuilder<T extends AbstractPolicyTO> extends Abstrac
 
             @Override
             protected List<String> load() {
-                return CollectionUtils.collect(
-                        new ResourceRestClient().list(),
-                        new Transformer<ResourceTO, String>() {
-
-                    @Override
-                    public String transform(final ResourceTO input) {
-                        return input.getKey();
-                    }
-                }, new ArrayList<String>());
+                return new ResourceRestClient().list().stream().map(EntityTO::getKey).collect(Collectors.toList());
             }
         };
 
@@ -103,7 +94,7 @@ public class PolicyModalPanelBuilder<T extends AbstractPolicyTO> extends Abstrac
             final List<Component> fields = new ArrayList<>();
 
             FieldPanel<String> description = new AjaxTextFieldPanel("field", "description",
-                    new PropertyModel<String>(policyTO, "description"), false);
+                    new PropertyModel<>(policyTO, "description"), false);
             description.setRequired(true);
             fields.add(description);
 
@@ -117,7 +108,7 @@ public class PolicyModalPanelBuilder<T extends AbstractPolicyTO> extends Abstrac
                 fields.add(new AjaxCheckBoxPanel(
                         "field",
                         "propagateSuspension",
-                        new PropertyModel<Boolean>(policyTO, "propagateSuspension"),
+                        new PropertyModel<>(policyTO, "propagateSuspension"),
                         false));
 
                 fields.add(new AjaxPalettePanel.Builder<String>().setName("passthroughResources").build(
@@ -136,7 +127,7 @@ public class PolicyModalPanelBuilder<T extends AbstractPolicyTO> extends Abstrac
                 fields.add(new AjaxCheckBoxPanel(
                         "field",
                         "allowNullPassword",
-                        new PropertyModel<Boolean>(policyTO, "allowNullPassword"),
+                        new PropertyModel<>(policyTO, "allowNullPassword"),
                         false));
             }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
index fd3c72e..6375bac 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleDirectoryPanel.java
@@ -24,9 +24,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
@@ -102,7 +100,7 @@ public class PolicyRuleDirectoryPanel<T extends AbstractPolicyTO> extends Direct
     protected List<IColumn<PolicyRuleWrapper, String>> getColumns() {
         final List<IColumn<PolicyRuleWrapper, String>> columns = new ArrayList<>();
 
-        columns.add(new PropertyColumn<PolicyRuleWrapper, String>(
+        columns.add(new PropertyColumn<>(
                 new StringResourceModel("ruleConf", this), "name", "name"));
 
         columns.add(new AbstractColumn<PolicyRuleWrapper, String>(
@@ -160,13 +158,9 @@ public class PolicyRuleDirectoryPanel<T extends AbstractPolicyTO> extends Direct
                 final RuleConf rule = model.getObject().getConf();
                 try {
                     final T actual = restClient.getPolicy(policy);
-                    CollectionUtils.filter(getRuleConf(actual), new Predicate<RuleConf>() {
-
-                        @Override
-                        public boolean evaluate(final RuleConf object) {
-                            return !object.getName().equals(rule.getName());
-                        }
-                    });
+                    List<RuleConf> conf = getRuleConf(actual);
+                    conf.removeAll(conf.stream().
+                            filter(object -> object.getName().equals(rule.getName())).collect(Collectors.toList()));
                     restClient.updatePolicy(actual);
                     SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
                     customActionOnFinishCallback(target);
@@ -235,14 +229,9 @@ public class PolicyRuleDirectoryPanel<T extends AbstractPolicyTO> extends Direct
         public Iterator<PolicyRuleWrapper> iterator(final long first, final long count) {
             final T actual = restClient.getPolicy(policy);
 
-            final ArrayList<PolicyRuleWrapper> rules = CollectionUtils.collect(getRuleConf(actual),
-                    new Transformer<RuleConf, PolicyRuleWrapper>() {
-
-                @Override
-                public PolicyRuleWrapper transform(final RuleConf input) {
-                    return new PolicyRuleWrapper(input.getName()).setName(input.getName()).setConf(input);
-                }
-            }, new ArrayList<PolicyRuleWrapper>());
+            final List<PolicyRuleWrapper> rules = getRuleConf(actual).stream().map(input
+                    -> new PolicyRuleWrapper(input.getName()).setName(input.getName()).setConf(input)).
+                    collect(Collectors.toList());
 
             Collections.sort(rules, comparator);
             return rules.subList((int) first, (int) (first + count)).iterator();

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
index 698c3f5..b9a36a9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicyRuleWizardBuilder.java
@@ -22,8 +22,7 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Predicate;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.panels.BeanPanel;
 import org.apache.syncope.client.console.rest.PolicyRestClient;
@@ -80,13 +79,8 @@ public class PolicyRuleWizardBuilder
         if (modelObject.isNew()) {
             composable.getRuleConfs().add(modelObject.getConf());
         } else {
-            CollectionUtils.filter(composable.getRuleConfs(), new Predicate<RuleConf>() {
-
-                @Override
-                public boolean evaluate(final RuleConf object) {
-                    return !object.getName().equals(modelObject.getOldName());
-                }
-            });
+            composable.getRuleConfs().removeAll(composable.getRuleConfs().stream().
+                    filter(conf -> conf.getName().equals(modelObject.getOldName())).collect(Collectors.toList()));
             composable.getRuleConfs().add(modelObject.getConf());
         }
 
@@ -109,7 +103,7 @@ public class PolicyRuleWizardBuilder
         public Profile(final PolicyRuleDirectoryPanel.PolicyRuleWrapper rule) {
 
             final AjaxTextFieldPanel name = new AjaxTextFieldPanel(
-                    "name", "rule", new PropertyModel<String>(rule, "name"), false);
+                    "name", "rule", new PropertyModel<>(rule, "name"), false);
             name.addRequiredLabel();
             add(name);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicySpecModalPanel.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicySpecModalPanel.java b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicySpecModalPanel.java
index fbe0c4e..19dd7ba 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicySpecModalPanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/policies/PolicySpecModalPanel.java
@@ -26,8 +26,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-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.syncope.client.console.SyncopeConsoleSession;
 import org.apache.syncope.client.console.commons.Constants;
@@ -42,7 +41,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownCho
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxPalettePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiPanel;
 import org.apache.syncope.common.lib.policy.PullPolicyTO;
-import org.apache.syncope.common.lib.to.AbstractSchemaTO;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.ConflictResolutionAction;
 import org.apache.syncope.common.lib.types.SchemaType;
@@ -74,25 +73,20 @@ public class PolicySpecModalPanel extends AbstractModalPanel<PullPolicyTO> {
         add(new AjaxDropDownChoicePanel<>(
                 "conflictResolutionAction",
                 "conflictResolutionAction",
-                new PropertyModel<ConflictResolutionAction>(policyTO.getSpecification(), "conflictResolutionAction")).
-                setChoices(Arrays.asList(ConflictResolutionAction.values())));
+                new PropertyModel<>(policyTO.getSpecification(), "conflictResolutionAction")).
+                setChoices(Arrays.asList((Serializable[]) ConflictResolutionAction.values())));
 
         model = new PropertyModel<List<CorrelationRule>>(policyTO.getSpecification(), "correlationRules") {
 
             private static final long serialVersionUID = -8168676563540297301L;
 
-            private List<CorrelationRule> rules = CollectionUtils.collect(
-                    policyTO.getSpecification().getCorrelationRules() == null
-                    ? Collections.<String>emptySet()
-                    : policyTO.getSpecification().getCorrelationRules().keySet(),
-                    new Transformer<String, CorrelationRule>() {
-
-                @Override
-                public CorrelationRule transform(final String input) {
-                    return new CorrelationRule(
-                            input, policyTO.getSpecification().getCorrelationRules().get(input));
-                }
-            }, new ArrayList<CorrelationRule>());
+            private List<CorrelationRule> rules =
+                    (policyTO.getSpecification().getCorrelationRules() == null
+                            ? Collections.<String>emptySet()
+                            : policyTO.getSpecification().getCorrelationRules().keySet()).stream().
+                            map(rule -> new CorrelationRule(
+                            rule, policyTO.getSpecification().getCorrelationRules().get(rule))).
+                            collect(Collectors.toList());
 
             @Override
             public List<CorrelationRule> getObject() {
@@ -129,9 +123,9 @@ public class PolicySpecModalPanel extends AbstractModalPanel<PullPolicyTO> {
     public void onSubmit(final AjaxRequestTarget target, final Form<?> form) {
         try {
             getItem().getSpecification().getCorrelationRules().clear();
-            for (CorrelationRule rule : model.getObject()) {
+            model.getObject().forEach(rule -> {
                 getItem().getSpecification().getCorrelationRules().put(rule.getAny(), rule.getRule());
-            }
+            });
             restClient.updatePolicy(getItem());
             SyncopeConsoleSession.get().info(getString(Constants.OPERATION_SUCCEEDED));
             this.modal.close(target);
@@ -276,20 +270,14 @@ public class PolicySpecModalPanel extends AbstractModalPanel<PullPolicyTO> {
 
         private static List<String> getPlainSchemas(final CorrelationRule rule) {
             final List<String> choices = StringUtils.isEmpty(rule.getAny())
-                    ? new ArrayList<String>()
-                    : CollectionUtils.collect(
-                            new SchemaRestClient().getSchemas(SchemaType.PLAIN,
-                                    rule.getAny().equals(AnyTypeKind.USER.name())
-                                    ? AnyTypeKind.USER
-                                    : rule.getAny().equals(AnyTypeKind.GROUP.name())
-                                    ? AnyTypeKind.GROUP
-                                    : AnyTypeKind.ANY_OBJECT), new Transformer<AbstractSchemaTO, String>() {
-
-                        @Override
-                        public String transform(final AbstractSchemaTO input) {
-                            return input.getKey();
-                        }
-                    }, new ArrayList<String>());
+                    ? new ArrayList<>()
+                    : new SchemaRestClient().getSchemas(SchemaType.PLAIN,
+                            rule.getAny().equals(AnyTypeKind.USER.name())
+                            ? AnyTypeKind.USER
+                            : rule.getAny().equals(AnyTypeKind.GROUP.name())
+                            ? AnyTypeKind.GROUP
+                            : AnyTypeKind.ANY_OBJECT).stream().map(EntityTO::getKey).
+                            collect(Collectors.toList());
 
             Collections.sort(choices);
             return choices;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
index ceaa524..ffb24e2 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/reports/ReportWizardBuilder.java
@@ -19,17 +19,15 @@
 package org.apache.syncope.client.console.reports;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.syncope.client.console.rest.ReportRestClient;
 import org.apache.syncope.client.console.tasks.CrontabPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxCheckBoxPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxDropDownChoicePanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
+import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.ReportTO;
-import org.apache.syncope.common.lib.to.ReportTemplateTO;
 import org.apache.wicket.PageReference;
 import org.apache.wicket.extensions.wizard.WizardModel;
 import org.apache.wicket.extensions.wizard.WizardStep;
@@ -72,28 +70,22 @@ public class ReportWizardBuilder extends AjaxWizardBuilder<ReportTO> {
         public Profile(final ReportTO reportTO) {
 
             AjaxTextFieldPanel name = new AjaxTextFieldPanel(
-                    "name", "name", new PropertyModel<String>(reportTO, "name"), false);
+                    "name", "name", new PropertyModel<>(reportTO, "name"), false);
             name.addRequiredLabel();
             name.setEnabled(true);
             add(name);
 
             final AjaxDropDownChoicePanel<String> template = new AjaxDropDownChoicePanel<>(
                     "template", getString("template"),
-                    new PropertyModel<String>(reportTO, "template"));
-            template.setChoices(CollectionUtils.collect(
-                    restClient.listTemplates(), new Transformer<ReportTemplateTO, String>() {
-
-                @Override
-                public String transform(final ReportTemplateTO input) {
-                    return input.getKey();
-                }
-            }, new ArrayList<String>()));
+                    new PropertyModel<>(reportTO, "template"));
+            template.setChoices(restClient.listTemplates().stream().
+                    map(EntityTO::getKey).collect(Collectors.toList()));
 
             template.addRequiredLabel();
             add(template);
 
             AjaxCheckBoxPanel active = new AjaxCheckBoxPanel(
-                    "active", "active", new PropertyModel<Boolean>(reportTO, "active"), false);
+                    "active", "active", new PropertyModel<>(reportTO, "active"), false);
             add(active);
         }
     }
@@ -104,7 +96,7 @@ public class ReportWizardBuilder extends AjaxWizardBuilder<ReportTO> {
 
         public Schedule(final ReportTO reportTO) {
             crontabPanel = new CrontabPanel(
-                    "schedule", new PropertyModel<String>(reportTO, "cronExpression"), reportTO.getCronExpression());
+                    "schedule", new PropertyModel<>(reportTO, "cronExpression"), reportTO.getCronExpression());
             add(crontabPanel);
         }
 

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

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/SecurityQuestionLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SecurityQuestionLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SecurityQuestionLogic.java
index e3dae91..f77f2fd 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SecurityQuestionLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SecurityQuestionLogic.java
@@ -19,10 +19,8 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.List;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.syncope.common.lib.to.SecurityQuestionTO;
 import org.apache.syncope.common.lib.types.StandardEntitlement;
@@ -52,14 +50,8 @@ public class SecurityQuestionLogic extends AbstractTransactionalLogic<SecurityQu
     @PreAuthorize("isAuthenticated()")
     @Transactional(readOnly = true)
     public List<SecurityQuestionTO> list() {
-        return CollectionUtils.collect(securityQuestionDAO.findAll(),
-                new Transformer<SecurityQuestion, SecurityQuestionTO>() {
-
-            @Override
-            public SecurityQuestionTO transform(final SecurityQuestion input) {
-                return binder.getSecurityQuestionTO(input);
-            }
-        }, new ArrayList<SecurityQuestionTO>());
+        return securityQuestionDAO.findAll().stream().
+                map(securityQuestion -> binder.getSecurityQuestionTO(securityQuestion)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.SECURITY_QUESTION_READ + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
index 00a6592..ad3a86d 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/SyncopeLogic.java
@@ -23,16 +23,14 @@ import java.lang.management.OperatingSystemMXBean;
 import java.lang.management.RuntimeMXBean;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
-import java.net.URI;
 import java.net.UnknownHostException;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import javax.annotation.Resource;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.common.lib.AbstractBaseBean;
 import org.apache.syncope.common.lib.SyncopeConstants;
@@ -76,7 +74,6 @@ import org.apache.syncope.core.provisioning.api.GroupProvisioningManager;
 import org.apache.syncope.core.provisioning.api.UserProvisioningManager;
 import org.apache.syncope.core.provisioning.api.cache.VirAttrCache;
 import org.apache.syncope.core.provisioning.api.data.GroupDataBinder;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.workflow.api.AnyObjectWorkflowAdapter;
 import org.apache.syncope.core.workflow.api.GroupWorkflowAdapter;
@@ -204,9 +201,8 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
                 PLATFORM_INFO.setBuildNumber(buildNumber);
 
                 if (bundleManager.getLocations() != null) {
-                    for (URI location : bundleManager.getLocations()) {
-                        PLATFORM_INFO.getConnIdLocations().add(location.toASCIIString());
-                    }
+                    bundleManager.getLocations().
+                            forEach(location -> PLATFORM_INFO.getConnIdLocations().add(location.toASCIIString()));
                 }
 
                 PLATFORM_INFO.setAnyObjectWorkflowAdapter(AopUtils.getTargetClass(awfAdapter).getName());
@@ -246,35 +242,23 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
             PLATFORM_INFO.getEntitlements().clear();
             PLATFORM_INFO.getEntitlements().addAll(EntitlementsHolder.getInstance().getValues());
 
-            AuthContextUtils.execWithAuthContext(AuthContextUtils.getDomain(), new AuthContextUtils.Executable<Void>() {
-
-                @Override
-                public Void exec() {
-                    PLATFORM_INFO.getAnyTypes().clear();
-                    CollectionUtils.collect(
-                            anyTypeDAO.findAll(),
-                            EntityUtils.keyTransformer(),
-                            PLATFORM_INFO.getAnyTypes());
-
-                    PLATFORM_INFO.getUserClasses().clear();
-                    CollectionUtils.collect(
-                            anyTypeDAO.findUser().getClasses(),
-                            EntityUtils.keyTransformer(),
-                            PLATFORM_INFO.getUserClasses());
-
-                    PLATFORM_INFO.getAnyTypeClasses().clear();
-                    CollectionUtils.collect(
-                            anyTypeClassDAO.findAll(),
-                            EntityUtils.keyTransformer(),
-                            PLATFORM_INFO.getAnyTypeClasses());
-
-                    PLATFORM_INFO.getResources().clear();
-                    CollectionUtils.collect(
-                            resourceDAO.findAll(),
-                            EntityUtils.keyTransformer(),
-                            PLATFORM_INFO.getResources());
-                    return null;
-                }
+            AuthContextUtils.execWithAuthContext(AuthContextUtils.getDomain(), () -> {
+                PLATFORM_INFO.getAnyTypes().clear();
+                PLATFORM_INFO.getAnyTypes().addAll(anyTypeDAO.findAll().stream().
+                        map(type -> type.getKey()).collect(Collectors.toList()));
+
+                PLATFORM_INFO.getUserClasses().clear();
+                PLATFORM_INFO.getUserClasses().addAll(anyTypeDAO.findUser().getClasses().stream().
+                        map(cls -> cls.getKey()).collect(Collectors.toList()));
+
+                PLATFORM_INFO.getAnyTypeClasses().clear();
+                PLATFORM_INFO.getAnyTypeClasses().addAll(anyTypeClassDAO.findAll().stream().
+                        map(cls -> cls.getKey()).collect(Collectors.toList()));
+
+                PLATFORM_INFO.getResources().clear();
+                PLATFORM_INFO.getResources().addAll(resourceDAO.findAll().stream().
+                        map(resource -> resource.getKey()).collect(Collectors.toList()));
+                return null;
             });
         }
 
@@ -394,14 +378,8 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
                 searchCond,
                 page, size,
                 Collections.singletonList(orderByClause), AnyTypeKind.GROUP);
-        List<GroupTO> result = CollectionUtils.collect(matching, new Transformer<Group, GroupTO>() {
-
-            @Transactional(readOnly = true)
-            @Override
-            public GroupTO transform(final Group input) {
-                return groupDataBinder.getGroupTO(input, false);
-            }
-        }, new ArrayList<GroupTO>());
+        List<GroupTO> result = matching.stream().
+                map(group -> groupDataBinder.getGroupTO(group, false)).collect(Collectors.toList());
 
         return Pair.of(count, result);
     }
@@ -412,12 +390,12 @@ public class SyncopeLogic extends AbstractLogic<AbstractBaseBean> {
         if (group == null) {
             throw new NotFoundException("Group " + groupName);
         }
-        TypeExtension typeExt = group.getTypeExtension(anyTypeDAO.findUser());
-        if (typeExt == null) {
+        Optional<? extends TypeExtension> typeExt = group.getTypeExtension(anyTypeDAO.findUser());
+        if (!typeExt.isPresent()) {
             throw new NotFoundException("TypeExtension in " + groupName + " for users");
         }
 
-        return groupDataBinder.getTypeExtensionTO(typeExt);
+        return groupDataBinder.getTypeExtensionTO(typeExt.get());
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
index 06e38d2..f7fbe1e 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/TaskLogic.java
@@ -19,12 +19,10 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
+import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.tuple.Triple;
 import org.apache.syncope.common.lib.SyncopeClientException;
@@ -170,15 +168,11 @@ public class TaskLogic extends AbstractExecutableLogic<AbstractTaskTO> {
             final List<OrderByClause> orderByClauses,
             final boolean details) {
 
-        return CollectionUtils.collect(taskDAO.findAll(
+        return taskDAO.findAll(
                 type, resourceDAO.find(resource), notificationDAO.find(notification), anyTypeKind, entityKey,
-                page, size, orderByClauses), new Transformer<Task, T>() {
-
-            @Override
-            public T transform(final Task task) {
-                return (T) binder.getTaskTO(task, taskUtilsFactory.getInstance(type), details);
-            }
-        }, new ArrayList<T>());
+                page, size, orderByClauses).stream().
+                <T>map(task -> binder.getTaskTO(task, taskUtilsFactory.getInstance(type), details)).
+                collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.TASK_READ + "')")
@@ -297,26 +291,15 @@ public class TaskLogic extends AbstractExecutableLogic<AbstractTaskTO> {
             throw new NotFoundException("Task " + key);
         }
 
-        return CollectionUtils.collect(taskExecDAO.findAll(task, page, size, orderByClauses),
-                new Transformer<TaskExec, ExecTO>() {
-
-            @Override
-            public ExecTO transform(final TaskExec taskExec) {
-                return binder.getExecTO(taskExec);
-            }
-        }, new ArrayList<ExecTO>());
+        return taskExecDAO.findAll(task, page, size, orderByClauses).stream().
+                map(taskExec -> binder.getExecTO(taskExec)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.TASK_LIST + "')")
     @Override
     public List<ExecTO> listRecentExecutions(final int max) {
-        return CollectionUtils.collect(taskExecDAO.findRecent(max), new Transformer<TaskExec, ExecTO>() {
-
-            @Override
-            public ExecTO transform(final TaskExec taskExec) {
-                return binder.getExecTO(taskExec);
-            }
-        }, new ArrayList<ExecTO>());
+        return taskExecDAO.findRecent(max).stream().
+                map(taskExec -> binder.getExecTO(taskExec)).collect(Collectors.toList());
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.TASK_DELETE + "')")
@@ -345,7 +328,7 @@ public class TaskLogic extends AbstractExecutableLogic<AbstractTaskTO> {
 
         BulkActionResult result = new BulkActionResult();
 
-        for (TaskExec exec : taskExecDAO.findAll(task, startedBefore, startedAfter, endedBefore, endedAfter)) {
+        taskExecDAO.findAll(task, startedBefore, startedAfter, endedBefore, endedAfter).forEach(exec -> {
             try {
                 taskExecDAO.delete(exec);
                 result.getResults().put(String.valueOf(exec.getKey()), BulkActionResult.Status.SUCCESS);
@@ -353,7 +336,7 @@ public class TaskLogic extends AbstractExecutableLogic<AbstractTaskTO> {
                 LOG.error("Error deleting execution {} of task {}", exec.getKey(), key, e);
                 result.getResults().put(String.valueOf(exec.getKey()), BulkActionResult.Status.FAILURE);
             }
-        }
+        });
 
         return result;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
index f889780..5f99944 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/UserLogic.java
@@ -19,14 +19,12 @@
 package org.apache.syncope.core.logic;
 
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Collection;
 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.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
@@ -112,14 +110,9 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
                 AuthContextUtils.getAuthorizations().get(StandardEntitlement.USER_SEARCH), realm),
                 searchCond == null ? userDAO.getAllMatchingCond() : searchCond,
                 page, size, orderBy, AnyTypeKind.USER);
-        List<UserTO> result = CollectionUtils.collect(matching, new Transformer<User, UserTO>() {
-
-            @Transactional(readOnly = true)
-            @Override
-            public UserTO transform(final User input) {
-                return binder.returnUserTO(binder.getUserTO(input, details));
-            }
-        }, new ArrayList<UserTO>());
+        List<UserTO> result = matching.stream().
+                map(user -> binder.returnUserTO(binder.getUserTO(user, details))).
+                collect(Collectors.toList());
 
         return Pair.of(count, result);
     }
@@ -325,13 +318,8 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
         List<Group> ownedGroups = groupDAO.findOwnedByUser(before.getLeft().getKey());
         if (!ownedGroups.isEmpty()) {
             SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.GroupOwnership);
-            sce.getElements().addAll(CollectionUtils.collect(ownedGroups, new Transformer<Group, String>() {
-
-                @Override
-                public String transform(final Group group) {
-                    return group.getKey() + " " + group.getName();
-                }
-            }, new ArrayList<String>()));
+            sce.getElements().addAll(ownedGroups.stream().
+                    map(group -> group.getKey() + " " + group.getName()).collect(Collectors.toList()));
             throw sce;
         }
 
@@ -360,13 +348,9 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
 
         UserPatch patch = new UserPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return binder.returnUserTO(binder.getUserTO(provisioningManager.unlink(patch)));
     }
@@ -383,13 +367,9 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
 
         UserPatch patch = new UserPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return binder.returnUserTO(binder.getUserTO(provisioningManager.link(patch)));
     }
@@ -408,13 +388,9 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
 
         UserPatch patch = new UserPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.DELETE).value(resource).build()).
+                collect(Collectors.toList()));
 
         return update(patch, nullPriorityAsync);
     }
@@ -437,13 +413,9 @@ public class UserLogic extends AbstractAnyLogic<UserTO, UserPatch> {
 
         UserPatch patch = new UserPatch();
         patch.setKey(key);
-        patch.getResources().addAll(CollectionUtils.collect(resources, new Transformer<String, StringPatchItem>() {
-
-            @Override
-            public StringPatchItem transform(final String resource) {
-                return new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build();
-            }
-        }));
+        patch.getResources().addAll(resources.stream().map(resource
+                -> new StringPatchItem.Builder().operation(PatchOperation.ADD_REPLACE).value(resource).build()).
+                collect(Collectors.toList()));
 
         if (changepwd) {
             patch.setPassword(new PasswordPatch.Builder().

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/migration/src/main/java/org/apache/syncope/core/migration/MigrationPullActions.java
----------------------------------------------------------------------
diff --git a/core/migration/src/main/java/org/apache/syncope/core/migration/MigrationPullActions.java b/core/migration/src/main/java/org/apache/syncope/core/migration/MigrationPullActions.java
index caf633a..e626215 100644
--- a/core/migration/src/main/java/org/apache/syncope/core/migration/MigrationPullActions.java
+++ b/core/migration/src/main/java/org/apache/syncope/core/migration/MigrationPullActions.java
@@ -22,8 +22,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.TransformerUtils;
+import java.util.stream.Collectors;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.EntityTO;
 import org.apache.syncope.common.lib.to.GroupTO;
@@ -73,7 +72,7 @@ public class MigrationPullActions extends SchedulingPullActions {
                 && resourcesAttr.getValue() != null && !resourcesAttr.getValue().isEmpty()) {
 
             ((AnyTO) entity).getResources().addAll(
-                    CollectionUtils.collect(resourcesAttr.getValue(), TransformerUtils.stringValueTransformer()));
+                    resourcesAttr.getValue().stream().map(Object::toString).collect(Collectors.toList()));
         }
 
         return delta;

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/attrvalue/validation/InvalidEntityException.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/attrvalue/validation/InvalidEntityException.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/attrvalue/validation/InvalidEntityException.java
index 89ff590..f9db494 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/attrvalue/validation/InvalidEntityException.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/attrvalue/validation/InvalidEntityException.java
@@ -25,8 +25,6 @@ import java.util.Map.Entry;
 import java.util.Set;
 import javax.validation.ConstraintViolation;
 import javax.validation.ValidationException;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.common.lib.types.EntityViolationType;
 
 /**
@@ -73,7 +71,7 @@ public class InvalidEntityException extends ValidationException {
 
         this.entityClassSimpleName = entityClassSimpleName;
 
-        for (ConstraintViolation<Object> violation : violations) {
+        violations.forEach((violation) -> {
             int firstComma = violation.getMessageTemplate().indexOf(';');
 
             final String key = violation.getMessageTemplate().substring(
@@ -96,17 +94,11 @@ public class InvalidEntityException extends ValidationException {
             }
 
             this.violations.get(violation.getLeafBean().getClass()).add(entityViolationType);
-        }
+        });
     }
 
     public final boolean hasViolation(final EntityViolationType type) {
-        return IterableUtils.matchesAny(violations.keySet(), new Predicate<Class<?>>() {
-
-            @Override
-            public boolean evaluate(final Class<?> entity) {
-                return violations.get(entity).contains(type);
-            }
-        });
+        return violations.keySet().stream().anyMatch(entity -> violations.get(entity).contains(type));
     }
 
     public String getEntityClassSimpleName() {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AllowedSchemas.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AllowedSchemas.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AllowedSchemas.java
index 6c04ac4..54f5e51 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AllowedSchemas.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/AllowedSchemas.java
@@ -18,14 +18,12 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.PredicateUtils;
-import org.apache.commons.collections4.SetUtils;
+import java.util.function.Predicate;
 import org.apache.syncope.core.persistence.api.entity.Schema;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
 
@@ -40,7 +38,7 @@ public class AllowedSchemas<S extends Schema> {
     }
 
     public Set<S> getForMembership(final Group group) {
-        return SetUtils.emptyIfNull(forMemberships.get(group));
+        return forMemberships.get(group) == null ? Collections.<S>emptySet() : forMemberships.get(group);
     }
 
     public Map<Group, Set<S>> getForMemberships() {
@@ -52,35 +50,27 @@ public class AllowedSchemas<S extends Schema> {
     }
 
     public boolean forSelfContains(final String schema) {
-        return IterableUtils.matchesAny(forSelf, new KeyMatches(schema));
+        return forSelf.stream().anyMatch(new KeyMatches(schema));
     }
 
     public boolean forMembershipsContains(final Group group, final S schema) {
-        return IterableUtils.matchesAny(forMemberships.get(group), PredicateUtils.equalPredicate(schema));
+        return getForMembership(group).stream().anyMatch(s -> s.equals(schema));
     }
 
     public boolean forMembershipsContains(final S schema) {
-        for (Map.Entry<Group, Set<S>> entry : forMemberships.entrySet()) {
-            if (entry.getValue().contains(schema)) {
-                return true;
-            }
-        }
-        return false;
+        return forMemberships.entrySet().stream().
+                anyMatch(entry -> entry.getValue().contains(schema));
     }
 
     public boolean forMembershipsContains(final Group group, final String schema) {
-        return IterableUtils.matchesAny(forMemberships.get(group), new KeyMatches(schema));
+        return getForMembership(group).stream().anyMatch(new KeyMatches(schema));
     }
 
     public boolean forMembershipsContains(final String schema) {
         KeyMatches keyMatches = new KeyMatches(schema);
 
-        for (Map.Entry<Group, Set<S>> entry : forMemberships.entrySet()) {
-            if (IterableUtils.matchesAny(entry.getValue(), keyMatches)) {
-                return true;
-            }
-        }
-        return false;
+        return forMemberships.entrySet().stream().
+                anyMatch(entry -> entry.getValue().stream().anyMatch(keyMatches));
     }
 
     public boolean contains(final S schema) {
@@ -106,7 +96,7 @@ public class AllowedSchemas<S extends Schema> {
         }
 
         @Override
-        public boolean evaluate(final S object) {
+        public boolean test(final S object) {
             return object.getKey().equals(schema);
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConfDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConfDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConfDAO.java
index b6fe304..b150aaa 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConfDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/ConfDAO.java
@@ -18,12 +18,13 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.conf.CPlainAttr;
 import org.apache.syncope.core.persistence.api.entity.conf.Conf;
 
 public interface ConfDAO extends DAO<Conf> {
 
-    CPlainAttr find(String key);
+    Optional<? extends CPlainAttr> find(String key);
 
     <T> T find(String key, T defaultValue);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
index 580fe32..4bc1488 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java
@@ -18,6 +18,7 @@
  */
 package org.apache.syncope.core.persistence.api.dao;
 
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import org.apache.syncope.core.persistence.api.entity.AnyTypeClass;
@@ -46,6 +47,8 @@ public interface GroupDAO extends AnyDAO<Group> {
 
     List<String> findADynMembers(Group group);
 
+    Collection<String> findAllResourceKeys(final String key);
+
     void clearADynMembers(Group group);
 
     void refreshDynMemberships(AnyObject anyObject);

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
index 9896e73..0ec609e 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Any.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.api.entity;
 
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
 import java.util.List;
+import java.util.Optional;
 
 public interface Any<P extends PlainAttr<?>> extends AnnotatedEntity {
 
@@ -43,7 +44,7 @@ public interface Any<P extends PlainAttr<?>> extends AnnotatedEntity {
 
     boolean remove(P attr);
 
-    P getPlainAttr(String plainSchemaName);
+    Optional<? extends P> getPlainAttr(String plainSchema);
 
     List<? extends P> getPlainAttrs();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/GroupableRelatable.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/GroupableRelatable.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/GroupableRelatable.java
index 147f469..dd13b4a 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/GroupableRelatable.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/GroupableRelatable.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.api.entity;
 
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 
 public interface GroupableRelatable<
         L extends Any<P>, 
@@ -29,31 +30,30 @@ public interface GroupableRelatable<
         REL extends Relationship<L, R>> extends Any<P> {
 
     @Override
-    boolean add(final P attr);
+    boolean add(P attr);
 
     @Override
-    boolean remove(final P attr);
+    boolean remove(P attr);
 
     /**
      * Returns the plain attribute for this instance and the given schema name - if found, {@code NULL} otherwise.
      * <b>IMPORTANT:</b> This method won't return any attribute related to memberships.
      *
-     * @param plainSchemaName plain schema name
-     * @return plain attribute for this instance and the given schema name - if found, {@code NULL} otherwise
+     * @param plainSchema plain schema name
+     * @return plain attribute for this instance and the given schema name
      */
     @Override
-    P getPlainAttr(String plainSchemaName);
+    Optional<? extends P> getPlainAttr(String plainSchema);
 
     /**
      * Returns the plain attribute for this instance, the given schema name and the given membership -
      * if found, {@code NULL} otherwise.
      *
-     * @param plainSchemaName plain schema name
+     * @param plainSchema plain schema name
      * @param membership membership
-     * @return plain attribute for this instance, the given schema name and the given membership -
-     * if found, {@code NULL} otherwise
+     * @return plain attribute for this instance, the given schema name and the given membership
      */
-    P getPlainAttr(String plainSchemaName, Membership<?> membership);
+    Optional<? extends P> getPlainAttr(String plainSchema, Membership<?> membership);
 
     /**
      * Returns the plain attributes for this instance.
@@ -68,10 +68,10 @@ public interface GroupableRelatable<
      * Returns the list of plain attributes for this instance and the given schema name (including membeship attributes,
      * as opposite to {@link Any#getPlainAttr(java.lang.String)}).
      *
-     * @param plainSchemaName plain schema name
+     * @param plainSchema plain schema name
      * @return list of plain attributes for this instance and the given schema name (including membeship attributes)
      */
-    Collection<? extends P> getPlainAttrs(String plainSchemaName);
+    Collection<? extends P> getPlainAttrs(String plainSchema);
 
     /**
      * Returns the list of plain attributes for this instance and the given membership.
@@ -83,13 +83,13 @@ public interface GroupableRelatable<
 
     boolean add(M membership);
 
-    M getMembership(String groupKey);
+    Optional<? extends M> getMembership(String groupKey);
 
     List<? extends M> getMemberships();
 
     boolean add(REL relationship);
 
-    REL getRelationship(RelationshipType relationshipType, String otherEndKey);
+    Optional<? extends REL> getRelationship(RelationshipType relationshipType, String otherEndKey);
 
     Collection<? extends REL> getRelationships(String otherEndKey);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Notification.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Notification.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Notification.java
index 9046ccf..62d8221 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Notification.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Notification.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.common.lib.types.TraceLevel;
 
 public interface Notification extends Entity {
@@ -45,7 +46,7 @@ public interface Notification extends Entity {
 
     boolean add(AnyAbout about);
 
-    AnyAbout getAbout(AnyType anyType);
+    Optional<? extends AnyAbout> getAbout(AnyType anyType);
 
     List<? extends AnyAbout> getAbouts();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
index 9796d22..e345921 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/Realm.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.syncope.core.persistence.api.entity.policy.AccountPolicy;
 import org.apache.syncope.core.persistence.api.entity.policy.PasswordPolicy;
@@ -48,7 +49,7 @@ public interface Realm extends Entity {
 
     boolean add(AnyTemplateRealm template);
 
-    AnyTemplateRealm getTemplate(AnyType anyType);
+    Optional<? extends AnyTemplateRealm> getTemplate(AnyType anyType);
 
     List<? extends AnyTemplateRealm> getTemplates();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/group/Group.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/group/Group.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/group/Group.java
index b696eee..59d7e5e 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/group/Group.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/group/Group.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity.group;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.Any;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ADynGroupMembership;
@@ -43,7 +44,7 @@ public interface Group extends Any<GPlainAttr> {
     boolean add(GPlainAttr attr);
 
     @Override
-    GPlainAttr getPlainAttr(String plainSchemaName);
+    Optional<? extends GPlainAttr> getPlainAttr(String plainSchema);
 
     @Override
     List<? extends GPlainAttr> getPlainAttrs();
@@ -54,13 +55,13 @@ public interface Group extends Any<GPlainAttr> {
 
     boolean add(ADynGroupMembership dynGroupMembership);
 
-    ADynGroupMembership getADynMembership(AnyType anyType);
+    Optional<? extends ADynGroupMembership> getADynMembership(AnyType anyType);
 
     List<? extends ADynGroupMembership> getADynMemberships();
 
     boolean add(TypeExtension typeExtension);
 
-    TypeExtension getTypeExtension(AnyType anyType);
+    Optional<? extends TypeExtension> getTypeExtension(AnyType anyType);
 
     List<? extends TypeExtension> getTypeExtensions();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AccountPolicy.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AccountPolicy.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AccountPolicy.java
index 6aed282..bf810b3 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AccountPolicy.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/policy/AccountPolicy.java
@@ -42,7 +42,7 @@ public interface AccountPolicy extends Policy {
 
     boolean add(ExternalResource resource);
 
-    Set<String> getResourceNames();
+    Set<String> getResourceKeys();
 
     Set<? extends ExternalResource> getResources();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
index e0e1335..4b8ee40 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/ExternalResource.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity.resource;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import org.apache.syncope.common.lib.types.ConnConfProperty;
 import org.apache.syncope.common.lib.types.ConnectorCapability;
@@ -91,9 +92,9 @@ public interface ExternalResource extends ProvidedKeyEntity {
 
     boolean add(Provision provision);
 
-    Provision getProvision(AnyType anyType);
+    Optional<? extends Provision> getProvision(AnyType anyType);
 
-    Provision getProvision(ObjectClass objectClass);
+    Optional<? extends Provision> getProvision(ObjectClass objectClass);
 
     List<? extends Provision> getProvisions();
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Mapping.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Mapping.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Mapping.java
index 92940a0..ce7abaa 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Mapping.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/Mapping.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity.resource;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 
 public interface Mapping extends Entity {
@@ -33,7 +34,7 @@ public interface Mapping extends Entity {
 
     boolean add(MappingItem item);
 
-    MappingItem getConnObjectKeyItem();
+    Optional<? extends MappingItem> getConnObjectKeyItem();
 
     void setConnObjectKeyItem(MappingItem item);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/OrgUnit.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/OrgUnit.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/OrgUnit.java
index cdb0504..89bf153 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/OrgUnit.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/resource/OrgUnit.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity.resource;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.identityconnectors.framework.common.objects.ObjectClass;
 import org.identityconnectors.framework.common.objects.SyncToken;
@@ -45,7 +46,7 @@ public interface OrgUnit extends Entity {
 
     boolean add(OrgUnitItem item);
 
-    OrgUnitItem getConnObjectKeyItem();
+    Optional<? extends OrgUnitItem> getConnObjectKeyItem();
 
     void setConnObjectKeyItem(OrgUnitItem item);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PullTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PullTask.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PullTask.java
index 52c5b93..0ce891b 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PullTask.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PullTask.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity.task;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.common.lib.types.PullMode;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Realm;
@@ -39,7 +40,7 @@ public interface PullTask extends ProvisioningTask {
 
     boolean add(AnyTemplatePullTask template);
 
-    AnyTemplatePullTask getTemplate(AnyType anyType);
+    Optional<? extends AnyTemplatePullTask> getTemplate(AnyType anyType);
 
     List<? extends AnyTemplatePullTask> getTemplates();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
index fe86726..b5fa504 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/task/PushTask.java
@@ -19,6 +19,7 @@
 package org.apache.syncope.core.persistence.api.entity.task;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.Realm;
 
@@ -30,7 +31,7 @@ public interface PushTask extends ProvisioningTask {
 
     boolean add(PushTaskAnyFilter filter);
 
-    PushTaskAnyFilter getFilter(AnyType anyType);
+    Optional<? extends PushTaskAnyFilter> getFilter(AnyType anyType);
 
     List<? extends PushTaskAnyFilter> getFilters();
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
----------------------------------------------------------------------
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
index ce607bf..41b677e 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondVisitor.java
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.api.search;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import org.apache.cxf.jaxrs.ext.search.ConditionType;
 import org.apache.cxf.jaxrs.ext.search.SearchBean;
 import org.apache.cxf.jaxrs.ext.search.SearchCondition;
@@ -69,11 +70,11 @@ public class SearchCondVisitor extends AbstractSearchConditionVisitor<SearchBean
 
     private SearchCond visitPrimitive(final SearchCondition<SearchBean> sc) {
         String name = getRealPropertyName(sc.getStatement().getProperty());
-        SpecialAttr specialAttrName = SpecialAttr.fromString(name);
+        Optional<SpecialAttr> specialAttrName = SpecialAttr.fromString(name);
 
         String value = SearchUtils.toSqlWildcardString(sc.getStatement().getValue().toString(), false).
                 replaceAll("\\\\_", "_");
-        SpecialAttr specialAttrValue = SpecialAttr.fromString(value);
+        Optional<SpecialAttr> specialAttrValue = SpecialAttr.fromString(value);
 
         AttributeCond attributeCond = createAttributeCond(name);
         attributeCond.setExpression(value);
@@ -95,8 +96,8 @@ public class SearchCondVisitor extends AbstractSearchConditionVisitor<SearchBean
         switch (ct) {
             case EQUALS:
             case NOT_EQUALS:
-                if (specialAttrName == null) {
-                    if (specialAttrValue != null && specialAttrValue == SpecialAttr.NULL) {
+                if (!specialAttrName.isPresent()) {
+                    if (specialAttrValue.isPresent() && specialAttrValue.get() == SpecialAttr.NULL) {
                         attributeCond.setType(AttributeCond.Type.ISNULL);
                         attributeCond.setExpression(null);
                     } else if (value.indexOf('%') == -1) {
@@ -111,7 +112,7 @@ public class SearchCondVisitor extends AbstractSearchConditionVisitor<SearchBean
 
                     leaf = SearchCond.getLeafCond(attributeCond);
                 } else {
-                    switch (specialAttrName) {
+                    switch (specialAttrName.get()) {
                         case TYPE:
                             AnyTypeCond typeCond = new AnyTypeCond();
                             typeCond.setAnyTypeKey(value);
@@ -213,11 +214,11 @@ public class SearchCondVisitor extends AbstractSearchConditionVisitor<SearchBean
 
     private SearchCond visitCompount(final SearchCondition<SearchBean> sc) {
         List<SearchCond> searchConds = new ArrayList<>();
-        for (SearchCondition<SearchBean> searchCondition : sc.getSearchConditions()) {
+        sc.getSearchConditions().forEach(searchCondition -> {
             searchConds.add(searchCondition.getStatement() == null
                     ? visitCompount(searchCondition)
                     : visitPrimitive(searchCondition));
-        }
+        });
 
         SearchCond compound;
         switch (sc.getConditionType()) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
index c287ca1..0786351 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/ContentLoaderHandler.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.core.persistence.jpa.content;
 
 import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.sql.Types;
 import java.text.ParseException;
 import java.util.HashMap;
@@ -32,7 +31,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.ResultSetExtractor;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.helpers.DefaultHandler;
@@ -59,20 +57,16 @@ public class ContentLoaderHandler extends DefaultHandler {
     private Object[] getParameters(final String tableName, final Attributes attrs) {
         JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
 
-        Map<String, Integer> colTypes = jdbcTemplate.query("SELECT * FROM " + tableName + " WHERE 0=1",
-                new ResultSetExtractor<Map<String, Integer>>() {
-
-            @Override
-            public Map<String, Integer> extractData(final ResultSet rs) throws SQLException {
-                Map<String, Integer> colTypes = new HashMap<>();
-                for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
-                    colTypes.put(
-                            rs.getMetaData().getColumnName(i).toUpperCase(),
-                            rs.getMetaData().getColumnType(i));
-                }
-                return colTypes;
-            }
-        });
+        Map<String, Integer> colTypes = jdbcTemplate.query(
+                "SELECT * FROM " + tableName + " WHERE 0=1", (final ResultSet rs) -> {
+                    Map<String, Integer> colTypes1 = new HashMap<>();
+                    for (int i = 1; i <= rs.getMetaData().getColumnCount();
+                    i++) {
+                        colTypes1.
+                                put(rs.getMetaData().getColumnName(i).toUpperCase(), rs.getMetaData().getColumnType(i));
+                    }
+                    return colTypes1;
+                });
 
         Object[] parameters = new Object[attrs.getLength()];
         for (int i = 0; i < attrs.getLength(); i++) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
index f1f3e44..c2adeea 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java
@@ -48,8 +48,6 @@ import javax.xml.transform.TransformerConfigurationException;
 import javax.xml.transform.sax.SAXTransformerFactory;
 import javax.xml.transform.sax.TransformerHandler;
 import javax.xml.transform.stream.StreamResult;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
@@ -97,13 +95,8 @@ public class XMLContentExporter extends AbstractContentDealer implements Content
             Collections.singletonMap("SYNCOPEGROUP", Collections.singleton("USEROWNER_ID"));
 
     private boolean isTableAllowed(final String tableName) {
-        return IterableUtils.matchesAll(TABLE_PREFIXES_TO_BE_EXCLUDED, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String prefix) {
-                return !tableName.toUpperCase().startsWith(prefix.toUpperCase());
-            }
-        });
+        return TABLE_PREFIXES_TO_BE_EXCLUDED.stream().
+                allMatch(prefix -> !tableName.toUpperCase().startsWith(prefix.toUpperCase()));
     }
 
     private List<String> sortByForeignKeys(final String dbSchema, final Connection conn, final Set<String> tableNames)

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
index 894ec21..d883901 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnyDAO.java
@@ -22,7 +22,6 @@ import java.io.StringReader;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -55,12 +54,9 @@ import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Schema;
 import org.apache.syncope.core.persistence.api.entity.VirSchema;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
-import org.apache.syncope.core.persistence.api.entity.group.TypeExtension;
 import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource;
-import org.apache.syncope.core.persistence.api.entity.user.UMembership;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.apache.syncope.core.persistence.jpa.entity.AbstractPlainAttrValue;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
@@ -236,12 +232,12 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
         query.setParameter("doubleValue", attrValue.getDoubleValue());
 
         List<A> result = new ArrayList<>();
-        for (PlainAttrValue value : (List<PlainAttrValue>) query.getResultList()) {
+        ((List<PlainAttrValue>) query.getResultList()).stream().forEach(value -> {
             A any = (A) value.getAttr().getOwner();
             if (!result.contains(any)) {
                 result.add(any);
             }
-        }
+        });
 
         return result;
     }
@@ -318,23 +314,19 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
         }
 
         // Sort literals in order to process later literals included into others
-        Collections.sort(literals, new Comparator<String>() {
-
-            @Override
-            public int compare(final String t, final String t1) {
-                if (t == null && t1 == null) {
-                    return 0;
-                } else if (t != null && t1 == null) {
-                    return -1;
-                } else if (t == null && t1 != null) {
-                    return 1;
-                } else if (t.length() == t1.length()) {
-                    return 0;
-                } else if (t.length() > t1.length()) {
-                    return -1;
-                } else {
-                    return 1;
-                }
+        Collections.sort(literals, (final String t, final String t1) -> {
+            if (t == null && t1 == null) {
+                return 0;
+            } else if (t != null && t1 == null) {
+                return -1;
+            } else if (t == null && t1 != null) {
+                return 1;
+            } else if (t.length() == t1.length()) {
+                return 0;
+            } else if (t.length() > t1.length()) {
+                return -1;
+            } else {
+                return 1;
             }
         });
 
@@ -483,7 +475,7 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
         typeOwnClasses.addAll(any.getType().getClasses());
         typeOwnClasses.addAll(any.getAuxClasses());
 
-        for (AnyTypeClass typeClass : typeOwnClasses) {
+        typeOwnClasses.forEach(typeClass -> {
             if (reference.equals(PlainSchema.class)) {
                 result.getForSelf().addAll((Collection<? extends S>) typeClass.getPlainSchemas());
             } else if (reference.equals(DerSchema.class)) {
@@ -491,29 +483,31 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
             } else if (reference.equals(VirSchema.class)) {
                 result.getForSelf().addAll((Collection<? extends S>) typeClass.getVirSchemas());
             }
-        }
+        });
 
         // schemas given by type extensions
         Map<Group, List<? extends AnyTypeClass>> typeExtensionClasses = new HashMap<>();
         if (any instanceof User) {
-            for (UMembership memb : ((User) any).getMemberships()) {
-                for (TypeExtension typeExtension : memb.getRightEnd().getTypeExtensions()) {
+            ((User) any).getMemberships().forEach(memb -> {
+                memb.getRightEnd().getTypeExtensions().forEach(typeExtension -> {
                     typeExtensionClasses.put(memb.getRightEnd(), typeExtension.getAuxClasses());
-                }
-            }
+                });
+            });
         } else if (any instanceof AnyObject) {
-            for (AMembership memb : ((AnyObject) any).getMemberships()) {
-                for (TypeExtension typeExtension : memb.getRightEnd().getTypeExtensions()) {
-                    if (any.getType().equals(typeExtension.getAnyType())) {
-                        typeExtensionClasses.put(memb.getRightEnd(), typeExtension.getAuxClasses());
-                    }
-                }
-            }
+            ((AnyObject) any).getMemberships().forEach(memb -> {
+                memb.getRightEnd().getTypeExtensions().stream().
+                        filter(typeExtension -> any.getType().equals(typeExtension.getAnyType())).
+                        forEachOrdered((typeExtension) -> {
+                            typeExtensionClasses.put(memb.getRightEnd(), typeExtension.getAuxClasses());
+                        });
+            });
         }
 
-        for (Map.Entry<Group, List<? extends AnyTypeClass>> entry : typeExtensionClasses.entrySet()) {
-            result.getForMemberships().put(entry.getKey(), new HashSet<S>());
-            for (AnyTypeClass typeClass : entry.getValue()) {
+        typeExtensionClasses.entrySet().stream().map(entry -> {
+            result.getForMemberships().put(entry.getKey(), new HashSet<>());
+            return entry;
+        }).forEachOrdered((entry) -> {
+            entry.getValue().forEach(typeClass -> {
                 if (reference.equals(PlainSchema.class)) {
                     result.getForMemberships().get(entry.getKey()).
                             addAll((Collection<? extends S>) typeClass.getPlainSchemas());
@@ -524,8 +518,8 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
                     result.getForMemberships().get(entry.getKey()).
                             addAll((Collection<? extends S>) typeClass.getVirSchemas());
                 }
-            }
-        }
+            });
+        });
 
         return result;
     }
@@ -547,24 +541,25 @@ public abstract class AbstractAnyDAO<A extends Any<?>> extends AbstractDAO<A> im
 
     @Transactional(readOnly = true)
     @Override
+    @SuppressWarnings("unchecked")
     public List<String> findDynRealms(final String key) {
         Query query = entityManager().createNativeQuery(
                 "SELECT dynRealm_id FROM " + JPADynRealmDAO.DYNMEMB_TABLE + " WHERE any_id=?");
         query.setParameter(1, key);
 
         List<String> result = new ArrayList<>();
-        for (Object resultKey : query.getResultList()) {
-            String actualKey = resultKey instanceof Object[]
-                    ? (String) ((Object[]) resultKey)[0]
-                    : ((String) resultKey);
-
-            DynRealm dynRealm = dynRealmDAO().find(actualKey);
-            if (dynRealm == null) {
-                LOG.error("Could not find dynRealm with id {}, even though returned by the native query", actualKey);
-            } else if (!result.contains(actualKey)) {
-                result.add(actualKey);
-            }
-        }
+        query.getResultList().stream().map(resultKey -> resultKey instanceof Object[]
+                ? (String) ((Object[]) resultKey)[0]
+                : ((String) resultKey)).
+                forEachOrdered((actualKey) -> {
+                    DynRealm dynRealm = dynRealmDAO().find(actualKey.toString());
+                    if (dynRealm == null) {
+                        LOG.error("Could not find dynRealm with id {}, even though returned by the native query",
+                                actualKey);
+                    } else if (!result.contains(actualKey.toString())) {
+                        result.add(actualKey.toString());
+                    }
+                });
         return result;
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index c9daf03..f20a765 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -25,12 +25,11 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.Entity;
 import javax.validation.ValidationException;
 import javax.validation.constraints.Max;
 import javax.validation.constraints.Min;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.commons.lang3.ClassUtils;
 import org.apache.commons.lang3.SerializationUtils;
 import org.apache.commons.lang3.tuple.Pair;
@@ -100,15 +99,11 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
     }
 
     protected SearchCond buildEffectiveCond(final SearchCond cond, final Set<String> dynRealmKeys) {
-        List<SearchCond> effectiveConds = CollectionUtils.collect(dynRealmKeys, new Transformer<String, SearchCond>() {
-
-            @Override
-            public SearchCond transform(final String input) {
-                DynRealmCond dynRealmCond = new DynRealmCond();
-                dynRealmCond.setDynRealm(input);
-                return SearchCond.getLeafCond(dynRealmCond);
-            }
-        }, new ArrayList<SearchCond>());
+        List<SearchCond> effectiveConds = dynRealmKeys.stream().map(dynRealmKey -> {
+            DynRealmCond dynRealmCond = new DynRealmCond();
+            dynRealmCond.setDynRealm(dynRealmKey);
+            return SearchCond.getLeafCond(dynRealmCond);
+        }).collect(Collectors.toList());
         effectiveConds.add(cond);
 
         return SearchCond.getAndCond(effectiveConds);
@@ -314,23 +309,22 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
     protected <T extends Any<?>> List<T> buildResult(final List<Object> raw, final AnyTypeKind kind) {
         List<T> result = new ArrayList<>();
 
-        for (Object anyKey : raw) {
-            String actualKey = anyKey instanceof Object[]
-                    ? (String) ((Object[]) anyKey)[0]
-                    : ((String) anyKey);
-
-            @SuppressWarnings("unchecked")
-            T any = kind == AnyTypeKind.USER
-                    ? (T) userDAO.find(actualKey)
-                    : kind == AnyTypeKind.GROUP
-                            ? (T) groupDAO.find(actualKey)
-                            : (T) anyObjectDAO.find(actualKey);
-            if (any == null) {
-                LOG.error("Could not find {} with id {}, even if returned by native query", kind, actualKey);
-            } else if (!result.contains(any)) {
-                result.add(any);
-            }
-        }
+        raw.stream().map(anyKey -> anyKey instanceof Object[]
+                ? (String) ((Object[]) anyKey)[0]
+                : ((String) anyKey)).
+                forEachOrdered((actualKey) -> {
+                    @SuppressWarnings("unchecked")
+                    T any = kind == AnyTypeKind.USER
+                            ? (T) userDAO.find(actualKey)
+                            : kind == AnyTypeKind.GROUP
+                                    ? (T) groupDAO.find(actualKey)
+                                    : (T) anyObjectDAO.find(actualKey);
+                    if (any == null) {
+                        LOG.error("Could not find {} with id {}, even if returned by native query", kind, actualKey);
+                    } else if (!result.contains(any)) {
+                        result.add(any);
+                    }
+                });
 
         return result;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java
index 256ffe6..c54517f 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultAccountRule.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.List;
 import java.util.regex.Pattern;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.policy.AccountRuleConf;
@@ -26,7 +25,6 @@ import org.apache.syncope.common.lib.policy.DefaultAccountRuleConf;
 import org.apache.syncope.core.provisioning.api.utils.policy.AccountPolicyException;
 import org.apache.syncope.core.persistence.api.dao.AccountRule;
 import org.apache.syncope.core.persistence.api.dao.AccountRuleConfClass;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -47,15 +45,12 @@ public class DefaultAccountRule implements AccountRule {
                     AccountRuleConf.class.getName() + " expected, got " + conf.getClass().getName());
         }
 
-        for (String schema : this.conf.getSchemasNotPermitted()) {
-            PlainAttr<?> attr = user.getPlainAttr(schema);
-            if (attr != null) {
-                List<String> values = attr.getValuesAsStrings();
-                if (values != null && !values.isEmpty()) {
-                    this.conf.getWordsNotPermitted().add(values.get(0));
-                }
-            }
-        }
+        this.conf.getSchemasNotPermitted().stream().
+                map(schema -> user.getPlainAttr(schema)).
+                filter(attr -> attr.isPresent()).
+                map(attr -> attr.get().getValuesAsStrings()).
+                filter(values -> (values != null && !values.isEmpty())).
+                forEachOrdered(values -> this.conf.getWordsNotPermitted().add(values.get(0)));
 
         if (user.getUsername() == null) {
             throw new AccountPolicyException("Invalid account");
@@ -72,11 +67,11 @@ public class DefaultAccountRule implements AccountRule {
         }
 
         // check words not permitted
-        for (String word : this.conf.getWordsNotPermitted()) {
-            if (StringUtils.containsIgnoreCase(user.getUsername(), word)) {
-                throw new AccountPolicyException("Used word(s) not permitted");
-            }
-        }
+        this.conf.getWordsNotPermitted().stream().
+                filter(word -> StringUtils.containsIgnoreCase(user.getUsername(), word)).
+                forEachOrdered(item -> {
+                    throw new AccountPolicyException("Used word(s) not permitted");
+                });
 
         // check case
         if (this.conf.isAllUpperCase() && !user.getUsername().equals(user.getUsername().toUpperCase())) {
@@ -93,18 +88,18 @@ public class DefaultAccountRule implements AccountRule {
         }
 
         // check prefix
-        for (String prefix : this.conf.getPrefixesNotPermitted()) {
-            if (user.getUsername().startsWith(prefix)) {
-                throw new AccountPolicyException("Prefix not permitted");
-            }
-        }
+        this.conf.getPrefixesNotPermitted().stream().
+                filter(prefix -> user.getUsername().startsWith(prefix)).
+                forEachOrdered(item -> {
+                    throw new AccountPolicyException("Prefix not permitted");
+                });
 
         // check suffix
-        for (String suffix : this.conf.getSuffixesNotPermitted()) {
-            if (user.getUsername().endsWith(suffix)) {
-                throw new AccountPolicyException("Suffix not permitted");
-            }
-        }
+        this.conf.getSuffixesNotPermitted().stream().
+                filter(suffix -> user.getUsername().endsWith(suffix)).
+                forEachOrdered(item -> {
+                    throw new AccountPolicyException("Suffix not permitted");
+                });
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java
index 39a02c0..e3eeacd 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/DefaultPasswordRule.java
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.util.List;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.common.lib.policy.DefaultPasswordRuleConf;
 import org.apache.syncope.common.lib.policy.PasswordRuleConf;
@@ -26,7 +25,6 @@ import org.apache.syncope.core.provisioning.api.utils.policy.PasswordPolicyExcep
 import org.apache.syncope.core.provisioning.api.utils.policy.PolicyPattern;
 import org.apache.syncope.core.persistence.api.dao.PasswordRule;
 import org.apache.syncope.core.persistence.api.dao.PasswordRuleConfClass;
-import org.apache.syncope.core.persistence.api.entity.PlainAttr;
 import org.apache.syncope.core.persistence.api.entity.user.User;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -45,15 +43,12 @@ public class DefaultPasswordRule implements PasswordRule {
                     PasswordRuleConf.class.getName() + " expected, got " + conf.getClass().getName());
         }
 
-        for (String schema : this.conf.getSchemasNotPermitted()) {
-            PlainAttr<?> attr = user.getPlainAttr(schema);
-            if (attr != null) {
-                List<String> values = attr.getValuesAsStrings();
-                if (values != null && !values.isEmpty()) {
-                    this.conf.getWordsNotPermitted().add(values.get(0));
-                }
-            }
-        }
+        this.conf.getSchemasNotPermitted().stream().
+                map(schema -> user.getPlainAttr(schema)).
+                filter(attr -> attr.isPresent()).
+                map(attr -> attr.get().getValuesAsStrings()).
+                filter(values -> (values != null && !values.isEmpty())).
+                forEachOrdered(values -> this.conf.getWordsNotPermitted().add(values.get(0)));
 
         String clearPassword = user.getClearPassword();
         String password = user.getPassword();
@@ -69,11 +64,11 @@ public class DefaultPasswordRule implements PasswordRule {
             }
 
             // check words not permitted
-            for (String word : this.conf.getWordsNotPermitted()) {
-                if (StringUtils.containsIgnoreCase(clearPassword, word)) {
-                    throw new PasswordPolicyException("Used word(s) not permitted");
-                }
-            }
+            this.conf.getWordsNotPermitted().stream().
+                    filter(word -> StringUtils.containsIgnoreCase(clearPassword, word)).
+                    forEachOrdered(item -> {
+                        throw new PasswordPolicyException("Used word(s) not permitted");
+                    });
 
             // check digits occurrence
             if (this.conf.isDigitRequired() && !checkDigit(clearPassword)) {
@@ -91,18 +86,18 @@ public class DefaultPasswordRule implements PasswordRule {
             }
 
             // check prefix
-            for (String prefix : this.conf.getPrefixesNotPermitted()) {
-                if (clearPassword.startsWith(prefix)) {
-                    throw new PasswordPolicyException("Prefix not permitted");
-                }
-            }
+            this.conf.getPrefixesNotPermitted().stream().
+                    filter(prefix -> clearPassword.startsWith(prefix)).
+                    forEachOrdered(item -> {
+                        throw new PasswordPolicyException("Prefix not permitted");
+                    });
 
             // check suffix
-            for (String suffix : this.conf.getSuffixesNotPermitted()) {
-                if (clearPassword.endsWith(suffix)) {
-                    throw new PasswordPolicyException("Suffix not permitted");
-                }
-            }
+            this.conf.getSuffixesNotPermitted().stream().
+                    filter(suffix -> clearPassword.endsWith(suffix)).
+                    forEachOrdered(item -> {
+                        throw new PasswordPolicyException("Suffix not permitted");
+                    });
 
             // check digit first occurrence
             if (this.conf.isMustStartWithDigit() && !checkFirstDigit(clearPassword)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
index 32c655c..a595389 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java
@@ -28,26 +28,20 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.NoResultException;
 import javax.persistence.Query;
 import javax.persistence.TypedQuery;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.IterableUtils;
-import org.apache.commons.collections4.Predicate;
-import org.apache.commons.collections4.SetUtils;
-import org.apache.commons.collections4.Transformer;
 import org.apache.syncope.common.lib.types.AnyEntitlement;
 import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.core.spring.security.AuthContextUtils;
 import org.apache.syncope.core.spring.security.DelegatedAdministrationException;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.dao.AnyObjectDAO;
 import org.apache.syncope.core.persistence.api.dao.GroupDAO;
 import org.apache.syncope.core.persistence.api.dao.UserDAO;
 import org.apache.syncope.core.persistence.api.entity.AnyType;
 import org.apache.syncope.core.persistence.api.entity.AnyUtils;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership;
 import org.apache.syncope.core.persistence.api.entity.anyobject.ARelationship;
 import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject;
 import org.apache.syncope.core.persistence.api.entity.group.Group;
@@ -141,17 +135,16 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
 
     @Override
     protected void securityChecks(final AnyObject anyObject) {
-        Set<String> authRealms = SetUtils.emptyIfNull(
-                AuthContextUtils.getAuthorizations().get(AnyEntitlement.READ.getFor(anyObject.getType().getKey())));
-        boolean authorized = IterableUtils.matchesAny(authRealms, new Predicate<String>() {
-
-            @Override
-            public boolean evaluate(final String realm) {
-                return anyObject.getRealm().getFullPath().startsWith(realm);
-            }
-        });
+        Map<String, Set<String>> authorizations = AuthContextUtils.getAuthorizations();
+        Set<String> authRealms = authorizations.containsKey(AnyEntitlement.READ.getFor(anyObject.getType().getKey()))
+                ? authorizations.get(AnyEntitlement.READ.getFor(anyObject.getType().getKey()))
+                : Collections.emptySet();
+        boolean authorized = authRealms.stream().
+                anyMatch(realm -> anyObject.getRealm().getFullPath().startsWith(realm));
         if (!authorized) {
-            authorized = !CollectionUtils.intersection(findDynRealms(anyObject.getKey()), authRealms).isEmpty();
+            authorized = findDynRealms(anyObject.getKey()).stream().
+                    filter(dynRealm -> authRealms.contains(dynRealm)).
+                    count() > 0;
         }
         if (authRealms.isEmpty() || !authorized) {
             throw new DelegatedAdministrationException(
@@ -236,18 +229,21 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
         groupDAO().removeDynMemberships(anyObject);
         dynRealmDAO().removeDynMemberships(anyObject.getKey());
 
-        for (ARelationship relationship : findARelationships(anyObject)) {
+        findARelationships(anyObject).stream().map(relationship -> {
             relationship.getLeftEnd().getRelationships().remove(relationship);
+            return relationship;
+        }).map(relationship -> {
             save(relationship.getLeftEnd());
+            return relationship;
+        }).forEachOrdered(relationship -> entityManager().remove(relationship));
 
-            entityManager().remove(relationship);
-        }
-        for (URelationship relationship : findURelationships(anyObject)) {
+        findURelationships(anyObject).stream().map(relationship -> {
             relationship.getLeftEnd().getRelationships().remove(relationship);
+            return relationship;
+        }).map(relationship -> {
             userDAO().save(relationship.getLeftEnd());
-
-            entityManager().remove(relationship);
-        }
+            return relationship;
+        }).forEachOrdered(relationship -> entityManager().remove(relationship));
 
         entityManager().remove(anyObject);
         publisher.publishEvent(
@@ -256,45 +252,43 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
+    @SuppressWarnings("unchecked")
     public List<Group> findDynGroups(final String key) {
         Query query = entityManager().createNativeQuery(
                 "SELECT group_id FROM " + JPAGroupDAO.ADYNMEMB_TABLE + " WHERE any_id=?");
         query.setParameter(1, key);
 
         List<Group> result = new ArrayList<>();
-        for (Object resultKey : query.getResultList()) {
-            String actualKey = resultKey instanceof Object[]
-                    ? (String) ((Object[]) resultKey)[0]
-                    : ((String) resultKey);
-
-            Group group = groupDAO().find(actualKey);
-            if (group == null) {
-                LOG.error("Could not find group with id {}, even though returned by the native query", actualKey);
-            } else if (!result.contains(group)) {
-                result.add(group);
-            }
-        }
+        query.getResultList().stream().map(resultKey -> resultKey instanceof Object[]
+                ? (String) ((Object[]) resultKey)[0]
+                : ((String) resultKey)).
+                forEachOrdered(actualKey -> {
+                    Group group = groupDAO().find(actualKey.toString());
+                    if (group == null) {
+                        LOG.error("Could not find group with id {}, even though returned by the native query",
+                                actualKey);
+                    } else if (!result.contains(group)) {
+                        result.add(group);
+                    }
+                });
         return result;
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
     public Collection<Group> findAllGroups(final AnyObject anyObject) {
-        return CollectionUtils.union(
-                CollectionUtils.collect(anyObject.getMemberships(), new Transformer<AMembership, Group>() {
+        Set<Group> result = new HashSet<>();
+        result.addAll(anyObject.getMemberships().stream().
+                map(membership -> membership.getRightEnd()).collect(Collectors.toSet()));
+        result.addAll(findDynGroups(anyObject.getKey()));
 
-                    @Override
-                    public Group transform(final AMembership input) {
-                        return input.getRightEnd();
-                    }
-                }, new ArrayList<Group>()),
-                findDynGroups(anyObject.getKey()));
+        return result;
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
     @Override
     public Collection<String> findAllGroupKeys(final AnyObject anyObject) {
-        return CollectionUtils.collect(findAllGroups(anyObject), EntityUtils.<Group>keyTransformer());
+        return findAllGroups(anyObject).stream().map(group -> group.getKey()).collect(Collectors.toList());
     }
 
     @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
@@ -302,9 +296,7 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
     public Collection<ExternalResource> findAllResources(final AnyObject anyObject) {
         Set<ExternalResource> result = new HashSet<>();
         result.addAll(anyObject.getResources());
-        for (Group group : findAllGroups(anyObject)) {
-            result.addAll(group.getResources());
-        }
+        findAllGroups(anyObject).forEach(group -> result.addAll(group.getResources()));
 
         return result;
     }
@@ -312,7 +304,7 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj
     @Transactional(readOnly = true)
     @Override
     public Collection<String> findAllResourceKeys(final String key) {
-        return CollectionUtils.collect(findAllResources(authFind(key)), EntityUtils.<ExternalResource>keyTransformer());
+        return findAllResources(authFind(key)).stream().map(resource -> resource.getKey()).collect(Collectors.toList());
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/74ee038a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 6af5f27..a7aae81 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -25,9 +25,9 @@ import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.stream.Collectors;
 import javax.persistence.Query;
 import javax.persistence.TemporalType;
-import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
@@ -36,7 +36,6 @@ import org.apache.syncope.common.lib.types.AnyTypeKind;
 import org.apache.syncope.common.lib.types.AttrSchemaType;
 import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.core.provisioning.api.utils.RealmUtils;
-import org.apache.syncope.core.provisioning.api.utils.EntityUtils;
 import org.apache.syncope.core.persistence.api.dao.search.AttributeCond;
 import org.apache.syncope.core.persistence.api.dao.search.MembershipCond;
 import org.apache.syncope.core.persistence.api.dao.search.OrderByClause;
@@ -80,8 +79,8 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
                     noRealm.getElements().add("Invalid realm specified: " + realmPath);
                     throw noRealm;
                 } else {
-                    CollectionUtils.collect(
-                            realmDAO.findDescendants(realm), EntityUtils.<Realm>keyTransformer(), realmKeys);
+                    realmKeys.addAll(realmDAO.findDescendants(realm).stream().
+                            map(r -> r.getKey()).collect(Collectors.toSet()));
                 }
             } else {
                 DynRealm dynRealm = dynRealmDAO.find(realmPath);
@@ -93,7 +92,8 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             }
         }
         if (!dynRealmKeys.isEmpty()) {
-            CollectionUtils.collect(realmDAO.findAll(), EntityUtils.keyTransformer(), realmKeys);
+            realmKeys.addAll(realmDAO.findAll().stream().
+                    map(r -> r.getKey()).collect(Collectors.toSet()));
         }
 
         StringBuilder adminRealmFilter = new StringBuilder("u.any_id IN (").