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ò <ilgro...@apache.org> Authored: Tue Sep 20 13:21:18 2016 +0200 Committer: Francesco Chicchiriccò <ilgro...@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 == 'te...@syncope.apache.org'? 'TYPE_8': 'TYPE_OTHER'"]}]}'/> + 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 == 'te...@syncope.apache.org'? 'TYPE_8': 'TYPE_OTHER'"]}]}'/> <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":["'type a'"]},{"schema":"userId","readonly":false,"values":["'reconci...@syncope.apache.org'"]},{"schema":"fullname","readonly":false,"values":["'reconciled fullname'"]},{"schema":"surname","readonly":false,"values":["'surname'"]}]}'/> + 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":["'type a'"]},{"schema":"userId","values":["'reconci...@syncope.apache.org'"]},{"schema":"fullname","values":["'reconciled fullname'"]},{"schema":"surname","values":["'surname'"]}]}'/> <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":"'/' + 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":"'/' + 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":["'test'"]},{"schema":"fullname","readonly":false,"values":["'test'"]},{"schema":"surname","readonly":false,"values":["'test'"]}]}'/> + 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":["'test'"]},{"schema":"fullname","values":["'test'"]},{"schema":"surname","values":["'test'"]}]}'/> <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); }