From 79a18752fe038d10e6473092f568b05add3d9f50 Mon Sep 17 00:00:00 2001
From: Fabrice Daugan <fabrice.daugan@gmail.com>
Date: Tue, 7 May 2024 13:53:46 +0200
Subject: [PATCH] style

---
 pom.xml                                       |   2 +-
 .../id/ldap/dao/UserLdapRepository.java       |  32 +---
 .../id/ldap/resource/CsvStreamingOutput.java  |   2 +-
 .../server/core/avltree/ArrayMarshaller.java  |  12 +-
 .../id/resource/DelegateLdapResourceTest.java |  74 +++-----
 .../id/resource/GroupLdapResourceTest.java    |  28 +--
 .../SubscriptionForLdapResourceTest.java      |   2 +-
 .../id/resource/UserLdapResourceTest.java     | 162 +++++++++---------
 .../id/resource/UserLdapResourceZAddTest.java |  16 +-
 .../resource/UserLdapResourceZUpdateTest.java |  34 ++--
 .../UserLdapResourceZZDeleteTest.java         |   4 +-
 11 files changed, 148 insertions(+), 220 deletions(-)

diff --git a/pom.xml b/pom.xml
index 5fa9ace..cd54c71 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
     <parent>
         <groupId>org.ligoj.api</groupId>
         <artifactId>plugin-parent</artifactId>
-        <version>4.1.7</version>
+        <version>4.1.8-SNAPSHOT</version>
         <relativePath/>
     </parent>
 
diff --git a/src/main/java/org/ligoj/app/plugin/id/ldap/dao/UserLdapRepository.java b/src/main/java/org/ligoj/app/plugin/id/ldap/dao/UserLdapRepository.java
index 1e2769e..59536bd 100644
--- a/src/main/java/org/ligoj/app/plugin/id/ldap/dao/UserLdapRepository.java
+++ b/src/main/java/org/ligoj/app/plugin/id/ldap/dao/UserLdapRepository.java
@@ -375,15 +375,6 @@ public Map<String, UserOrg> findAllNoCache(final Map<String, GroupOrg> groups) {
 		return result;
 	}
 
-	@Override
-	public void updateMembership(final Collection<String> groups, final UserOrg user) {
-		// Add new groups
-		addUserToGroups(user, CollectionUtils.subtract(groups, user.getGroups()));
-
-		// Remove old groups
-		removeUserFromGroups(user, CollectionUtils.subtract(user.getGroups(), groups));
-	}
-
 	/**
 	 * Update the membership of given group. All users are checked.
 	 */
@@ -582,26 +573,6 @@ private boolean matchPattern(final UserOrg userLdap, final String criteria) {
 				&& StringUtils.containsIgnoreCase(userLdap.getMails().getFirst(), criteria);
 	}
 
-	/**
-	 * Add the user from the given groups. Cache is also updated.
-	 *
-	 * @param user   The user to add to the given groups.
-	 * @param groups the groups to add, normalized.
-	 */
-	protected void addUserToGroups(final UserOrg user, final Collection<String> groups) {
-		groups.forEach(g -> groupLdapRepository.addUser(user, g));
-	}
-
-	/**
-	 * Remove the user from the given groups.Cache is also updated.
-	 *
-	 * @param user   The user to remove from the given groups.
-	 * @param groups the groups to remove, normalized.
-	 */
-	protected void removeUserFromGroups(final UserOrg user, final Collection<String> groups) {
-		groups.forEach(g -> groupLdapRepository.removeUser(user, g));
-	}
-
 	@Override
 	public void updateUser(final UserOrg user) {
 		final var context = template
@@ -711,7 +682,6 @@ public void unlock(final UserOrg user) {
 		}
 	}
 
-
 	@Getter
 	static final class CaptureAuthenticatedLdapEntryContextCallback implements AuthenticatedLdapEntryContextCallback, AuthenticatedLdapEntryContextMapper<Object> {
 
@@ -733,7 +703,7 @@ public UserOrg authenticate(final String name, final String password) {
 		log.info("Authenticating {} ...", name);
 		final var property = getAuthenticateProperty(name);
 		UserOrg user = null;
-		boolean authResult = false;
+		var authResult = false;
 		String reason;
 		try {
 			if (selfSearch) {
diff --git a/src/main/java/org/ligoj/app/plugin/id/ldap/resource/CsvStreamingOutput.java b/src/main/java/org/ligoj/app/plugin/id/ldap/resource/CsvStreamingOutput.java
index 8d2fb98..7c68598 100644
--- a/src/main/java/org/ligoj/app/plugin/id/ldap/resource/CsvStreamingOutput.java
+++ b/src/main/java/org/ligoj/app/plugin/id/ldap/resource/CsvStreamingOutput.java
@@ -102,7 +102,7 @@ private void writeUserData(final Writer writer, final UserOrg user) throws IOExc
 		writer.write(";");
 		writer.write(user.getLastName());
 		writer.write(";");
-		writer.write(user.getMails().isEmpty() ? "" : user.getMails().get(0));
+		writer.write(user.getMails().isEmpty() ? "" : user.getMails().getFirst());
 	}
 
 	/**
diff --git a/src/test/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java b/src/test/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java
index a6aa8b3..186d0fe 100644
--- a/src/test/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java
+++ b/src/test/java/org/apache/directory/server/core/avltree/ArrayMarshaller.java
@@ -19,15 +19,11 @@
  */
 package org.apache.directory.server.core.avltree;
 
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.IOException;
-import java.util.Comparator;
-
 import org.apache.directory.shared.ldap.util.StringTools;
 
+import java.io.*;
+import java.util.Comparator;
+
 /**
  * Class to serialize the Array data. Only there for Java11 compliance.
  *
@@ -68,7 +64,7 @@ public ArrayMarshaller(Comparator<E> comparator) {
 
 	@Override
 	public byte[] serialize(ArrayTree<E> tree) {
-		if ((tree == null) || (tree.size() == 0)) {
+		if (tree == null || tree.isEmpty()) {
 			return EMPTY_TREE;
 		}
 
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/DelegateLdapResourceTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/DelegateLdapResourceTest.java
index 54da053..248fc7a 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/DelegateLdapResourceTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/DelegateLdapResourceTest.java
@@ -76,7 +76,7 @@ void findAllFewVisible() {
 		Assertions.assertEquals(2, result.getRecordsTotal());
 
 		// someone;group;dig rha;false;false;cn=dig rha,cn=dig as,cn=dig,ou=fonction,ou=groups,dc=sample,dc=com
-		DelegateOrgLightVo entity = result.getData().get(0);
+		DelegateOrgLightVo entity = result.getData().getFirst();
 		Assertions.assertEquals("DIG RHA", entity.getName());
 		Assertions.assertEquals(DelegateType.GROUP, entity.getType());
 		Assertions.assertNotNull(entity.getCreatedDate());
@@ -116,7 +116,7 @@ void findAllSelf() {
 
 		// mlavoine;tree;cn=Biz Agency,ou=tools;false;false;cn=Biz
 		// Agency,ou=tools,dc=sample,dc=com
-		final DelegateOrgLightVo entity = result.getData().get(0);
+		final DelegateOrgLightVo entity = result.getData().getFirst();
 		Assertions.assertEquals("cn=biz agency,ou=tools,dc=sample,dc=com", entity.getName());
 		Assertions.assertEquals(DelegateType.TREE, entity.getType());
 		Assertions.assertNotNull(entity.getCreatedDate());
@@ -134,8 +134,8 @@ void findAllSelf() {
 		Assertions.assertEquals("ing", result.getData().get(2).getName());
 
 		// mlavoine;tree;cn=biz agency,ou=tools,dc=sample,dc=com
-		Assertions.assertEquals(DelegateType.TREE, result.getData().get(0).getType());
-		Assertions.assertEquals("cn=biz agency,ou=tools,dc=sample,dc=com", result.getData().get(0).getName());
+		Assertions.assertEquals(DelegateType.TREE, result.getData().getFirst().getType());
+		Assertions.assertEquals("cn=biz agency,ou=tools,dc=sample,dc=com", result.getData().getFirst().getName());
 	}
 
 	@Test
@@ -166,7 +166,7 @@ void findAllReceiverGroup() {
 		Assertions.assertEquals(1, result.getData().size());
 		Assertions.assertEquals(1, result.getRecordsTotal());
 
-		final DelegateOrgLightVo vo = result.getData().get(0);
+		final DelegateOrgLightVo vo = result.getData().getFirst();
 		Assertions.assertEquals("ing", vo.getName());
 		Assertions.assertEquals(DelegateType.COMPANY, vo.getType());
 		Assertions.assertEquals("ligoj-jupiter", vo.getReceiver().getId());
@@ -182,7 +182,7 @@ void findAllReceiverCompany() {
 		Assertions.assertEquals(1, result.getData().size());
 		Assertions.assertEquals(1, result.getRecordsTotal());
 
-		final DelegateOrgLightVo entity = result.getData().get(0);
+		final DelegateOrgLightVo entity = result.getData().getFirst();
 		Assertions.assertEquals("Business Solution", entity.getName());
 		Assertions.assertEquals(DelegateType.GROUP, entity.getType());
 		Assertions.assertEquals("ing", entity.getReceiver().getId());
@@ -374,9 +374,7 @@ void createOnTreePartialDn() {
 		vo.setName("cn=myDn");
 		vo.setReceiver("fdaugan");
 		vo.setType(DelegateType.TREE);
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.create(vo);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.create(vo));
 	}
 
 	@Test
@@ -386,20 +384,16 @@ void createInvalidDn() {
 		vo.setName("myDn*Partial");
 		vo.setReceiver("fdaugan");
 		vo.setType(DelegateType.TREE);
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.create(vo);
-		}), "tree", "DistinguishName");
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.create(vo)), "tree", "DistinguishName");
 	}
 
 	@Test
-	void createOnUnkownCompany() {
+	void createOnUnknownCompany() {
 		final DelegateOrgEditionVo vo = new DelegateOrgEditionVo();
 		vo.setName("any");
 		vo.setType(DelegateType.COMPANY);
 		vo.setReceiver("fdaugan");
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.create(vo);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.create(vo));
 	}
 
 	@Test
@@ -429,9 +423,7 @@ void createOnSubTreeInvalidDn() {
 		vo.setName("myDn,dc=sample,dc=com");
 		vo.setReceiver("fdaugan");
 		vo.setType(DelegateType.TREE);
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.create(vo);
-		}), "tree", "DistinguishName");
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.create(vo)), "tree", "DistinguishName");
 	}
 
 	@Test
@@ -442,9 +434,7 @@ void updateForbiddenNotAdminDn() {
 		vo.setName("Biz Agency");
 		vo.setReceiver("mlavoine");
 		vo.setType(DelegateType.GROUP);
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.update(vo);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.update(vo));
 	}
 
 	@Test
@@ -455,9 +445,7 @@ void updateInvisibleDelegateUser() {
 		vo.setName("Biz Agency");
 		vo.setReceiver("any");
 		vo.setType(DelegateType.GROUP);
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.update(vo);
-		}), "id", "unknown-id");
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.update(vo)), "id", "unknown-id");
 	}
 
 	@Test
@@ -470,9 +458,7 @@ void updateInvisibleDelegateCompany() {
 		vo.setName("socygan");
 		vo.setReceiver("mtuyer");
 		vo.setType(DelegateType.COMPANY);
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.update(vo);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.update(vo));
 	}
 
 	@Test
@@ -483,9 +469,7 @@ void updateInvisibleReceiverUser() {
 		vo.setName("ing");
 		vo.setReceiver("fdaugan");
 		vo.setType(DelegateType.COMPANY);
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.update(vo);
-		}), "id", "unknown-id");
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.update(vo)), "id", "unknown-id");
 	}
 
 	@Test
@@ -497,9 +481,7 @@ void updateInvisibleReceiverCompany() {
 		vo.setReceiver("socygan");
 		vo.setReceiverType(ReceiverType.COMPANY);
 		vo.setType(DelegateType.COMPANY);
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.update(vo);
-		}), "company", "unknown-id");
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.update(vo)), "company", "unknown-id");
 	}
 
 	@Test
@@ -511,9 +493,7 @@ void updateInvisibleReceiverGroup() {
 		vo.setReceiver("biz agency");
 		vo.setReceiverType(ReceiverType.GROUP);
 		vo.setType(DelegateType.COMPANY);
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.update(vo);
-		}), "group", "unknown-id");
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.update(vo)), "group", "unknown-id");
 	}
 
 	@Test
@@ -524,9 +504,7 @@ void updateForbiddenInvalidDelegateType() {
 		vo.setName("ing");
 		vo.setReceiver("mtuyer");
 		vo.setType(DelegateType.GROUP);
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.update(vo);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.update(vo));
 	}
 
 	@Test
@@ -539,9 +517,7 @@ void updateForbiddenInvalidDelegateTree() {
 		vo.setName("ou=z,ou=groups,dc=sample,dc=com");
 		vo.setReceiver("mtuyer");
 		vo.setType(DelegateType.TREE);
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.update(vo);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.update(vo));
 	}
 
 	@Test
@@ -581,9 +557,7 @@ void updateNotExist() {
 		vo.setName("ing");
 		vo.setReceiver("mtuyer");
 		vo.setType(DelegateType.COMPANY);
-		Assertions.assertThrows(ObjectRetrievalFailureException.class, () -> {
-			resource.update(vo);
-		});
+		Assertions.assertThrows(ObjectRetrievalFailureException.class, () -> resource.update(vo));
 	}
 
 	@Test
@@ -679,15 +653,11 @@ void deleteNotAdmin() {
 		initSpringSecurityContext("someone");
 		final int id = em.createQuery("SELECT id FROM DelegateOrg WHERE receiver=:user AND name=:name", Integer.class)
 				.setParameter("user", "someone").setParameter("name", "dig rha").getSingleResult();
-		Assertions.assertThrows(ForbiddenException.class, () -> {
-			resource.delete(id);
-		});
+		Assertions.assertThrows(ForbiddenException.class, () -> resource.delete(id));
 	}
 
 	@Test
 	void deleteUnknown() {
-		Assertions.assertThrows(ObjectRetrievalFailureException.class, () -> {
-			resource.delete(-5);
-		});
+		Assertions.assertThrows(ObjectRetrievalFailureException.class, () -> resource.delete(-5));
 	}
 }
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/GroupLdapResourceTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/GroupLdapResourceTest.java
index eed8b41..33025e3 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/GroupLdapResourceTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/GroupLdapResourceTest.java
@@ -46,7 +46,7 @@ void findAll() {
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "d"));
 		Assertions.assertEquals(5, groups.getRecordsTotal());
 
-		final ContainerCountVo group0 = groups.getData().get(0);
+		final ContainerCountVo group0 = groups.getData().getFirst();
 		Assertions.assertEquals("DIG", group0.getName());
 		Assertions.assertEquals(0, group0.getCount());
 		Assertions.assertEquals(0, group0.getCountVisible());
@@ -83,7 +83,7 @@ void findAll2() {
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "sea-octopus"));
 		Assertions.assertEquals(1, groups.getRecordsTotal());
 
-		final ContainerCountVo group0 = groups.getData().get(0);
+		final ContainerCountVo group0 = groups.getData().getFirst();
 		Assertions.assertEquals("sea-octopus", group0.getName());
 		Assertions.assertEquals(0, group0.getCount());
 		Assertions.assertEquals(0, group0.getCountVisible());
@@ -100,7 +100,7 @@ void findAllDescNoCriteria() {
 		Assertions.assertTrue(groups.getRecordsTotal() >= 16);
 
 		// No group type case
-		final ContainerCountVo group0 = groups.getData().get(0);
+		final ContainerCountVo group0 = groups.getData().getFirst();
 		Assertions.assertEquals("VigiReport", group0.getName());
 	}
 
@@ -122,7 +122,7 @@ void findAllFromMembership() {
 		initSpringSecurityContext("mmartin");
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "hub"));
 		Assertions.assertEquals(2, groups.getRecordsTotal());
-		Assertions.assertEquals("Hub France", groups.getData().get(0).getName());
+		Assertions.assertEquals("Hub France", groups.getData().getFirst().getName());
 		Assertions.assertEquals("Hub Paris", groups.getData().get(1).getName());
 	}
 
@@ -143,7 +143,7 @@ void findAllLimitedRights() {
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "dig as"));
 		Assertions.assertEquals(1, groups.getRecordsTotal());
 
-		final ContainerCountVo group0 = groups.getData().get(0);
+		final ContainerCountVo group0 = groups.getData().getFirst();
 		Assertions.assertEquals("DIG AS", group0.getName());
 		Assertions.assertEquals(1, group0.getCount());
 		Assertions.assertEquals(1, group0.getCountVisible());
@@ -276,7 +276,7 @@ void createEmptyDeleteWithParent() {
 		filter.and(new EqualsFilter("objectclass", "groupOfUniqueNames"));
 		filter.and(new EqualsFilter("cn", "New-Ax-1-z:Z 0"));
 		final DirContextAdapter contextAdapter = getTemplate()
-				.search("cn=DIG,ou=fonction,ou=groups,dc=sample,dc=com", filter.encode(), (Object ctx) -> (DirContextAdapter) ctx).get(0);
+				.search("cn=DIG,ou=fonction,ou=groups,dc=sample,dc=com", filter.encode(), (Object ctx) -> (DirContextAdapter) ctx).getFirst();
 		Assertions.assertEquals("uid=wuser,ou=ing,ou=external,ou=people,dc=sample,dc=com", contextAdapter.getObjectAttribute("seeAlso"));
 		Assertions.assertEquals("SOME", contextAdapter.getStringAttribute("businessCategory"));
 		Assertions.assertEquals("uid=fdaugan,ou=ligoj,ou=france,ou=people,dc=sample,dc=com", contextAdapter.getStringAttribute("owner"));
@@ -286,14 +286,14 @@ void createEmptyDeleteWithParent() {
 		// Pre check
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "New-Ax-1-z:Z 0"));
 		Assertions.assertEquals(1, groups.getRecordsTotal());
-		Assertions.assertEquals(1, groups.getData().get(0).getCount());
+		Assertions.assertEquals(1, groups.getData().getFirst().getCount());
 
 		resource.empty("New-Ax-1-z:Z 0");
 
 		// Post check
 		final var groupsEmpty = resource.findAll(newUriInfoAscSearch("name", "New-Ax-1-z:Z 0"));
 		Assertions.assertEquals(1, groupsEmpty.getRecordsTotal());
-		Assertions.assertEquals(0, groupsEmpty.getData().get(0).getCount());
+		Assertions.assertEquals(0, groupsEmpty.getData().getFirst().getCount());
 
 		resource.delete("New-Ax-1-z:Z 0");
 
@@ -312,14 +312,14 @@ void createEmptyDelete() {
 		// Pre check
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "New-Ax-1-z:Z 0"));
 		Assertions.assertEquals(1, groups.getRecordsTotal());
-		Assertions.assertEquals(1, groups.getData().get(0).getCount());
+		Assertions.assertEquals(1, groups.getData().getFirst().getCount());
 
 		resource.empty("New-Ax-1-z:Z 0");
 
 		// Post check
 		final var groupsEmpty = resource.findAll(newUriInfoAscSearch("name", "New-Ax-1-z:Z 0"));
 		Assertions.assertEquals(1, groupsEmpty.getRecordsTotal());
-		Assertions.assertEquals(0, groupsEmpty.getData().get(0).getCount());
+		Assertions.assertEquals(0, groupsEmpty.getData().getFirst().getCount());
 
 		resource.delete("New-Ax-1-z:Z 0");
 
@@ -338,7 +338,7 @@ private void createInternal(final GroupEditionVo group, final String expected) {
 		final var groups = resource.findAll(newUriInfoAscSearch("name", "ew-Ax"));
 		Assertions.assertEquals(1, groups.getRecordsTotal());
 
-		final ContainerCountVo group0 = groups.getData().get(0);
+		final ContainerCountVo group0 = groups.getData().getFirst();
 		Assertions.assertEquals("New-Ax-1-z:Z 0", group0.getName());
 		Assertions.assertEquals(0, group0.getCount());
 		Assertions.assertEquals(0, group0.getCountVisible());
@@ -499,12 +499,12 @@ void findAllUsingDelegateReceiverCompany() {
 		Assertions.assertEquals(2, tableItem.getData().size());
 
 		// Check the groups "Business Solution"
-		Assertions.assertEquals("Business Solution", tableItem.getData().get(0).getName());
+		Assertions.assertEquals("Business Solution", tableItem.getData().getFirst().getName());
 		Assertions.assertEquals("Sub Business Solution", tableItem.getData().get(1).getName());
 
 		// Check the groups
-		Assertions.assertEquals(0, tableItem.getData().get(0).getCountVisible());
-		Assertions.assertEquals(1, tableItem.getData().get(0).getCount());
+		Assertions.assertEquals(0, tableItem.getData().getFirst().getCountVisible());
+		Assertions.assertEquals(1, tableItem.getData().getFirst().getCount());
 	}
 
 }
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/SubscriptionForLdapResourceTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/SubscriptionForLdapResourceTest.java
index ff55428..edeab69 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/SubscriptionForLdapResourceTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/SubscriptionForLdapResourceTest.java
@@ -146,7 +146,7 @@ private void cleanSubGroup(final String dn) {
 
 	private String[] getMembers() {
 		final var groupContext = getTemplate().search("cn=ligoj-jupiter,ou=ligoj,ou=project,dc=sample,dc=com",
-				new EqualsFilter("cn", "ligoj-jupiter").encode(), (Object ctx) -> (DirContextAdapter) ctx).get(0);
+				new EqualsFilter("cn", "ligoj-jupiter").encode(), (Object ctx) -> (DirContextAdapter) ctx).getFirst();
 		return groupContext.getStringAttributes("uniqueMember");
 	}
 
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceTest.java
index b603003..8b768cd 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceTest.java
@@ -45,7 +45,7 @@ void findByIdNoCache() {
 		Assertions.assertEquals("Fabrice", userLdap.getFirstName());
 		Assertions.assertEquals("Daugan", userLdap.getLastName());
 		Assertions.assertEquals("ligoj", userLdap.getCompany());
-		Assertions.assertEquals("fabrice.daugan@sample.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("fabrice.daugan@sample.com", userLdap.getMails().getFirst());
 	}
 
 	@Test
@@ -58,7 +58,7 @@ void findByIdCaseInsensitive() {
 	void findBy() {
 		final List<UserOrg> users = resource.findAllBy("mail", "marc.martin@sample.com");
 		Assertions.assertEquals(1, users.size());
-		final UserOrg userLdap = users.get(0);
+		final UserOrg userLdap = users.getFirst();
 		Assertions.assertEquals("mmartin", userLdap.getName());
 		Assertions.assertEquals("3890", userLdap.getDepartment());
 		Assertions.assertEquals("8234", userLdap.getLocalId());
@@ -87,7 +87,7 @@ void findAllAllFiltersAllRights() {
 		Assertions.assertEquals(2, tableItem.getRecordsFiltered());
 
 		// Check the users
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("fdoe2", userLdap.getId());
 		Assertions.assertEquals("jdoe5", tableItem.getData().get(1).getId());
 
@@ -95,11 +95,11 @@ void findAllAllFiltersAllRights() {
 		Assertions.assertEquals("ing", userLdap.getCompany());
 		Assertions.assertEquals("First2", userLdap.getFirstName());
 		Assertions.assertEquals("Doe2", userLdap.getLastName());
-		Assertions.assertEquals("first2.doe2@ing.fr", userLdap.getMails().get(0));
+		Assertions.assertEquals("first2.doe2@ing.fr", userLdap.getMails().getFirst());
 		Assertions.assertTrue(userLdap.isCanWrite());
 		final List<GroupVo> groups = new ArrayList<>(userLdap.getGroups());
 		Assertions.assertEquals(2, groups.size());
-		Assertions.assertEquals("Biz Agency", groups.get(0).getName());
+		Assertions.assertEquals("Biz Agency", groups.getFirst().getName());
 		Assertions.assertEquals("DIG RHA", groups.get(1).getName());
 	}
 
@@ -111,17 +111,17 @@ void findAllAllFiltersReducesGroupsAscLogin() {
 		Assertions.assertEquals(2, tableItem.getRecordsFiltered());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
 		Assertions.assertEquals("jdoe5", tableItem.getData().get(1).getId());
 
 		// Check the other attributes
-		Assertions.assertEquals("ing", tableItem.getData().get(0).getCompany());
-		Assertions.assertEquals("First2", tableItem.getData().get(0).getFirstName());
-		Assertions.assertEquals("Doe2", tableItem.getData().get(0).getLastName());
-		Assertions.assertEquals("first2.doe2@ing.fr", tableItem.getData().get(0).getMails().get(0));
-		final List<GroupVo> groups = new ArrayList<>(tableItem.getData().get(0).getGroups());
+		Assertions.assertEquals("ing", tableItem.getData().getFirst().getCompany());
+		Assertions.assertEquals("First2", tableItem.getData().getFirst().getFirstName());
+		Assertions.assertEquals("Doe2", tableItem.getData().getFirst().getLastName());
+		Assertions.assertEquals("first2.doe2@ing.fr", tableItem.getData().getFirst().getMails().getFirst());
+		final List<GroupVo> groups = new ArrayList<>(tableItem.getData().getFirst().getGroups());
 		Assertions.assertEquals(2, groups.size());
-		Assertions.assertEquals("Biz Agency", groups.get(0).getName());
+		Assertions.assertEquals("Biz Agency", groups.getFirst().getName());
 		Assertions.assertEquals("DIG RHA", groups.get(1).getName());
 	}
 
@@ -132,18 +132,18 @@ void findAllNotSecure() {
 		Assertions.assertEquals(4, tableItem.size());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.get(0).getId());
+		Assertions.assertEquals("fdoe2", tableItem.getFirst().getId());
 		Assertions.assertEquals("jdoe4", tableItem.get(1).getId());
 		Assertions.assertEquals("jdoe5", tableItem.get(2).getId());
 
 		// Check the other attributes
-		Assertions.assertEquals("ing", tableItem.get(0).getCompany());
-		Assertions.assertEquals("First2", tableItem.get(0).getFirstName());
-		Assertions.assertEquals("Doe2", tableItem.get(0).getLastName());
-		Assertions.assertEquals("first2.doe2@ing.fr", tableItem.get(0).getMails().get(0));
-		Assertions.assertEquals(2, tableItem.get(0).getGroups().size());
-		Assertions.assertTrue(tableItem.get(0).getGroups().contains("biz agency"));
-		Assertions.assertTrue(tableItem.get(0).getGroups().contains("dig rha"));
+		Assertions.assertEquals("ing", tableItem.getFirst().getCompany());
+		Assertions.assertEquals("First2", tableItem.getFirst().getFirstName());
+		Assertions.assertEquals("Doe2", tableItem.getFirst().getLastName());
+		Assertions.assertEquals("first2.doe2@ing.fr", tableItem.getFirst().getMails().getFirst());
+		Assertions.assertEquals(2, tableItem.getFirst().getGroups().size());
+		Assertions.assertTrue(tableItem.getFirst().getGroups().contains("biz agency"));
+		Assertions.assertTrue(tableItem.getFirst().getGroups().contains("dig rha"));
 	}
 
 	@Test
@@ -166,7 +166,7 @@ void findAllDefaultDescFirstName() {
 		// My company
 		// [SimpleUser(id=jdoe4), SimpleUser(id=hdurant), SimpleUser(id=fdoe2),
 		// SimpleUser(id=fdauganb)]
-		Assertions.assertEquals("jdoe4", tableItem.getData().get(0).getId());
+		Assertions.assertEquals("jdoe4", tableItem.getData().getFirst().getId());
 		Assertions.assertEquals("hdurant", tableItem.getData().get(1).getId());
 		Assertions.assertEquals("fdoe2", tableItem.getData().get(3).getId());
 
@@ -207,12 +207,12 @@ void findAllUsingDelegateReceiverGroup() {
 		Assertions.assertEquals(15, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("admin-test", tableItem.getData().get(0).getId());
-		Assertions.assertFalse(tableItem.getData().get(0).isCanWrite());
+		Assertions.assertEquals("admin-test", tableItem.getData().getFirst().getId());
+		Assertions.assertFalse(tableItem.getData().getFirst().isCanWrite());
 
 		// Check the groups
-		Assertions.assertEquals(1, tableItem.getData().get(0).getGroups().size());
-		Assertions.assertEquals("ligoj-Jupiter", tableItem.getData().get(0).getGroups().get(0).getName());
+		Assertions.assertEquals(1, tableItem.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("ligoj-Jupiter", tableItem.getData().getFirst().getGroups().getFirst().getName());
 	}
 
 	/**
@@ -228,11 +228,11 @@ void findAllForMyCompany() {
 		Assertions.assertEquals(9, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
-		Assertions.assertTrue(tableItem.getData().get(0).isCanWrite());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
+		Assertions.assertTrue(tableItem.getData().getFirst().isCanWrite());
 
 		// Check the groups
-		Assertions.assertEquals(0, tableItem.getData().get(0).getGroups().size());
+		Assertions.assertEquals(0, tableItem.getData().getFirst().getGroups().size());
 	}
 
 	/**
@@ -249,11 +249,11 @@ void findAllForMyCompanyFilter() {
 		Assertions.assertEquals(8, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
-		Assertions.assertTrue(tableItem.getData().get(0).isCanWrite());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
+		Assertions.assertTrue(tableItem.getData().getFirst().isCanWrite());
 
 		// Check the groups
-		Assertions.assertEquals(0, tableItem.getData().get(0).getGroups().size());
+		Assertions.assertEquals(0, tableItem.getData().getFirst().getGroups().size());
 	}
 
 	/**
@@ -271,9 +271,9 @@ void findAllForMyGroup() {
 		Assertions.assertEquals(5, tableItem.getData().size());
 
 		// Check the users (from delegate)
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
-		Assertions.assertFalse(tableItem.getData().get(0).isCanWrite());
-		Assertions.assertTrue(tableItem.getData().get(0).isCanWriteGroups());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
+		Assertions.assertFalse(tableItem.getData().getFirst().isCanWrite());
+		Assertions.assertTrue(tableItem.getData().getFirst().isCanWriteGroups());
 	}
 
 	/**
@@ -290,17 +290,17 @@ void findAllForMySubGroup() {
 		Assertions.assertEquals(1, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
-		Assertions.assertFalse(tableItem.getData().get(0).isCanWrite());
-		Assertions.assertTrue(tableItem.getData().get(0).isCanWriteGroups());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
+		Assertions.assertFalse(tableItem.getData().getFirst().isCanWrite());
+		Assertions.assertTrue(tableItem.getData().getFirst().isCanWriteGroups());
 
 		// Check the groups
 		// "Biz Agency" is visible since "mmartin" is in the parent group "
-		Assertions.assertEquals(2, tableItem.getData().get(0).getGroups().size());
-		Assertions.assertEquals("Biz Agency", tableItem.getData().get(0).getGroups().get(0).getName());
-		Assertions.assertTrue(tableItem.getData().get(0).getGroups().get(0).isCanWrite());
-		Assertions.assertEquals("DIG RHA", tableItem.getData().get(0).getGroups().get(1).getName());
-		Assertions.assertFalse(tableItem.getData().get(0).getGroups().get(1).isCanWrite());
+		Assertions.assertEquals(2, tableItem.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("Biz Agency", tableItem.getData().getFirst().getGroups().getFirst().getName());
+		Assertions.assertTrue(tableItem.getData().getFirst().getGroups().getFirst().isCanWrite());
+		Assertions.assertEquals("DIG RHA", tableItem.getData().getFirst().getGroups().get(1).getName());
+		Assertions.assertFalse(tableItem.getData().getFirst().getGroups().get(1).isCanWrite());
 	}
 
 	@Test
@@ -314,7 +314,7 @@ void findAllFullAscCompany() {
 		Assertions.assertEquals(15, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
 	}
 
 	@Test
@@ -325,8 +325,8 @@ void findAllFullDescCompany() {
 		Assertions.assertEquals(16, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("flast0", tableItem.getData().get(0).getId());
-		Assertions.assertEquals("socygan", tableItem.getData().get(0).getCompany());
+		Assertions.assertEquals("flast0", tableItem.getData().getFirst().getId());
+		Assertions.assertEquals("socygan", tableItem.getData().getFirst().getCompany());
 		Assertions.assertEquals("fdaugan", tableItem.getData().get(6).getId());
 		Assertions.assertEquals("ligoj", tableItem.getData().get(6).getCompany());
 	}
@@ -353,7 +353,7 @@ void findAllMemberDifferentCase() {
 		Assertions.assertEquals(1, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("mmartin", tableItem.getData().get(0).getId());
+		Assertions.assertEquals("mmartin", tableItem.getData().getFirst().getId());
 	}
 
 	/**
@@ -382,13 +382,13 @@ void findAllNoWrite() {
 		Assertions.assertEquals(1, tableItem.getData().size());
 
 		// Check the users
-		Assertions.assertEquals("fdoe2", tableItem.getData().get(0).getId());
-		Assertions.assertFalse(tableItem.getData().get(0).isCanWrite());
+		Assertions.assertEquals("fdoe2", tableItem.getData().getFirst().getId());
+		Assertions.assertFalse(tableItem.getData().getFirst().isCanWrite());
 
 		// Check the groups
-		Assertions.assertEquals(1, tableItem.getData().get(0).getGroups().size());
-		Assertions.assertEquals("Biz Agency", tableItem.getData().get(0).getGroups().get(0).getName());
-		Assertions.assertFalse(tableItem.getData().get(0).getGroups().get(0).isCanWrite());
+		Assertions.assertEquals(1, tableItem.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("Biz Agency", tableItem.getData().getFirst().getGroups().getFirst().getName());
+		Assertions.assertFalse(tableItem.getData().getFirst().getGroups().getFirst().isCanWrite());
 	}
 
 	/**
@@ -484,14 +484,14 @@ void update() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("flast1", userLdap.getId());
 		Assertions.assertEquals("Firsta", userLdap.getFirstName());
 		Assertions.assertEquals("Lasta", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("flasta@ing.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("flasta@ing.com", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
-		Assertions.assertEquals("DIG RHA", userLdap.getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", userLdap.getGroups().getFirst().getName());
 
 		// Rollback attributes
 		user.setId("flast1");
@@ -520,12 +520,12 @@ void updateFirstName() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		UserOrgVo userLdap = tableItem.getData().get(0);
+		UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("jlast3", userLdap.getId());
 		Assertions.assertEquals("John31", userLdap.getFirstName());
 		Assertions.assertEquals("Last3", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("john3.last3@ing.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("john3.last3@ing.com", userLdap.getMails().getFirst());
 		Assertions.assertEquals(0, userLdap.getGroups().size());
 		rollbackUser();
 	}
@@ -546,12 +546,12 @@ void updateLastName() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		UserOrgVo userLdap = tableItem.getData().get(0);
+		UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("jlast3", userLdap.getId());
 		Assertions.assertEquals("John31", userLdap.getFirstName());
 		Assertions.assertEquals("Last31", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("john3.last3@ing.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("john3.last3@ing.com", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
 		rollbackUser();
 	}
@@ -572,13 +572,13 @@ void updateMail() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		UserOrgVo userLdap = tableItem.getData().get(0);
+		UserOrgVo userLdap = tableItem.getData().getFirst();
 		user.setGroups(null);
 		Assertions.assertEquals("jlast3", userLdap.getId());
 		Assertions.assertEquals("John31", userLdap.getFirstName());
 		Assertions.assertEquals("Last31", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("john31.last31@ing.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("john31.last31@ing.com", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
 		rollbackUser();
 	}
@@ -600,7 +600,7 @@ void updateUserChangeCompanyAndBackAgain() {
 
 		// Check the new DN and company everywhere
 		Assertions.assertEquals("uid=flast0,ou=ing,ou=external,ou=people,dc=sample,dc=com", getContext("flast0").getDn().toString());
-		Assertions.assertEquals("ing", resource.findAll(null, null, "flast0", newUriInfo()).getData().get(0).getCompany());
+		Assertions.assertEquals("ing", resource.findAll(null, null, "flast0", newUriInfo()).getData().getFirst().getCompany());
 		Assertions.assertEquals("ing", getUser().findByIdNoCache("flast0").getCompany());
 		Assertions.assertEquals("ing", getUser().findById("flast0").getCompany());
 
@@ -609,7 +609,7 @@ void updateUserChangeCompanyAndBackAgain() {
 
 		// Check the old DN and company everywhere
 		Assertions.assertEquals("uid=flast0,ou=socygan,ou=external,ou=people,dc=sample,dc=com", getContext("flast0").getDn().toString());
-		Assertions.assertEquals("socygan", resource.findAll(null, null, "flast0", newUriInfo()).getData().get(0).getCompany());
+		Assertions.assertEquals("socygan", resource.findAll(null, null, "flast0", newUriInfo()).getData().getFirst().getCompany());
 		Assertions.assertEquals("socygan", getUser().findByIdNoCache("flast0").getCompany());
 		Assertions.assertEquals("socygan", getUser().findById("flast0").getCompany());
 	}
@@ -649,7 +649,7 @@ void updateUserChangeDepartmentAndBackAgain() {
 
 		// Check the new DN and department and group everywhere
 		Assertions.assertEquals("uid=flast0,ou=socygan,ou=external,ou=people,dc=sample,dc=com", getContext("flast0").getDn().toString());
-		Assertions.assertEquals("456987", resource.findAll(null, null, "flast0", newUriInfo()).getData().get(0).getDepartment());
+		Assertions.assertEquals("456987", resource.findAll(null, null, "flast0", newUriInfo()).getData().getFirst().getDepartment());
 		Assertions.assertEquals("456987", getUser().findByIdNoCache("flast0").getDepartment());
 		Assertions.assertEquals("456987", getUser().findById("flast0").getDepartment());
 		Assertions.assertTrue(getUser().findById("flast0").getGroups().contains("dig as"));
@@ -662,7 +662,7 @@ void updateUserChangeDepartmentAndBackAgain() {
 
 		// Check the old DN and department everywhere
 		Assertions.assertEquals("uid=flast0,ou=socygan,ou=external,ou=people,dc=sample,dc=com", getContext("flast0").getDn().toString());
-		Assertions.assertNull(resource.findAll(null, null, "flast0", newUriInfo()).getData().get(0).getDepartment());
+		Assertions.assertNull(resource.findAll(null, null, "flast0", newUriInfo()).getData().getFirst().getDepartment());
 		Assertions.assertNull(getUser().findByIdNoCache("flast0").getDepartment());
 		Assertions.assertNull(getUser().findById("flast0").getDepartment());
 		Assertions.assertFalse(getUser().findById("flast0").getGroups().contains("dig as"));
@@ -689,7 +689,7 @@ void updateUserChangeDepartmentNotExists() {
 
 		// Check the new DN and department and group everywhere
 		Assertions.assertEquals("uid=flast0,ou=socygan,ou=external,ou=people,dc=sample,dc=com", getContext("flast0").getDn().toString());
-		Assertions.assertEquals("any", resource.findAll(null, null, "flast0", newUriInfo()).getData().get(0).getDepartment());
+		Assertions.assertEquals("any", resource.findAll(null, null, "flast0", newUriInfo()).getData().getFirst().getDepartment());
 		Assertions.assertEquals("any", getUser().findByIdNoCache("flast0").getDepartment());
 		Assertions.assertEquals("any", getUser().findById("flast0").getDepartment());
 		Assertions.assertNull(getGroup().findByDepartment("any"));
@@ -699,7 +699,7 @@ void updateUserChangeDepartmentNotExists() {
 
 		// Check the old DN and department everywhere
 		Assertions.assertEquals("uid=flast0,ou=socygan,ou=external,ou=people,dc=sample,dc=com", getContext("flast0").getDn().toString());
-		Assertions.assertNull(resource.findAll(null, null, "flast0", newUriInfo()).getData().get(0).getDepartment());
+		Assertions.assertNull(resource.findAll(null, null, "flast0", newUriInfo()).getData().getFirst().getDepartment());
 		Assertions.assertNull(getUser().findByIdNoCache("flast0").getDepartment());
 	}
 
@@ -750,14 +750,14 @@ void updateUserNoChange() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("jlast3", userLdap.getId());
 		Assertions.assertEquals("John3", userLdap.getFirstName());
 		Assertions.assertEquals("Last3", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("jlast3@ing.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("jlast3@ing.com", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
-		Assertions.assertEquals("DIG RHA", userLdap.getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", userLdap.getGroups().getFirst().getName());
 	}
 
 	@Test
@@ -880,22 +880,22 @@ void updateUserAddGroup() {
 		initSpringSecurityContext("fdaugan");
 		final var initialResultsFromUpdater = resource.findAll(null, null, "wuser", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, initialResultsFromUpdater.getRecordsTotal());
-		Assertions.assertEquals(1, initialResultsFromUpdater.getData().get(0).getGroups().size());
-		Assertions.assertEquals("Biz Agency Manager", initialResultsFromUpdater.getData().get(0).getGroups().get(0).getName());
+		Assertions.assertEquals(1, initialResultsFromUpdater.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("Biz Agency Manager", initialResultsFromUpdater.getData().getFirst().getGroups().getFirst().getName());
 
 		// Pre-condition, check the user "wuser", has no group visible by
 		// "assist"
 		initSpringSecurityContext("assist");
 		final var assisteResult = resource.findAll(null, null, "wuser", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, assisteResult.getRecordsTotal());
-		Assertions.assertEquals(0, assisteResult.getData().get(0).getGroups().size());
+		Assertions.assertEquals(0, assisteResult.getData().getFirst().getGroups().size());
 
 		// Pre-condition, check the user "wuser", "Biz Agency Manager" is not
 		// visible by "mtuyer"
 		initSpringSecurityContext("mtuyer");
 		final var usersFromOtherGroupManager = resource.findAll(null, null, "wuser", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, usersFromOtherGroupManager.getRecordsTotal());
-		Assertions.assertEquals(0, usersFromOtherGroupManager.getData().get(0).getGroups().size());
+		Assertions.assertEquals(0, usersFromOtherGroupManager.getData().getFirst().getGroups().size());
 
 		// Add a new valid group "DIG RHA" to "wuser" by "fdaugan"
 		initSpringSecurityContext("fdaugan");
@@ -916,22 +916,22 @@ void updateUserAddGroup() {
 		Assertions.assertEquals(1, tableItem.getRecordsTotal());
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
-		Assertions.assertEquals(2, tableItem.getData().get(0).getGroups().size());
-		Assertions.assertEquals("Biz Agency Manager", tableItem.getData().get(0).getGroups().get(0).getName());
-		Assertions.assertEquals("DIG RHA", tableItem.getData().get(0).getGroups().get(1).getName());
+		Assertions.assertEquals(2, tableItem.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("Biz Agency Manager", tableItem.getData().getFirst().getGroups().getFirst().getName());
+		Assertions.assertEquals("DIG RHA", tableItem.getData().getFirst().getGroups().get(1).getName());
 
 		// Check the user "wuser", still has no group visible by "assist"
 		initSpringSecurityContext("assist");
 		final var assisteResult2 = resource.findAll(null, null, "wuser", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, assisteResult2.getRecordsTotal());
-		Assertions.assertEquals(0, assisteResult2.getData().get(0).getGroups().size());
+		Assertions.assertEquals(0, assisteResult2.getData().getFirst().getGroups().size());
 
 		// Check the user "wuser", still has the group "DIG RHA" visible by
 		// "mtuyer"
 		initSpringSecurityContext("mtuyer");
 		final var usersFromOtherGroupManager2 = resource.findAll(null, null, "wuser", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, usersFromOtherGroupManager2.getRecordsTotal());
-		Assertions.assertEquals("DIG RHA", usersFromOtherGroupManager2.getData().get(0).getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", usersFromOtherGroupManager2.getData().getFirst().getGroups().getFirst().getName());
 
 		// Restore the old state
 		initSpringSecurityContext("fdaugan");
@@ -947,8 +947,8 @@ void updateUserAddGroup() {
 		resource.update(user);
 		final var initialResultsFromUpdater2 = resource.findAll(null, null, "wuser", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, initialResultsFromUpdater2.getRecordsTotal());
-		Assertions.assertEquals(1, initialResultsFromUpdater2.getData().get(0).getGroups().size());
-		Assertions.assertEquals("Biz Agency Manager", initialResultsFromUpdater2.getData().get(0).getGroups().get(0).getName());
+		Assertions.assertEquals(1, initialResultsFromUpdater2.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("Biz Agency Manager", initialResultsFromUpdater2.getData().getFirst().getGroups().getFirst().getName());
 	}
 
 	/**
@@ -1028,7 +1028,7 @@ void findAllMyCompany() {
 		Assertions.assertEquals(7, tableItem.getRecordsFiltered());
 
 		// Check the users
-		Assertions.assertEquals("admin-test", tableItem.getData().get(0).getId());
+		Assertions.assertEquals("admin-test", tableItem.getData().getFirst().getId());
 	}
 
 	/**
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZAddTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZAddTest.java
index 81619b2..a9e1f7f 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZAddTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZAddTest.java
@@ -94,9 +94,7 @@ void zcreateUserDelegateCompanyNotExist() {
 		user.setCompany("any");
 		user.setMail("flastc@ing.com");
 		initSpringSecurityContext("fdaugan");
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.create(user);
-		}), "company", BusinessException.KEY_UNKNOWN_ID);
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.create(user)), "company", BusinessException.KEY_UNKNOWN_ID);
 	}
 
 	@Test
@@ -108,9 +106,7 @@ void zcreateUserNoDelegate() {
 		user.setCompany("ing");
 		user.setMail("flastd@ing.com");
 		initSpringSecurityContext("any");
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.create(user);
-		}), "company", BusinessException.KEY_UNKNOWN_ID);
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.create(user)), "company", BusinessException.KEY_UNKNOWN_ID);
 	}
 
 	@Test
@@ -122,9 +118,7 @@ void zcreateUserNoDelegateCompany() {
 		user.setCompany("socygan");
 		user.setMail("flastc@ing.com");
 		initSpringSecurityContext("fdaugan");
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.create(user);
-		}), "company", BusinessException.KEY_UNKNOWN_ID);
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.create(user)), "company", BusinessException.KEY_UNKNOWN_ID);
 	}
 
 	@Test
@@ -139,9 +133,7 @@ void zcreateUserNoDelegateGroup() {
 		groups.add("dig sud ouest");
 		user.setGroups(groups);
 		initSpringSecurityContext("someone");
-		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> {
-			resource.create(user);
-		}), "group", BusinessException.KEY_UNKNOWN_ID);
+		MatcherUtil.assertThrows(Assertions.assertThrows(ValidationJsonException.class, () -> resource.create(user)), "group", BusinessException.KEY_UNKNOWN_ID);
 	}
 
 	/**
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZUpdateTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZUpdateTest.java
index 7c565ae..f5f253c 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZUpdateTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZUpdateTest.java
@@ -38,14 +38,14 @@ void zupdateUserHadNoMail() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("jdoe5", userLdap.getId());
 		Assertions.assertEquals("John5", userLdap.getFirstName());
 		Assertions.assertEquals("Doe5", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("first5.last5@ing.fr", userLdap.getMails().get(0));
+		Assertions.assertEquals("first5.last5@ing.fr", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
-		Assertions.assertEquals("DIG RHA", userLdap.getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", userLdap.getGroups().getFirst().getName());
 	}
 
 	@Test
@@ -66,14 +66,14 @@ void zupdateUserHasNoMail() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("jdoe5", userLdap.getId());
 		Assertions.assertEquals("John5", userLdap.getFirstName());
 		Assertions.assertEquals("Doe5", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
 		Assertions.assertTrue(userLdap.getMails().isEmpty());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
-		Assertions.assertEquals("DIG RHA", userLdap.getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", userLdap.getGroups().getFirst().getName());
 	}
 
 	@Test
@@ -94,14 +94,14 @@ void zupdateUserNoPassword() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("jdoe4", userLdap.getId());
 		Assertions.assertEquals("John4", userLdap.getFirstName());
 		Assertions.assertEquals("Doe4", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("fohn4.doe4@ing.fr", userLdap.getMails().get(0));
+		Assertions.assertEquals("fohn4.doe4@ing.fr", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
-		Assertions.assertEquals("DIG RHA", userLdap.getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", userLdap.getGroups().getFirst().getName());
 	}
 
 	@Test
@@ -110,11 +110,11 @@ void zupdateUserRemoveGroup() {
 		initSpringSecurityContext("fdaugan");
 		final TableItem<UserOrgVo> initialResult = resource.findAll(null, null, "fdoe2", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, initialResult.getData().size());
-		Assertions.assertEquals(2, initialResult.getData().get(0).getGroups().size());
-		Assertions.assertEquals("Biz Agency", initialResult.getData().get(0).getGroups().get(0).getName());
-		Assertions.assertTrue(initialResult.getData().get(0).getGroups().get(0).isCanWrite());
-		Assertions.assertEquals("DIG RHA", initialResult.getData().get(0).getGroups().get(1).getName());
-		Assertions.assertTrue(initialResult.getData().get(0).getGroups().get(1).isCanWrite());
+		Assertions.assertEquals(2, initialResult.getData().getFirst().getGroups().size());
+		Assertions.assertEquals("Biz Agency", initialResult.getData().getFirst().getGroups().getFirst().getName());
+		Assertions.assertTrue(initialResult.getData().getFirst().getGroups().getFirst().isCanWrite());
+		Assertions.assertEquals("DIG RHA", initialResult.getData().getFirst().getGroups().get(1).getName());
+		Assertions.assertTrue(initialResult.getData().getFirst().getGroups().get(1).isCanWrite());
 
 		// Remove group "Biz Agency"
 		final UserOrgEditionVo user = new UserOrgEditionVo();
@@ -132,21 +132,21 @@ void zupdateUserRemoveGroup() {
 		Assertions.assertEquals(1, tableItem.getRecordsFiltered());
 		Assertions.assertEquals(1, tableItem.getData().size());
 
-		final UserOrgVo userLdap = tableItem.getData().get(0);
+		final UserOrgVo userLdap = tableItem.getData().getFirst();
 		Assertions.assertEquals("fdoe2", userLdap.getId());
 		Assertions.assertEquals("First2", userLdap.getFirstName());
 		Assertions.assertEquals("Doe2", userLdap.getLastName());
 		Assertions.assertEquals("ing", userLdap.getCompany());
-		Assertions.assertEquals("fdoe2@ing.com", userLdap.getMails().get(0));
+		Assertions.assertEquals("fdoe2@ing.com", userLdap.getMails().getFirst());
 		Assertions.assertEquals(1, userLdap.getGroups().size());
-		Assertions.assertEquals("DIG RHA", userLdap.getGroups().get(0).getName());
+		Assertions.assertEquals("DIG RHA", userLdap.getGroups().getFirst().getName());
 
 		// Remove all groups
 		user.setGroups(null);
 		resource.update(user);
 		final TableItem<UserOrgVo> tableItemNoGroup = resource.findAll(null, null, "fdoe2", newUriInfoAsc("id"));
 		Assertions.assertEquals(1, tableItemNoGroup.getData().size());
-		Assertions.assertEquals(0, tableItemNoGroup.getData().get(0).getGroups().size());
+		Assertions.assertEquals(0, tableItemNoGroup.getData().getFirst().getGroups().size());
 
 	}
 
diff --git a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZZDeleteTest.java b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZZDeleteTest.java
index fc9f7c2..f58290d 100644
--- a/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZZDeleteTest.java
+++ b/src/test/java/org/ligoj/app/plugin/id/resource/UserLdapResourceZZDeleteTest.java
@@ -39,9 +39,9 @@ void zzdeleteUser() {
 		final List<DirContextAdapter> groups = getTemplate().search("ou=groups,dc=sample,dc=com", filter.encode(),
 				(Object ctx) -> (DirContextAdapter) ctx);
 		Assertions.assertEquals(1, groups.size());
-		final DirContextAdapter group = groups.get(0);
+		final DirContextAdapter group = groups.getFirst();
 		final String[] stringAttributes = group.getStringAttributes("uniqueMember");
-		Assertions.assertFalse(stringAttributes.length == 0);
+		Assertions.assertEquals(0, stringAttributes.length);
 		for (final String memberDN : stringAttributes) {
 			Assertions.assertFalse(memberDN.startsWith("uid=jdoe5"));
 		}