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/06/12 09:43:21 UTC

[1/4] syncope git commit: [SYNCOPE-1106] Removed methods returning Map, added methods for getting attribute for specific schema

Repository: syncope
Updated Branches:
  refs/heads/2_0_X ee453d664 -> 31cffd4ec
  refs/heads/master 7a4805bec -> 9ec5f834f


http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 abf2d5d..937c37b 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
@@ -93,7 +93,7 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
         List<PropagationTaskTO> tasks = new ArrayList<>(
                 taskService.<PropagationTaskTO>list(new TaskQuery.Builder(TaskType.PROPAGATION).
                         anyTypeKind(AnyTypeKind.USER).entityKey(userTO.getKey()).build()).
-                getResult());
+                        getResult());
         assertFalse(tasks.isEmpty());
 
         BulkAction bulkAction = new BulkAction();
@@ -135,7 +135,7 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
 
             // 1. create printer on external resource
             AnyObjectTO anyObjectTO = AnyObjectITCase.getSampleTO("propagationJEXLTransformer");
-            String originalLocation = anyObjectTO.getPlainAttrMap().get("location").getValues().get(0);
+            String originalLocation = anyObjectTO.getPlainAttr("location").getValues().get(0);
             assertFalse(originalLocation.endsWith(suffix));
 
             anyObjectTO = createAnyObject(anyObjectTO).getEntity();
@@ -145,8 +145,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.getPlainAttrMap().get("location").getValues().get(0).endsWith(suffix));
-            assertTrue(connObjectTO.getAttrMap().get("LOCATION").getValues().get(0).endsWith(suffix));
+            assertFalse(anyObjectTO.getPlainAttr("location").getValues().get(0).endsWith(suffix));
+            assertTrue(connObjectTO.getAttr("LOCATION").getValues().get(0).endsWith(suffix));
         } finally {
             resourceService.update(originalResource);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 8458767..0869613 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
@@ -231,9 +231,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(userName, userTO.getUsername());
             assertEquals(ActivitiDetector.isActivitiEnabledForUsers(syncopeService)
                     ? "active" : "created", userTO.getStatus());
-            assertEquals("test9@syncope.apache.org", userTO.getPlainAttrMap().get("email").getValues().get(0));
-            assertEquals("test9@syncope.apache.org", userTO.getPlainAttrMap().get("userId").getValues().get(0));
-            assertTrue(Integer.valueOf(userTO.getPlainAttrMap().get("fullname").getValues().get(0)) <= 10);
+            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);
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
 
@@ -243,7 +243,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // check for user template
             userTO = userService.read("test7");
             assertNotNull(userTO);
-            assertEquals("TYPE_OTHER", userTO.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("TYPE_OTHER", userTO.getPlainAttr("ctype").getValues().get(0));
             assertEquals(3, userTO.getResources().size());
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
@@ -262,7 +262,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("test8");
             assertNotNull(userTO);
-            assertEquals("TYPE_8", userTO.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("TYPE_8", userTO.getPlainAttr("ctype").getValues().get(0));
 
             // Check for ignored user - SYNCOPE-663
             try {
@@ -315,7 +315,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("testuser1");
             assertNotNull(userTO);
-            assertEquals("reconciled@syncope.apache.org", userTO.getPlainAttrMap().get("userId").getValues().get(0));
+            assertEquals("reconciled@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
             assertEquals("suspended", userTO.getStatus());
 
             // enable user on external resource
@@ -408,16 +408,16 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // Check for SYNCOPE-436
         assertEquals("pullFromLDAP",
-                matchingUsers.getResult().get(0).getVirAttrMap().get("virtualReadOnly").getValues().get(0));
+                matchingUsers.getResult().get(0).getVirAttr("virtualReadOnly").getValues().get(0));
         // Check for SYNCOPE-270
-        assertNotNull(matchingUsers.getResult().get(0).getPlainAttrMap().get("obscure"));
+        assertNotNull(matchingUsers.getResult().get(0).getPlainAttr("obscure"));
         // Check for SYNCOPE-123
-        assertNotNull(matchingUsers.getResult().get(0).getPlainAttrMap().get("photo"));
+        assertNotNull(matchingUsers.getResult().get(0).getPlainAttr("photo"));
 
         GroupTO groupTO = matchingGroups.getResult().iterator().next();
         assertNotNull(groupTO);
         assertEquals("testLDAPGroup", groupTO.getName());
-        assertEquals("true", groupTO.getPlainAttrMap().get("show").getValues().get(0));
+        assertEquals("true", groupTO.getPlainAttr("show").getValues().get(0));
         assertEquals(matchingUsers.getResult().iterator().next().getKey(), groupTO.getUserOwner());
         assertNull(groupTO.getGroupOwner());
 
@@ -480,7 +480,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             // 1. create printer on external resource
             AnyObjectTO anyObjectTO = AnyObjectITCase.getSampleTO("pull");
-            String originalLocation = anyObjectTO.getPlainAttrMap().get("location").getValues().get(0);
+            String originalLocation = anyObjectTO.getPlainAttr("location").getValues().get(0);
             assertFalse(originalLocation.startsWith(PrefixMappingItemTransformer.PREFIX));
 
             anyObjectTO = createAnyObject(anyObjectTO).getEntity();
@@ -490,9 +490,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.getPlainAttrMap().get("location").getValues().get(0).
+            assertFalse(anyObjectTO.getPlainAttr("location").getValues().get(0).
                     startsWith(PrefixMappingItemTransformer.PREFIX));
-            assertTrue(connObjectTO.getAttrMap().get("LOCATION").getValues().get(0).
+            assertTrue(connObjectTO.getAttr("LOCATION").getValues().get(0).
                     startsWith(PrefixMappingItemTransformer.PREFIX));
 
             // 3. unlink any existing printer and delete from Syncope (printer is now only on external resource)
@@ -761,7 +761,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("testuser2");
             assertNotNull(userTO);
-            assertEquals("testuser2@syncope.apache.org", userTO.getPlainAttrMap().get("userId").getValues().get(0));
+            assertEquals("testuser2@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
             assertEquals(2, userTO.getMemberships().size());
             assertEquals(4, userTO.getResources().size());
         } finally {
@@ -784,7 +784,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.getPlainAttrMap().get("email").getValues().iterator().next();
+        String email = userTO.getPlainAttr("email").getValues().iterator().next();
         assertNotNull(email);
 
         // 4. update TESTPULL on external H2 by changing e-mail address
@@ -796,7 +796,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         // 6. verify that the e-mail was updated
         userTO = userService.read("issuesyncope230");
         assertNotNull(userTO);
-        email = userTO.getPlainAttrMap().get("email").getValues().iterator().next();
+        email = userTO.getPlainAttr("email").getValues().iterator().next();
         assertNotNull(email);
         assertEquals("updatedSYNCOPE230@syncope.apache.org", email);
     }
@@ -876,7 +876,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read(userTO.getKey());
             assertNotNull(userTO);
-            assertNotNull(userTO.getPlainAttrMap().get("firstname").getValues().get(0));
+            assertNotNull(userTO.getPlainAttr("firstname").getValues().get(0));
         } finally {
             removeTestUsers();
         }
@@ -886,8 +886,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
     public void issueSYNCOPE307() {
         UserTO userTO = UserITCase.getUniqueSampleTO("s307@apache.org");
         userTO.setUsername("test0");
-        userTO.getPlainAttrMap().get("firstname").getValues().clear();
-        userTO.getPlainAttrMap().get("firstname").getValues().add("nome0");
+        userTO.getPlainAttr("firstname").getValues().clear();
+        userTO.getPlainAttr("firstname").getValues().add("nome0");
         userTO.getAuxClasses().add("csv");
 
         AttrTO csvuserid = new AttrTO();
@@ -901,7 +901,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         assertNotNull(userTO);
 
         userTO = userService.read(userTO.getKey());
-        assertTrue(userTO.getVirAttrMap().isEmpty());
+        assertTrue(userTO.getVirAttrs().isEmpty());
 
         // Update pull task
         PullTaskTO task = taskService.read("38abbf9e-a1a3-40a1-a15f-7d0ac02f47f1", true);
@@ -921,7 +921,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // check that template was successfully applied...
         userTO = userService.read(userTO.getKey());
-        assertEquals("virtualvalue", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // ...and that propagation to db succeeded
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
@@ -1018,9 +1018,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
             ConnObjectTO connObject =
                     resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
             assertNotNull(getLdapRemoteObject(
-                    connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                    connObject.getAttr(Name.NAME).getValues().get(0),
                     oldCleanPassword,
-                    connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                    connObject.getAttr(Name.NAME).getValues().get(0)));
 
             // 5. Update the LDAP Connector to retrieve passwords
             ResourceTO ldapResource = resourceService.read(RESOURCE_NAME_LDAP);
@@ -1112,7 +1112,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // the user is successfully pulled...
             user = userService.read("pullFromLDAP");
             assertNotNull(user);
-            assertEquals("pullFromLDAP@syncope.apache.org", user.getPlainAttrMap().get("email").getValues().get(0));
+            assertEquals("pullFromLDAP@syncope.apache.org", user.getPlainAttr("email").getValues().get(0));
 
             group = groupService.read("testLDAPGroup");
             assertNotNull(group);
@@ -1120,18 +1120,18 @@ 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.getAttrMap().get("mail").getValues().get(0));
-            AttrTO userDn = connObject.getAttrMap().get(Name.NAME);
+            assertEquals("pullFromLDAP@syncope.apache.org", connObject.getAttr("mail").getValues().get(0));
+            AttrTO userDn = connObject.getAttr(Name.NAME);
             assertNotNull(userDn);
             assertEquals(1, userDn.getValues().size());
             assertNotNull(
                     getLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD, userDn.getValues().get(0)));
 
             // ...and propagated
-            JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-            String email = queryForObject(
-                    jdbcTemplate, 50, "SELECT EMAIL FROM TESTPULL WHERE USERNAME=?", String.class, user.getUsername());
-            assertEquals(user.getPlainAttrMap().get("email").getValues().get(0), email);
+            PagedResult<AbstractTaskTO> propagationTasks = taskService.list(new TaskQuery.Builder(TaskType.PROPAGATION).
+                    resource(RESOURCE_NAME_DBPULL).
+                    anyTypeKind(AnyTypeKind.USER).entityKey(user.getKey()).build());
+            assertEquals(1, propagationTasks.getSize());
 
             // 4. update the user on the external resource
             updateLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD,
@@ -1139,7 +1139,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.getAttrMap().get("mail").getValues().get(0));
+            assertEquals("pullFromLDAP2@syncope.apache.org", connObject.getAttr("mail").getValues().get(0));
 
             // 5. exec the pull task again
             execution = execProvisioningTask(taskService, pullTask.getKey(), 50, false);
@@ -1148,12 +1148,13 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // the internal is updated...
             user = userService.read("pullFromLDAP");
             assertNotNull(user);
-            assertEquals("pullFromLDAP2@syncope.apache.org", user.getPlainAttrMap().get("email").getValues().get(0));
+            assertEquals("pullFromLDAP2@syncope.apache.org", user.getPlainAttr("email").getValues().get(0));
 
             // ...and propagated
-            email = queryForObject(
-                    jdbcTemplate, 50, "SELECT EMAIL FROM TESTPULL WHERE USERNAME=?", String.class, user.getUsername());
-            assertEquals(user.getPlainAttrMap().get("email").getValues().get(0), email);
+            propagationTasks = taskService.list(new TaskQuery.Builder(TaskType.PROPAGATION).
+                    resource(RESOURCE_NAME_DBPULL).
+                    anyTypeKind(AnyTypeKind.USER).entityKey(user.getKey()).build());
+            assertEquals(2, propagationTasks.getSize());
         } catch (Exception e) {
             LOG.error("Unexpected during issueSYNCOPE1062()", e);
             fail(e.getMessage());

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 370cf52..ebfb113 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
@@ -35,6 +35,7 @@ import java.util.Set;
 import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
@@ -573,7 +574,7 @@ public class ResourceITCase extends AbstractITCase {
 
                     @Override
                     public String transform(final ConnObjectTO input) {
-                        return input.getAttrMap().get("__NAME__").getValues().get(0);
+                        return input.getAttr(ConnIdSpecialName.NAME).getValues().get(0);
                     }
                 }, read);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 69dd12e..356d98a 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
@@ -93,7 +93,7 @@ public class UserITCase extends AbstractITCase {
     private static final FastDateFormat DATE_FORMAT = DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT;
 
     private boolean getBooleanAttribute(final ConnObjectTO connObjectTO, final String attrName) {
-        return Boolean.parseBoolean(connObjectTO.getAttrMap().get(attrName).getValues().get(0));
+        return Boolean.parseBoolean(connObjectTO.getAttr(attrName).getValues().get(0));
     }
 
     public static UserTO getUniqueSampleTO(final String email) {
@@ -335,7 +335,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.getPlainAttrMap().get("userId");
+        AttrTO userIdAttr = userTO.getPlainAttr("userId");
         userIdAttr.getValues().clear();
         userIdAttr.getValues().add("a.b@c.com");
 
@@ -351,7 +351,7 @@ public class UserITCase extends AbstractITCase {
     public void createWithRequiredValueMissing() {
         UserTO userTO = getUniqueSampleTO("a.b@c.it");
 
-        AttrTO type = userTO.getPlainAttrMap().get("ctype");
+        AttrTO type = userTO.getPlainAttr("ctype");
         userTO.getPlainAttrs().remove(type);
 
         userTO.getMemberships().add(new MembershipTO.Builder().
@@ -367,7 +367,7 @@ public class UserITCase extends AbstractITCase {
 
         userTO.getPlainAttrs().add(attrTO("ctype", "F"));
 
-        AttrTO surname = userTO.getPlainAttrMap().get("surname");
+        AttrTO surname = userTO.getPlainAttr("surname");
         userTO.getPlainAttrs().remove(surname);
 
         // 2. create user without surname (mandatory when type == 'F')
@@ -512,8 +512,7 @@ public class UserITCase extends AbstractITCase {
         userTO = updateUser(userPatch).getEntity();
 
         assertNotNull(userTO);
-        assertNotNull(userTO.getDerAttrMap());
-        assertFalse(userTO.getPlainAttrMap().containsKey("ctype"));
+        assertNull(userTO.getPlainAttr("ctype"));
     }
 
     @Test(expected = SyncopeClientException.class)
@@ -585,10 +584,10 @@ public class UserITCase extends AbstractITCase {
         assertEquals(1, userTO.getMemberships().size());
         assertFalse(userTO.getDerAttrs().isEmpty());
 
-        AttrTO userIdAttr = userTO.getPlainAttrMap().get("userId");
+        AttrTO userIdAttr = userTO.getPlainAttr("userId");
         assertEquals(Collections.singletonList(newUserId), userIdAttr.getValues());
 
-        AttrTO fullNameAttr = userTO.getPlainAttrMap().get("fullname");
+        AttrTO fullNameAttr = userTO.getPlainAttr("fullname");
         assertEquals(Collections.singletonList(newFullName), fullNameAttr.getValues());
     }
 
@@ -838,7 +837,7 @@ public class UserITCase extends AbstractITCase {
         userTO = createUser(userTO).getEntity();
         assertNotNull(userTO);
 
-        AttrTO loginDate = userTO.getPlainAttrMap().get("loginDate");
+        AttrTO loginDate = userTO.getPlainAttr("loginDate");
         assertNotNull(loginDate);
         assertEquals(1, loginDate.getValues().size());
 
@@ -852,7 +851,7 @@ public class UserITCase extends AbstractITCase {
         userTO = updateUser(userPatch).getEntity();
         assertNotNull(userTO);
 
-        loginDate = userTO.getPlainAttrMap().get("loginDate");
+        loginDate = userTO.getPlainAttr("loginDate");
         assertNotNull(loginDate);
         assertEquals(2, loginDate.getValues().size());
     }
@@ -928,12 +927,12 @@ public class UserITCase extends AbstractITCase {
 
         UserTO actual = createUser(userTO).getEntity();
         assertNotNull(actual);
-        assertNotNull(actual.getDerAttrMap().get("csvuserid"));
+        assertNotNull(actual.getDerAttr("csvuserid"));
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_CSV, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("sx-dx", connObjectTO.getAttrMap().get("THEIRGROUP").getValues().get(0));
+        assertEquals("sx-dx", connObjectTO.getAttr("THEIRGROUP").getValues().get(0));
     }
 
     @Test
@@ -1013,7 +1012,7 @@ public class UserITCase extends AbstractITCase {
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_CSV, AnyTypeKind.USER.name(), userTO.getKey());
-        assertNull(connObjectTO.getAttrMap().get("email"));
+        assertNull(connObjectTO.getAttr("email"));
     }
 
     @Test
@@ -1321,7 +1320,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.getPlainAttrMap().get("surname").getValues().get(0));
+        assertEquals("surname", userTO.getPlainAttr("surname").getValues().get(0));
 
         // verify user exists on the backend REST service
         WebClient webClient = WebClient.create(
@@ -1341,7 +1340,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().getPlainAttrMap().get("surname").getValues().get(0));
+        assertEquals("surname2", result.getEntity().getPlainAttr("surname").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/31cffd4e/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 df32cad..499b24c 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
@@ -409,7 +409,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_DBVIRATTR, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("virtualvalue", connObjectTO.getAttrMap().get("USERNAME").getValues().get(0));
+        assertEquals("virtualvalue", connObjectTO.getAttr("USERNAME").getValues().get(0));
         // ----------------------------------
 
         userTO = userService.read(userTO.getKey());
@@ -467,7 +467,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         ConnObjectTO userOnDb = resourceService.readConnObject(
                 RESOURCE_NAME_TESTDB, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDbAttr = userOnDb.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDbAttr = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDbAttr);
         assertNotNull(pwdOnTestDbAttr.getValues());
         assertFalse(pwdOnTestDbAttr.getValues().isEmpty());
@@ -475,7 +475,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         ConnObjectTO userOnDb2 = resourceService.readConnObject(
                 RESOURCE_NAME_TESTDB2, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDb2Attr = userOnDb2.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDb2Attr = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDb2Attr);
         assertNotNull(pwdOnTestDb2Attr.getValues());
         assertFalse(pwdOnTestDb2Attr.getValues().isEmpty());
@@ -500,7 +500,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.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDbAttrAfter = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDbAttrAfter);
         assertNotNull(pwdOnTestDbAttrAfter.getValues());
         assertFalse(pwdOnTestDbAttrAfter.getValues().isEmpty());
@@ -508,7 +508,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.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDb2AttrAfter = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDb2AttrAfter);
         assertNotNull(pwdOnTestDb2AttrAfter.getValues());
         assertFalse(pwdOnTestDb2AttrAfter.getValues().isEmpty());
@@ -607,7 +607,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.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("a type", userTO.getPlainAttr("ctype").getValues().get(0));
         }
     }
 
@@ -643,7 +643,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObj = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), groupTO.getKey());
         assertNotNull(connObj);
-        assertTrue(connObj.getAttrMap().get("uniqueMember").getValues().
+        assertTrue(connObj.getAttr("uniqueMember").getValues().
                 contains("uid=" + userTO.getUsername() + ",ou=people,o=isp"));
 
         // 4. remove membership
@@ -658,7 +658,7 @@ 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.getAttrMap().get("uniqueMember").getValues().
+        assertFalse(connObj.getAttr("uniqueMember").getValues().
                 contains("uid=" + userTO.getUsername() + ",ou=people,o=isp"));
 
         // 6. restore original resource-ldap group mapping
@@ -690,19 +690,19 @@ public class UserIssuesITCase extends AbstractITCase {
 
         userTO = createUser(userTO).getEntity();
         assertTrue(userTO.getResources().contains(RESOURCE_NAME_LDAP));
-        assertNotNull(userTO.getPlainAttrMap().get("obscure"));
-        assertNotNull(userTO.getPlainAttrMap().get("photo"));
+        assertNotNull(userTO.getPlainAttr("obscure"));
+        assertNotNull(userTO.getPlainAttr("photo"));
 
         // 3. read user on resource
         ConnObjectTO connObj = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(connObj);
-        AttrTO registeredAddress = connObj.getAttrMap().get("registeredAddress");
+        AttrTO registeredAddress = connObj.getAttr("registeredAddress");
         assertNotNull(registeredAddress);
-        assertEquals(userTO.getPlainAttrMap().get("obscure").getValues(), registeredAddress.getValues());
-        AttrTO jpegPhoto = connObj.getAttrMap().get("jpegPhoto");
+        assertEquals(userTO.getPlainAttr("obscure").getValues(), registeredAddress.getValues());
+        AttrTO jpegPhoto = connObj.getAttr("jpegPhoto");
         assertNotNull(jpegPhoto);
-        assertEquals(userTO.getPlainAttrMap().get("photo").getValues(), jpegPhoto.getValues());
+        assertEquals(userTO.getPlainAttr("photo").getValues(), jpegPhoto.getValues());
 
         // 4. remove group
         groupService.delete(groupTO.getKey());
@@ -806,14 +806,14 @@ public class UserIssuesITCase extends AbstractITCase {
         userTO.getPlainAttrs().add(attrTO("makeItDouble", "3"));
 
         userTO = createUser(userTO).getEntity();
-        assertEquals("6", userTO.getPlainAttrMap().get("makeItDouble").getValues().get(0));
+        assertEquals("6", userTO.getPlainAttr("makeItDouble").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(userTO.getKey());
         userPatch.getPlainAttrs().add(attrAddReplacePatch("makeItDouble", "7"));
 
         userTO = updateUser(userPatch).getEntity();
-        assertEquals("14", userTO.getPlainAttrMap().get("makeItDouble").getValues().get(0));
+        assertEquals("14", userTO.getPlainAttr("makeItDouble").getValues().get(0));
     }
 
     @Test
@@ -867,9 +867,9 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 3. try (and succeed) to perform simple LDAP binding with provided password ('password123')
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).getValues().get(0),
                 "password123",
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).getValues().get(0)));
 
         // 4. update user without any password change request
         UserPatch userPatch = new UserPatch();
@@ -881,9 +881,9 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 5. try (and succeed again) to perform simple LDAP binding: password has not changed
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).getValues().get(0),
                 "password123",
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).getValues().get(0)));
     }
 
     @Test
@@ -901,7 +901,7 @@ 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.getAttrMap().get("NAME"));
+        assertNull(actual.getAttr("NAME"));
 
         // 2.  update resource ws-target-resource-1
         ResourceTO ws1 = resourceService.read(RESOURCE_NAME_WS1);
@@ -941,8 +941,8 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO newUser =
                 resourceService.readConnObject(RESOURCE_NAME_WS1, AnyTypeKind.USER.name(), userTO.getKey());
 
-        assertNotNull(newUser.getAttrMap().get("NAME"));
-        assertEquals("firstnameNew", newUser.getAttrMap().get("NAME").getValues().get(0));
+        assertNotNull(newUser.getAttr("NAME"));
+        assertEquals("firstnameNew", newUser.getAttr("NAME").getValues().get(0));
 
         // 4.  restore resource ws-target-resource-1 mapping
         ws1NewUMapping = newWs1.getProvision(AnyTypeKind.USER.name()).getMapping();
@@ -1031,9 +1031,9 @@ public class UserIssuesITCase extends AbstractITCase {
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
 
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).getValues().get(0),
                 "security123",
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).getValues().get(0)));
 
         // 5. Remove LDAPPasswordPropagationActions
         resourceTO = resourceService.read(RESOURCE_NAME_LDAP);
@@ -1076,8 +1076,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has not changed
-        assertEquals("password0", connObjectTO.getAttrMap().
-                get(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("password0", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
         assertNull(userTO.getPassword());
 
         // 3. create user with not null password and propagate onto resource-csv, specify not to save password on
@@ -1098,8 +1097,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has been propagated and that saved userTO's password is null
-        assertEquals("passwordTESTNULL1", connObjectTO.getAttrMap().
-                get(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("passwordTESTNULL1", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
         assertNull(userTO.getPassword());
 
         // 4. create user and propagate password on resource-csv and on Syncope local storage
@@ -1119,8 +1117,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has been correctly propagated on Syncope and resource-csv as usual
-        assertEquals("passwordTESTNULL1", connObjectTO.getAttrMap().
-                get(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("passwordTESTNULL1", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
         Pair<Map<String, Set<String>>, UserTO> self =
                 clientFactory.create(userTO.getUsername(), "passwordTESTNULL1").self();
         assertNotNull(self);
@@ -1171,12 +1168,12 @@ public class UserIssuesITCase extends AbstractITCase {
 
         UserTO actual = createUser(userTO).getEntity();
         assertNotNull(actual);
-        assertNotNull(actual.getDerAttrMap().get("csvuserid"));
+        assertNotNull(actual.getDerAttr("csvuserid"));
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("postalAddress", connObjectTO.getAttrMap().get("postalAddress").getValues().get(0));
+        assertEquals("postalAddress", connObjectTO.getAttr("postalAddress").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(actual.getKey());
@@ -1186,7 +1183,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("newPostalAddress", connObjectTO.getAttrMap().get("postalAddress").getValues().get(0));
+        assertEquals("newPostalAddress", connObjectTO.getAttr("postalAddress").getValues().get(0));
     }
 
     @Test
@@ -1333,7 +1330,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObject =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
         assertNotNull(connObject);
-        AttrTO userDn = connObject.getAttrMap().get(Name.NAME);
+        AttrTO userDn = connObject.getAttr(Name.NAME);
         assertNotNull(userDn);
         assertEquals(1, userDn.getValues().size());
         assertNotNull(getLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD, userDn.getValues().get(0)));
@@ -1358,7 +1355,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 2. create user matching the condition above
         UserTO user = UserITCase.getUniqueSampleTO("syncope1099U@apache.org");
-        user.getPlainAttrMap().get("firstname").getValues().set(0, "issueSYNCOPE1099");
+        user.getPlainAttr("firstname").getValues().set(0, "issueSYNCOPE1099");
 
         ProvisioningResult<UserTO> created = createUser(user);
         assertNotNull(created);

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 7b633a5..5f8661b 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
@@ -156,7 +156,7 @@ public class UserSelfITCase extends AbstractITCase {
     public void authenticateByPlainAttribute() {
         UserTO rossini = userService.read("rossini");
         assertNotNull(rossini);
-        String userId = rossini.getPlainAttrMap().get("userId").getValues().get(0);
+        String userId = rossini.getPlainAttr("userId").getValues().get(0);
         assertNotNull(userId);
 
         Pair<Map<String, Set<String>>, UserTO> self = clientFactory.create(userId, ADMIN_PWD).self();

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 97ebbc0..e310181 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
@@ -89,7 +89,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 2. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
         assertNotNull(userTO);
-        assertEquals("virtualvalue", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(userTO.getKey());
@@ -102,7 +102,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 4. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
         assertNotNull(userTO);
-        assertEquals("virtualupdated", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualupdated", userTO.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test
@@ -144,7 +144,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -162,7 +162,7 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = result.getEntity();
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -176,7 +176,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertEquals("suspended", userTO.getStatus());
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
 
         statusPatch = new StatusPatch();
         statusPatch.setKey(userTO.getKey());
@@ -186,7 +186,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertEquals("active", userTO.getStatus());
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -204,11 +204,11 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = result.getEntity();
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("Surname2", connObjectTO.getAttrMap().get("SURNAME").getValues().get(0));
+        assertEquals("Surname2", connObjectTO.getAttr("SURNAME").getValues().get(0));
 
         // virtual attribute value did not change
-        assertFalse(connObjectTO.getAttrMap().get("COMPANYNAME").getValues().isEmpty());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertFalse(connObjectTO.getAttr("COMPANYNAME").getValues().isEmpty());
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
     }
 
@@ -232,7 +232,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 2. check for virtual attribute value
         actual = userService.read(actual.getKey());
-        assertEquals("virattrcache", actual.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", actual.getVirAttr("virtualdata").getValues().get(0));
 
         // 3. update virtual attribute directly
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
@@ -248,7 +248,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 4. check for cached attribute value
         actual = userService.read(actual.getKey());
-        assertEquals("virattrcache", actual.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", actual.getVirAttr("virtualdata").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(actual.getKey());
@@ -261,7 +261,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 6. check for virtual attribute value
         actual = userService.read(actual.getKey());
         assertNotNull(actual);
-        assertEquals("virtualupdated", actual.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualupdated", actual.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test
@@ -376,7 +376,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 2. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // ----------------------------------------
         // 3. change connector URL so that we are sure that any provided value will come from virtual cache
@@ -411,7 +411,7 @@ public class VirAttrITCase extends AbstractITCase {
         // ----------------------------------------
 
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // ----------------------------------------
         // 5. restore connector URL, values can be read again from external resource
@@ -428,7 +428,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // cached value still in place...
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // force cache update by adding a resource which has virtualdata mapped for propagation
         UserPatch userPatch = new UserPatch();
@@ -439,7 +439,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache2", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache2", userTO.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test
@@ -451,7 +451,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.getVirAttrMap().get("virtualReadOnly").getValues().isEmpty());
+        assertTrue(userTO.getVirAttr("virtualReadOnly").getValues().isEmpty());
     }
 
     @Test
@@ -564,9 +564,9 @@ public class VirAttrITCase extends AbstractITCase {
 
             Map<String, Object> actuals = jdbcTemplate.queryForMap(
                     "SELECT id, surname, email FROM testpull WHERE id=?",
-                    new Object[] { userTO.getPlainAttrMap().get("fullname").getValues().get(0) });
+                    new Object[] { userTO.getPlainAttr("fullname").getValues().get(0) });
 
-            assertEquals(userTO.getPlainAttrMap().get("fullname").getValues().get(0), actuals.get("id").toString());
+            assertEquals(userTO.getPlainAttr("fullname").getValues().get(0), actuals.get("id").toString());
             assertEquals("ml@group.it", actuals.get("email"));
             // -------------------------------------------
         } catch (Exception e) {
@@ -593,7 +593,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         userTO = createUser(userTO).getEntity();
 
-        assertNotNull(userTO.getVirAttrMap().get("virtualReadOnly"));
+        assertNotNull(userTO.getVirAttr("virtualReadOnly"));
     }
 
     @Test
@@ -611,8 +611,8 @@ public class VirAttrITCase extends AbstractITCase {
 
         userTO = createUser(userTO).getEntity();
 
-        assertNotNull(userTO.getVirAttrMap().get("virtualdata"));
-        assertEquals("syncope501@apache.org", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertNotNull(userTO.getVirAttr("virtualdata"));
+        assertEquals("syncope501@apache.org", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // 2. update virtual attribute
         UserPatch userPatch = new UserPatch();
@@ -624,8 +624,8 @@ public class VirAttrITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         // 3. check that user virtual attribute has really been updated 
-        assertFalse(userTO.getVirAttrMap().get("virtualdata").getValues().isEmpty());
-        assertEquals("syncope501_updated@apache.org", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertFalse(userTO.getVirAttr("virtualdata").getValues().isEmpty());
+        assertEquals("syncope501_updated@apache.org", userTO.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test


[3/4] syncope git commit: [SYNCOPE-1106] Removed methods returning Map, added methods for getting attribute for specific schema

Posted by il...@apache.org.
http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 abf2d5d..937c37b 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
@@ -93,7 +93,7 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
         List<PropagationTaskTO> tasks = new ArrayList<>(
                 taskService.<PropagationTaskTO>list(new TaskQuery.Builder(TaskType.PROPAGATION).
                         anyTypeKind(AnyTypeKind.USER).entityKey(userTO.getKey()).build()).
-                getResult());
+                        getResult());
         assertFalse(tasks.isEmpty());
 
         BulkAction bulkAction = new BulkAction();
@@ -135,7 +135,7 @@ public class PropagationTaskITCase extends AbstractTaskITCase {
 
             // 1. create printer on external resource
             AnyObjectTO anyObjectTO = AnyObjectITCase.getSampleTO("propagationJEXLTransformer");
-            String originalLocation = anyObjectTO.getPlainAttrMap().get("location").getValues().get(0);
+            String originalLocation = anyObjectTO.getPlainAttr("location").getValues().get(0);
             assertFalse(originalLocation.endsWith(suffix));
 
             anyObjectTO = createAnyObject(anyObjectTO).getEntity();
@@ -145,8 +145,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.getPlainAttrMap().get("location").getValues().get(0).endsWith(suffix));
-            assertTrue(connObjectTO.getAttrMap().get("LOCATION").getValues().get(0).endsWith(suffix));
+            assertFalse(anyObjectTO.getPlainAttr("location").getValues().get(0).endsWith(suffix));
+            assertTrue(connObjectTO.getAttr("LOCATION").getValues().get(0).endsWith(suffix));
         } finally {
             resourceService.update(originalResource);
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 8458767..0869613 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
@@ -231,9 +231,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
             assertEquals(userName, userTO.getUsername());
             assertEquals(ActivitiDetector.isActivitiEnabledForUsers(syncopeService)
                     ? "active" : "created", userTO.getStatus());
-            assertEquals("test9@syncope.apache.org", userTO.getPlainAttrMap().get("email").getValues().get(0));
-            assertEquals("test9@syncope.apache.org", userTO.getPlainAttrMap().get("userId").getValues().get(0));
-            assertTrue(Integer.valueOf(userTO.getPlainAttrMap().get("fullname").getValues().get(0)) <= 10);
+            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);
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
 
@@ -243,7 +243,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // check for user template
             userTO = userService.read("test7");
             assertNotNull(userTO);
-            assertEquals("TYPE_OTHER", userTO.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("TYPE_OTHER", userTO.getPlainAttr("ctype").getValues().get(0));
             assertEquals(3, userTO.getResources().size());
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_TESTDB));
             assertTrue(userTO.getResources().contains(RESOURCE_NAME_WS2));
@@ -262,7 +262,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("test8");
             assertNotNull(userTO);
-            assertEquals("TYPE_8", userTO.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("TYPE_8", userTO.getPlainAttr("ctype").getValues().get(0));
 
             // Check for ignored user - SYNCOPE-663
             try {
@@ -315,7 +315,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("testuser1");
             assertNotNull(userTO);
-            assertEquals("reconciled@syncope.apache.org", userTO.getPlainAttrMap().get("userId").getValues().get(0));
+            assertEquals("reconciled@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
             assertEquals("suspended", userTO.getStatus());
 
             // enable user on external resource
@@ -408,16 +408,16 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // Check for SYNCOPE-436
         assertEquals("pullFromLDAP",
-                matchingUsers.getResult().get(0).getVirAttrMap().get("virtualReadOnly").getValues().get(0));
+                matchingUsers.getResult().get(0).getVirAttr("virtualReadOnly").getValues().get(0));
         // Check for SYNCOPE-270
-        assertNotNull(matchingUsers.getResult().get(0).getPlainAttrMap().get("obscure"));
+        assertNotNull(matchingUsers.getResult().get(0).getPlainAttr("obscure"));
         // Check for SYNCOPE-123
-        assertNotNull(matchingUsers.getResult().get(0).getPlainAttrMap().get("photo"));
+        assertNotNull(matchingUsers.getResult().get(0).getPlainAttr("photo"));
 
         GroupTO groupTO = matchingGroups.getResult().iterator().next();
         assertNotNull(groupTO);
         assertEquals("testLDAPGroup", groupTO.getName());
-        assertEquals("true", groupTO.getPlainAttrMap().get("show").getValues().get(0));
+        assertEquals("true", groupTO.getPlainAttr("show").getValues().get(0));
         assertEquals(matchingUsers.getResult().iterator().next().getKey(), groupTO.getUserOwner());
         assertNull(groupTO.getGroupOwner());
 
@@ -480,7 +480,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             // 1. create printer on external resource
             AnyObjectTO anyObjectTO = AnyObjectITCase.getSampleTO("pull");
-            String originalLocation = anyObjectTO.getPlainAttrMap().get("location").getValues().get(0);
+            String originalLocation = anyObjectTO.getPlainAttr("location").getValues().get(0);
             assertFalse(originalLocation.startsWith(PrefixMappingItemTransformer.PREFIX));
 
             anyObjectTO = createAnyObject(anyObjectTO).getEntity();
@@ -490,9 +490,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.getPlainAttrMap().get("location").getValues().get(0).
+            assertFalse(anyObjectTO.getPlainAttr("location").getValues().get(0).
                     startsWith(PrefixMappingItemTransformer.PREFIX));
-            assertTrue(connObjectTO.getAttrMap().get("LOCATION").getValues().get(0).
+            assertTrue(connObjectTO.getAttr("LOCATION").getValues().get(0).
                     startsWith(PrefixMappingItemTransformer.PREFIX));
 
             // 3. unlink any existing printer and delete from Syncope (printer is now only on external resource)
@@ -761,7 +761,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read("testuser2");
             assertNotNull(userTO);
-            assertEquals("testuser2@syncope.apache.org", userTO.getPlainAttrMap().get("userId").getValues().get(0));
+            assertEquals("testuser2@syncope.apache.org", userTO.getPlainAttr("userId").getValues().get(0));
             assertEquals(2, userTO.getMemberships().size());
             assertEquals(4, userTO.getResources().size());
         } finally {
@@ -784,7 +784,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.getPlainAttrMap().get("email").getValues().iterator().next();
+        String email = userTO.getPlainAttr("email").getValues().iterator().next();
         assertNotNull(email);
 
         // 4. update TESTPULL on external H2 by changing e-mail address
@@ -796,7 +796,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         // 6. verify that the e-mail was updated
         userTO = userService.read("issuesyncope230");
         assertNotNull(userTO);
-        email = userTO.getPlainAttrMap().get("email").getValues().iterator().next();
+        email = userTO.getPlainAttr("email").getValues().iterator().next();
         assertNotNull(email);
         assertEquals("updatedSYNCOPE230@syncope.apache.org", email);
     }
@@ -876,7 +876,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
             userTO = userService.read(userTO.getKey());
             assertNotNull(userTO);
-            assertNotNull(userTO.getPlainAttrMap().get("firstname").getValues().get(0));
+            assertNotNull(userTO.getPlainAttr("firstname").getValues().get(0));
         } finally {
             removeTestUsers();
         }
@@ -886,8 +886,8 @@ public class PullTaskITCase extends AbstractTaskITCase {
     public void issueSYNCOPE307() {
         UserTO userTO = UserITCase.getUniqueSampleTO("s307@apache.org");
         userTO.setUsername("test0");
-        userTO.getPlainAttrMap().get("firstname").getValues().clear();
-        userTO.getPlainAttrMap().get("firstname").getValues().add("nome0");
+        userTO.getPlainAttr("firstname").getValues().clear();
+        userTO.getPlainAttr("firstname").getValues().add("nome0");
         userTO.getAuxClasses().add("csv");
 
         AttrTO csvuserid = new AttrTO();
@@ -901,7 +901,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
         assertNotNull(userTO);
 
         userTO = userService.read(userTO.getKey());
-        assertTrue(userTO.getVirAttrMap().isEmpty());
+        assertTrue(userTO.getVirAttrs().isEmpty());
 
         // Update pull task
         PullTaskTO task = taskService.read("38abbf9e-a1a3-40a1-a15f-7d0ac02f47f1", true);
@@ -921,7 +921,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
 
         // check that template was successfully applied...
         userTO = userService.read(userTO.getKey());
-        assertEquals("virtualvalue", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // ...and that propagation to db succeeded
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
@@ -1018,9 +1018,9 @@ public class PullTaskITCase extends AbstractTaskITCase {
             ConnObjectTO connObject =
                     resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
             assertNotNull(getLdapRemoteObject(
-                    connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                    connObject.getAttr(Name.NAME).getValues().get(0),
                     oldCleanPassword,
-                    connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                    connObject.getAttr(Name.NAME).getValues().get(0)));
 
             // 5. Update the LDAP Connector to retrieve passwords
             ResourceTO ldapResource = resourceService.read(RESOURCE_NAME_LDAP);
@@ -1112,7 +1112,7 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // the user is successfully pulled...
             user = userService.read("pullFromLDAP");
             assertNotNull(user);
-            assertEquals("pullFromLDAP@syncope.apache.org", user.getPlainAttrMap().get("email").getValues().get(0));
+            assertEquals("pullFromLDAP@syncope.apache.org", user.getPlainAttr("email").getValues().get(0));
 
             group = groupService.read("testLDAPGroup");
             assertNotNull(group);
@@ -1120,18 +1120,18 @@ 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.getAttrMap().get("mail").getValues().get(0));
-            AttrTO userDn = connObject.getAttrMap().get(Name.NAME);
+            assertEquals("pullFromLDAP@syncope.apache.org", connObject.getAttr("mail").getValues().get(0));
+            AttrTO userDn = connObject.getAttr(Name.NAME);
             assertNotNull(userDn);
             assertEquals(1, userDn.getValues().size());
             assertNotNull(
                     getLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD, userDn.getValues().get(0)));
 
             // ...and propagated
-            JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
-            String email = queryForObject(
-                    jdbcTemplate, 50, "SELECT EMAIL FROM TESTPULL WHERE USERNAME=?", String.class, user.getUsername());
-            assertEquals(user.getPlainAttrMap().get("email").getValues().get(0), email);
+            PagedResult<AbstractTaskTO> propagationTasks = taskService.list(new TaskQuery.Builder(TaskType.PROPAGATION).
+                    resource(RESOURCE_NAME_DBPULL).
+                    anyTypeKind(AnyTypeKind.USER).entityKey(user.getKey()).build());
+            assertEquals(1, propagationTasks.getSize());
 
             // 4. update the user on the external resource
             updateLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD,
@@ -1139,7 +1139,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.getAttrMap().get("mail").getValues().get(0));
+            assertEquals("pullFromLDAP2@syncope.apache.org", connObject.getAttr("mail").getValues().get(0));
 
             // 5. exec the pull task again
             execution = execProvisioningTask(taskService, pullTask.getKey(), 50, false);
@@ -1148,12 +1148,13 @@ public class PullTaskITCase extends AbstractTaskITCase {
             // the internal is updated...
             user = userService.read("pullFromLDAP");
             assertNotNull(user);
-            assertEquals("pullFromLDAP2@syncope.apache.org", user.getPlainAttrMap().get("email").getValues().get(0));
+            assertEquals("pullFromLDAP2@syncope.apache.org", user.getPlainAttr("email").getValues().get(0));
 
             // ...and propagated
-            email = queryForObject(
-                    jdbcTemplate, 50, "SELECT EMAIL FROM TESTPULL WHERE USERNAME=?", String.class, user.getUsername());
-            assertEquals(user.getPlainAttrMap().get("email").getValues().get(0), email);
+            propagationTasks = taskService.list(new TaskQuery.Builder(TaskType.PROPAGATION).
+                    resource(RESOURCE_NAME_DBPULL).
+                    anyTypeKind(AnyTypeKind.USER).entityKey(user.getKey()).build());
+            assertEquals(2, propagationTasks.getSize());
         } catch (Exception e) {
             LOG.error("Unexpected during issueSYNCOPE1062()", e);
             fail(e.getMessage());

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 370cf52..ebfb113 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
@@ -35,6 +35,7 @@ import java.util.Set;
 import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
@@ -573,7 +574,7 @@ public class ResourceITCase extends AbstractITCase {
 
                     @Override
                     public String transform(final ConnObjectTO input) {
-                        return input.getAttrMap().get("__NAME__").getValues().get(0);
+                        return input.getAttr(ConnIdSpecialName.NAME).getValues().get(0);
                     }
                 }, read);
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 69dd12e..356d98a 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
@@ -93,7 +93,7 @@ public class UserITCase extends AbstractITCase {
     private static final FastDateFormat DATE_FORMAT = DateFormatUtils.ISO_8601_EXTENDED_DATETIME_FORMAT;
 
     private boolean getBooleanAttribute(final ConnObjectTO connObjectTO, final String attrName) {
-        return Boolean.parseBoolean(connObjectTO.getAttrMap().get(attrName).getValues().get(0));
+        return Boolean.parseBoolean(connObjectTO.getAttr(attrName).getValues().get(0));
     }
 
     public static UserTO getUniqueSampleTO(final String email) {
@@ -335,7 +335,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.getPlainAttrMap().get("userId");
+        AttrTO userIdAttr = userTO.getPlainAttr("userId");
         userIdAttr.getValues().clear();
         userIdAttr.getValues().add("a.b@c.com");
 
@@ -351,7 +351,7 @@ public class UserITCase extends AbstractITCase {
     public void createWithRequiredValueMissing() {
         UserTO userTO = getUniqueSampleTO("a.b@c.it");
 
-        AttrTO type = userTO.getPlainAttrMap().get("ctype");
+        AttrTO type = userTO.getPlainAttr("ctype");
         userTO.getPlainAttrs().remove(type);
 
         userTO.getMemberships().add(new MembershipTO.Builder().
@@ -367,7 +367,7 @@ public class UserITCase extends AbstractITCase {
 
         userTO.getPlainAttrs().add(attrTO("ctype", "F"));
 
-        AttrTO surname = userTO.getPlainAttrMap().get("surname");
+        AttrTO surname = userTO.getPlainAttr("surname");
         userTO.getPlainAttrs().remove(surname);
 
         // 2. create user without surname (mandatory when type == 'F')
@@ -512,8 +512,7 @@ public class UserITCase extends AbstractITCase {
         userTO = updateUser(userPatch).getEntity();
 
         assertNotNull(userTO);
-        assertNotNull(userTO.getDerAttrMap());
-        assertFalse(userTO.getPlainAttrMap().containsKey("ctype"));
+        assertNull(userTO.getPlainAttr("ctype"));
     }
 
     @Test(expected = SyncopeClientException.class)
@@ -585,10 +584,10 @@ public class UserITCase extends AbstractITCase {
         assertEquals(1, userTO.getMemberships().size());
         assertFalse(userTO.getDerAttrs().isEmpty());
 
-        AttrTO userIdAttr = userTO.getPlainAttrMap().get("userId");
+        AttrTO userIdAttr = userTO.getPlainAttr("userId");
         assertEquals(Collections.singletonList(newUserId), userIdAttr.getValues());
 
-        AttrTO fullNameAttr = userTO.getPlainAttrMap().get("fullname");
+        AttrTO fullNameAttr = userTO.getPlainAttr("fullname");
         assertEquals(Collections.singletonList(newFullName), fullNameAttr.getValues());
     }
 
@@ -838,7 +837,7 @@ public class UserITCase extends AbstractITCase {
         userTO = createUser(userTO).getEntity();
         assertNotNull(userTO);
 
-        AttrTO loginDate = userTO.getPlainAttrMap().get("loginDate");
+        AttrTO loginDate = userTO.getPlainAttr("loginDate");
         assertNotNull(loginDate);
         assertEquals(1, loginDate.getValues().size());
 
@@ -852,7 +851,7 @@ public class UserITCase extends AbstractITCase {
         userTO = updateUser(userPatch).getEntity();
         assertNotNull(userTO);
 
-        loginDate = userTO.getPlainAttrMap().get("loginDate");
+        loginDate = userTO.getPlainAttr("loginDate");
         assertNotNull(loginDate);
         assertEquals(2, loginDate.getValues().size());
     }
@@ -928,12 +927,12 @@ public class UserITCase extends AbstractITCase {
 
         UserTO actual = createUser(userTO).getEntity();
         assertNotNull(actual);
-        assertNotNull(actual.getDerAttrMap().get("csvuserid"));
+        assertNotNull(actual.getDerAttr("csvuserid"));
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_CSV, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("sx-dx", connObjectTO.getAttrMap().get("THEIRGROUP").getValues().get(0));
+        assertEquals("sx-dx", connObjectTO.getAttr("THEIRGROUP").getValues().get(0));
     }
 
     @Test
@@ -1013,7 +1012,7 @@ public class UserITCase extends AbstractITCase {
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_CSV, AnyTypeKind.USER.name(), userTO.getKey());
-        assertNull(connObjectTO.getAttrMap().get("email"));
+        assertNull(connObjectTO.getAttr("email"));
     }
 
     @Test
@@ -1321,7 +1320,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.getPlainAttrMap().get("surname").getValues().get(0));
+        assertEquals("surname", userTO.getPlainAttr("surname").getValues().get(0));
 
         // verify user exists on the backend REST service
         WebClient webClient = WebClient.create(
@@ -1341,7 +1340,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().getPlainAttrMap().get("surname").getValues().get(0));
+        assertEquals("surname2", result.getEntity().getPlainAttr("surname").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/9ec5f834/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 df32cad..499b24c 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
@@ -409,7 +409,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_DBVIRATTR, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("virtualvalue", connObjectTO.getAttrMap().get("USERNAME").getValues().get(0));
+        assertEquals("virtualvalue", connObjectTO.getAttr("USERNAME").getValues().get(0));
         // ----------------------------------
 
         userTO = userService.read(userTO.getKey());
@@ -467,7 +467,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         ConnObjectTO userOnDb = resourceService.readConnObject(
                 RESOURCE_NAME_TESTDB, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDbAttr = userOnDb.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDbAttr = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDbAttr);
         assertNotNull(pwdOnTestDbAttr.getValues());
         assertFalse(pwdOnTestDbAttr.getValues().isEmpty());
@@ -475,7 +475,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         ConnObjectTO userOnDb2 = resourceService.readConnObject(
                 RESOURCE_NAME_TESTDB2, AnyTypeKind.USER.name(), userTO.getKey());
-        final AttrTO pwdOnTestDb2Attr = userOnDb2.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDb2Attr = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDb2Attr);
         assertNotNull(pwdOnTestDb2Attr.getValues());
         assertFalse(pwdOnTestDb2Attr.getValues().isEmpty());
@@ -500,7 +500,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.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDbAttrAfter = userOnDb.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDbAttrAfter);
         assertNotNull(pwdOnTestDbAttrAfter.getValues());
         assertFalse(pwdOnTestDbAttrAfter.getValues().isEmpty());
@@ -508,7 +508,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.getAttrMap().get(OperationalAttributes.PASSWORD_NAME);
+        final AttrTO pwdOnTestDb2AttrAfter = userOnDb2.getAttr(OperationalAttributes.PASSWORD_NAME);
         assertNotNull(pwdOnTestDb2AttrAfter);
         assertNotNull(pwdOnTestDb2AttrAfter.getValues());
         assertFalse(pwdOnTestDb2AttrAfter.getValues().isEmpty());
@@ -607,7 +607,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.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("a type", userTO.getPlainAttr("ctype").getValues().get(0));
         }
     }
 
@@ -643,7 +643,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObj = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), groupTO.getKey());
         assertNotNull(connObj);
-        assertTrue(connObj.getAttrMap().get("uniqueMember").getValues().
+        assertTrue(connObj.getAttr("uniqueMember").getValues().
                 contains("uid=" + userTO.getUsername() + ",ou=people,o=isp"));
 
         // 4. remove membership
@@ -658,7 +658,7 @@ 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.getAttrMap().get("uniqueMember").getValues().
+        assertFalse(connObj.getAttr("uniqueMember").getValues().
                 contains("uid=" + userTO.getUsername() + ",ou=people,o=isp"));
 
         // 6. restore original resource-ldap group mapping
@@ -690,19 +690,19 @@ public class UserIssuesITCase extends AbstractITCase {
 
         userTO = createUser(userTO).getEntity();
         assertTrue(userTO.getResources().contains(RESOURCE_NAME_LDAP));
-        assertNotNull(userTO.getPlainAttrMap().get("obscure"));
-        assertNotNull(userTO.getPlainAttrMap().get("photo"));
+        assertNotNull(userTO.getPlainAttr("obscure"));
+        assertNotNull(userTO.getPlainAttr("photo"));
 
         // 3. read user on resource
         ConnObjectTO connObj = resourceService.readConnObject(
                 RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), userTO.getKey());
         assertNotNull(connObj);
-        AttrTO registeredAddress = connObj.getAttrMap().get("registeredAddress");
+        AttrTO registeredAddress = connObj.getAttr("registeredAddress");
         assertNotNull(registeredAddress);
-        assertEquals(userTO.getPlainAttrMap().get("obscure").getValues(), registeredAddress.getValues());
-        AttrTO jpegPhoto = connObj.getAttrMap().get("jpegPhoto");
+        assertEquals(userTO.getPlainAttr("obscure").getValues(), registeredAddress.getValues());
+        AttrTO jpegPhoto = connObj.getAttr("jpegPhoto");
         assertNotNull(jpegPhoto);
-        assertEquals(userTO.getPlainAttrMap().get("photo").getValues(), jpegPhoto.getValues());
+        assertEquals(userTO.getPlainAttr("photo").getValues(), jpegPhoto.getValues());
 
         // 4. remove group
         groupService.delete(groupTO.getKey());
@@ -806,14 +806,14 @@ public class UserIssuesITCase extends AbstractITCase {
         userTO.getPlainAttrs().add(attrTO("makeItDouble", "3"));
 
         userTO = createUser(userTO).getEntity();
-        assertEquals("6", userTO.getPlainAttrMap().get("makeItDouble").getValues().get(0));
+        assertEquals("6", userTO.getPlainAttr("makeItDouble").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(userTO.getKey());
         userPatch.getPlainAttrs().add(attrAddReplacePatch("makeItDouble", "7"));
 
         userTO = updateUser(userPatch).getEntity();
-        assertEquals("14", userTO.getPlainAttrMap().get("makeItDouble").getValues().get(0));
+        assertEquals("14", userTO.getPlainAttr("makeItDouble").getValues().get(0));
     }
 
     @Test
@@ -867,9 +867,9 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 3. try (and succeed) to perform simple LDAP binding with provided password ('password123')
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).getValues().get(0),
                 "password123",
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).getValues().get(0)));
 
         // 4. update user without any password change request
         UserPatch userPatch = new UserPatch();
@@ -881,9 +881,9 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 5. try (and succeed again) to perform simple LDAP binding: password has not changed
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).getValues().get(0),
                 "password123",
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).getValues().get(0)));
     }
 
     @Test
@@ -901,7 +901,7 @@ 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.getAttrMap().get("NAME"));
+        assertNull(actual.getAttr("NAME"));
 
         // 2.  update resource ws-target-resource-1
         ResourceTO ws1 = resourceService.read(RESOURCE_NAME_WS1);
@@ -941,8 +941,8 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO newUser =
                 resourceService.readConnObject(RESOURCE_NAME_WS1, AnyTypeKind.USER.name(), userTO.getKey());
 
-        assertNotNull(newUser.getAttrMap().get("NAME"));
-        assertEquals("firstnameNew", newUser.getAttrMap().get("NAME").getValues().get(0));
+        assertNotNull(newUser.getAttr("NAME"));
+        assertEquals("firstnameNew", newUser.getAttr("NAME").getValues().get(0));
 
         // 4.  restore resource ws-target-resource-1 mapping
         ws1NewUMapping = newWs1.getProvision(AnyTypeKind.USER.name()).getMapping();
@@ -1031,9 +1031,9 @@ public class UserIssuesITCase extends AbstractITCase {
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
 
         assertNotNull(getLdapRemoteObject(
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0),
+                connObject.getAttr(Name.NAME).getValues().get(0),
                 "security123",
-                connObject.getAttrMap().get(Name.NAME).getValues().get(0)));
+                connObject.getAttr(Name.NAME).getValues().get(0)));
 
         // 5. Remove LDAPPasswordPropagationActions
         resourceTO = resourceService.read(RESOURCE_NAME_LDAP);
@@ -1076,8 +1076,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has not changed
-        assertEquals("password0", connObjectTO.getAttrMap().
-                get(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("password0", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
         assertNull(userTO.getPassword());
 
         // 3. create user with not null password and propagate onto resource-csv, specify not to save password on
@@ -1098,8 +1097,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has been propagated and that saved userTO's password is null
-        assertEquals("passwordTESTNULL1", connObjectTO.getAttrMap().
-                get(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("passwordTESTNULL1", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
         assertNull(userTO.getPassword());
 
         // 4. create user and propagate password on resource-csv and on Syncope local storage
@@ -1119,8 +1117,7 @@ public class UserIssuesITCase extends AbstractITCase {
         assertNotNull(connObjectTO);
 
         // check if password has been correctly propagated on Syncope and resource-csv as usual
-        assertEquals("passwordTESTNULL1", connObjectTO.getAttrMap().
-                get(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
+        assertEquals("passwordTESTNULL1", connObjectTO.getAttr(OperationalAttributes.PASSWORD_NAME).getValues().get(0));
         Pair<Map<String, Set<String>>, UserTO> self =
                 clientFactory.create(userTO.getUsername(), "passwordTESTNULL1").self();
         assertNotNull(self);
@@ -1171,12 +1168,12 @@ public class UserIssuesITCase extends AbstractITCase {
 
         UserTO actual = createUser(userTO).getEntity();
         assertNotNull(actual);
-        assertNotNull(actual.getDerAttrMap().get("csvuserid"));
+        assertNotNull(actual.getDerAttr("csvuserid"));
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("postalAddress", connObjectTO.getAttrMap().get("postalAddress").getValues().get(0));
+        assertEquals("postalAddress", connObjectTO.getAttr("postalAddress").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(actual.getKey());
@@ -1186,7 +1183,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), actual.getKey());
         assertNotNull(connObjectTO);
-        assertEquals("newPostalAddress", connObjectTO.getAttrMap().get("postalAddress").getValues().get(0));
+        assertEquals("newPostalAddress", connObjectTO.getAttr("postalAddress").getValues().get(0));
     }
 
     @Test
@@ -1333,7 +1330,7 @@ public class UserIssuesITCase extends AbstractITCase {
         ConnObjectTO connObject =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.USER.name(), user.getKey());
         assertNotNull(connObject);
-        AttrTO userDn = connObject.getAttrMap().get(Name.NAME);
+        AttrTO userDn = connObject.getAttr(Name.NAME);
         assertNotNull(userDn);
         assertEquals(1, userDn.getValues().size());
         assertNotNull(getLdapRemoteObject(RESOURCE_LDAP_ADMIN_DN, RESOURCE_LDAP_ADMIN_PWD, userDn.getValues().get(0)));
@@ -1358,7 +1355,7 @@ public class UserIssuesITCase extends AbstractITCase {
 
         // 2. create user matching the condition above
         UserTO user = UserITCase.getUniqueSampleTO("syncope1099U@apache.org");
-        user.getPlainAttrMap().get("firstname").getValues().set(0, "issueSYNCOPE1099");
+        user.getPlainAttr("firstname").getValues().set(0, "issueSYNCOPE1099");
 
         ProvisioningResult<UserTO> created = createUser(user);
         assertNotNull(created);

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 7b633a5..5f8661b 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
@@ -156,7 +156,7 @@ public class UserSelfITCase extends AbstractITCase {
     public void authenticateByPlainAttribute() {
         UserTO rossini = userService.read("rossini");
         assertNotNull(rossini);
-        String userId = rossini.getPlainAttrMap().get("userId").getValues().get(0);
+        String userId = rossini.getPlainAttr("userId").getValues().get(0);
         assertNotNull(userId);
 
         Pair<Map<String, Set<String>>, UserTO> self = clientFactory.create(userId, ADMIN_PWD).self();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 97ebbc0..e310181 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
@@ -89,7 +89,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 2. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
         assertNotNull(userTO);
-        assertEquals("virtualvalue", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualvalue", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(userTO.getKey());
@@ -102,7 +102,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 4. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
         assertNotNull(userTO);
-        assertEquals("virtualupdated", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualupdated", userTO.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test
@@ -144,7 +144,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -162,7 +162,7 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = result.getEntity();
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -176,7 +176,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertEquals("suspended", userTO.getStatus());
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
 
         statusPatch = new StatusPatch();
         statusPatch.setKey(userTO.getKey());
@@ -186,7 +186,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertEquals("active", userTO.getStatus());
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
 
         // ----------------------------------
@@ -204,11 +204,11 @@ public class VirAttrITCase extends AbstractITCase {
         userTO = result.getEntity();
 
         connObjectTO = resourceService.readConnObject(RESOURCE_NAME_WS2, AnyTypeKind.USER.name(), userTO.getKey());
-        assertEquals("Surname2", connObjectTO.getAttrMap().get("SURNAME").getValues().get(0));
+        assertEquals("Surname2", connObjectTO.getAttr("SURNAME").getValues().get(0));
 
         // virtual attribute value did not change
-        assertFalse(connObjectTO.getAttrMap().get("COMPANYNAME").getValues().isEmpty());
-        assertEquals("virtualvalue2", connObjectTO.getAttrMap().get("COMPANYNAME").getValues().get(0));
+        assertFalse(connObjectTO.getAttr("COMPANYNAME").getValues().isEmpty());
+        assertEquals("virtualvalue2", connObjectTO.getAttr("COMPANYNAME").getValues().get(0));
         // ----------------------------------
     }
 
@@ -232,7 +232,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 2. check for virtual attribute value
         actual = userService.read(actual.getKey());
-        assertEquals("virattrcache", actual.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", actual.getVirAttr("virtualdata").getValues().get(0));
 
         // 3. update virtual attribute directly
         JdbcTemplate jdbcTemplate = new JdbcTemplate(testDataSource);
@@ -248,7 +248,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 4. check for cached attribute value
         actual = userService.read(actual.getKey());
-        assertEquals("virattrcache", actual.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", actual.getVirAttr("virtualdata").getValues().get(0));
 
         UserPatch userPatch = new UserPatch();
         userPatch.setKey(actual.getKey());
@@ -261,7 +261,7 @@ public class VirAttrITCase extends AbstractITCase {
         // 6. check for virtual attribute value
         actual = userService.read(actual.getKey());
         assertNotNull(actual);
-        assertEquals("virtualupdated", actual.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virtualupdated", actual.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test
@@ -376,7 +376,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // 2. check for virtual attribute value
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // ----------------------------------------
         // 3. change connector URL so that we are sure that any provided value will come from virtual cache
@@ -411,7 +411,7 @@ public class VirAttrITCase extends AbstractITCase {
         // ----------------------------------------
 
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // ----------------------------------------
         // 5. restore connector URL, values can be read again from external resource
@@ -428,7 +428,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         // cached value still in place...
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // force cache update by adding a resource which has virtualdata mapped for propagation
         UserPatch userPatch = new UserPatch();
@@ -439,7 +439,7 @@ public class VirAttrITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         userTO = userService.read(userTO.getKey());
-        assertEquals("virattrcache2", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertEquals("virattrcache2", userTO.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test
@@ -451,7 +451,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.getVirAttrMap().get("virtualReadOnly").getValues().isEmpty());
+        assertTrue(userTO.getVirAttr("virtualReadOnly").getValues().isEmpty());
     }
 
     @Test
@@ -564,9 +564,9 @@ public class VirAttrITCase extends AbstractITCase {
 
             Map<String, Object> actuals = jdbcTemplate.queryForMap(
                     "SELECT id, surname, email FROM testpull WHERE id=?",
-                    new Object[] { userTO.getPlainAttrMap().get("fullname").getValues().get(0) });
+                    new Object[] { userTO.getPlainAttr("fullname").getValues().get(0) });
 
-            assertEquals(userTO.getPlainAttrMap().get("fullname").getValues().get(0), actuals.get("id").toString());
+            assertEquals(userTO.getPlainAttr("fullname").getValues().get(0), actuals.get("id").toString());
             assertEquals("ml@group.it", actuals.get("email"));
             // -------------------------------------------
         } catch (Exception e) {
@@ -593,7 +593,7 @@ public class VirAttrITCase extends AbstractITCase {
 
         userTO = createUser(userTO).getEntity();
 
-        assertNotNull(userTO.getVirAttrMap().get("virtualReadOnly"));
+        assertNotNull(userTO.getVirAttr("virtualReadOnly"));
     }
 
     @Test
@@ -611,8 +611,8 @@ public class VirAttrITCase extends AbstractITCase {
 
         userTO = createUser(userTO).getEntity();
 
-        assertNotNull(userTO.getVirAttrMap().get("virtualdata"));
-        assertEquals("syncope501@apache.org", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertNotNull(userTO.getVirAttr("virtualdata"));
+        assertEquals("syncope501@apache.org", userTO.getVirAttr("virtualdata").getValues().get(0));
 
         // 2. update virtual attribute
         UserPatch userPatch = new UserPatch();
@@ -624,8 +624,8 @@ public class VirAttrITCase extends AbstractITCase {
         assertNotNull(userTO);
 
         // 3. check that user virtual attribute has really been updated 
-        assertFalse(userTO.getVirAttrMap().get("virtualdata").getValues().isEmpty());
-        assertEquals("syncope501_updated@apache.org", userTO.getVirAttrMap().get("virtualdata").getValues().get(0));
+        assertFalse(userTO.getVirAttr("virtualdata").getValues().isEmpty());
+        assertEquals("syncope501_updated@apache.org", userTO.getVirAttr("virtualdata").getValues().get(0));
     }
 
     @Test


[4/4] syncope git commit: [SYNCOPE-1106] Removed methods returning Map, added methods for getting attribute for specific schema

Posted by il...@apache.org.
[SYNCOPE-1106] Removed methods returning Map, added methods for getting attribute for specific schema


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

Branch: refs/heads/master
Commit: 9ec5f834f68a92e2d808f5fd347264b7518ab73d
Parents: 7a4805b
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Jun 12 11:43:03 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Jun 12 11:43:11 2017 +0200

----------------------------------------------------------------------
 .../commons/SortableAnyProviderComparator.java  | 20 ++----
 .../console/commons/status/StatusUtils.java     | 14 +---
 .../syncope/client/console/panels/Realm.java    | 22 +++---
 .../html/repeater/data/table/AttrColumn.java    | 17 +++--
 .../data/table/ConnObjectAttrColumn.java        |  7 +-
 .../console/wizards/any/ConnObjectPanel.java    |  6 +-
 .../client/console/wizards/any/DerAttrs.java    |  7 +-
 .../client/console/wizards/any/PlainAttrs.java  |  5 +-
 .../client/console/wizards/any/VirAttrs.java    |  5 +-
 .../resources/UserSelfCreateResource.java       |  7 +-
 .../enduser/resources/UserSelfReadResource.java |  6 +-
 .../resources/UserSelfUpdateResource.java       |  7 +-
 .../enduser/util/UserRequestValidator.java      | 12 ++--
 .../enduser/util/UserRequestValidatorTest.java  |  4 +-
 .../syncope/common/lib/AnyOperations.java       | 14 ++--
 .../syncope/common/lib/EntityTOUtils.java       | 13 ++++
 .../org/apache/syncope/common/lib/to/AnyTO.java | 48 ++++++-------
 .../syncope/common/lib/to/AttributableTO.java   |  7 +-
 .../syncope/common/lib/to/ConnObjectTO.java     | 18 ++---
 .../syncope/common/lib/to/MembershipTO.java     | 50 +++++++-------
 .../test/resources/domains/MasterContent.xml    | 16 ++---
 .../java/DefaultGroupProvisioningManager.java   |  2 +-
 .../java/job/report/GroupReportlet.java         |  7 +-
 .../java/job/report/UserReportlet.java          |  7 +-
 .../provisioning/java/utils/TemplateUtils.java  |  7 +-
 .../provisioning/java/MailTemplateTest.java     |  2 +-
 .../rest/cxf/service/AbstractAnyService.java    |  6 +-
 .../camel/producer/CreateProducer.java          |  2 +-
 .../syncope/fit/core/AnyObjectITCase.java       | 16 ++---
 .../syncope/fit/core/AuthenticationITCase.java  |  4 +-
 .../syncope/fit/core/CamelRouteITCase.java      |  4 +-
 .../apache/syncope/fit/core/DynRealmITCase.java |  2 +-
 .../apache/syncope/fit/core/GroupITCase.java    | 34 +++++-----
 .../syncope/fit/core/MembershipITCase.java      | 39 +++++------
 .../syncope/fit/core/MigrationITCase.java       |  6 +-
 .../syncope/fit/core/PropagationTaskITCase.java |  8 +--
 .../apache/syncope/fit/core/PullTaskITCase.java | 71 ++++++++++----------
 .../apache/syncope/fit/core/ResourceITCase.java |  3 +-
 .../org/apache/syncope/fit/core/UserITCase.java | 29 ++++----
 .../syncope/fit/core/UserIssuesITCase.java      | 69 +++++++++----------
 .../apache/syncope/fit/core/UserSelfITCase.java |  2 +-
 .../apache/syncope/fit/core/VirAttrITCase.java  | 48 ++++++-------
 42 files changed, 336 insertions(+), 337 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 52087f7..0eb370d 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
@@ -21,7 +21,6 @@ package org.apache.syncope.client.console.commons;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -54,18 +53,11 @@ public class SortableAnyProviderComparator<T extends AnyTO> extends SortableData
 
         private static final long serialVersionUID = -7856686374020091808L;
 
-        private final Map<String, AttrTO> plainAttrs;
-
-        private final Map<String, AttrTO> derAttrs;
-
-        private final Map<String, AttrTO> virAttrs;
+        private final AnyTO anyTO;
 
         AttrModel(final AnyTO anyTO) {
             super();
-
-            this.plainAttrs = anyTO.getPlainAttrMap();
-            this.derAttrs = anyTO.getDerAttrMap();
-            this.virAttrs = anyTO.getVirAttrMap();
+            this.anyTO = anyTO;
         }
 
         /**
@@ -91,20 +83,20 @@ public class SortableAnyProviderComparator<T extends AnyTO> extends SortableData
 
             final AttrTO attr;
             if (schemaType == null) {
-                attr = this.plainAttrs.get(schema);
+                attr = this.anyTO.getPlainAttr(schema);
             } else {
                 switch (schemaType) {
                     case PLAIN:
                     default:
-                        attr = this.plainAttrs.get(schema);
+                        attr = this.anyTO.getPlainAttr(schema);
                         break;
 
                     case DERIVED:
-                        attr = this.derAttrs.get(schema);
+                        attr = this.anyTO.getDerAttr(schema);
                         break;
 
                     case VIRTUAL:
-                        attr = this.virAttrs.get(schema);
+                        attr = this.anyTO.getVirAttr(schema);
                         break;
                 }
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 baf5b9b..6da9246 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
@@ -21,9 +21,7 @@ package org.apache.syncope.client.console.commons.status;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.console.commons.Constants;
@@ -113,22 +111,14 @@ public class StatusUtils implements Serializable {
     }
 
     private Boolean isEnabled(final ConnObjectTO objectTO) {
-        final Map<String, AttrTO> attributeTOs = objectTO.getAttrMap();
-
-        final AttrTO status = attributeTOs.get(ConnIdSpecialName.ENABLE);
-
+        final AttrTO status = objectTO.getAttr(ConnIdSpecialName.ENABLE);
         return status != null && status.getValues() != null && !status.getValues().isEmpty()
                 ? Boolean.valueOf(status.getValues().get(0))
                 : Boolean.FALSE;
     }
 
     private String getConnObjectLink(final ConnObjectTO objectTO) {
-        final Map<String, AttrTO> attributeTOs = objectTO == null
-                ? Collections.<String, AttrTO>emptyMap()
-                : objectTO.getAttrMap();
-
-        final AttrTO name = attributeTOs.get(ConnIdSpecialName.NAME);
-
+        final AttrTO name = objectTO == null ? null : objectTO.getAttr(ConnIdSpecialName.NAME);
         return name != null && name.getValues() != null && !name.getValues().isEmpty()
                 ? name.getValues().get(0)
                 : null;

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 615b393..e6d57cd 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
@@ -25,8 +25,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
@@ -85,8 +83,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
 
         setPageRef(pageRef);
 
-        AjaxBootstrapTabbedPanel<ITab> tabbedPanel
-                = new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
+        AjaxBootstrapTabbedPanel<ITab> tabbedPanel =
+                new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
         tabbedPanel.setSelectedTab(selectedIndex);
         addInnerObject(tabbedPanel);
         this.wizardBuilder = new RealmWizardBuilder(pageRef);
@@ -167,15 +165,15 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
             }
         });
 
-        final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo
-                = FormLayoutInfoUtils.fetch(anyTypeTOs);
+        final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo =
+                FormLayoutInfoUtils.fetch(anyTypeTOs);
 
         Collections.sort(anyTypeTOs, new AnyTypeComparator());
         for (final AnyTypeTO anyTypeTO : anyTypeTOs) {
             tabs.add(new ITabComponent(
                     new Model<>(anyTypeTO.getKey()),
                     AnyTypeKind.GROUP.name().equals(anyTypeTO.getKey())
-                    ? null : new String[]{String.format("%s_SEARCH", anyTypeTO.getKey())}) {
+                    ? null : new String[] { String.format("%s_SEARCH", anyTypeTO.getKey()) }) {
 
                 private static final long serialVersionUID = 1169585538404171118L;
 
@@ -223,12 +221,12 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
                 if ("afterObj".equalsIgnoreCase(key)) {
                     ConnObjectTO afterObj = bean.getAfterObj();
                     String remoteId = afterObj == null
-                            || MapUtils.isEmpty(afterObj.getAttrMap())
-                            || !afterObj.getAttrMap().containsKey(ConnIdSpecialName.NAME)
-                            || CollectionUtils.isEmpty(afterObj.getAttrMap().get(ConnIdSpecialName.NAME).getValues())
+                            || afterObj.getAttrs().isEmpty()
+                            || afterObj.getAttr(ConnIdSpecialName.NAME) == null
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).getValues() == null
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).getValues().isEmpty()
                             ? StringUtils.EMPTY
-                            : afterObj.getAttrMap().get(ConnIdSpecialName.NAME).getValues().
-                            iterator().next();
+                            : afterObj.getAttr(ConnIdSpecialName.NAME).getValues().get(0);
 
                     return new Label("field", remoteId);
                 } else if ("status".equalsIgnoreCase(key)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 b756a05..1341791 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
@@ -19,6 +19,7 @@
 package org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table;
 
 import java.util.List;
+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;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
@@ -50,27 +51,25 @@ public class AttrColumn<T extends AttributableTO> extends AbstractColumn<T, Stri
 
         List<String> values = null;
 
+        AttrTO attr = null;
         switch (schemaType) {
             case PLAIN:
-                if (rowModel.getObject().getPlainAttrMap().containsKey(name)) {
-                    values = rowModel.getObject().getPlainAttrMap().get(name).getValues();
-                }
+                attr = rowModel.getObject().getPlainAttr(name);
                 break;
 
             case DERIVED:
-                if (rowModel.getObject().getDerAttrMap().containsKey(name)) {
-                    values = rowModel.getObject().getDerAttrMap().get(name).getValues();
-                }
+                attr = rowModel.getObject().getDerAttr(name);
                 break;
 
             case VIRTUAL:
-                if (rowModel.getObject().getVirAttrMap().containsKey(name)) {
-                    values = rowModel.getObject().getVirAttrMap().get(name).getValues();
-                }
+                attr = rowModel.getObject().getVirAttr(name);
                 break;
 
             default:
         }
+        if (attr != null) {
+            values = attr.getValues();
+        }
 
         if (values == null || values.isEmpty()) {
             cellItem.add(new Label(componentId, ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 907f647..5d9dbd4 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 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;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
@@ -47,10 +48,8 @@ public class ConnObjectAttrColumn extends AbstractColumn<ConnObjectTO, String> {
             final String componentId,
             final IModel<ConnObjectTO> rowModel) {
 
-        List<String> values = null;
-        if (rowModel.getObject().getAttrMap().containsKey(name)) {
-            values = rowModel.getObject().getAttrMap().get(name).getValues();
-        }
+        AttrTO attr = rowModel.getObject().getAttr(name);
+        List<String> values = attr == null ? null : attr.getValues();
 
         if (values == null || values.isEmpty()) {
             cellItem.add(new Label(componentId, ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 7d3f612..2c75dae 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
@@ -31,6 +31,7 @@ import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.wicket.Component;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
@@ -88,11 +89,10 @@ public class ConnObjectPanel extends Panel {
 
         final Map<String, AttrTO> beforeProfile = connObjectTOs == null || connObjectTOs.getLeft() == null
                 ? null
-                : connObjectTOs.getLeft().getAttrMap();
-
+                : EntityTOUtils.buildAttrMap(connObjectTOs.getLeft().getAttrs());
         final Map<String, AttrTO> afterProfile = connObjectTOs == null || connObjectTOs.getRight() == null
                 ? null
-                : connObjectTOs.getRight().getAttrMap();
+                : EntityTOUtils.buildAttrMap(connObjectTOs.getRight().getAttrs());
 
         final ListView<String> propView = new ListView<String>("propView", formProps) {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
index d4edbf0..012a662 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
 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.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
@@ -83,7 +84,7 @@ public class DerAttrs extends AbstractAttrs<DerSchemaTO> {
 
                     @Override
                     public WebMarkupContainer getPanel(final String panelId) {
-                        return new DerAttrs.DerSchemas(panelId, new ListModel<AttrTO>(getAttrsFromTO(membershipTO)));
+                        return new DerAttrs.DerSchemas(panelId, new ListModel<>(getAttrsFromTO(membershipTO)));
                     }
                 }), Model.of(-1)).setOutputMarkupId(true));
             }
@@ -113,7 +114,7 @@ public class DerAttrs extends AbstractAttrs<DerSchemaTO> {
     protected void setAttrs() {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = anyTO.getDerAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
         for (DerSchemaTO schema : schemas.values()) {
             AttrTO attrTO = new AttrTO();
@@ -133,7 +134,7 @@ public class DerAttrs extends AbstractAttrs<DerSchemaTO> {
     protected void setAttrs(final MembershipTO membershipTO) {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = membershipTO.getDerAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
         for (DerSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
             AttrTO attrTO = new AttrTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 5c1291a..80891cf 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
@@ -37,6 +37,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.EncryptedFieldP
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -142,7 +143,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
     protected void setAttrs() {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
         for (PlainSchemaTO schema : schemas.values()) {
             AttrTO attrTO = new AttrTO();
@@ -167,7 +168,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
     protected void setAttrs(final MembershipTO membershipTO) {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = membershipTO.getPlainAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
         for (PlainSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
             AttrTO attrTO = new AttrTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
index 5a49b88..4b66f0d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
@@ -27,6 +27,7 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accor
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
@@ -117,7 +118,7 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
     protected void setAttrs() {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = anyTO.getVirAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
         for (VirSchemaTO schema : schemas.values()) {
             AttrTO attrTO = new AttrTO();
@@ -139,7 +140,7 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
     protected void setAttrs(final MembershipTO membershipTO) {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = membershipTO.getVirAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
         for (VirSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
             AttrTO attrTO = new AttrTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
index 8b42285..7b2a834 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.enduser.resources;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MediaType;
@@ -31,6 +30,7 @@ import org.apache.syncope.client.enduser.SyncopeEnduserConstants;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.Resource;
 import org.apache.syncope.client.enduser.util.UserRequestValidator;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
@@ -114,11 +114,10 @@ public class UserSelfCreateResource extends BaseUserSelfResource {
                     userTO.getPlainAttrs().removeAll(membAttrs);
 
                     // 2. millis -> Date conversion for PLAIN attributes of USER and its MEMBERSHIPS
-                    Map<String, AttrTO> userPlainAttrMap = userTO.getPlainAttrMap();
                     for (PlainSchemaTO plainSchema : SyncopeEnduserSession.get().getDatePlainSchemas()) {
-                        millisToDate(userPlainAttrMap, plainSchema);
+                        millisToDate(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()), plainSchema);
                         for (MembershipTO membership : userTO.getMemberships()) {
-                            millisToDate(membership.getPlainAttrMap(), plainSchema);
+                            millisToDate(EntityTOUtils.buildAttrMap(membership.getPlainAttrs()), plainSchema);
                         }
                     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
index c4cb6c1..eae1ec7 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
@@ -34,6 +34,7 @@ import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.Resource;
 import org.apache.syncope.client.enduser.model.CustomAttribute;
 import org.apache.syncope.client.enduser.model.CustomAttributesInfo;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
@@ -62,13 +63,12 @@ public class UserSelfReadResource extends BaseUserSelfResource {
             }
 
             UserTO userTO = SerializationUtils.clone(SyncopeEnduserSession.get().getSelfTO());
-            Map<String, AttrTO> userPlainAttrMap = userTO.getPlainAttrMap();
 
             // 1. Date -> millis conversion for PLAIN attributes of USER and its MEMBERSHIPS
             for (PlainSchemaTO plainSchema : SyncopeEnduserSession.get().getDatePlainSchemas()) {
-                dateToMillis(userPlainAttrMap, plainSchema);
+                dateToMillis(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()), plainSchema);
                 for (MembershipTO membership : userTO.getMemberships()) {
-                    dateToMillis(membership.getPlainAttrMap(), plainSchema);
+                    dateToMillis(EntityTOUtils.buildAttrMap(membership.getPlainAttrs()), plainSchema);
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
index 828f323..1e8ede2 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.enduser.resources;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MediaType;
@@ -32,6 +31,7 @@ import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.Resource;
 import org.apache.syncope.client.enduser.util.UserRequestValidator;
 import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
@@ -95,11 +95,10 @@ public class UserSelfUpdateResource extends BaseUserSelfResource {
                 userTO.getPlainAttrs().removeAll(membAttrs);
 
                 // 2. millis -> Date conversion for PLAIN attributes of USER and its MEMBERSHIPS
-                Map<String, AttrTO> userPlainAttrMap = userTO.getPlainAttrMap();
                 for (PlainSchemaTO plainSchema : SyncopeEnduserSession.get().getDatePlainSchemas()) {
-                    millisToDate(userPlainAttrMap, plainSchema);
+                    millisToDate(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()), plainSchema);
                     for (MembershipTO membership : userTO.getMemberships()) {
-                        millisToDate(membership.getPlainAttrMap(), plainSchema);
+                        millisToDate(EntityTOUtils.buildAttrMap(membership.getPlainAttrs()), plainSchema);
                     }
                 }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
index 350ae17..32f5551 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
@@ -23,6 +23,7 @@ import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.enduser.model.CustomAttribute;
 import org.apache.syncope.client.enduser.model.CustomAttributesInfo;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.SchemaType;
@@ -43,11 +44,12 @@ public final class UserRequestValidator {
             return true;
         }
 
-        return validateAttributes(userTO.getPlainAttrMap(), customForm.get(SchemaType.PLAIN.name()), checkDefaultValues)
-                && validateAttributes(userTO.getDerAttrMap(), customForm.get(SchemaType.DERIVED.name()),
-                        checkDefaultValues)
-                && validateAttributes(userTO.getVirAttrMap(), customForm.get(SchemaType.VIRTUAL.name()),
-                        checkDefaultValues);
+        return validateAttributes(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()),
+                customForm.get(SchemaType.PLAIN.name()), checkDefaultValues)
+                && validateAttributes(EntityTOUtils.buildAttrMap(userTO.getDerAttrs()),
+                        customForm.get(SchemaType.DERIVED.name()), checkDefaultValues)
+                && validateAttributes(EntityTOUtils.buildAttrMap(userTO.getVirAttrs()),
+                        customForm.get(SchemaType.VIRTUAL.name()), checkDefaultValues);
     }
 
     private static boolean validateAttributes(final Map<String, AttrTO> attrMap,

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 70d4fd3..d8c021a 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.getPlainAttrMap().get("firstname").getValues().add("notAllowedFirstnameValue");
+        userTO.getPlainAttr("firstname").getValues().add("notAllowedFirstnameValue");
         assertFalse(UserRequestValidator.compliant(userTO, customForm, true));
         assertTrue(UserRequestValidator.compliant(userTO, customForm, false));
         // clean
-        userTO.getPlainAttrMap().get("firstname").getValues().remove("notAllowedFirstnameValue");
+        userTO.getPlainAttr("firstname").getValues().remove("notAllowedFirstnameValue");
 
         // derived must not be present
         AttrTO derivedNotAllowed = attrTO("derivedNotAllowed");

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 1da4df7..69d373e 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
@@ -89,8 +89,8 @@ public final class AnyOperations {
         result.setGroup(updated.getGroupKey());
 
         // 1. plain attributes
-        Map<String, AttrTO> updatedAttrs = new HashMap<>(updated.getPlainAttrMap());
-        Map<String, AttrTO> originalAttrs = new HashMap<>(original.getPlainAttrMap());
+        Map<String, AttrTO> updatedAttrs = EntityTOUtils.buildAttrMap(updated.getPlainAttrs());
+        Map<String, AttrTO> originalAttrs = EntityTOUtils.buildAttrMap(original.getPlainAttrs());
 
         result.getPlainAttrs().clear();
 
@@ -159,8 +159,8 @@ public final class AnyOperations {
         }
 
         // 3. plain attributes
-        Map<String, AttrTO> updatedAttrs = new HashMap<>(updated.getPlainAttrMap());
-        Map<String, AttrTO> originalAttrs = new HashMap<>(original.getPlainAttrMap());
+        Map<String, AttrTO> updatedAttrs = EntityTOUtils.buildAttrMap(updated.getPlainAttrs());
+        Map<String, AttrTO> originalAttrs = EntityTOUtils.buildAttrMap(original.getPlainAttrs());
 
         result.getPlainAttrs().clear();
 
@@ -483,7 +483,7 @@ public final class AnyOperations {
 
         // 2. plain attributes
         result.getPlainAttrs().clear();
-        result.getPlainAttrs().addAll(patch(to.getPlainAttrMap(), patch.getPlainAttrs()));
+        result.getPlainAttrs().addAll(patch(EntityTOUtils.buildAttrMap(to.getPlainAttrs()), patch.getPlainAttrs()));
 
         // 3. virtual attributes
         result.getVirAttrs().clear();
@@ -571,7 +571,7 @@ public final class AnyOperations {
                         }
                     } else {
                         newMembershipTO.getPlainAttrs().addAll(
-                                patch(memb.getPlainAttrMap(), membPatch.getPlainAttrs()));
+                                patch(EntityTOUtils.buildAttrMap(memb.getPlainAttrs()), membPatch.getPlainAttrs()));
                     }
 
                     // 3. virtual attributes
@@ -637,7 +637,7 @@ public final class AnyOperations {
                         }
                     } else {
                         newMembershipTO.getPlainAttrs().addAll(
-                                patch(memb.getPlainAttrMap(), membPatch.getPlainAttrs()));
+                                patch(EntityTOUtils.buildAttrMap(memb.getPlainAttrs()), membPatch.getPlainAttrs()));
                     }
 
                     // 3. virtual attributes

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 001e569..d0c04bc 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
@@ -18,7 +18,11 @@
  */
 package org.apache.syncope.common.lib;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.EntityTO;
 
 public final class EntityTOUtils {
@@ -33,6 +37,15 @@ public final class EntityTOUtils {
         };
     }
 
+    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);
+        }
+
+        return result;
+    }
+
     /**
      * Private default constructor, for static-only classes.
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 47f1d9b..7796b62 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
@@ -22,16 +22,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 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 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 })
@@ -46,7 +45,7 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     private String realm;
 
-    private List<String> dynRealms = new ArrayList<>();
+    private final List<String> dynRealms = new ArrayList<>();
 
     private String status;
 
@@ -118,13 +117,14 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getPlainAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(plainAttrs.size());
-        for (AttrTO attributeTO : plainAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+    public AttrTO getPlainAttr(final String schema) {
+        return IterableUtils.find(plainAttrs, new Predicate<AttrTO>() {
 
-        return Collections.unmodifiableMap(result);
+            @Override
+            public boolean evaluate(final AttrTO object) {
+                return object.getSchema().equals(schema);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "derAttrs")
@@ -137,13 +137,14 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getDerAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(derAttrs.size());
-        for (AttrTO attributeTO : derAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+    public AttrTO getDerAttr(final String schema) {
+        return IterableUtils.find(derAttrs, new Predicate<AttrTO>() {
 
-        return Collections.unmodifiableMap(result);
+            @Override
+            public boolean evaluate(final AttrTO object) {
+                return object.getSchema().equals(schema);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "virAttrs")
@@ -156,13 +157,14 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getVirAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(virAttrs.size());
-        for (AttrTO attributeTO : virAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "resources")

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 da2f7a1..79e57b8 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,20 +18,19 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.util.Map;
 import java.util.Set;
 
 public interface AttributableTO {
 
     Set<AttrTO> getPlainAttrs();
 
-    Map<String, AttrTO> getPlainAttrMap();
+    AttrTO getPlainAttr(String schema);
 
     Set<AttrTO> getDerAttrs();
 
-    Map<String, AttrTO> getDerAttrMap();
+    AttrTO getDerAttr(String schema);
 
     Set<AttrTO> getVirAttrs();
 
-    Map<String, AttrTO> getVirAttrMap();
+    AttrTO getVirAttr(String schema);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 09784c8..6301d68 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
@@ -20,15 +20,14 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
-import java.util.Map;
 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")
@@ -47,12 +46,13 @@ public class ConnObjectTO extends AbstractBaseBean {
     }
 
     @JsonIgnore
-    public Map<String, AttrTO> getAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(attrs.size());
-        for (AttrTO attributeTO : attrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+    public AttrTO getAttr(final String schema) {
+        return IterableUtils.find(attrs, new Predicate<AttrTO>() {
 
-        return Collections.unmodifiableMap(result);
+            @Override
+            public boolean evaluate(final AttrTO object) {
+                return object.getSchema().equals(schema);
+            }
+        });
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 a970dec..5737c7f 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
@@ -20,15 +20,14 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
 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")
@@ -112,13 +111,14 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getPlainAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(plainAttrs.size());
-        for (AttrTO attributeTO : plainAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "derAttrs")
@@ -131,13 +131,14 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getDerAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(derAttrs.size());
-        for (AttrTO attributeTO : derAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "virAttrs")
@@ -150,12 +151,13 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getVirAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(virAttrs.size());
-        for (AttrTO attributeTO : virAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 4521db6..ec97437 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1264,15 +1264,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.plainAttrMap[&quot;firstname&quot;].values[0]} ${user.plainAttrMap[&quot;surname&quot;].values[0]}, welcome to Syncope!
+                textTemplate="Hi ${user.getPlainAttr(&quot;firstname&quot;).values[0]} ${user.getPlainAttr(&quot;surname&quot;).values[0]}, welcome to Syncope!
 
 Your username is ${user.username}.
-Your email address is ${user.plainAttrMap[&quot;email&quot;].values[0]}.
-Your email address inside a link: http://localhost/?email=${user.plainAttrMap[&quot;email&quot;].values[0].replace('@', '%40')}
+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')}
 
 This message was sent to the following recipients:&#10;
 $$ for (recipient: recipients) {&#10;
-  * ${recipient.plainAttrMap[&quot;email&quot;].values[0]}&#10;
+  * ${recipient.getPlainAttr(&quot;email&quot;).values[0]}&#10;
 $$ }&#10;
 &#10;
 because one of the following events occurred:&#10;
@@ -1288,19 +1288,19 @@ $$ }&#10;
 $$ }&#10;"
                 htmlTemplate="&lt;html&gt;
 &lt;body&gt;
-&lt;h3&gt;Hi ${user.plainAttrMap[&quot;firstname&quot;].values[0]} ${user.plainAttrMap[&quot;surname&quot;].values[0]}, welcome to Syncope!&lt;/h3&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;p&gt;
    Your username is ${user.username}.&lt;br/&gt;
-   Your email address is ${user.plainAttrMap[&quot;email&quot;].values[0]}.
-   Your email address inside a &lt;a href=&quot;http://localhost/?email=${user.plainAttrMap[&quot;email&quot;].values[0].replace('@', '%40')}&quot;&gt;link&lt;/a&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;.
 &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.plainAttrMap[&quot;email&quot;].values[0]}&lt;/li&gt;&#10;
+  &lt;li&gt;${recipient.getPlainAttr(&quot;email&quot;).values[0]}&lt;/li&gt;&#10;
 $$ }&#10;
 &lt;/ul&gt;&#10;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 13f19a0..2e213f7 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
@@ -95,7 +95,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
         WorkflowResult<String> created = gwfAdapter.create(groupTO);
 
         // see ConnObjectUtils#getAnyTOFromConnObject for GroupOwnerSchema
-        AttrTO groupOwner = groupTO.getPlainAttrMap().get(StringUtils.EMPTY);
+        AttrTO groupOwner = groupTO.getPlainAttr(StringUtils.EMPTY);
         if (groupOwner != null) {
             groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
index fa558b6..44a4dfa 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.report.GroupReportletConf;
 import org.apache.syncope.common.lib.report.GroupReportletConf.Feature;
@@ -86,7 +87,7 @@ public class GroupReportlet extends AbstractReportlet {
 
         AttributesImpl atts = new AttributesImpl();
         if (!attrs.isEmpty()) {
-            Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
+            Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
             handler.startElement("", "", "attributes", null);
             for (String attrName : attrs) {
@@ -112,7 +113,7 @@ public class GroupReportlet extends AbstractReportlet {
         }
 
         if (!derAttrs.isEmpty()) {
-            Map<String, AttrTO> derAttrMap = anyTO.getDerAttrMap();
+            Map<String, AttrTO> derAttrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
             handler.startElement("", "", "derivedAttributes", null);
             for (String attrName : derAttrs) {
@@ -138,7 +139,7 @@ public class GroupReportlet extends AbstractReportlet {
         }
 
         if (!virAttrs.isEmpty()) {
-            Map<String, AttrTO> virAttrMap = anyTO.getVirAttrMap();
+            Map<String, AttrTO> virAttrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
             handler.startElement("", "", "virtualAttributes", null);
             for (String attrName : virAttrs) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 200f64a..2e4314d 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
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.report.ReportletConf;
 import org.apache.syncope.common.lib.report.UserReportletConf;
@@ -98,7 +99,7 @@ public class UserReportlet extends AbstractReportlet {
 
         AttributesImpl atts = new AttributesImpl();
         if (!attrs.isEmpty()) {
-            Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
+            Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
             handler.startElement("", "", "attributes", null);
             for (String attrName : attrs) {
@@ -124,7 +125,7 @@ public class UserReportlet extends AbstractReportlet {
         }
 
         if (!derAttrs.isEmpty()) {
-            Map<String, AttrTO> derAttrMap = anyTO.getDerAttrMap();
+            Map<String, AttrTO> derAttrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
             handler.startElement("", "", "derivedAttributes", null);
             for (String attrName : derAttrs) {
@@ -150,7 +151,7 @@ public class UserReportlet extends AbstractReportlet {
         }
 
         if (!virAttrs.isEmpty()) {
-            Map<String, AttrTO> virAttrMap = anyTO.getVirAttrMap();
+            Map<String, AttrTO> virAttrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
             handler.startElement("", "", "virtualAttributes", null);
             for (String attrName : virAttrs) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 de0480f..69485e4 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
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.commons.jexl3.MapContext;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -75,7 +76,7 @@ public class TemplateUtils {
             }
         }
 
-        Map<String, AttrTO> currentAttrMap = anyTO.getPlainAttrMap();
+        Map<String, AttrTO> currentAttrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
         for (AttrTO templatePlainAttr : template.getPlainAttrs()) {
             if (!templatePlainAttr.getValues().isEmpty()
                     && (!currentAttrMap.containsKey(templatePlainAttr.getSchema())
@@ -85,14 +86,14 @@ public class TemplateUtils {
             }
         }
 
-        currentAttrMap = anyTO.getDerAttrMap();
+        currentAttrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
         for (AttrTO templateDerAttr : template.getDerAttrs()) {
             if (!currentAttrMap.containsKey(templateDerAttr.getSchema())) {
                 anyTO.getDerAttrs().add(templateDerAttr);
             }
         }
 
-        currentAttrMap = anyTO.getVirAttrMap();
+        currentAttrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
         for (AttrTO templateVirAttr : template.getVirAttrs()) {
             if (!templateVirAttr.getValues().isEmpty()
                     && (!currentAttrMap.containsKey(templateVirAttr.getSchema())

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 37c37d1..cb9177a 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
@@ -111,7 +111,7 @@ public class MailTemplateTest extends AbstractTest {
         ctx.put("input", input);
 
         UserTO recipient = SerializationUtils.clone(user);
-        recipient.getPlainAttrMap().get("email").getValues().set(0, "another@syncope.apache.org");
+        recipient.getPlainAttr("email").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/9ec5f834/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 7a66c3d..0574d82 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
@@ -87,16 +87,16 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         AttrTO result;
         switch (schemaType) {
             case DERIVED:
-                result = any.getDerAttrMap().get(schema);
+                result = any.getDerAttr(schema);
                 break;
 
             case VIRTUAL:
-                result = any.getVirAttrMap().get(schema);
+                result = any.getVirAttr(schema);
                 break;
 
             case PLAIN:
             default:
-                result = any.getPlainAttrMap().get(schema);
+                result = any.getPlainAttr(schema);
         }
 
         if (result == null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 8193e3e..612844b 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
@@ -72,7 +72,7 @@ public class CreateProducer extends AbstractProducer {
 
                 if (actual instanceof GroupTO && isPull()) {
                     Map<String, String> groupOwnerMap = exchange.getProperty("groupOwnerMap", Map.class);
-                    AttrTO groupOwner = ((GroupTO) actual).getPlainAttrMap().get(StringUtils.EMPTY);
+                    AttrTO groupOwner = ((GroupTO) actual).getPlainAttr(StringUtils.EMPTY);
                     if (groupOwner != null) {
                         groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next());
                     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 95325a9..ffd55b1 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
@@ -67,10 +67,10 @@ public class AnyObjectITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_DBSCRIPTED, anyObjectTO.getType(), anyObjectTO.getKey());
         assertNotNull(connObjectTO);
-        assertNotNull(connObjectTO.getAttrMap().get("LOCATION"));
+        assertNotNull(connObjectTO.getAttr("LOCATION"));
         assertEquals(
-                anyObjectTO.getPlainAttrMap().get("location").getValues(),
-                connObjectTO.getAttrMap().get("LOCATION").getValues());
+                anyObjectTO.getPlainAttr("location").getValues(),
+                connObjectTO.getAttr("LOCATION").getValues());
     }
 
     @Test
@@ -123,8 +123,8 @@ public class AnyObjectITCase extends AbstractITCase {
     public void list() {
         PagedResult<AnyObjectTO> anyObjectTOs = anyObjectService.search(
                 new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").query()).
-                build());
+                        fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").query()).
+                        build());
         assertNotNull(anyObjectTOs);
         assertTrue(anyObjectTOs.getResult().size() >= 2);
         for (AnyObjectTO anyObjectTO : anyObjectTOs.getResult()) {
@@ -154,7 +154,7 @@ public class AnyObjectITCase extends AbstractITCase {
 
         anyObjectTO = updateAnyObject(anyObjectPatch).getEntity();
 
-        assertEquals(newLocation, anyObjectTO.getPlainAttrMap().get("location").getValues().get(0));
+        assertEquals(newLocation, anyObjectTO.getPlainAttr("location").getValues().get(0));
     }
 
     @Test
@@ -167,7 +167,7 @@ public class AnyObjectITCase extends AbstractITCase {
         assertEquals(anyObjectTO.getPlainAttrs(), attrs);
 
         AttrTO location = anyObjectService.read(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
-        assertEquals(anyObjectTO.getPlainAttrMap().get("location"), location);
+        assertEquals(anyObjectTO.getPlainAttr("location"), location);
     }
 
     @Test
@@ -190,7 +190,7 @@ public class AnyObjectITCase extends AbstractITCase {
         AnyObjectTO anyObjectTO = getSampleTO("deleteAttr");
         anyObjectTO = createAnyObject(anyObjectTO).getEntity();
         assertNotNull(anyObjectTO);
-        assertNotNull(anyObjectTO.getPlainAttrMap().get("location"));
+        assertNotNull(anyObjectTO.getPlainAttr("location"));
 
         anyObjectService.delete(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 55d0cd3..50fa799 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
@@ -278,7 +278,7 @@ public class AuthenticationITCase extends AbstractITCase {
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
             }).getEntity();
-            assertEquals("surname", user.getPlainAttrMap().get("surname").getValues().get(0));
+            assertEquals("surname", user.getPlainAttr("surname").getValues().get(0));
 
             // 5. as delegated, update user attempting to move under realm / -> fail
             UserPatch userPatch = new UserPatch();
@@ -301,7 +301,7 @@ public class AuthenticationITCase extends AbstractITCase {
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
             }).getEntity();
-            assertEquals("surname2", user.getPlainAttrMap().get("surname").getValues().get(0));
+            assertEquals("surname2", user.getPlainAttr("surname").getValues().get(0));
 
             // 7. as delegated, delete user
             delegatedUserService.delete(user.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 66fbcc1..4f4f475 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
@@ -120,7 +120,7 @@ public class CamelRouteITCase extends AbstractITCase {
                 + "    </setProperty>\n"
                 + "    <setBody>\n"
                 + "     <groovy>\n"
-                + "request.body.getPlainAttrMap().get(\"camelAttribute\").getValues().set(0,\"true\")\n"
+                + "request.body.getPlainAttr(\"camelAttribute\").getValues().set(0,\"true\")\n"
                 + "       return request.body\n"
                 + "     </groovy>\n"
                 + "    </setBody>\n"
@@ -165,7 +165,7 @@ public class CamelRouteITCase extends AbstractITCase {
 
             userTO = createUser(userTO).getEntity();
             assertNotNull(userTO);
-            assertEquals("true", userTO.getPlainAttrMap().get("camelAttribute").getValues().get(0));
+            assertEquals("true", userTO.getPlainAttr("camelAttribute").getValues().get(0));
         } finally {
             doUpdate(oldRoute.getKey(), oldRoute.getContent());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 caf1623..88d08f9 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
@@ -210,7 +210,7 @@ public class DynRealmITCase extends AbstractITCase {
                     readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
                     }).getEntity();
             assertNotNull(group);
-            assertEquals("modified", group.getPlainAttrMap().get("icon").getValues().get(0));
+            assertEquals("modified", group.getPlainAttr("icon").getValues().get(0));
         } finally {
             if (role != null) {
                 roleService.delete(role.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 1d8c528..3dff239 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
@@ -44,6 +44,7 @@ import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.AnyOperations;
+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.AnyObjectPatch;
@@ -119,17 +120,16 @@ public class GroupITCase extends AbstractITCase {
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
 
-        assertNotNull(groupTO.getVirAttrMap());
-        assertNotNull(groupTO.getVirAttrMap().get("rvirtualdata").getValues());
-        assertFalse(groupTO.getVirAttrMap().get("rvirtualdata").getValues().isEmpty());
-        assertEquals("rvirtualvalue", groupTO.getVirAttrMap().get("rvirtualdata").getValues().get(0));
+        assertNotNull(groupTO.getVirAttr("rvirtualdata").getValues());
+        assertFalse(groupTO.getVirAttr("rvirtualdata").getValues().isEmpty());
+        assertEquals("rvirtualvalue", groupTO.getVirAttr("rvirtualdata").getValues().get(0));
 
         assertTrue(groupTO.getResources().contains(RESOURCE_NAME_LDAP));
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), groupTO.getKey());
         assertNotNull(connObjectTO);
-        assertNotNull(connObjectTO.getAttrMap().get("owner"));
+        assertNotNull(connObjectTO.getAttr("owner"));
 
         // SYNCOPE-515: remove ownership
         GroupPatch groupPatch = new GroupPatch();
@@ -240,12 +240,12 @@ public class GroupITCase extends AbstractITCase {
         assertEquals(modName, groupTO.getName());
         assertEquals(2, groupTO.getPlainAttrs().size());
 
-        groupTO.getPlainAttrMap().get("show").getValues().clear();
+        groupTO.getPlainAttr("show").getValues().clear();
 
         groupTO = groupService.update(groupTO).readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
         }).getEntity();
 
-        assertFalse(groupTO.getPlainAttrMap().containsKey("show"));
+        assertNull(groupTO.getPlainAttr("show"));
     }
 
     @Test
@@ -269,7 +269,7 @@ public class GroupITCase extends AbstractITCase {
         GroupPatch patch = AnyOperations.diff(updated, original, true);
         GroupTO group = updateGroup(patch).getEntity();
 
-        Map<String, AttrTO> attrs = group.getPlainAttrMap();
+        Map<String, AttrTO> attrs = EntityTOUtils.buildAttrMap(group.getPlainAttrs());
         assertFalse(attrs.containsKey("icon"));
         assertFalse(attrs.containsKey("show"));
         assertEquals(Collections.singletonList("sx"), attrs.get("rderived_sx").getValues());
@@ -574,10 +574,10 @@ public class GroupITCase extends AbstractITCase {
 
         // 2. create a group *without* an attribute for that schema: it works
         GroupTO groupTO = getSampleTO("lastGroup");
-        assertFalse(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
+        assertNull(groupTO.getPlainAttr(badge.getKey()));
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
-        assertFalse(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
+        assertNull(groupTO.getPlainAttr(badge.getKey()));
 
         // 3. add the new mandatory schema to the default group type
         AnyTypeTO type = anyTypeService.read(AnyTypeKind.GROUP.name());
@@ -605,7 +605,7 @@ public class GroupITCase extends AbstractITCase {
 
             groupTO = updateGroup(groupPatch).getEntity();
             assertNotNull(groupTO);
-            assertTrue(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
+            assertNotNull(groupTO.getPlainAttr(badge.getKey()));
         } finally {
             // restore the original group class
             typeClass.getPlainSchemas().remove(badge.getKey());
@@ -669,7 +669,7 @@ public class GroupITCase extends AbstractITCase {
         AnyObjectTO newAny = AnyObjectITCase.getSampleTO("aDynMembership");
         newAny.getResources().clear();
         newAny = createAnyObject(newAny).getEntity();
-        assertNotNull(newAny.getPlainAttrMap().get("location"));
+        assertNotNull(newAny.getPlainAttr("location"));
         assertTrue(anyObjectService.read(
                 "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynGroups().contains(group.getKey()));
         assertTrue(anyObjectService.read(
@@ -697,7 +697,7 @@ public class GroupITCase extends AbstractITCase {
                 attrTO(new AttrTO.Builder().schema("location").build()).
                 build());
         newAny = updateAnyObject(anyPatch).getEntity();
-        assertNull(newAny.getPlainAttrMap().get("location"));
+        assertNull(newAny.getPlainAttr("location"));
         assertFalse(anyObjectService.read(
                 "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynGroups().contains(group.getKey()));
         assertFalse(anyObjectService.read(
@@ -1036,7 +1036,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.23", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
 
         // 3. update schema, set conversion pattern
         schema = schemaService.read(SchemaType.PLAIN, schema.getKey());
@@ -1046,7 +1046,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.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.230", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
 
         // 5. modify group with new double value
         GroupPatch patch = new GroupPatch();
@@ -1055,7 +1055,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = updateGroup(patch).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.257", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.257", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
 
         // 6. update schema, unset conversion pattern
         schema.setConversionPattern(null);
@@ -1068,7 +1068,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = updateGroup(patch).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.23", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 74a78d3..e150bb2 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,6 +21,7 @@ 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;
 
@@ -74,7 +75,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.getPlainAttrMap().get("ctype"));
+        user.getPlainAttrs().remove(user.getPlainAttr("ctype"));
 
         // the group 034740a9-fa10-453b-af37-dc7897e98fb1 has USER type extensions for 'csv' and 'other' 
         // any type classes
@@ -107,19 +108,19 @@ public class MembershipITCase extends AbstractITCase {
             user = createUser(user).getEntity();
 
             // 1. verify that 'aLong' is correctly populated for user
-            assertEquals(1, user.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1976", user.getPlainAttrMap().get("aLong").getValues().get(0));
+            assertEquals(1, user.getPlainAttr("aLong").getValues().size());
+            assertEquals("1976", user.getPlainAttr("aLong").getValues().get(0));
 
             // 2. verify that 'aLong' is correctly populated for user's membership
             assertEquals(1, user.getMemberships().size());
             membership = user.getMembershipMap().get("034740a9-fa10-453b-af37-dc7897e98fb1");
             assertNotNull(membership);
-            assertEquals(1, membership.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1977", membership.getPlainAttrMap().get("aLong").getValues().get(0));
+            assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
+            assertEquals("1977", membership.getPlainAttr("aLong").getValues().get(0));
 
             // 3. verify that derived attrbutes from 'csv' and 'other' are also populated for user's membership
-            assertFalse(membership.getDerAttrMap().get("csvuserid").getValues().isEmpty());
-            assertFalse(membership.getDerAttrMap().get("noschema").getValues().isEmpty());
+            assertFalse(membership.getDerAttr("csvuserid").getValues().isEmpty());
+            assertFalse(membership.getDerAttr("noschema").getValues().isEmpty());
 
             // update user - change some values and add new membership attribute
             UserPatch userPatch = new UserPatch();
@@ -138,19 +139,19 @@ public class MembershipITCase extends AbstractITCase {
             user = updateUser(userPatch).getEntity();
 
             // 4. verify that 'aLong' is correctly populated for user
-            assertEquals(1, user.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1977", user.getPlainAttrMap().get("aLong").getValues().get(0));
-            assertFalse(user.getPlainAttrMap().containsKey("ctype"));
+            assertEquals(1, user.getPlainAttr("aLong").getValues().size());
+            assertEquals("1977", user.getPlainAttr("aLong").getValues().get(0));
+            assertNull(user.getPlainAttr("ctype"));
 
             // 5. verify that 'aLong' is correctly populated for user's membership
             assertEquals(1, user.getMemberships().size());
             membership = user.getMembershipMap().get("034740a9-fa10-453b-af37-dc7897e98fb1");
             assertNotNull(membership);
-            assertEquals(1, membership.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1976", membership.getPlainAttrMap().get("aLong").getValues().get(0));
+            assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
+            assertEquals("1976", membership.getPlainAttr("aLong").getValues().get(0));
 
             // 6. verify that 'ctype' is correctly populated for user's membership
-            assertEquals("membership type", membership.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("membership type", membership.getPlainAttr("ctype").getValues().get(0));
 
             // finally remove membership
             userPatch = new UserPatch();
@@ -212,12 +213,12 @@ public class MembershipITCase extends AbstractITCase {
         assertEquals(1, user.getMemberships().size());
         membership = user.getMembershipMap().get(groupTO.getKey());
         assertNotNull(membership);
-        assertEquals(1, membership.getPlainAttrMap().get("aLong").getValues().size());
-        assertEquals("1454", membership.getPlainAttrMap().get("aLong").getValues().get(0));
+        assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
+        assertEquals("1454", membership.getPlainAttr("aLong").getValues().get(0));
 
         // verify that derived attrbutes from 'csv' and 'other' are also populated for user's membership
-        assertFalse(membership.getDerAttrMap().get("csvuserid").getValues().isEmpty());
-        assertFalse(membership.getDerAttrMap().get("noschema").getValues().isEmpty());
+        assertFalse(membership.getDerAttr("csvuserid").getValues().isEmpty());
+        assertFalse(membership.getDerAttr("noschema").getValues().isEmpty());
 
         // now remove the group -> all related memberships should have been removed as well
         groupService.delete(groupTO.getKey());
@@ -264,7 +265,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.getPlainAttrMap().get("ctype"));
+            user.getPlainAttrs().remove(user.getPlainAttr("ctype"));
             user.getResources().clear();
             user.getResources().add(newResource.getKey());
 
@@ -310,7 +311,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).
-                    getPlainAttrMap().get("aLong").getValues().get(0));
+                    getPlainAttr("aLong").getValues().get(0));
         } catch (Exception e) {
             LOG.error("Unexpected error", e);
             fail(e.getMessage());

http://git-wip-us.apache.org/repos/asf/syncope/blob/9ec5f834/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 ed8d0df..9017a9b 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
@@ -518,8 +518,8 @@ public class MigrationITCase extends AbstractTaskITCase {
         assertEquals("/" + MIGRATION_REALM, group.getRealm());
 
         // 4a. user plain attrs
-        assertEquals("Gioacchino", user.getPlainAttrMap().get("firstname").getValues().get(0));
-        assertEquals("Rossini", user.getPlainAttrMap().get("surname").getValues().get(0));
+        assertEquals("Gioacchino", user.getPlainAttr("firstname").getValues().get(0));
+        assertEquals("Rossini", user.getPlainAttr("surname").getValues().get(0));
 
         // 4b. user resources
         assertTrue(user.getResources().contains(RESOURCE_NAME_TESTDB2));
@@ -528,7 +528,7 @@ public class MigrationITCase extends AbstractTaskITCase {
         assertNotNull(clientFactory.create("bellini12", ADMIN_PWD).self());
 
         // 4d. group plain attrs
-        assertEquals("r12", group.getPlainAttrMap().get("title").getValues().get(0));
+        assertEquals("r12", group.getPlainAttr("title").getValues().get(0));
 
         // 4e. group resources
         assertTrue(group.getResources().contains(RESOURCE_NAME_CSV));


[2/4] syncope git commit: [SYNCOPE-1106] Removed methods returning Map, added methods for getting attribute for specific schema

Posted by il...@apache.org.
[SYNCOPE-1106] Removed methods returning Map, added methods for getting attribute for specific schema


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

Branch: refs/heads/2_0_X
Commit: 31cffd4ec3fc6ba0b4ca1a96732299be7d585bab
Parents: ee453d6
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Mon Jun 12 11:43:03 2017 +0200
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Mon Jun 12 11:43:03 2017 +0200

----------------------------------------------------------------------
 .../commons/SortableAnyProviderComparator.java  | 20 ++----
 .../console/commons/status/StatusUtils.java     | 14 +---
 .../syncope/client/console/panels/Realm.java    | 22 +++---
 .../html/repeater/data/table/AttrColumn.java    | 17 +++--
 .../data/table/ConnObjectAttrColumn.java        |  7 +-
 .../console/wizards/any/ConnObjectPanel.java    |  6 +-
 .../client/console/wizards/any/DerAttrs.java    |  7 +-
 .../client/console/wizards/any/PlainAttrs.java  |  5 +-
 .../client/console/wizards/any/VirAttrs.java    |  5 +-
 .../resources/UserSelfCreateResource.java       |  7 +-
 .../enduser/resources/UserSelfReadResource.java |  6 +-
 .../resources/UserSelfUpdateResource.java       |  7 +-
 .../enduser/util/UserRequestValidator.java      | 12 ++--
 .../enduser/util/UserRequestValidatorTest.java  |  4 +-
 .../syncope/common/lib/AnyOperations.java       | 14 ++--
 .../syncope/common/lib/EntityTOUtils.java       | 13 ++++
 .../org/apache/syncope/common/lib/to/AnyTO.java | 48 ++++++-------
 .../syncope/common/lib/to/AttributableTO.java   |  7 +-
 .../syncope/common/lib/to/ConnObjectTO.java     | 18 ++---
 .../syncope/common/lib/to/MembershipTO.java     | 50 +++++++-------
 .../test/resources/domains/MasterContent.xml    | 16 ++---
 .../java/DefaultGroupProvisioningManager.java   |  2 +-
 .../java/job/report/GroupReportlet.java         |  7 +-
 .../java/job/report/UserReportlet.java          |  7 +-
 .../provisioning/java/utils/TemplateUtils.java  |  7 +-
 .../provisioning/java/MailTemplateTest.java     |  2 +-
 .../rest/cxf/service/AbstractAnyService.java    |  6 +-
 .../camel/producer/CreateProducer.java          |  2 +-
 .../syncope/fit/core/AnyObjectITCase.java       | 16 ++---
 .../syncope/fit/core/AuthenticationITCase.java  |  4 +-
 .../syncope/fit/core/CamelRouteITCase.java      |  4 +-
 .../apache/syncope/fit/core/DynRealmITCase.java |  2 +-
 .../apache/syncope/fit/core/GroupITCase.java    | 34 +++++-----
 .../syncope/fit/core/MembershipITCase.java      | 39 +++++------
 .../syncope/fit/core/MigrationITCase.java       |  6 +-
 .../syncope/fit/core/PropagationTaskITCase.java |  8 +--
 .../apache/syncope/fit/core/PullTaskITCase.java | 71 ++++++++++----------
 .../apache/syncope/fit/core/ResourceITCase.java |  3 +-
 .../org/apache/syncope/fit/core/UserITCase.java | 29 ++++----
 .../syncope/fit/core/UserIssuesITCase.java      | 69 +++++++++----------
 .../apache/syncope/fit/core/UserSelfITCase.java |  2 +-
 .../apache/syncope/fit/core/VirAttrITCase.java  | 48 ++++++-------
 42 files changed, 336 insertions(+), 337 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 52087f7..0eb370d 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
@@ -21,7 +21,6 @@ package org.apache.syncope.client.console.commons;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Set;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -54,18 +53,11 @@ public class SortableAnyProviderComparator<T extends AnyTO> extends SortableData
 
         private static final long serialVersionUID = -7856686374020091808L;
 
-        private final Map<String, AttrTO> plainAttrs;
-
-        private final Map<String, AttrTO> derAttrs;
-
-        private final Map<String, AttrTO> virAttrs;
+        private final AnyTO anyTO;
 
         AttrModel(final AnyTO anyTO) {
             super();
-
-            this.plainAttrs = anyTO.getPlainAttrMap();
-            this.derAttrs = anyTO.getDerAttrMap();
-            this.virAttrs = anyTO.getVirAttrMap();
+            this.anyTO = anyTO;
         }
 
         /**
@@ -91,20 +83,20 @@ public class SortableAnyProviderComparator<T extends AnyTO> extends SortableData
 
             final AttrTO attr;
             if (schemaType == null) {
-                attr = this.plainAttrs.get(schema);
+                attr = this.anyTO.getPlainAttr(schema);
             } else {
                 switch (schemaType) {
                     case PLAIN:
                     default:
-                        attr = this.plainAttrs.get(schema);
+                        attr = this.anyTO.getPlainAttr(schema);
                         break;
 
                     case DERIVED:
-                        attr = this.derAttrs.get(schema);
+                        attr = this.anyTO.getDerAttr(schema);
                         break;
 
                     case VIRTUAL:
-                        attr = this.virAttrs.get(schema);
+                        attr = this.anyTO.getVirAttr(schema);
                         break;
                 }
             }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 baf5b9b..6da9246 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
@@ -21,9 +21,7 @@ package org.apache.syncope.client.console.commons.status;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.commons.ConnIdSpecialName;
 import org.apache.syncope.client.console.commons.Constants;
@@ -113,22 +111,14 @@ public class StatusUtils implements Serializable {
     }
 
     private Boolean isEnabled(final ConnObjectTO objectTO) {
-        final Map<String, AttrTO> attributeTOs = objectTO.getAttrMap();
-
-        final AttrTO status = attributeTOs.get(ConnIdSpecialName.ENABLE);
-
+        final AttrTO status = objectTO.getAttr(ConnIdSpecialName.ENABLE);
         return status != null && status.getValues() != null && !status.getValues().isEmpty()
                 ? Boolean.valueOf(status.getValues().get(0))
                 : Boolean.FALSE;
     }
 
     private String getConnObjectLink(final ConnObjectTO objectTO) {
-        final Map<String, AttrTO> attributeTOs = objectTO == null
-                ? Collections.<String, AttrTO>emptyMap()
-                : objectTO.getAttrMap();
-
-        final AttrTO name = attributeTOs.get(ConnIdSpecialName.NAME);
-
+        final AttrTO name = objectTO == null ? null : objectTO.getAttr(ConnIdSpecialName.NAME);
         return name != null && name.getValues() != null && !name.getValues().isEmpty()
                 ? name.getValues().get(0)
                 : null;

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 615b393..e6d57cd 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
@@ -25,8 +25,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.collections4.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.commons.lang3.tuple.Triple;
@@ -85,8 +83,8 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
 
         setPageRef(pageRef);
 
-        AjaxBootstrapTabbedPanel<ITab> tabbedPanel
-                = new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
+        AjaxBootstrapTabbedPanel<ITab> tabbedPanel =
+                new AjaxBootstrapTabbedPanel<>("tabbedPanel", buildTabList(pageRef));
         tabbedPanel.setSelectedTab(selectedIndex);
         addInnerObject(tabbedPanel);
         this.wizardBuilder = new RealmWizardBuilder(pageRef);
@@ -167,15 +165,15 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
             }
         });
 
-        final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo
-                = FormLayoutInfoUtils.fetch(anyTypeTOs);
+        final Triple<UserFormLayoutInfo, GroupFormLayoutInfo, Map<String, AnyObjectFormLayoutInfo>> formLayoutInfo =
+                FormLayoutInfoUtils.fetch(anyTypeTOs);
 
         Collections.sort(anyTypeTOs, new AnyTypeComparator());
         for (final AnyTypeTO anyTypeTO : anyTypeTOs) {
             tabs.add(new ITabComponent(
                     new Model<>(anyTypeTO.getKey()),
                     AnyTypeKind.GROUP.name().equals(anyTypeTO.getKey())
-                    ? null : new String[]{String.format("%s_SEARCH", anyTypeTO.getKey())}) {
+                    ? null : new String[] { String.format("%s_SEARCH", anyTypeTO.getKey()) }) {
 
                 private static final long serialVersionUID = 1169585538404171118L;
 
@@ -223,12 +221,12 @@ public abstract class Realm extends WizardMgtPanel<RealmTO> {
                 if ("afterObj".equalsIgnoreCase(key)) {
                     ConnObjectTO afterObj = bean.getAfterObj();
                     String remoteId = afterObj == null
-                            || MapUtils.isEmpty(afterObj.getAttrMap())
-                            || !afterObj.getAttrMap().containsKey(ConnIdSpecialName.NAME)
-                            || CollectionUtils.isEmpty(afterObj.getAttrMap().get(ConnIdSpecialName.NAME).getValues())
+                            || afterObj.getAttrs().isEmpty()
+                            || afterObj.getAttr(ConnIdSpecialName.NAME) == null
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).getValues() == null
+                            || afterObj.getAttr(ConnIdSpecialName.NAME).getValues().isEmpty()
                             ? StringUtils.EMPTY
-                            : afterObj.getAttrMap().get(ConnIdSpecialName.NAME).getValues().
-                            iterator().next();
+                            : afterObj.getAttr(ConnIdSpecialName.NAME).getValues().get(0);
 
                     return new Label("field", remoteId);
                 } else if ("status".equalsIgnoreCase(key)) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 b756a05..1341791 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
@@ -19,6 +19,7 @@
 package org.apache.syncope.client.console.wicket.extensions.markup.html.repeater.data.table;
 
 import java.util.List;
+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;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
@@ -50,27 +51,25 @@ public class AttrColumn<T extends AttributableTO> extends AbstractColumn<T, Stri
 
         List<String> values = null;
 
+        AttrTO attr = null;
         switch (schemaType) {
             case PLAIN:
-                if (rowModel.getObject().getPlainAttrMap().containsKey(name)) {
-                    values = rowModel.getObject().getPlainAttrMap().get(name).getValues();
-                }
+                attr = rowModel.getObject().getPlainAttr(name);
                 break;
 
             case DERIVED:
-                if (rowModel.getObject().getDerAttrMap().containsKey(name)) {
-                    values = rowModel.getObject().getDerAttrMap().get(name).getValues();
-                }
+                attr = rowModel.getObject().getDerAttr(name);
                 break;
 
             case VIRTUAL:
-                if (rowModel.getObject().getVirAttrMap().containsKey(name)) {
-                    values = rowModel.getObject().getVirAttrMap().get(name).getValues();
-                }
+                attr = rowModel.getObject().getVirAttr(name);
                 break;
 
             default:
         }
+        if (attr != null) {
+            values = attr.getValues();
+        }
 
         if (values == null || values.isEmpty()) {
             cellItem.add(new Label(componentId, ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 907f647..5d9dbd4 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 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;
 import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn;
@@ -47,10 +48,8 @@ public class ConnObjectAttrColumn extends AbstractColumn<ConnObjectTO, String> {
             final String componentId,
             final IModel<ConnObjectTO> rowModel) {
 
-        List<String> values = null;
-        if (rowModel.getObject().getAttrMap().containsKey(name)) {
-            values = rowModel.getObject().getAttrMap().get(name).getValues();
-        }
+        AttrTO attr = rowModel.getObject().getAttr(name);
+        List<String> values = attr == null ? null : attr.getValues();
 
         if (values == null || values.isEmpty()) {
             cellItem.add(new Label(componentId, ""));

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 7d3f612..2c75dae 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
@@ -31,6 +31,7 @@ import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.wicket.Component;
 import org.apache.wicket.behavior.Behavior;
 import org.apache.wicket.markup.ComponentTag;
@@ -88,11 +89,10 @@ public class ConnObjectPanel extends Panel {
 
         final Map<String, AttrTO> beforeProfile = connObjectTOs == null || connObjectTOs.getLeft() == null
                 ? null
-                : connObjectTOs.getLeft().getAttrMap();
-
+                : EntityTOUtils.buildAttrMap(connObjectTOs.getLeft().getAttrs());
         final Map<String, AttrTO> afterProfile = connObjectTOs == null || connObjectTOs.getRight() == null
                 ? null
-                : connObjectTOs.getRight().getAttrMap();
+                : EntityTOUtils.buildAttrMap(connObjectTOs.getRight().getAttrs());
 
         final ListView<String> propView = new ListView<String>("propView", formProps) {
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
index d4edbf0..012a662 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/DerAttrs.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accordion;
 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.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.DerSchemaTO;
@@ -83,7 +84,7 @@ public class DerAttrs extends AbstractAttrs<DerSchemaTO> {
 
                     @Override
                     public WebMarkupContainer getPanel(final String panelId) {
-                        return new DerAttrs.DerSchemas(panelId, new ListModel<AttrTO>(getAttrsFromTO(membershipTO)));
+                        return new DerAttrs.DerSchemas(panelId, new ListModel<>(getAttrsFromTO(membershipTO)));
                     }
                 }), Model.of(-1)).setOutputMarkupId(true));
             }
@@ -113,7 +114,7 @@ public class DerAttrs extends AbstractAttrs<DerSchemaTO> {
     protected void setAttrs() {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = anyTO.getDerAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
         for (DerSchemaTO schema : schemas.values()) {
             AttrTO attrTO = new AttrTO();
@@ -133,7 +134,7 @@ public class DerAttrs extends AbstractAttrs<DerSchemaTO> {
     protected void setAttrs(final MembershipTO membershipTO) {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = membershipTO.getDerAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
         for (DerSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
             AttrTO attrTO = new AttrTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 5c1291a..80891cf 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
@@ -37,6 +37,7 @@ import org.apache.syncope.client.console.wicket.markup.html.form.EncryptedFieldP
 import org.apache.syncope.client.console.wicket.markup.html.form.FieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
@@ -142,7 +143,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
     protected void setAttrs() {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
         for (PlainSchemaTO schema : schemas.values()) {
             AttrTO attrTO = new AttrTO();
@@ -167,7 +168,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
     protected void setAttrs(final MembershipTO membershipTO) {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = membershipTO.getPlainAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
         for (PlainSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
             AttrTO attrTO = new AttrTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
index 5a49b88..4b66f0d 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/VirAttrs.java
@@ -27,6 +27,7 @@ import org.apache.syncope.client.console.wicket.markup.html.bootstrap.tabs.Accor
 import org.apache.syncope.client.console.wicket.markup.html.form.AjaxTextFieldPanel;
 import org.apache.syncope.client.console.wicket.markup.html.form.MultiFieldPanel;
 import org.apache.syncope.client.console.wizards.AjaxWizard;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
@@ -117,7 +118,7 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
     protected void setAttrs() {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = anyTO.getVirAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
         for (VirSchemaTO schema : schemas.values()) {
             AttrTO attrTO = new AttrTO();
@@ -139,7 +140,7 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
     protected void setAttrs(final MembershipTO membershipTO) {
         List<AttrTO> attrs = new ArrayList<>();
 
-        Map<String, AttrTO> attrMap = membershipTO.getVirAttrMap();
+        Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
         for (VirSchemaTO schema : membershipSchemas.get(membershipTO.getGroupKey()).values()) {
             AttrTO attrTO = new AttrTO();

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
index 8b42285..7b2a834 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfCreateResource.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.enduser.resources;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MediaType;
@@ -31,6 +30,7 @@ import org.apache.syncope.client.enduser.SyncopeEnduserConstants;
 import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.Resource;
 import org.apache.syncope.client.enduser.util.UserRequestValidator;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
@@ -114,11 +114,10 @@ public class UserSelfCreateResource extends BaseUserSelfResource {
                     userTO.getPlainAttrs().removeAll(membAttrs);
 
                     // 2. millis -> Date conversion for PLAIN attributes of USER and its MEMBERSHIPS
-                    Map<String, AttrTO> userPlainAttrMap = userTO.getPlainAttrMap();
                     for (PlainSchemaTO plainSchema : SyncopeEnduserSession.get().getDatePlainSchemas()) {
-                        millisToDate(userPlainAttrMap, plainSchema);
+                        millisToDate(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()), plainSchema);
                         for (MembershipTO membership : userTO.getMemberships()) {
-                            millisToDate(membership.getPlainAttrMap(), plainSchema);
+                            millisToDate(EntityTOUtils.buildAttrMap(membership.getPlainAttrs()), plainSchema);
                         }
                     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
index c4cb6c1..eae1ec7 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfReadResource.java
@@ -34,6 +34,7 @@ import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.Resource;
 import org.apache.syncope.client.enduser.model.CustomAttribute;
 import org.apache.syncope.client.enduser.model.CustomAttributesInfo;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
@@ -62,13 +63,12 @@ public class UserSelfReadResource extends BaseUserSelfResource {
             }
 
             UserTO userTO = SerializationUtils.clone(SyncopeEnduserSession.get().getSelfTO());
-            Map<String, AttrTO> userPlainAttrMap = userTO.getPlainAttrMap();
 
             // 1. Date -> millis conversion for PLAIN attributes of USER and its MEMBERSHIPS
             for (PlainSchemaTO plainSchema : SyncopeEnduserSession.get().getDatePlainSchemas()) {
-                dateToMillis(userPlainAttrMap, plainSchema);
+                dateToMillis(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()), plainSchema);
                 for (MembershipTO membership : userTO.getMemberships()) {
-                    dateToMillis(membership.getPlainAttrMap(), plainSchema);
+                    dateToMillis(EntityTOUtils.buildAttrMap(membership.getPlainAttrs()), plainSchema);
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
index 828f323..1e8ede2 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/resources/UserSelfUpdateResource.java
@@ -19,7 +19,6 @@
 package org.apache.syncope.client.enduser.resources;
 
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.MediaType;
@@ -32,6 +31,7 @@ import org.apache.syncope.client.enduser.SyncopeEnduserSession;
 import org.apache.syncope.client.enduser.annotations.Resource;
 import org.apache.syncope.client.enduser.util.UserRequestValidator;
 import org.apache.syncope.common.lib.AnyOperations;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.MembershipTO;
 import org.apache.syncope.common.lib.to.PlainSchemaTO;
@@ -95,11 +95,10 @@ public class UserSelfUpdateResource extends BaseUserSelfResource {
                 userTO.getPlainAttrs().removeAll(membAttrs);
 
                 // 2. millis -> Date conversion for PLAIN attributes of USER and its MEMBERSHIPS
-                Map<String, AttrTO> userPlainAttrMap = userTO.getPlainAttrMap();
                 for (PlainSchemaTO plainSchema : SyncopeEnduserSession.get().getDatePlainSchemas()) {
-                    millisToDate(userPlainAttrMap, plainSchema);
+                    millisToDate(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()), plainSchema);
                     for (MembershipTO membership : userTO.getMemberships()) {
-                        millisToDate(membership.getPlainAttrMap(), plainSchema);
+                        millisToDate(EntityTOUtils.buildAttrMap(membership.getPlainAttrs()), plainSchema);
                     }
                 }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
----------------------------------------------------------------------
diff --git a/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java b/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
index 350ae17..32f5551 100644
--- a/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
+++ b/client/enduser/src/main/java/org/apache/syncope/client/enduser/util/UserRequestValidator.java
@@ -23,6 +23,7 @@ import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
 import org.apache.syncope.client.enduser.model.CustomAttribute;
 import org.apache.syncope.client.enduser.model.CustomAttributesInfo;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.UserTO;
 import org.apache.syncope.common.lib.types.SchemaType;
@@ -43,11 +44,12 @@ public final class UserRequestValidator {
             return true;
         }
 
-        return validateAttributes(userTO.getPlainAttrMap(), customForm.get(SchemaType.PLAIN.name()), checkDefaultValues)
-                && validateAttributes(userTO.getDerAttrMap(), customForm.get(SchemaType.DERIVED.name()),
-                        checkDefaultValues)
-                && validateAttributes(userTO.getVirAttrMap(), customForm.get(SchemaType.VIRTUAL.name()),
-                        checkDefaultValues);
+        return validateAttributes(EntityTOUtils.buildAttrMap(userTO.getPlainAttrs()),
+                customForm.get(SchemaType.PLAIN.name()), checkDefaultValues)
+                && validateAttributes(EntityTOUtils.buildAttrMap(userTO.getDerAttrs()),
+                        customForm.get(SchemaType.DERIVED.name()), checkDefaultValues)
+                && validateAttributes(EntityTOUtils.buildAttrMap(userTO.getVirAttrs()),
+                        customForm.get(SchemaType.VIRTUAL.name()), checkDefaultValues);
     }
 
     private static boolean validateAttributes(final Map<String, AttrTO> attrMap,

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 70d4fd3..d8c021a 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.getPlainAttrMap().get("firstname").getValues().add("notAllowedFirstnameValue");
+        userTO.getPlainAttr("firstname").getValues().add("notAllowedFirstnameValue");
         assertFalse(UserRequestValidator.compliant(userTO, customForm, true));
         assertTrue(UserRequestValidator.compliant(userTO, customForm, false));
         // clean
-        userTO.getPlainAttrMap().get("firstname").getValues().remove("notAllowedFirstnameValue");
+        userTO.getPlainAttr("firstname").getValues().remove("notAllowedFirstnameValue");
 
         // derived must not be present
         AttrTO derivedNotAllowed = attrTO("derivedNotAllowed");

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 1da4df7..69d373e 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
@@ -89,8 +89,8 @@ public final class AnyOperations {
         result.setGroup(updated.getGroupKey());
 
         // 1. plain attributes
-        Map<String, AttrTO> updatedAttrs = new HashMap<>(updated.getPlainAttrMap());
-        Map<String, AttrTO> originalAttrs = new HashMap<>(original.getPlainAttrMap());
+        Map<String, AttrTO> updatedAttrs = EntityTOUtils.buildAttrMap(updated.getPlainAttrs());
+        Map<String, AttrTO> originalAttrs = EntityTOUtils.buildAttrMap(original.getPlainAttrs());
 
         result.getPlainAttrs().clear();
 
@@ -159,8 +159,8 @@ public final class AnyOperations {
         }
 
         // 3. plain attributes
-        Map<String, AttrTO> updatedAttrs = new HashMap<>(updated.getPlainAttrMap());
-        Map<String, AttrTO> originalAttrs = new HashMap<>(original.getPlainAttrMap());
+        Map<String, AttrTO> updatedAttrs = EntityTOUtils.buildAttrMap(updated.getPlainAttrs());
+        Map<String, AttrTO> originalAttrs = EntityTOUtils.buildAttrMap(original.getPlainAttrs());
 
         result.getPlainAttrs().clear();
 
@@ -483,7 +483,7 @@ public final class AnyOperations {
 
         // 2. plain attributes
         result.getPlainAttrs().clear();
-        result.getPlainAttrs().addAll(patch(to.getPlainAttrMap(), patch.getPlainAttrs()));
+        result.getPlainAttrs().addAll(patch(EntityTOUtils.buildAttrMap(to.getPlainAttrs()), patch.getPlainAttrs()));
 
         // 3. virtual attributes
         result.getVirAttrs().clear();
@@ -571,7 +571,7 @@ public final class AnyOperations {
                         }
                     } else {
                         newMembershipTO.getPlainAttrs().addAll(
-                                patch(memb.getPlainAttrMap(), membPatch.getPlainAttrs()));
+                                patch(EntityTOUtils.buildAttrMap(memb.getPlainAttrs()), membPatch.getPlainAttrs()));
                     }
 
                     // 3. virtual attributes
@@ -637,7 +637,7 @@ public final class AnyOperations {
                         }
                     } else {
                         newMembershipTO.getPlainAttrs().addAll(
-                                patch(memb.getPlainAttrMap(), membPatch.getPlainAttrs()));
+                                patch(EntityTOUtils.buildAttrMap(memb.getPlainAttrs()), membPatch.getPlainAttrs()));
                     }
 
                     // 3. virtual attributes

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 001e569..d0c04bc 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
@@ -18,7 +18,11 @@
  */
 package org.apache.syncope.common.lib;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import org.apache.commons.collections4.Transformer;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.EntityTO;
 
 public final class EntityTOUtils {
@@ -33,6 +37,15 @@ public final class EntityTOUtils {
         };
     }
 
+    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);
+        }
+
+        return result;
+    }
+
     /**
      * Private default constructor, for static-only classes.
      */

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 47f1d9b..7796b62 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
@@ -22,16 +22,15 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonTypeInfo;
 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 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 })
@@ -46,7 +45,7 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     private String realm;
 
-    private List<String> dynRealms = new ArrayList<>();
+    private final List<String> dynRealms = new ArrayList<>();
 
     private String status;
 
@@ -118,13 +117,14 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getPlainAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(plainAttrs.size());
-        for (AttrTO attributeTO : plainAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+    public AttrTO getPlainAttr(final String schema) {
+        return IterableUtils.find(plainAttrs, new Predicate<AttrTO>() {
 
-        return Collections.unmodifiableMap(result);
+            @Override
+            public boolean evaluate(final AttrTO object) {
+                return object.getSchema().equals(schema);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "derAttrs")
@@ -137,13 +137,14 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getDerAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(derAttrs.size());
-        for (AttrTO attributeTO : derAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+    public AttrTO getDerAttr(final String schema) {
+        return IterableUtils.find(derAttrs, new Predicate<AttrTO>() {
 
-        return Collections.unmodifiableMap(result);
+            @Override
+            public boolean evaluate(final AttrTO object) {
+                return object.getSchema().equals(schema);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "virAttrs")
@@ -156,13 +157,14 @@ public abstract class AnyTO extends AbstractAnnotatedBean implements EntityTO, A
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getVirAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(virAttrs.size());
-        for (AttrTO attributeTO : virAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "resources")

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 da2f7a1..79e57b8 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,20 +18,19 @@
  */
 package org.apache.syncope.common.lib.to;
 
-import java.util.Map;
 import java.util.Set;
 
 public interface AttributableTO {
 
     Set<AttrTO> getPlainAttrs();
 
-    Map<String, AttrTO> getPlainAttrMap();
+    AttrTO getPlainAttr(String schema);
 
     Set<AttrTO> getDerAttrs();
 
-    Map<String, AttrTO> getDerAttrMap();
+    AttrTO getDerAttr(String schema);
 
     Set<AttrTO> getVirAttrs();
 
-    Map<String, AttrTO> getVirAttrMap();
+    AttrTO getVirAttr(String schema);
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 09784c8..6301d68 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
@@ -20,15 +20,14 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.LinkedHashSet;
-import java.util.Map;
 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")
@@ -47,12 +46,13 @@ public class ConnObjectTO extends AbstractBaseBean {
     }
 
     @JsonIgnore
-    public Map<String, AttrTO> getAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(attrs.size());
-        for (AttrTO attributeTO : attrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
+    public AttrTO getAttr(final String schema) {
+        return IterableUtils.find(attrs, new Predicate<AttrTO>() {
 
-        return Collections.unmodifiableMap(result);
+            @Override
+            public boolean evaluate(final AttrTO object) {
+                return object.getSchema().equals(schema);
+            }
+        });
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 a970dec..5737c7f 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
@@ -20,15 +20,14 @@ package org.apache.syncope.common.lib.to;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Map;
 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")
@@ -112,13 +111,14 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getPlainAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(plainAttrs.size());
-        for (AttrTO attributeTO : plainAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "derAttrs")
@@ -131,13 +131,14 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getDerAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(derAttrs.size());
-        for (AttrTO attributeTO : derAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 
     @XmlElementWrapper(name = "virAttrs")
@@ -150,12 +151,13 @@ public class MembershipTO extends RelationshipTO implements AttributableTO {
 
     @JsonIgnore
     @Override
-    public Map<String, AttrTO> getVirAttrMap() {
-        Map<String, AttrTO> result = new HashMap<>(virAttrs.size());
-        for (AttrTO attributeTO : virAttrs) {
-            result.put(attributeTO.getSchema(), attributeTO);
-        }
-
-        return Collections.unmodifiableMap(result);
+    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);
+            }
+        });
     }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 4521db6..ec97437 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1264,15 +1264,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.plainAttrMap[&quot;firstname&quot;].values[0]} ${user.plainAttrMap[&quot;surname&quot;].values[0]}, welcome to Syncope!
+                textTemplate="Hi ${user.getPlainAttr(&quot;firstname&quot;).values[0]} ${user.getPlainAttr(&quot;surname&quot;).values[0]}, welcome to Syncope!
 
 Your username is ${user.username}.
-Your email address is ${user.plainAttrMap[&quot;email&quot;].values[0]}.
-Your email address inside a link: http://localhost/?email=${user.plainAttrMap[&quot;email&quot;].values[0].replace('@', '%40')}
+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')}
 
 This message was sent to the following recipients:&#10;
 $$ for (recipient: recipients) {&#10;
-  * ${recipient.plainAttrMap[&quot;email&quot;].values[0]}&#10;
+  * ${recipient.getPlainAttr(&quot;email&quot;).values[0]}&#10;
 $$ }&#10;
 &#10;
 because one of the following events occurred:&#10;
@@ -1288,19 +1288,19 @@ $$ }&#10;
 $$ }&#10;"
                 htmlTemplate="&lt;html&gt;
 &lt;body&gt;
-&lt;h3&gt;Hi ${user.plainAttrMap[&quot;firstname&quot;].values[0]} ${user.plainAttrMap[&quot;surname&quot;].values[0]}, welcome to Syncope!&lt;/h3&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;p&gt;
    Your username is ${user.username}.&lt;br/&gt;
-   Your email address is ${user.plainAttrMap[&quot;email&quot;].values[0]}.
-   Your email address inside a &lt;a href=&quot;http://localhost/?email=${user.plainAttrMap[&quot;email&quot;].values[0].replace('@', '%40')}&quot;&gt;link&lt;/a&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;.
 &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.plainAttrMap[&quot;email&quot;].values[0]}&lt;/li&gt;&#10;
+  &lt;li&gt;${recipient.getPlainAttr(&quot;email&quot;).values[0]}&lt;/li&gt;&#10;
 $$ }&#10;
 &lt;/ul&gt;&#10;
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 13f19a0..2e213f7 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
@@ -95,7 +95,7 @@ public class DefaultGroupProvisioningManager implements GroupProvisioningManager
         WorkflowResult<String> created = gwfAdapter.create(groupTO);
 
         // see ConnObjectUtils#getAnyTOFromConnObject for GroupOwnerSchema
-        AttrTO groupOwner = groupTO.getPlainAttrMap().get(StringUtils.EMPTY);
+        AttrTO groupOwner = groupTO.getPlainAttr(StringUtils.EMPTY);
         if (groupOwner != null) {
             groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
index fa558b6..44a4dfa 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/job/report/GroupReportlet.java
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.report.GroupReportletConf;
 import org.apache.syncope.common.lib.report.GroupReportletConf.Feature;
@@ -86,7 +87,7 @@ public class GroupReportlet extends AbstractReportlet {
 
         AttributesImpl atts = new AttributesImpl();
         if (!attrs.isEmpty()) {
-            Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
+            Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
             handler.startElement("", "", "attributes", null);
             for (String attrName : attrs) {
@@ -112,7 +113,7 @@ public class GroupReportlet extends AbstractReportlet {
         }
 
         if (!derAttrs.isEmpty()) {
-            Map<String, AttrTO> derAttrMap = anyTO.getDerAttrMap();
+            Map<String, AttrTO> derAttrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
             handler.startElement("", "", "derivedAttributes", null);
             for (String attrName : derAttrs) {
@@ -138,7 +139,7 @@ public class GroupReportlet extends AbstractReportlet {
         }
 
         if (!virAttrs.isEmpty()) {
-            Map<String, AttrTO> virAttrMap = anyTO.getVirAttrMap();
+            Map<String, AttrTO> virAttrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
             handler.startElement("", "", "virtualAttributes", null);
             for (String attrName : virAttrs) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 200f64a..2e4314d 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
@@ -23,6 +23,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.report.ReportletConf;
 import org.apache.syncope.common.lib.report.UserReportletConf;
@@ -98,7 +99,7 @@ public class UserReportlet extends AbstractReportlet {
 
         AttributesImpl atts = new AttributesImpl();
         if (!attrs.isEmpty()) {
-            Map<String, AttrTO> attrMap = anyTO.getPlainAttrMap();
+            Map<String, AttrTO> attrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
 
             handler.startElement("", "", "attributes", null);
             for (String attrName : attrs) {
@@ -124,7 +125,7 @@ public class UserReportlet extends AbstractReportlet {
         }
 
         if (!derAttrs.isEmpty()) {
-            Map<String, AttrTO> derAttrMap = anyTO.getDerAttrMap();
+            Map<String, AttrTO> derAttrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
 
             handler.startElement("", "", "derivedAttributes", null);
             for (String attrName : derAttrs) {
@@ -150,7 +151,7 @@ public class UserReportlet extends AbstractReportlet {
         }
 
         if (!virAttrs.isEmpty()) {
-            Map<String, AttrTO> virAttrMap = anyTO.getVirAttrMap();
+            Map<String, AttrTO> virAttrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
 
             handler.startElement("", "", "virtualAttributes", null);
             for (String attrName : virAttrs) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 de0480f..69485e4 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
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.commons.jexl3.MapContext;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.EntityTOUtils;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTO;
@@ -75,7 +76,7 @@ public class TemplateUtils {
             }
         }
 
-        Map<String, AttrTO> currentAttrMap = anyTO.getPlainAttrMap();
+        Map<String, AttrTO> currentAttrMap = EntityTOUtils.buildAttrMap(anyTO.getPlainAttrs());
         for (AttrTO templatePlainAttr : template.getPlainAttrs()) {
             if (!templatePlainAttr.getValues().isEmpty()
                     && (!currentAttrMap.containsKey(templatePlainAttr.getSchema())
@@ -85,14 +86,14 @@ public class TemplateUtils {
             }
         }
 
-        currentAttrMap = anyTO.getDerAttrMap();
+        currentAttrMap = EntityTOUtils.buildAttrMap(anyTO.getDerAttrs());
         for (AttrTO templateDerAttr : template.getDerAttrs()) {
             if (!currentAttrMap.containsKey(templateDerAttr.getSchema())) {
                 anyTO.getDerAttrs().add(templateDerAttr);
             }
         }
 
-        currentAttrMap = anyTO.getVirAttrMap();
+        currentAttrMap = EntityTOUtils.buildAttrMap(anyTO.getVirAttrs());
         for (AttrTO templateVirAttr : template.getVirAttrs()) {
             if (!templateVirAttr.getValues().isEmpty()
                     && (!currentAttrMap.containsKey(templateVirAttr.getSchema())

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 37c37d1..cb9177a 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
@@ -111,7 +111,7 @@ public class MailTemplateTest extends AbstractTest {
         ctx.put("input", input);
 
         UserTO recipient = SerializationUtils.clone(user);
-        recipient.getPlainAttrMap().get("email").getValues().set(0, "another@syncope.apache.org");
+        recipient.getPlainAttr("email").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/31cffd4e/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 7a66c3d..0574d82 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
@@ -87,16 +87,16 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
         AttrTO result;
         switch (schemaType) {
             case DERIVED:
-                result = any.getDerAttrMap().get(schema);
+                result = any.getDerAttr(schema);
                 break;
 
             case VIRTUAL:
-                result = any.getVirAttrMap().get(schema);
+                result = any.getVirAttr(schema);
                 break;
 
             case PLAIN:
             default:
-                result = any.getPlainAttrMap().get(schema);
+                result = any.getPlainAttr(schema);
         }
 
         if (result == null) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 8193e3e..612844b 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
@@ -72,7 +72,7 @@ public class CreateProducer extends AbstractProducer {
 
                 if (actual instanceof GroupTO && isPull()) {
                     Map<String, String> groupOwnerMap = exchange.getProperty("groupOwnerMap", Map.class);
-                    AttrTO groupOwner = ((GroupTO) actual).getPlainAttrMap().get(StringUtils.EMPTY);
+                    AttrTO groupOwner = ((GroupTO) actual).getPlainAttr(StringUtils.EMPTY);
                     if (groupOwner != null) {
                         groupOwnerMap.put(created.getResult(), groupOwner.getValues().iterator().next());
                     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 95325a9..ffd55b1 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
@@ -67,10 +67,10 @@ public class AnyObjectITCase extends AbstractITCase {
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_DBSCRIPTED, anyObjectTO.getType(), anyObjectTO.getKey());
         assertNotNull(connObjectTO);
-        assertNotNull(connObjectTO.getAttrMap().get("LOCATION"));
+        assertNotNull(connObjectTO.getAttr("LOCATION"));
         assertEquals(
-                anyObjectTO.getPlainAttrMap().get("location").getValues(),
-                connObjectTO.getAttrMap().get("LOCATION").getValues());
+                anyObjectTO.getPlainAttr("location").getValues(),
+                connObjectTO.getAttr("LOCATION").getValues());
     }
 
     @Test
@@ -123,8 +123,8 @@ public class AnyObjectITCase extends AbstractITCase {
     public void list() {
         PagedResult<AnyObjectTO> anyObjectTOs = anyObjectService.search(
                 new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").query()).
-                build());
+                        fiql(SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").query()).
+                        build());
         assertNotNull(anyObjectTOs);
         assertTrue(anyObjectTOs.getResult().size() >= 2);
         for (AnyObjectTO anyObjectTO : anyObjectTOs.getResult()) {
@@ -154,7 +154,7 @@ public class AnyObjectITCase extends AbstractITCase {
 
         anyObjectTO = updateAnyObject(anyObjectPatch).getEntity();
 
-        assertEquals(newLocation, anyObjectTO.getPlainAttrMap().get("location").getValues().get(0));
+        assertEquals(newLocation, anyObjectTO.getPlainAttr("location").getValues().get(0));
     }
 
     @Test
@@ -167,7 +167,7 @@ public class AnyObjectITCase extends AbstractITCase {
         assertEquals(anyObjectTO.getPlainAttrs(), attrs);
 
         AttrTO location = anyObjectService.read(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
-        assertEquals(anyObjectTO.getPlainAttrMap().get("location"), location);
+        assertEquals(anyObjectTO.getPlainAttr("location"), location);
     }
 
     @Test
@@ -190,7 +190,7 @@ public class AnyObjectITCase extends AbstractITCase {
         AnyObjectTO anyObjectTO = getSampleTO("deleteAttr");
         anyObjectTO = createAnyObject(anyObjectTO).getEntity();
         assertNotNull(anyObjectTO);
-        assertNotNull(anyObjectTO.getPlainAttrMap().get("location"));
+        assertNotNull(anyObjectTO.getPlainAttr("location"));
 
         anyObjectService.delete(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 55d0cd3..50fa799 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
@@ -278,7 +278,7 @@ public class AuthenticationITCase extends AbstractITCase {
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
             }).getEntity();
-            assertEquals("surname", user.getPlainAttrMap().get("surname").getValues().get(0));
+            assertEquals("surname", user.getPlainAttr("surname").getValues().get(0));
 
             // 5. as delegated, update user attempting to move under realm / -> fail
             UserPatch userPatch = new UserPatch();
@@ -301,7 +301,7 @@ public class AuthenticationITCase extends AbstractITCase {
 
             user = response.readEntity(new GenericType<ProvisioningResult<UserTO>>() {
             }).getEntity();
-            assertEquals("surname2", user.getPlainAttrMap().get("surname").getValues().get(0));
+            assertEquals("surname2", user.getPlainAttr("surname").getValues().get(0));
 
             // 7. as delegated, delete user
             delegatedUserService.delete(user.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 66fbcc1..4f4f475 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
@@ -120,7 +120,7 @@ public class CamelRouteITCase extends AbstractITCase {
                 + "    </setProperty>\n"
                 + "    <setBody>\n"
                 + "     <groovy>\n"
-                + "request.body.getPlainAttrMap().get(\"camelAttribute\").getValues().set(0,\"true\")\n"
+                + "request.body.getPlainAttr(\"camelAttribute\").getValues().set(0,\"true\")\n"
                 + "       return request.body\n"
                 + "     </groovy>\n"
                 + "    </setBody>\n"
@@ -165,7 +165,7 @@ public class CamelRouteITCase extends AbstractITCase {
 
             userTO = createUser(userTO).getEntity();
             assertNotNull(userTO);
-            assertEquals("true", userTO.getPlainAttrMap().get("camelAttribute").getValues().get(0));
+            assertEquals("true", userTO.getPlainAttr("camelAttribute").getValues().get(0));
         } finally {
             doUpdate(oldRoute.getKey(), oldRoute.getContent());
         }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 caf1623..88d08f9 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
@@ -210,7 +210,7 @@ public class DynRealmITCase extends AbstractITCase {
                     readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
                     }).getEntity();
             assertNotNull(group);
-            assertEquals("modified", group.getPlainAttrMap().get("icon").getValues().get(0));
+            assertEquals("modified", group.getPlainAttr("icon").getValues().get(0));
         } finally {
             if (role != null) {
                 roleService.delete(role.getKey());

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 1d8c528..3dff239 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
@@ -44,6 +44,7 @@ import org.apache.commons.lang3.SerializationUtils;
 import org.apache.syncope.client.lib.AnonymousAuthenticationHandler;
 import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.AnyOperations;
+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.AnyObjectPatch;
@@ -119,17 +120,16 @@ public class GroupITCase extends AbstractITCase {
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
 
-        assertNotNull(groupTO.getVirAttrMap());
-        assertNotNull(groupTO.getVirAttrMap().get("rvirtualdata").getValues());
-        assertFalse(groupTO.getVirAttrMap().get("rvirtualdata").getValues().isEmpty());
-        assertEquals("rvirtualvalue", groupTO.getVirAttrMap().get("rvirtualdata").getValues().get(0));
+        assertNotNull(groupTO.getVirAttr("rvirtualdata").getValues());
+        assertFalse(groupTO.getVirAttr("rvirtualdata").getValues().isEmpty());
+        assertEquals("rvirtualvalue", groupTO.getVirAttr("rvirtualdata").getValues().get(0));
 
         assertTrue(groupTO.getResources().contains(RESOURCE_NAME_LDAP));
 
         ConnObjectTO connObjectTO =
                 resourceService.readConnObject(RESOURCE_NAME_LDAP, AnyTypeKind.GROUP.name(), groupTO.getKey());
         assertNotNull(connObjectTO);
-        assertNotNull(connObjectTO.getAttrMap().get("owner"));
+        assertNotNull(connObjectTO.getAttr("owner"));
 
         // SYNCOPE-515: remove ownership
         GroupPatch groupPatch = new GroupPatch();
@@ -240,12 +240,12 @@ public class GroupITCase extends AbstractITCase {
         assertEquals(modName, groupTO.getName());
         assertEquals(2, groupTO.getPlainAttrs().size());
 
-        groupTO.getPlainAttrMap().get("show").getValues().clear();
+        groupTO.getPlainAttr("show").getValues().clear();
 
         groupTO = groupService.update(groupTO).readEntity(new GenericType<ProvisioningResult<GroupTO>>() {
         }).getEntity();
 
-        assertFalse(groupTO.getPlainAttrMap().containsKey("show"));
+        assertNull(groupTO.getPlainAttr("show"));
     }
 
     @Test
@@ -269,7 +269,7 @@ public class GroupITCase extends AbstractITCase {
         GroupPatch patch = AnyOperations.diff(updated, original, true);
         GroupTO group = updateGroup(patch).getEntity();
 
-        Map<String, AttrTO> attrs = group.getPlainAttrMap();
+        Map<String, AttrTO> attrs = EntityTOUtils.buildAttrMap(group.getPlainAttrs());
         assertFalse(attrs.containsKey("icon"));
         assertFalse(attrs.containsKey("show"));
         assertEquals(Collections.singletonList("sx"), attrs.get("rderived_sx").getValues());
@@ -574,10 +574,10 @@ public class GroupITCase extends AbstractITCase {
 
         // 2. create a group *without* an attribute for that schema: it works
         GroupTO groupTO = getSampleTO("lastGroup");
-        assertFalse(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
+        assertNull(groupTO.getPlainAttr(badge.getKey()));
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
-        assertFalse(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
+        assertNull(groupTO.getPlainAttr(badge.getKey()));
 
         // 3. add the new mandatory schema to the default group type
         AnyTypeTO type = anyTypeService.read(AnyTypeKind.GROUP.name());
@@ -605,7 +605,7 @@ public class GroupITCase extends AbstractITCase {
 
             groupTO = updateGroup(groupPatch).getEntity();
             assertNotNull(groupTO);
-            assertTrue(groupTO.getPlainAttrMap().containsKey(badge.getKey()));
+            assertNotNull(groupTO.getPlainAttr(badge.getKey()));
         } finally {
             // restore the original group class
             typeClass.getPlainSchemas().remove(badge.getKey());
@@ -669,7 +669,7 @@ public class GroupITCase extends AbstractITCase {
         AnyObjectTO newAny = AnyObjectITCase.getSampleTO("aDynMembership");
         newAny.getResources().clear();
         newAny = createAnyObject(newAny).getEntity();
-        assertNotNull(newAny.getPlainAttrMap().get("location"));
+        assertNotNull(newAny.getPlainAttr("location"));
         assertTrue(anyObjectService.read(
                 "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynGroups().contains(group.getKey()));
         assertTrue(anyObjectService.read(
@@ -697,7 +697,7 @@ public class GroupITCase extends AbstractITCase {
                 attrTO(new AttrTO.Builder().schema("location").build()).
                 build());
         newAny = updateAnyObject(anyPatch).getEntity();
-        assertNull(newAny.getPlainAttrMap().get("location"));
+        assertNull(newAny.getPlainAttr("location"));
         assertFalse(anyObjectService.read(
                 "fc6dbc3a-6c07-4965-8781-921e7401a4a5").getDynGroups().contains(group.getKey()));
         assertFalse(anyObjectService.read(
@@ -1036,7 +1036,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = createGroup(groupTO).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.23", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
 
         // 3. update schema, set conversion pattern
         schema = schemaService.read(SchemaType.PLAIN, schema.getKey());
@@ -1046,7 +1046,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.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.230", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
 
         // 5. modify group with new double value
         GroupPatch patch = new GroupPatch();
@@ -1055,7 +1055,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = updateGroup(patch).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.257", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.257", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
 
         // 6. update schema, unset conversion pattern
         schema.setConversionPattern(null);
@@ -1068,7 +1068,7 @@ public class GroupITCase extends AbstractITCase {
 
         groupTO = updateGroup(patch).getEntity();
         assertNotNull(groupTO);
-        assertEquals("11.23", groupTO.getPlainAttrMap().get(doubleSchemaName).getValues().get(0));
+        assertEquals("11.23", groupTO.getPlainAttr(doubleSchemaName).getValues().get(0));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 74a78d3..e150bb2 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,6 +21,7 @@ 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;
 
@@ -74,7 +75,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.getPlainAttrMap().get("ctype"));
+        user.getPlainAttrs().remove(user.getPlainAttr("ctype"));
 
         // the group 034740a9-fa10-453b-af37-dc7897e98fb1 has USER type extensions for 'csv' and 'other' 
         // any type classes
@@ -107,19 +108,19 @@ public class MembershipITCase extends AbstractITCase {
             user = createUser(user).getEntity();
 
             // 1. verify that 'aLong' is correctly populated for user
-            assertEquals(1, user.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1976", user.getPlainAttrMap().get("aLong").getValues().get(0));
+            assertEquals(1, user.getPlainAttr("aLong").getValues().size());
+            assertEquals("1976", user.getPlainAttr("aLong").getValues().get(0));
 
             // 2. verify that 'aLong' is correctly populated for user's membership
             assertEquals(1, user.getMemberships().size());
             membership = user.getMembershipMap().get("034740a9-fa10-453b-af37-dc7897e98fb1");
             assertNotNull(membership);
-            assertEquals(1, membership.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1977", membership.getPlainAttrMap().get("aLong").getValues().get(0));
+            assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
+            assertEquals("1977", membership.getPlainAttr("aLong").getValues().get(0));
 
             // 3. verify that derived attrbutes from 'csv' and 'other' are also populated for user's membership
-            assertFalse(membership.getDerAttrMap().get("csvuserid").getValues().isEmpty());
-            assertFalse(membership.getDerAttrMap().get("noschema").getValues().isEmpty());
+            assertFalse(membership.getDerAttr("csvuserid").getValues().isEmpty());
+            assertFalse(membership.getDerAttr("noschema").getValues().isEmpty());
 
             // update user - change some values and add new membership attribute
             UserPatch userPatch = new UserPatch();
@@ -138,19 +139,19 @@ public class MembershipITCase extends AbstractITCase {
             user = updateUser(userPatch).getEntity();
 
             // 4. verify that 'aLong' is correctly populated for user
-            assertEquals(1, user.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1977", user.getPlainAttrMap().get("aLong").getValues().get(0));
-            assertFalse(user.getPlainAttrMap().containsKey("ctype"));
+            assertEquals(1, user.getPlainAttr("aLong").getValues().size());
+            assertEquals("1977", user.getPlainAttr("aLong").getValues().get(0));
+            assertNull(user.getPlainAttr("ctype"));
 
             // 5. verify that 'aLong' is correctly populated for user's membership
             assertEquals(1, user.getMemberships().size());
             membership = user.getMembershipMap().get("034740a9-fa10-453b-af37-dc7897e98fb1");
             assertNotNull(membership);
-            assertEquals(1, membership.getPlainAttrMap().get("aLong").getValues().size());
-            assertEquals("1976", membership.getPlainAttrMap().get("aLong").getValues().get(0));
+            assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
+            assertEquals("1976", membership.getPlainAttr("aLong").getValues().get(0));
 
             // 6. verify that 'ctype' is correctly populated for user's membership
-            assertEquals("membership type", membership.getPlainAttrMap().get("ctype").getValues().get(0));
+            assertEquals("membership type", membership.getPlainAttr("ctype").getValues().get(0));
 
             // finally remove membership
             userPatch = new UserPatch();
@@ -212,12 +213,12 @@ public class MembershipITCase extends AbstractITCase {
         assertEquals(1, user.getMemberships().size());
         membership = user.getMembershipMap().get(groupTO.getKey());
         assertNotNull(membership);
-        assertEquals(1, membership.getPlainAttrMap().get("aLong").getValues().size());
-        assertEquals("1454", membership.getPlainAttrMap().get("aLong").getValues().get(0));
+        assertEquals(1, membership.getPlainAttr("aLong").getValues().size());
+        assertEquals("1454", membership.getPlainAttr("aLong").getValues().get(0));
 
         // verify that derived attrbutes from 'csv' and 'other' are also populated for user's membership
-        assertFalse(membership.getDerAttrMap().get("csvuserid").getValues().isEmpty());
-        assertFalse(membership.getDerAttrMap().get("noschema").getValues().isEmpty());
+        assertFalse(membership.getDerAttr("csvuserid").getValues().isEmpty());
+        assertFalse(membership.getDerAttr("noschema").getValues().isEmpty());
 
         // now remove the group -> all related memberships should have been removed as well
         groupService.delete(groupTO.getKey());
@@ -264,7 +265,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.getPlainAttrMap().get("ctype"));
+            user.getPlainAttrs().remove(user.getPlainAttr("ctype"));
             user.getResources().clear();
             user.getResources().add(newResource.getKey());
 
@@ -310,7 +311,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).
-                    getPlainAttrMap().get("aLong").getValues().get(0));
+                    getPlainAttr("aLong").getValues().get(0));
         } catch (Exception e) {
             LOG.error("Unexpected error", e);
             fail(e.getMessage());

http://git-wip-us.apache.org/repos/asf/syncope/blob/31cffd4e/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 ed8d0df..9017a9b 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
@@ -518,8 +518,8 @@ public class MigrationITCase extends AbstractTaskITCase {
         assertEquals("/" + MIGRATION_REALM, group.getRealm());
 
         // 4a. user plain attrs
-        assertEquals("Gioacchino", user.getPlainAttrMap().get("firstname").getValues().get(0));
-        assertEquals("Rossini", user.getPlainAttrMap().get("surname").getValues().get(0));
+        assertEquals("Gioacchino", user.getPlainAttr("firstname").getValues().get(0));
+        assertEquals("Rossini", user.getPlainAttr("surname").getValues().get(0));
 
         // 4b. user resources
         assertTrue(user.getResources().contains(RESOURCE_NAME_TESTDB2));
@@ -528,7 +528,7 @@ public class MigrationITCase extends AbstractTaskITCase {
         assertNotNull(clientFactory.create("bellini12", ADMIN_PWD).self());
 
         // 4d. group plain attrs
-        assertEquals("r12", group.getPlainAttrMap().get("title").getValues().get(0));
+        assertEquals("r12", group.getPlainAttr("title").getValues().get(0));
 
         // 4e. group resources
         assertTrue(group.getResources().contains(RESOURCE_NAME_CSV));