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 2016/09/20 11:23:59 UTC

[1/2] syncope git commit: [SYNCOPE-948] Improvement provided

Repository: syncope
Updated Branches:
  refs/heads/2_0_X 3be11e82b -> 95d4b15ae
  refs/heads/master 228bf3ed5 -> 84cb7fb4f


[SYNCOPE-948] Improvement provided


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

Branch: refs/heads/2_0_X
Commit: 95d4b15aeada2816c7fc44b54c83926f0d9634ea
Parents: 3be11e8
Author: Francesco Chicchiricc� <il...@apache.org>
Authored: Tue Sep 20 13:21:18 2016 +0200
Committer: Francesco Chicchiricc� <il...@apache.org>
Committed: Tue Sep 20 13:23:10 2016 +0200

----------------------------------------------------------------------
 .../anyobject/AnyObjectResultManager.java       |  3 --
 .../cli/commands/group/GroupResultManager.java  |  3 --
 .../cli/commands/user/UserResultManager.java    |  3 --
 .../client/console/wizards/any/PlainAttrs.java  | 12 ++---
 .../client/console/wizards/any/VirAttrs.java    | 12 +++--
 .../syncope/common/lib/AnyOperations.java       |  7 ++-
 .../apache/syncope/common/lib/to/AttrTO.java    | 27 ++++++-----
 .../syncope/common/lib/AnyOperationsTest.java   | 51 ++++++++++++++++++++
 .../syncope/core/logic/ConfigurationLogic.java  |  2 +-
 .../core/logic/report/XSLTTransformer.java      |  2 +-
 .../test/resources/domains/MasterContent.xml    | 10 ++--
 .../api/data/ConfigurationDataBinder.java       |  2 +-
 .../java/data/AbstractAnyDataBinder.java        | 50 +++++++++++--------
 .../java/data/AnyObjectDataBinderImpl.java      |  3 +-
 .../java/data/ConfigurationDataBinderImpl.java  | 35 ++++++--------
 .../java/data/GroupDataBinderImpl.java          | 10 +++-
 .../java/data/UserDataBinderImpl.java           |  3 +-
 .../syncope/fit/core/AnyObjectITCase.java       |  2 +
 .../syncope/fit/core/ConfigurationITCase.java   |  2 +
 19 files changed, 154 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
index a107239..1e2c3e6 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
@@ -68,9 +68,6 @@ public class AnyObjectResultManager extends CommonsResultManager {
                 .append(attribute.getSchema())
                 .append(": ")
                 .append(attribute.getValues());
-        if (attribute.isReadonly()) {
-            attributeMessageBuilder.append(" - is readonly");
-        }
         System.out.println(attributeMessageBuilder.toString());
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
index db4796d..da4c349 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
@@ -71,9 +71,6 @@ public class GroupResultManager extends CommonsResultManager {
                 .append(attribute.getSchema())
                 .append(": ")
                 .append(attribute.getValues());
-        if (attribute.isReadonly()) {
-            attributeMessageBuilder.append(" - is readonly");
-        }
         System.out.println(attributeMessageBuilder.toString());
         System.out.println("");
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
index 2c479a4..4a1111a 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
@@ -88,9 +88,6 @@ public class UserResultManager extends CommonsResultManager {
                     .append(attrTO.getSchema())
                     .append(": ")
                     .append(attrTO.getValues());
-            if (attrTO.isReadonly()) {
-                attributeSentence.append(" - is readonly.");
-            }
             System.out.println(attributeSentence);
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/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 c5c2f0c..96d9273 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
@@ -106,7 +106,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                         return new PlainSchemas(
                                 panelId,
                                 membershipSchemas.get(membershipTO.getGroupKey()),
-                                new ListModel<AttrTO>(getAttrsFromTO(membershipTO)));
+                                new ListModel<>(getAttrsFromTO(membershipTO)));
                     }
                 }), Model.of(-1)).setOutputMarkupId(true));
             }
@@ -150,8 +150,8 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
             if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
                 attrTO.getValues().add("");
 
-                // is important to set readonly only after values setting
-                attrTO.setReadonly(schema.isReadonly());
+                // is important to set the schema info only after values setting
+                attrTO.setSchemaInfo(schema);
             } else {
                 attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
             }
@@ -175,8 +175,8 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
             if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
                 attrTO.getValues().add("");
 
-                // is important to set readonly only after values setting
-                attrTO.setReadonly(schema.isReadonly());
+                // is important to set the schema info only after values setting
+                attrTO.setSchemaInfo(schema);
             } else {
                 attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
             }
@@ -232,7 +232,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                 break;
 
             case Enum:
-                panel = new AjaxDropDownChoicePanel<>("panel", schemaTO.getKey(), new Model<String>(), false);
+                panel = new AjaxDropDownChoicePanel<>("panel", schemaTO.getKey(), new Model<>(), false);
                 ((AjaxDropDownChoicePanel<String>) panel).setChoices(SchemaUtils.getEnumeratedValues(schemaTO));
 
                 if (StringUtils.isNotBlank(schemaTO.getEnumerationKeys())) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/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 27bc7f3..b3432f8 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
@@ -175,19 +175,21 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
                 protected void populateItem(final ListItem<AttrTO> item) {
                     AttrTO attrTO = item.getModelObject();
 
-                    attrTO.setReadonly(attrTO.isReadonly());
+                    AjaxTextFieldPanel panel =
+                            new AjaxTextFieldPanel("panel", attrTO.getSchema(), new Model<String>(), false);
 
-                    final AjaxTextFieldPanel panel
-                            = new AjaxTextFieldPanel("panel", attrTO.getSchema(), new Model<String>(), false);
+                    boolean readonly = attrTO.getSchemaInfo() == null
+                            ? false
+                            : VirSchemaTO.class.cast(attrTO.getSchemaInfo()).isReadonly();
 
                     if (mode == AjaxWizard.Mode.TEMPLATE) {
-                        item.add(panel.enableJexlHelp().setEnabled(!attrTO.isReadonly()));
+                        item.add(panel.enableJexlHelp().setEnabled(!readonly));
                     } else {
                         item.add(new MultiFieldPanel.Builder<>(
                                 new PropertyModel<List<String>>(attrTO, "values")).build(
                                 "panel",
                                 attrTO.getSchema(),
-                                panel).setEnabled(!attrTO.isReadonly()));
+                                panel).setEnabled(!readonly));
                     }
                 }
             });

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/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 2d3f8f9..b4cc329 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
@@ -186,8 +186,11 @@ public final class AnyOperations {
                             attrTO(new AttrTO.Builder().schema(attrTO.getSchema()).build()).
                             build());
                 }
-            } else {
-                AttrPatch patch = new AttrPatch.Builder().operation(PatchOperation.ADD_REPLACE).attrTO(attrTO).build();
+            } else if (!originalAttrs.containsKey(attrTO.getSchema())
+                    || !originalAttrs.get(attrTO.getSchema()).getValues().equals(attrTO.getValues())) {
+
+                AttrPatch patch = new AttrPatch.Builder().operation(PatchOperation.ADD_REPLACE).attrTO(attrTO).
+                        build();
                 if (!patch.isEmpty()) {
                     result.getPlainAttrs().add(patch);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
index 65a6b51..7822a6b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
@@ -45,8 +45,8 @@ public class AttrTO extends AbstractBaseBean {
             return this;
         }
 
-        public Builder readonly(final boolean readonly) {
-            instance.setReadonly(readonly);
+        public Builder schemaInfo(final AbstractSchemaTO schemaInfo) {
+            instance.schemaInfo = schemaInfo;
             return this;
         }
 
@@ -71,6 +71,11 @@ public class AttrTO extends AbstractBaseBean {
     }
 
     /**
+     * (Optional) schema information for this attribute.
+     */
+    private AbstractSchemaTO schemaInfo;
+
+    /**
      * Name of the schema that this attribute is referring to.
      */
     private String schema;
@@ -81,9 +86,15 @@ public class AttrTO extends AbstractBaseBean {
     private final List<String> values = new ArrayList<>();
 
     /**
-     * Whether this attribute is read-only or not.
+     * @return schema information for this attribute; may be {@code NULL}
      */
-    private boolean readonly = false;
+    public AbstractSchemaTO getSchemaInfo() {
+        return schemaInfo;
+    }
+
+    public void setSchemaInfo(final AbstractSchemaTO schemaInfo) {
+        this.schemaInfo = schemaInfo;
+    }
 
     /**
      * @return the name of the schema that this attribute is referring to
@@ -110,12 +121,4 @@ public class AttrTO extends AbstractBaseBean {
     public List<String> getValues() {
         return values;
     }
-
-    public boolean isReadonly() {
-        return readonly;
-    }
-
-    public void setReadonly(final boolean readonly) {
-        this.readonly = readonly;
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java
----------------------------------------------------------------------
diff --git a/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java b/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java
new file mode 100644
index 0000000..51b6423
--- /dev/null
+++ b/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.syncope.common.lib.patch.AnyObjectPatch;
+import org.apache.syncope.common.lib.patch.AttrPatch;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.types.PatchOperation;
+import org.junit.Test;
+
+public class AnyOperationsTest {
+
+    @Test
+    public void mindiff() {
+        AnyObjectTO oldOne = new AnyObjectTO();
+        oldOne.setName("name");
+        oldOne.getPlainAttrs().add(new AttrTO.Builder().schema("plain").value("oldValue").build());
+        oldOne.getPlainAttrs().add(new AttrTO.Builder().schema("encrypted").value("oldValue").build());
+
+        AnyObjectTO newOne = new AnyObjectTO();
+        newOne.setName("name");
+        newOne.getPlainAttrs().add(new AttrTO.Builder().schema("plain").value("newValue").build());
+        newOne.getPlainAttrs().add(new AttrTO.Builder().schema("encrypted").value("oldValue").build());
+
+        AnyObjectPatch diff = AnyOperations.diff(newOne, oldOne, true);
+        assertEquals(1, diff.getPlainAttrs().size());
+
+        AttrPatch patch = diff.getPlainAttrs().iterator().next();
+        assertEquals(PatchOperation.ADD_REPLACE, patch.getOperation());
+        assertEquals("plain", patch.getAttrTO().getSchema());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
index b6c31b4..200cc7a 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
@@ -103,7 +103,7 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONFIGURATION_SET + "')")
     public void set(final AttrTO value) {
-        confDAO.save(binder.getAttribute(value));
+        confDAO.save(binder.getAttr(value));
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONFIGURATION_EXPORT + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java b/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
index 91ecb92..3dd6d78 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
@@ -132,7 +132,7 @@ public class XSLTTransformer extends AbstractSAXTransformer implements CachingPi
         if (parameters == null) {
             this.parameters = null;
         } else {
-            this.parameters = new HashMap<>(parameters);
+            this.parameters = new HashMap<String, Object>(parameters);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/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 123da30..40a2e63 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1055,7 +1055,7 @@ under the License.
         pullMode="INCREMENTAL" unmatchingRule="ASSIGN" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="3a6173a9-8c34-4e37-b3b1-0c2ea385fac0"
                        pullTask_id="c41b9b71-9bfa-4f90-89f2-84787def4c5c" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","readonly":false,"values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"rightType":"GROUP","rightKey":"f779c0d4-633b-4be5-8f57-32eb478a3ca5","groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","readonly":false,"values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"rightType":"GROUP","rightKey":"f779c0d4-633b-4be5-8f57-32eb478a3ca5","groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
   <AnyTemplatePullTask id="b3772d66-ec06-4133-bf38-b3273845ac5b"
                        pullTask_id="c41b9b71-9bfa-4f90-89f2-84787def4c5c" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
@@ -1071,7 +1071,7 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="1" performUpdate="1" performDelete="0" syncStatus="1" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="6c3f578d-327b-4a7c-8037-6f5ba24eb770" pullTask_id="83f7e85d-9774-43fe-adba-ccd856312994" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","readonly":false,"values":["&apos;type a&apos;"]},{"schema":"userId","readonly":false,"values":["&apos;reconciled@syncope.apache.org&apos;"]},{"schema":"fullname","readonly":false,"values":["&apos;reconciled fullname&apos;"]},{"schema":"surname","readonly":false,"values":["&apos;surname&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","values":["&apos;type a&apos;"]},{"schema":"userId","values":["&apos;reconciled@syncope.apache.org&apos;"]},{"schema":"fullname","values":["&apos;reconciled fullname&apos;"]},{"schema":"surname","values":["&apos;surname&apos;"]}]}'/>
   <AnyTemplatePullTask id="45b61137-c7c3-49ee-86e0-9efffa75ae68" pullTask_id="83f7e85d-9774-43fe-adba-ccd856312994" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
   <Task DTYPE="PullTask" id="81d88f73-d474-4450-9031-605daa4e313f" name="TestDB2 Task" resource_id="resource-testdb2"
@@ -1084,9 +1084,9 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" pullMode="FULL_RECONCILIATION" performCreate="1" performDelete="1" performUpdate="1" syncStatus="0"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="df655a2a-40c0-43b1-a157-3f4988802f58" pullTask_id="1e419ca4-ea81-4493-a14f-28b90113686d" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":"&apos;/&apos; + title","status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["minimal group"],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","readonly":true,"values":[""]}],"resources":["resource-ldap"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":"&apos;/&apos; + title","status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["minimal group"],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","values":[""]}],"resources":["resource-ldap"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/>
   <AnyTemplatePullTask id="fda22ff3-98f3-42e4-a2ae-cd9a28282d57" pullTask_id="1e419ca4-ea81-4493-a14f-28b90113686d" anyType_id="GROUP"
-                       template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","readonly":false,"values":["true"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","values":["true"]}]}'/>
   <PullTask_actionsClassNames pullTask_id="1e419ca4-ea81-4493-a14f-28b90113686d" actionClassName="org.apache.syncope.core.provisioning.java.pushpull.LDAPMembershipPullActions"/>
   <Task DTYPE="PullTask" id="38abbf9e-a1a3-40a1-a15f-7d0ac02f47f1" name="VirAttrCache test" resource_id="resource-csv"
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" pullMode="FULL_RECONCILIATION"
@@ -1150,7 +1150,7 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="1" performUpdate="1" performDelete="1" syncStatus="1" pullMode="INCREMENTAL"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="8bc41ba1-cc1d-4ee0-bb43-61cd148b414f" pullTask_id="986867e2-993b-430e-8feb-aa9abb4c1dcd" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","readonly":false,"values":[""]},{"schema":"userId","readonly":false,"values":["&apos;test&apos;"]},{"schema":"fullname","readonly":false,"values":["&apos;test&apos;"]},{"schema":"surname","readonly":false,"values":["&apos;test&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","values":[""]},{"schema":"userId","values":["&apos;test&apos;"]},{"schema":"fullname","values":["&apos;test&apos;"]},{"schema":"surname","values":["&apos;test&apos;"]}]}'/>
   <AnyTemplatePullTask id="9af0e343-8a37-42d2-9bc7-6e2e3b103219" pullTask_id="986867e2-993b-430e-8feb-aa9abb4c1dcd" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
   <Task DTYPE="PullTask" id="feae4e57-15ca-40d9-b973-8b9015efca49" name="CSV (unlink matching; ignore unmatching)" resource_id="resource-csv"

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
index e62407f..0956d24 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
@@ -28,6 +28,6 @@ public interface ConfigurationDataBinder {
 
     List<AttrTO> getConfTO();
 
-    CPlainAttr getAttribute(AttrTO attributeTO);
+    CPlainAttr getAttr(AttrTO attrTO);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
index 167ced4..0bb5e25 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
@@ -89,6 +89,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.apache.syncope.core.persistence.api.entity.GroupableRelatable;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.api.IntAttrName;
+import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 
 abstract class AbstractAnyDataBinder {
@@ -96,6 +97,9 @@ abstract class AbstractAnyDataBinder {
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractAnyDataBinder.class);
 
     @Autowired
+    protected SchemaDataBinder schemaDataBinder;
+
+    @Autowired
     protected RealmDAO realmDAO;
 
     @Autowired
@@ -198,8 +202,8 @@ abstract class AbstractAnyDataBinder {
         List<String> valuesProvided = schema.isMultivalue()
                 ? values
                 : (values.isEmpty()
-                        ? Collections.<String>emptyList()
-                        : Collections.singletonList(values.iterator().next()));
+                ? Collections.<String>emptyList()
+                : Collections.singletonList(values.iterator().next()));
 
         for (String value : valuesProvided) {
             if (StringUtils.isBlank(value)) {
@@ -549,40 +553,48 @@ abstract class AbstractAnyDataBinder {
         }
     }
 
-    protected void fillTO(final AnyTO anyTO,
+    protected void fillTO(
+            final AnyTO anyTO,
             final String realmFullPath,
             final Collection<? extends AnyTypeClass> auxClasses,
             final Collection<? extends PlainAttr<?>> plainAttrs,
             final Map<DerSchema, String> derAttrs,
             final Map<VirSchema, List<String>> virAttrs,
-            final Collection<? extends ExternalResource> resources) {
+            final Collection<? extends ExternalResource> resources,
+            final boolean details) {
 
         anyTO.setRealm(realmFullPath);
 
         CollectionUtils.collect(auxClasses, EntityUtils.<AnyTypeClass>keyTransformer(), anyTO.getAuxClasses());
 
         for (PlainAttr<?> plainAttr : plainAttrs) {
-            anyTO.getPlainAttrs().add(new AttrTO.Builder().
+            AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(plainAttr.getSchema().getKey()).
-                    values(plainAttr.getValuesAsStrings()).
-                    readonly(plainAttr.getSchema().isReadonly()).
-                    build());
+                    values(plainAttr.getValuesAsStrings());
+            if (details) {
+                attrTOBuilder.schemaInfo(schemaDataBinder.getPlainSchemaTO(plainAttr.getSchema()));
+            }
+            anyTO.getPlainAttrs().add(attrTOBuilder.build());
         }
 
         for (Map.Entry<DerSchema, String> entry : derAttrs.entrySet()) {
-            anyTO.getDerAttrs().add(new AttrTO.Builder().
+            AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
-                    value(entry.getValue()).
-                    readonly(true).
-                    build());
+                    value(entry.getValue());
+            if (details) {
+                attrTOBuilder.schemaInfo(schemaDataBinder.getDerSchemaTO(entry.getKey()));
+            }
+            anyTO.getDerAttrs().add(attrTOBuilder.build());
         }
 
         for (Map.Entry<VirSchema, List<String>> entry : virAttrs.entrySet()) {
-            anyTO.getVirAttrs().add(new AttrTO.Builder().
+            AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
-                    values(entry.getValue()).
-                    readonly(entry.getKey().isReadonly()).
-                    build());
+                    values(entry.getValue());
+            if (details) {
+                attrTOBuilder.schemaInfo(schemaDataBinder.getVirSchemaTO(entry.getKey()));
+            }
+            anyTO.getVirAttrs().add(attrTOBuilder.build());
         }
 
         for (ExternalResource resource : resources) {
@@ -611,7 +623,7 @@ abstract class AbstractAnyDataBinder {
             membershipTO.getPlainAttrs().add(new AttrTO.Builder().
                     schema(plainAttr.getSchema().getKey()).
                     values(plainAttr.getValuesAsStrings()).
-                    readonly(plainAttr.getSchema().isReadonly()).
+                    schemaInfo(schemaDataBinder.getPlainSchemaTO(plainAttr.getSchema())).
                     build());
         }
 
@@ -619,7 +631,7 @@ abstract class AbstractAnyDataBinder {
             membershipTO.getDerAttrs().add(new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     value(entry.getValue()).
-                    readonly(true).
+                    schemaInfo(schemaDataBinder.getDerSchemaTO(entry.getKey())).
                     build());
         }
 
@@ -627,7 +639,7 @@ abstract class AbstractAnyDataBinder {
             membershipTO.getVirAttrs().add(new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     values(entry.getValue()).
-                    readonly(entry.getKey().isReadonly()).
+                    schemaInfo(schemaDataBinder.getVirSchemaTO(entry.getKey())).
                     build());
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index a998a66..677bf81 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -97,7 +97,8 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                 anyObject.getPlainAttrs(),
                 derAttrHandler.getValues(anyObject),
                 virAttrValues,
-                anyObjectDAO.findAllResources(anyObject));
+                anyObjectDAO.findAllResources(anyObject),
+                details);
 
         if (details) {
             // relationships

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
index 5d277b3..56b0b92 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
@@ -48,28 +48,23 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
 
     @Override
     public List<AttrTO> getConfTO() {
-        final List<AttrTO> attrTOs = new ArrayList<>();
-        for (final CPlainAttr plainAttr : confDAO.get().getPlainAttrs()) {
-            final AttrTO attrTO = new AttrTO();
-            attrTO.setSchema(plainAttr.getSchema().getKey());
-            attrTO.getValues().addAll(plainAttr.getValuesAsStrings());
-            attrTO.setReadonly(plainAttr.getSchema().isReadonly());
-            attrTOs.add(attrTO);
+        List<AttrTO> attrTOs = new ArrayList<>();
+        for (CPlainAttr attr : confDAO.get().getPlainAttrs()) {
+            attrTOs.add(getAttrTO(attr));
         }
         return attrTOs;
     }
 
     @Override
     public AttrTO getAttrTO(final CPlainAttr attr) {
-        AttrTO attributeTO = new AttrTO();
-        attributeTO.setSchema(attr.getSchema().getKey());
-        attributeTO.getValues().addAll(attr.getValuesAsStrings());
-        attributeTO.setReadonly(attr.getSchema().isReadonly());
-
-        return attributeTO;
+        return new AttrTO.Builder().
+                schemaInfo(schemaDataBinder.getPlainSchemaTO(attr.getSchema())).
+                schema(attr.getSchema().getKey()).
+                values(attr.getValuesAsStrings()).
+                build();
     }
 
-    private void fillAttribute(final List<String> values,
+    private void fillAttr(final List<String> values,
             final PlainSchema schema, final CPlainAttr attr, final SyncopeClientException invalidValues) {
 
         // if schema is multivalue, all values are considered for addition;
@@ -77,8 +72,8 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
         List<String> valuesProvided = schema.isMultivalue()
                 ? values
                 : (values.isEmpty()
-                        ? Collections.<String>emptyList()
-                        : Collections.singletonList(values.iterator().next()));
+                ? Collections.<String>emptyList()
+                : Collections.singletonList(values.iterator().next()));
 
         if (valuesProvided.isEmpty()) {
             JexlContext jexlContext = new MapContext();
@@ -120,16 +115,16 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
     }
 
     @Override
-    public CPlainAttr getAttribute(final AttrTO attributeTO) {
-        PlainSchema schema = getPlainSchema(attributeTO.getSchema());
+    public CPlainAttr getAttr(final AttrTO attrTO) {
+        PlainSchema schema = getPlainSchema(attrTO.getSchema());
         if (schema == null) {
-            throw new NotFoundException("Conf schema " + attributeTO.getSchema());
+            throw new NotFoundException("Conf schema " + attrTO.getSchema());
         } else {
             SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
             CPlainAttr attr = entityFactory.newEntity(CPlainAttr.class);
             attr.setSchema(schema);
-            fillAttribute(attributeTO.getValues(), schema, attr, invalidValues);
+            fillAttr(attrTO.getValues(), schema, attr, invalidValues);
 
             if (!invalidValues.isEmpty()) {
                 throw invalidValues;

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index c7ab1b1..d0d751a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -332,8 +332,14 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
         Map<VirSchema, List<String>> virAttrValues = details
                 ? virAttrHandler.getValues(group)
                 : Collections.<VirSchema, List<String>>emptyMap();
-        fillTO(groupTO, group.getRealm().getFullPath(), group.getAuxClasses(),
-                group.getPlainAttrs(), derAttrValues, virAttrValues, group.getResources());
+        fillTO(groupTO,
+                group.getRealm().getFullPath(),
+                group.getAuxClasses(),
+                group.getPlainAttrs(),
+                derAttrValues,
+                virAttrValues,
+                group.getResources(),
+                details);
 
         if (group.getUDynMembership() != null) {
             groupTO.setUDynMembershipCond(group.getUDynMembership().getFIQLCond());

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 5816820..4437713 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -570,7 +570,8 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
                 user.getPlainAttrs(),
                 derAttrHandler.getValues(user),
                 virAttrValues,
-                userDAO.findAllResources(user));
+                userDAO.findAllResources(user),
+                details);
 
         if (details) {
             // roles

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/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 b4aaf2e..95325a9 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
@@ -180,6 +180,8 @@ public class AnyObjectITCase extends AbstractITCase {
         anyObjectService.update(anyObjectTO.getKey(), SchemaType.PLAIN, updated);
 
         AttrTO location = anyObjectService.read(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
+        // need to remove schemaInfo which is included when reading the any object
+        location.setSchemaInfo(null);
         assertEquals(updated, location);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/95d4b15a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
index d1780e7..d2d9b64 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
@@ -58,6 +58,7 @@ public class ConfigurationITCase extends AbstractITCase {
         configurationService.set(conf);
 
         AttrTO actual = configurationService.get(conf.getSchema());
+        actual.setSchemaInfo(null);
         assertEquals(actual, conf);
     }
 
@@ -81,6 +82,7 @@ public class ConfigurationITCase extends AbstractITCase {
         configurationService.set(conf);
 
         AttrTO actual = configurationService.get(conf.getSchema());
+        actual.setSchemaInfo(null);
         assertEquals(actual, conf);
     }
 


[2/2] syncope git commit: [SYNCOPE-948] Improvement provided

Posted by il...@apache.org.
[SYNCOPE-948] Improvement provided


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

Branch: refs/heads/master
Commit: 84cb7fb4f449c4bd76580273eaa6eca2e3ad70f4
Parents: 228bf3e
Author: Francesco Chicchiricc� <il...@apache.org>
Authored: Tue Sep 20 13:21:18 2016 +0200
Committer: Francesco Chicchiricc� <il...@apache.org>
Committed: Tue Sep 20 13:23:40 2016 +0200

----------------------------------------------------------------------
 .../anyobject/AnyObjectResultManager.java       |  3 --
 .../cli/commands/group/GroupResultManager.java  |  3 --
 .../cli/commands/user/UserResultManager.java    |  3 --
 .../client/console/wizards/any/PlainAttrs.java  | 12 ++---
 .../client/console/wizards/any/VirAttrs.java    | 12 +++--
 .../syncope/common/lib/AnyOperations.java       |  7 ++-
 .../apache/syncope/common/lib/to/AttrTO.java    | 27 ++++++-----
 .../syncope/common/lib/AnyOperationsTest.java   | 51 ++++++++++++++++++++
 .../syncope/core/logic/ConfigurationLogic.java  |  2 +-
 .../core/logic/report/XSLTTransformer.java      |  2 +-
 .../test/resources/domains/MasterContent.xml    | 10 ++--
 .../api/data/ConfigurationDataBinder.java       |  2 +-
 .../java/data/AbstractAnyDataBinder.java        | 50 +++++++++++--------
 .../java/data/AnyObjectDataBinderImpl.java      |  3 +-
 .../java/data/ConfigurationDataBinderImpl.java  | 35 ++++++--------
 .../java/data/GroupDataBinderImpl.java          | 10 +++-
 .../java/data/UserDataBinderImpl.java           |  3 +-
 .../syncope/fit/core/AnyObjectITCase.java       |  2 +
 .../syncope/fit/core/ConfigurationITCase.java   |  2 +
 19 files changed, 154 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
index a107239..1e2c3e6 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/anyobject/AnyObjectResultManager.java
@@ -68,9 +68,6 @@ public class AnyObjectResultManager extends CommonsResultManager {
                 .append(attribute.getSchema())
                 .append(": ")
                 .append(attribute.getValues());
-        if (attribute.isReadonly()) {
-            attributeMessageBuilder.append(" - is readonly");
-        }
         System.out.println(attributeMessageBuilder.toString());
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
index db4796d..da4c349 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/group/GroupResultManager.java
@@ -71,9 +71,6 @@ public class GroupResultManager extends CommonsResultManager {
                 .append(attribute.getSchema())
                 .append(": ")
                 .append(attribute.getValues());
-        if (attribute.isReadonly()) {
-            attributeMessageBuilder.append(" - is readonly");
-        }
         System.out.println(attributeMessageBuilder.toString());
         System.out.println("");
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
----------------------------------------------------------------------
diff --git a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
index 2c479a4..4a1111a 100644
--- a/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
+++ b/client/cli/src/main/java/org/apache/syncope/client/cli/commands/user/UserResultManager.java
@@ -88,9 +88,6 @@ public class UserResultManager extends CommonsResultManager {
                     .append(attrTO.getSchema())
                     .append(": ")
                     .append(attrTO.getValues());
-            if (attrTO.isReadonly()) {
-                attributeSentence.append(" - is readonly.");
-            }
             System.out.println(attributeSentence);
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/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 c5c2f0c..96d9273 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
@@ -106,7 +106,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                         return new PlainSchemas(
                                 panelId,
                                 membershipSchemas.get(membershipTO.getGroupKey()),
-                                new ListModel<AttrTO>(getAttrsFromTO(membershipTO)));
+                                new ListModel<>(getAttrsFromTO(membershipTO)));
                     }
                 }), Model.of(-1)).setOutputMarkupId(true));
             }
@@ -150,8 +150,8 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
             if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
                 attrTO.getValues().add("");
 
-                // is important to set readonly only after values setting
-                attrTO.setReadonly(schema.isReadonly());
+                // is important to set the schema info only after values setting
+                attrTO.setSchemaInfo(schema);
             } else {
                 attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
             }
@@ -175,8 +175,8 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
             if (attrMap.get(schema.getKey()) == null || attrMap.get(schema.getKey()).getValues().isEmpty()) {
                 attrTO.getValues().add("");
 
-                // is important to set readonly only after values setting
-                attrTO.setReadonly(schema.isReadonly());
+                // is important to set the schema info only after values setting
+                attrTO.setSchemaInfo(schema);
             } else {
                 attrTO.getValues().addAll(attrMap.get(schema.getKey()).getValues());
             }
@@ -232,7 +232,7 @@ public class PlainAttrs extends AbstractAttrs<PlainSchemaTO> {
                 break;
 
             case Enum:
-                panel = new AjaxDropDownChoicePanel<>("panel", schemaTO.getKey(), new Model<String>(), false);
+                panel = new AjaxDropDownChoicePanel<>("panel", schemaTO.getKey(), new Model<>(), false);
                 ((AjaxDropDownChoicePanel<String>) panel).setChoices(SchemaUtils.getEnumeratedValues(schemaTO));
 
                 if (StringUtils.isNotBlank(schemaTO.getEnumerationKeys())) {

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/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 27bc7f3..b3432f8 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
@@ -175,19 +175,21 @@ public class VirAttrs extends AbstractAttrs<VirSchemaTO> {
                 protected void populateItem(final ListItem<AttrTO> item) {
                     AttrTO attrTO = item.getModelObject();
 
-                    attrTO.setReadonly(attrTO.isReadonly());
+                    AjaxTextFieldPanel panel =
+                            new AjaxTextFieldPanel("panel", attrTO.getSchema(), new Model<String>(), false);
 
-                    final AjaxTextFieldPanel panel
-                            = new AjaxTextFieldPanel("panel", attrTO.getSchema(), new Model<String>(), false);
+                    boolean readonly = attrTO.getSchemaInfo() == null
+                            ? false
+                            : VirSchemaTO.class.cast(attrTO.getSchemaInfo()).isReadonly();
 
                     if (mode == AjaxWizard.Mode.TEMPLATE) {
-                        item.add(panel.enableJexlHelp().setEnabled(!attrTO.isReadonly()));
+                        item.add(panel.enableJexlHelp().setEnabled(!readonly));
                     } else {
                         item.add(new MultiFieldPanel.Builder<>(
                                 new PropertyModel<List<String>>(attrTO, "values")).build(
                                 "panel",
                                 attrTO.getSchema(),
-                                panel).setEnabled(!attrTO.isReadonly()));
+                                panel).setEnabled(!readonly));
                     }
                 }
             });

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/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 2d3f8f9..b4cc329 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
@@ -186,8 +186,11 @@ public final class AnyOperations {
                             attrTO(new AttrTO.Builder().schema(attrTO.getSchema()).build()).
                             build());
                 }
-            } else {
-                AttrPatch patch = new AttrPatch.Builder().operation(PatchOperation.ADD_REPLACE).attrTO(attrTO).build();
+            } else if (!originalAttrs.containsKey(attrTO.getSchema())
+                    || !originalAttrs.get(attrTO.getSchema()).getValues().equals(attrTO.getValues())) {
+
+                AttrPatch patch = new AttrPatch.Builder().operation(PatchOperation.ADD_REPLACE).attrTO(attrTO).
+                        build();
                 if (!patch.isEmpty()) {
                     result.getPlainAttrs().add(patch);
                 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
index 65a6b51..7822a6b 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/to/AttrTO.java
@@ -45,8 +45,8 @@ public class AttrTO extends AbstractBaseBean {
             return this;
         }
 
-        public Builder readonly(final boolean readonly) {
-            instance.setReadonly(readonly);
+        public Builder schemaInfo(final AbstractSchemaTO schemaInfo) {
+            instance.schemaInfo = schemaInfo;
             return this;
         }
 
@@ -71,6 +71,11 @@ public class AttrTO extends AbstractBaseBean {
     }
 
     /**
+     * (Optional) schema information for this attribute.
+     */
+    private AbstractSchemaTO schemaInfo;
+
+    /**
      * Name of the schema that this attribute is referring to.
      */
     private String schema;
@@ -81,9 +86,15 @@ public class AttrTO extends AbstractBaseBean {
     private final List<String> values = new ArrayList<>();
 
     /**
-     * Whether this attribute is read-only or not.
+     * @return schema information for this attribute; may be {@code NULL}
      */
-    private boolean readonly = false;
+    public AbstractSchemaTO getSchemaInfo() {
+        return schemaInfo;
+    }
+
+    public void setSchemaInfo(final AbstractSchemaTO schemaInfo) {
+        this.schemaInfo = schemaInfo;
+    }
 
     /**
      * @return the name of the schema that this attribute is referring to
@@ -110,12 +121,4 @@ public class AttrTO extends AbstractBaseBean {
     public List<String> getValues() {
         return values;
     }
-
-    public boolean isReadonly() {
-        return readonly;
-    }
-
-    public void setReadonly(final boolean readonly) {
-        this.readonly = readonly;
-    }
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java
----------------------------------------------------------------------
diff --git a/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java b/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java
new file mode 100644
index 0000000..51b6423
--- /dev/null
+++ b/common/lib/src/test/java/org/apache/syncope/common/lib/AnyOperationsTest.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.common.lib;
+
+import static org.junit.Assert.assertEquals;
+
+import org.apache.syncope.common.lib.patch.AnyObjectPatch;
+import org.apache.syncope.common.lib.patch.AttrPatch;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
+import org.apache.syncope.common.lib.to.AttrTO;
+import org.apache.syncope.common.lib.types.PatchOperation;
+import org.junit.Test;
+
+public class AnyOperationsTest {
+
+    @Test
+    public void mindiff() {
+        AnyObjectTO oldOne = new AnyObjectTO();
+        oldOne.setName("name");
+        oldOne.getPlainAttrs().add(new AttrTO.Builder().schema("plain").value("oldValue").build());
+        oldOne.getPlainAttrs().add(new AttrTO.Builder().schema("encrypted").value("oldValue").build());
+
+        AnyObjectTO newOne = new AnyObjectTO();
+        newOne.setName("name");
+        newOne.getPlainAttrs().add(new AttrTO.Builder().schema("plain").value("newValue").build());
+        newOne.getPlainAttrs().add(new AttrTO.Builder().schema("encrypted").value("oldValue").build());
+
+        AnyObjectPatch diff = AnyOperations.diff(newOne, oldOne, true);
+        assertEquals(1, diff.getPlainAttrs().size());
+
+        AttrPatch patch = diff.getPlainAttrs().iterator().next();
+        assertEquals(PatchOperation.ADD_REPLACE, patch.getOperation());
+        assertEquals("plain", patch.getAttrTO().getSchema());
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
index b6c31b4..200cc7a 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/ConfigurationLogic.java
@@ -103,7 +103,7 @@ public class ConfigurationLogic extends AbstractTransactionalLogic<AttrTO> {
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONFIGURATION_SET + "')")
     public void set(final AttrTO value) {
-        confDAO.save(binder.getAttribute(value));
+        confDAO.save(binder.getAttr(value));
     }
 
     @PreAuthorize("hasRole('" + StandardEntitlement.CONFIGURATION_EXPORT + "')")

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
----------------------------------------------------------------------
diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java b/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
index 91ecb92..3dd6d78 100644
--- a/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
+++ b/core/logic/src/main/java/org/apache/syncope/core/logic/report/XSLTTransformer.java
@@ -132,7 +132,7 @@ public class XSLTTransformer extends AbstractSAXTransformer implements CachingPi
         if (parameters == null) {
             this.parameters = null;
         } else {
-            this.parameters = new HashMap<>(parameters);
+            this.parameters = new HashMap<String, Object>(parameters);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/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 123da30..40a2e63 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -1055,7 +1055,7 @@ under the License.
         pullMode="INCREMENTAL" unmatchingRule="ASSIGN" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="3a6173a9-8c34-4e37-b3b1-0c2ea385fac0"
                        pullTask_id="c41b9b71-9bfa-4f90-89f2-84787def4c5c" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","readonly":false,"values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"rightType":"GROUP","rightKey":"f779c0d4-633b-4be5-8f57-32eb478a3ca5","groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","readonly":false,"values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["csv"],"derAttrs":[{"schema":"cn","values":[""]}],"virAttrs":[],"resources":["resource-testdb"],"relationships":[],"memberships":[{"rightType":"GROUP","rightKey":"f779c0d4-633b-4be5-8f57-32eb478a3ca5","groupName":null}],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","values":["email == &apos;test8@syncope.apache.org&apos;? &apos;TYPE_8&apos;: &apos;TYPE_OTHER&apos;"]}]}'/>
   <AnyTemplatePullTask id="b3772d66-ec06-4133-bf38-b3273845ac5b"
                        pullTask_id="c41b9b71-9bfa-4f90-89f2-84787def4c5c" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
@@ -1071,7 +1071,7 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="1" performUpdate="1" performDelete="0" syncStatus="1" pullMode="FULL_RECONCILIATION"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="6c3f578d-327b-4a7c-8037-6f5ba24eb770" pullTask_id="83f7e85d-9774-43fe-adba-ccd856312994" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","readonly":false,"values":["&apos;type a&apos;"]},{"schema":"userId","readonly":false,"values":["&apos;reconciled@syncope.apache.org&apos;"]},{"schema":"fullname","readonly":false,"values":["&apos;reconciled fullname&apos;"]},{"schema":"surname","readonly":false,"values":["&apos;surname&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"relationships":[],"memberships":[],"dynGroups":[],"roles":[],"dynRoles":[],"plainAttrs":[{"schema":"ctype","values":["&apos;type a&apos;"]},{"schema":"userId","values":["&apos;reconciled@syncope.apache.org&apos;"]},{"schema":"fullname","values":["&apos;reconciled fullname&apos;"]},{"schema":"surname","values":["&apos;surname&apos;"]}]}'/>
   <AnyTemplatePullTask id="45b61137-c7c3-49ee-86e0-9efffa75ae68" pullTask_id="83f7e85d-9774-43fe-adba-ccd856312994" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
   <Task DTYPE="PullTask" id="81d88f73-d474-4450-9031-605daa4e313f" name="TestDB2 Task" resource_id="resource-testdb2"
@@ -1084,9 +1084,9 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" pullMode="FULL_RECONCILIATION" performCreate="1" performDelete="1" performUpdate="1" syncStatus="0"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="df655a2a-40c0-43b1-a157-3f4988802f58" pullTask_id="1e419ca4-ea81-4493-a14f-28b90113686d" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":"&apos;/&apos; + title","status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["minimal group"],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","readonly":true,"values":[""]}],"resources":["resource-ldap"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":"&apos;/&apos; + title","status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":["minimal group"],"derAttrs":[],"virAttrs":[{"schema":"virtualReadOnly","values":[""]}],"resources":["resource-ldap"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[]}'/>
   <AnyTemplatePullTask id="fda22ff3-98f3-42e4-a2ae-cd9a28282d57" pullTask_id="1e419ca4-ea81-4493-a14f-28b90113686d" anyType_id="GROUP"
-                       template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","readonly":false,"values":["true"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[{"schema":"show","values":["true"]}]}'/>
   <PullTask_actionsClassNames pullTask_id="1e419ca4-ea81-4493-a14f-28b90113686d" actionClassName="org.apache.syncope.core.provisioning.java.pushpull.LDAPMembershipPullActions"/>
   <Task DTYPE="PullTask" id="38abbf9e-a1a3-40a1-a15f-7d0ac02f47f1" name="VirAttrCache test" resource_id="resource-csv"
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="0" performUpdate="1" performDelete="0" syncStatus="0" pullMode="FULL_RECONCILIATION"
@@ -1150,7 +1150,7 @@ under the License.
         destinationRealm_id="e4c28e7a-9dbf-4ee7-9441-93812a0d4a28" performCreate="1" performUpdate="1" performDelete="1" syncStatus="1" pullMode="INCREMENTAL"
         unmatchingRule="PROVISION" matchingRule="UPDATE" active="1"/>
   <AnyTemplatePullTask id="8bc41ba1-cc1d-4ee0-bb43-61cd148b414f" pullTask_id="986867e2-993b-430e-8feb-aa9abb4c1dcd" anyType_id="USER"
-                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","readonly":false,"values":[""]},{"schema":"userId","readonly":false,"values":["&apos;test&apos;"]},{"schema":"fullname","readonly":false,"values":["&apos;test&apos;"]},{"schema":"surname","readonly":false,"values":["&apos;test&apos;"]}]}'/>
+                       template='{"@class":"org.apache.syncope.common.lib.to.UserTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"USER","realm":null,"status":null,"password":null,"token":null,"tokenExpireTime":null,"username":null,"lastLoginDate":null,"changePwdDate":null,"failedLogins":null,"securityQuestion":null,"securityAnswer":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":["resource-testdb"],"roles":[],"dynRoles":[],"relationships":[],"memberships":[],"dynGroups":[],"plainAttrs":[{"schema":"firstname","values":[""]},{"schema":"userId","values":["&apos;test&apos;"]},{"schema":"fullname","values":["&apos;test&apos;"]},{"schema":"surname","values":["&apos;test&apos;"]}]}'/>
   <AnyTemplatePullTask id="9af0e343-8a37-42d2-9bc7-6e2e3b103219" pullTask_id="986867e2-993b-430e-8feb-aa9abb4c1dcd" anyType_id="GROUP"
                        template='{"@class":"org.apache.syncope.common.lib.to.GroupTO","creator":null,"creationDate":null,"lastModifier":null,"lastChangeDate":null,"key":null,"type":"GROUP","realm":null,"status":null,"name":null,"userOwner":null,"groupOwner":null,"udynMembershipCond":null,"auxClasses":[],"derAttrs":[],"virAttrs":[],"resources":[],"plainAttrs":[]}'/>
   <Task DTYPE="PullTask" id="feae4e57-15ca-40d9-b973-8b9015efca49" name="CSV (unlink matching; ignore unmatching)" resource_id="resource-csv"

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
index e62407f..0956d24 100644
--- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
+++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/ConfigurationDataBinder.java
@@ -28,6 +28,6 @@ public interface ConfigurationDataBinder {
 
     List<AttrTO> getConfTO();
 
-    CPlainAttr getAttribute(AttrTO attributeTO);
+    CPlainAttr getAttr(AttrTO attrTO);
 
 }

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
index 167ced4..0bb5e25 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AbstractAnyDataBinder.java
@@ -89,6 +89,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.apache.syncope.core.persistence.api.entity.GroupableRelatable;
 import org.apache.syncope.core.provisioning.java.IntAttrNameParser;
 import org.apache.syncope.core.provisioning.api.IntAttrName;
+import org.apache.syncope.core.provisioning.api.data.SchemaDataBinder;
 import org.apache.syncope.core.provisioning.java.utils.MappingUtils;
 
 abstract class AbstractAnyDataBinder {
@@ -96,6 +97,9 @@ abstract class AbstractAnyDataBinder {
     protected static final Logger LOG = LoggerFactory.getLogger(AbstractAnyDataBinder.class);
 
     @Autowired
+    protected SchemaDataBinder schemaDataBinder;
+
+    @Autowired
     protected RealmDAO realmDAO;
 
     @Autowired
@@ -198,8 +202,8 @@ abstract class AbstractAnyDataBinder {
         List<String> valuesProvided = schema.isMultivalue()
                 ? values
                 : (values.isEmpty()
-                        ? Collections.<String>emptyList()
-                        : Collections.singletonList(values.iterator().next()));
+                ? Collections.<String>emptyList()
+                : Collections.singletonList(values.iterator().next()));
 
         for (String value : valuesProvided) {
             if (StringUtils.isBlank(value)) {
@@ -549,40 +553,48 @@ abstract class AbstractAnyDataBinder {
         }
     }
 
-    protected void fillTO(final AnyTO anyTO,
+    protected void fillTO(
+            final AnyTO anyTO,
             final String realmFullPath,
             final Collection<? extends AnyTypeClass> auxClasses,
             final Collection<? extends PlainAttr<?>> plainAttrs,
             final Map<DerSchema, String> derAttrs,
             final Map<VirSchema, List<String>> virAttrs,
-            final Collection<? extends ExternalResource> resources) {
+            final Collection<? extends ExternalResource> resources,
+            final boolean details) {
 
         anyTO.setRealm(realmFullPath);
 
         CollectionUtils.collect(auxClasses, EntityUtils.<AnyTypeClass>keyTransformer(), anyTO.getAuxClasses());
 
         for (PlainAttr<?> plainAttr : plainAttrs) {
-            anyTO.getPlainAttrs().add(new AttrTO.Builder().
+            AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(plainAttr.getSchema().getKey()).
-                    values(plainAttr.getValuesAsStrings()).
-                    readonly(plainAttr.getSchema().isReadonly()).
-                    build());
+                    values(plainAttr.getValuesAsStrings());
+            if (details) {
+                attrTOBuilder.schemaInfo(schemaDataBinder.getPlainSchemaTO(plainAttr.getSchema()));
+            }
+            anyTO.getPlainAttrs().add(attrTOBuilder.build());
         }
 
         for (Map.Entry<DerSchema, String> entry : derAttrs.entrySet()) {
-            anyTO.getDerAttrs().add(new AttrTO.Builder().
+            AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
-                    value(entry.getValue()).
-                    readonly(true).
-                    build());
+                    value(entry.getValue());
+            if (details) {
+                attrTOBuilder.schemaInfo(schemaDataBinder.getDerSchemaTO(entry.getKey()));
+            }
+            anyTO.getDerAttrs().add(attrTOBuilder.build());
         }
 
         for (Map.Entry<VirSchema, List<String>> entry : virAttrs.entrySet()) {
-            anyTO.getVirAttrs().add(new AttrTO.Builder().
+            AttrTO.Builder attrTOBuilder = new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
-                    values(entry.getValue()).
-                    readonly(entry.getKey().isReadonly()).
-                    build());
+                    values(entry.getValue());
+            if (details) {
+                attrTOBuilder.schemaInfo(schemaDataBinder.getVirSchemaTO(entry.getKey()));
+            }
+            anyTO.getVirAttrs().add(attrTOBuilder.build());
         }
 
         for (ExternalResource resource : resources) {
@@ -611,7 +623,7 @@ abstract class AbstractAnyDataBinder {
             membershipTO.getPlainAttrs().add(new AttrTO.Builder().
                     schema(plainAttr.getSchema().getKey()).
                     values(plainAttr.getValuesAsStrings()).
-                    readonly(plainAttr.getSchema().isReadonly()).
+                    schemaInfo(schemaDataBinder.getPlainSchemaTO(plainAttr.getSchema())).
                     build());
         }
 
@@ -619,7 +631,7 @@ abstract class AbstractAnyDataBinder {
             membershipTO.getDerAttrs().add(new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     value(entry.getValue()).
-                    readonly(true).
+                    schemaInfo(schemaDataBinder.getDerSchemaTO(entry.getKey())).
                     build());
         }
 
@@ -627,7 +639,7 @@ abstract class AbstractAnyDataBinder {
             membershipTO.getVirAttrs().add(new AttrTO.Builder().
                     schema(entry.getKey().getKey()).
                     values(entry.getValue()).
-                    readonly(entry.getKey().isReadonly()).
+                    schemaInfo(schemaDataBinder.getVirSchemaTO(entry.getKey())).
                     build());
         }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
index a998a66..677bf81 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java
@@ -97,7 +97,8 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An
                 anyObject.getPlainAttrs(),
                 derAttrHandler.getValues(anyObject),
                 virAttrValues,
-                anyObjectDAO.findAllResources(anyObject));
+                anyObjectDAO.findAllResources(anyObject),
+                details);
 
         if (details) {
             // relationships

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
index 5d277b3..56b0b92 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/ConfigurationDataBinderImpl.java
@@ -48,28 +48,23 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
 
     @Override
     public List<AttrTO> getConfTO() {
-        final List<AttrTO> attrTOs = new ArrayList<>();
-        for (final CPlainAttr plainAttr : confDAO.get().getPlainAttrs()) {
-            final AttrTO attrTO = new AttrTO();
-            attrTO.setSchema(plainAttr.getSchema().getKey());
-            attrTO.getValues().addAll(plainAttr.getValuesAsStrings());
-            attrTO.setReadonly(plainAttr.getSchema().isReadonly());
-            attrTOs.add(attrTO);
+        List<AttrTO> attrTOs = new ArrayList<>();
+        for (CPlainAttr attr : confDAO.get().getPlainAttrs()) {
+            attrTOs.add(getAttrTO(attr));
         }
         return attrTOs;
     }
 
     @Override
     public AttrTO getAttrTO(final CPlainAttr attr) {
-        AttrTO attributeTO = new AttrTO();
-        attributeTO.setSchema(attr.getSchema().getKey());
-        attributeTO.getValues().addAll(attr.getValuesAsStrings());
-        attributeTO.setReadonly(attr.getSchema().isReadonly());
-
-        return attributeTO;
+        return new AttrTO.Builder().
+                schemaInfo(schemaDataBinder.getPlainSchemaTO(attr.getSchema())).
+                schema(attr.getSchema().getKey()).
+                values(attr.getValuesAsStrings()).
+                build();
     }
 
-    private void fillAttribute(final List<String> values,
+    private void fillAttr(final List<String> values,
             final PlainSchema schema, final CPlainAttr attr, final SyncopeClientException invalidValues) {
 
         // if schema is multivalue, all values are considered for addition;
@@ -77,8 +72,8 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
         List<String> valuesProvided = schema.isMultivalue()
                 ? values
                 : (values.isEmpty()
-                        ? Collections.<String>emptyList()
-                        : Collections.singletonList(values.iterator().next()));
+                ? Collections.<String>emptyList()
+                : Collections.singletonList(values.iterator().next()));
 
         if (valuesProvided.isEmpty()) {
             JexlContext jexlContext = new MapContext();
@@ -120,16 +115,16 @@ public class ConfigurationDataBinderImpl extends AbstractAnyDataBinder implement
     }
 
     @Override
-    public CPlainAttr getAttribute(final AttrTO attributeTO) {
-        PlainSchema schema = getPlainSchema(attributeTO.getSchema());
+    public CPlainAttr getAttr(final AttrTO attrTO) {
+        PlainSchema schema = getPlainSchema(attrTO.getSchema());
         if (schema == null) {
-            throw new NotFoundException("Conf schema " + attributeTO.getSchema());
+            throw new NotFoundException("Conf schema " + attrTO.getSchema());
         } else {
             SyncopeClientException invalidValues = SyncopeClientException.build(ClientExceptionType.InvalidValues);
 
             CPlainAttr attr = entityFactory.newEntity(CPlainAttr.class);
             attr.setSchema(schema);
-            fillAttribute(attributeTO.getValues(), schema, attr, invalidValues);
+            fillAttr(attrTO.getValues(), schema, attr, invalidValues);
 
             if (!invalidValues.isEmpty()) {
                 throw invalidValues;

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
index c7ab1b1..d0d751a 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java
@@ -332,8 +332,14 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
         Map<VirSchema, List<String>> virAttrValues = details
                 ? virAttrHandler.getValues(group)
                 : Collections.<VirSchema, List<String>>emptyMap();
-        fillTO(groupTO, group.getRealm().getFullPath(), group.getAuxClasses(),
-                group.getPlainAttrs(), derAttrValues, virAttrValues, group.getResources());
+        fillTO(groupTO,
+                group.getRealm().getFullPath(),
+                group.getAuxClasses(),
+                group.getPlainAttrs(),
+                derAttrValues,
+                virAttrValues,
+                group.getResources(),
+                details);
 
         if (group.getUDynMembership() != null) {
             groupTO.setUDynMembershipCond(group.getUDynMembership().getFIQLCond());

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
----------------------------------------------------------------------
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
index 5816820..4437713 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java
@@ -570,7 +570,8 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat
                 user.getPlainAttrs(),
                 derAttrHandler.getValues(user),
                 virAttrValues,
-                userDAO.findAllResources(user));
+                userDAO.findAllResources(user),
+                details);
 
         if (details) {
             // roles

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/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 b4aaf2e..95325a9 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
@@ -180,6 +180,8 @@ public class AnyObjectITCase extends AbstractITCase {
         anyObjectService.update(anyObjectTO.getKey(), SchemaType.PLAIN, updated);
 
         AttrTO location = anyObjectService.read(anyObjectTO.getKey(), SchemaType.PLAIN, "location");
+        // need to remove schemaInfo which is included when reading the any object
+        location.setSchemaInfo(null);
         assertEquals(updated, location);
     }
 

http://git-wip-us.apache.org/repos/asf/syncope/blob/84cb7fb4/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
index d1780e7..d2d9b64 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/ConfigurationITCase.java
@@ -58,6 +58,7 @@ public class ConfigurationITCase extends AbstractITCase {
         configurationService.set(conf);
 
         AttrTO actual = configurationService.get(conf.getSchema());
+        actual.setSchemaInfo(null);
         assertEquals(actual, conf);
     }
 
@@ -81,6 +82,7 @@ public class ConfigurationITCase extends AbstractITCase {
         configurationService.set(conf);
 
         AttrTO actual = configurationService.get(conf.getSchema());
+        actual.setSchemaInfo(null);
         assertEquals(actual, conf);
     }