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 2018/12/05 12:26:03 UTC
[syncope] 02/02: [SYNCOPE-1408] Ensure all original,
unmodified attributes are considered, during patch generation for update
This is an automated email from the ASF dual-hosted git repository.
ilgrosso pushed a commit to branch 2_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git
commit 80123cc0bb8849c0b1edb7c38079fda22e3056af
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Dec 5 13:07:16 2018 +0100
[SYNCOPE-1408] Ensure all original, unmodified attributes are considered, during patch generation for update
---
.../wizards/any/AnyObjectWizardBuilder.java | 2 +-
.../console/wizards/any/AnyWizardBuilder.java | 68 +++++++++++++++++++---
.../console/wizards/any/GroupWizardBuilder.java | 2 +-
.../console/wizards/any/UserWizardBuilder.java | 2 +-
4 files changed, 64 insertions(+), 10 deletions(-)
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWizardBuilder.java
index 4ba73c8..835bb7a 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyObjectWizardBuilder.java
@@ -53,7 +53,7 @@ public class AnyObjectWizardBuilder extends AnyWizardBuilder<AnyObjectTO> implem
if (inner.getKey() == null) {
result = anyObjectRestClient.create(inner);
} else {
- inner.getPlainAttrs().addAll(cleanEmptyPlainAttrs(inner.getPlainAttrs()));
+ fixPlainAndVirAttrs(inner, getOriginalItem().getInnerObject());
AnyObjectPatch patch = AnyOperations.diff(inner, getOriginalItem().getInnerObject(), false);
// update just if it is changed
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
index a316510..b5de085 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/AnyWizardBuilder.java
@@ -18,9 +18,7 @@
*/
package org.apache.syncope.client.console.wizards.any;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import org.apache.syncope.client.console.layout.AbstractAnyFormLayout;
@@ -33,6 +31,8 @@ import org.apache.syncope.client.console.wizards.AjaxWizardBuilder;
import org.apache.syncope.common.lib.to.AnyTO;
import org.apache.syncope.common.lib.to.AttrTO;
import org.apache.syncope.common.lib.to.GroupTO;
+import org.apache.syncope.common.lib.to.GroupableRelatableTO;
+import org.apache.syncope.common.lib.to.MembershipTO;
import org.apache.syncope.common.lib.to.UserTO;
import org.apache.wicket.PageReference;
import org.apache.wicket.extensions.wizard.WizardModel;
@@ -177,16 +177,70 @@ public abstract class AnyWizardBuilder<A extends AnyTO> extends AjaxWizardBuilde
}
}
- protected Set<AttrTO> cleanEmptyPlainAttrs(final Set<AttrTO> plainAttrs) {
- Set<AttrTO> newPlainAttrs = new HashSet<>(plainAttrs);
- plainAttrs.clear();
- CollectionUtils.filterInverse(newPlainAttrs, new Predicate<AttrTO>() {
+ protected void fixPlainAndVirAttrs(final AnyTO updated, final AnyTO original) {
+ // re-add to the updated object any missing plain or virtual attribute (compared to original): this to cope with
+ // form layout, which might have not included some plain or virtual attributes
+ for (AttrTO attr : original.getPlainAttrs()) {
+ if (updated.getPlainAttr(attr.getSchema()) == null) {
+ updated.getPlainAttrs().add(attr);
+ }
+ }
+ for (AttrTO attr : original.getVirAttrs()) {
+ if (updated.getVirAttr(attr.getSchema()) == null) {
+ updated.getVirAttrs().add(attr);
+ }
+ }
+ if (updated instanceof GroupableRelatableTO && original instanceof GroupableRelatableTO) {
+ for (MembershipTO oMemb : GroupableRelatableTO.class.cast(original).getMemberships()) {
+ MembershipTO uMemb = GroupableRelatableTO.class.cast(updated).getMembership(oMemb.getGroupKey());
+ if (uMemb != null) {
+ for (AttrTO attr : oMemb.getPlainAttrs()) {
+ if (uMemb.getPlainAttr(attr.getSchema()) == null) {
+ uMemb.getPlainAttrs().add(attr);
+ }
+ }
+ for (AttrTO attr : oMemb.getVirAttrs()) {
+ if (uMemb.getVirAttr(attr.getSchema()) == null) {
+ uMemb.getVirAttrs().add(attr);
+ }
+ }
+ }
+ }
+ }
+
+ // remove from the updated object any plain or virtual attribute without values, thus triggering for removal in
+ // the generated patch
+ CollectionUtils.filterInverse(updated.getPlainAttrs(), new Predicate<AttrTO>() {
@Override
public boolean evaluate(final AttrTO attr) {
return attr.getValues().isEmpty();
}
});
- return newPlainAttrs;
+ CollectionUtils.filterInverse(updated.getVirAttrs(), new Predicate<AttrTO>() {
+
+ @Override
+ public boolean evaluate(final AttrTO attr) {
+ return attr.getValues().isEmpty();
+ }
+ });
+ if (updated instanceof GroupableRelatableTO) {
+ for (MembershipTO memb : GroupableRelatableTO.class.cast(updated).getMemberships()) {
+ CollectionUtils.filterInverse(memb.getPlainAttrs(), new Predicate<AttrTO>() {
+
+ @Override
+ public boolean evaluate(final AttrTO attr) {
+ return attr.getValues().isEmpty();
+ }
+ });
+ CollectionUtils.filterInverse(memb.getVirAttrs(), new Predicate<AttrTO>() {
+
+ @Override
+ public boolean evaluate(final AttrTO attr) {
+ return attr.getValues().isEmpty();
+ }
+ });
+ }
+ }
}
}
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
index 52fd40c..a1593d9 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/GroupWizardBuilder.java
@@ -72,7 +72,7 @@ public class GroupWizardBuilder extends AnyWizardBuilder<GroupTO> implements Gro
if (inner.getKey() == null) {
result = groupRestClient.create(inner);
} else {
- inner.getPlainAttrs().addAll(cleanEmptyPlainAttrs(inner.getPlainAttrs()));
+ fixPlainAndVirAttrs(inner, getOriginalItem().getInnerObject());
GroupPatch patch = AnyOperations.diff(inner, getOriginalItem().getInnerObject(), false);
GroupTO originaObj = getOriginalItem().getInnerObject();
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
index 603f7fe..62d4468 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/any/UserWizardBuilder.java
@@ -82,7 +82,7 @@ public class UserWizardBuilder extends AnyWizardBuilder<UserTO> implements UserF
? UserWrapper.class.cast(modelObject).isStorePasswordInSyncope()
: StringUtils.isNotBlank(inner.getPassword()));
} else {
- inner.getPlainAttrs().addAll(cleanEmptyPlainAttrs(inner.getPlainAttrs()));
+ fixPlainAndVirAttrs(inner, getOriginalItem().getInnerObject());
UserPatch patch = AnyOperations.diff(inner, getOriginalItem().getInnerObject(), false);
if (StringUtils.isNotBlank(inner.getPassword())) {