Repository: syncope Updated Branches: refs/heads/1_1_X a4d492918 -> 53dfa4088 refs/heads/1_2_X 7c337d226 -> be7c689a5
[SYNCOPE-1102] Minimum Viable Fix Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/be7c689a Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/be7c689a Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/be7c689a Branch: refs/heads/1_2_X Commit: be7c689a5947df4db09faf2cd5f3097514356eb1 Parents: 7c337d2 Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Tue Jun 6 12:41:17 2017 +0200 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Tue Jun 6 12:41:17 2017 +0200 ---------------------------------------------------------------------- .../persistence/beans/membership/MAttr.java | 2 +- .../core/persistence/beans/role/RAttr.java | 2 +- .../core/persistence/beans/user/UAttr.java | 2 +- .../persistence/dao/impl/AttrValueDAOImpl.java | 7 ++++++- .../data/AbstractAttributableDataBinder.java | 10 ++++++---- .../syncope/core/rest/UserTestITCase.java | 21 ++++++++++++++++++++ 6 files changed, 36 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/be7c689a/core/src/main/java/org/apache/syncope/core/persistence/beans/membership/MAttr.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/persistence/beans/membership/MAttr.java b/core/src/main/java/org/apache/syncope/core/persistence/beans/membership/MAttr.java index e1527b7..e3b6773 100644 --- a/core/src/main/java/org/apache/syncope/core/persistence/beans/membership/MAttr.java +++ b/core/src/main/java/org/apache/syncope/core/persistence/beans/membership/MAttr.java @@ -127,7 +127,7 @@ public class MAttr extends AbstractAttr { @Override public <T extends AbstractAttrValue> void setUniqueValue(final T uniqueAttributeValue) { - if (!(uniqueAttributeValue instanceof MAttrUniqueValue)) { + if (uniqueAttributeValue != null && !(uniqueAttributeValue instanceof MAttrUniqueValue)) { throw new ClassCastException("uniqueAttributeValue is expected to be typed MAttrUniqueValue: " + uniqueAttributeValue.getClass().getName()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/be7c689a/core/src/main/java/org/apache/syncope/core/persistence/beans/role/RAttr.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/persistence/beans/role/RAttr.java b/core/src/main/java/org/apache/syncope/core/persistence/beans/role/RAttr.java index 1e48846..d831574 100644 --- a/core/src/main/java/org/apache/syncope/core/persistence/beans/role/RAttr.java +++ b/core/src/main/java/org/apache/syncope/core/persistence/beans/role/RAttr.java @@ -127,7 +127,7 @@ public class RAttr extends AbstractAttr { @Override public <T extends AbstractAttrValue> void setUniqueValue(final T uniqueAttributeValue) { - if (!(uniqueAttributeValue instanceof RAttrUniqueValue)) { + if (uniqueAttributeValue != null && !(uniqueAttributeValue instanceof RAttrUniqueValue)) { throw new ClassCastException("uniqueAttributeValue is expected to be typed RAttrUniqueValue: " + uniqueAttributeValue.getClass().getName()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/be7c689a/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java b/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java index 5f38fa9..0a76bed 100644 --- a/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java +++ b/core/src/main/java/org/apache/syncope/core/persistence/beans/user/UAttr.java @@ -144,7 +144,7 @@ public class UAttr extends AbstractAttr { @Override public <T extends AbstractAttrValue> void setUniqueValue(final T uniqueAttributeValue) { - if (!(uniqueAttributeValue instanceof UAttrUniqueValue)) { + if (uniqueAttributeValue != null && !(uniqueAttributeValue instanceof UAttrUniqueValue)) { throw new ClassCastException("uniqueAttributeValue is expected to be typed UAttrUniqueValue: " + uniqueAttributeValue.getClass().getName()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/be7c689a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AttrValueDAOImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AttrValueDAOImpl.java b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AttrValueDAOImpl.java index 4ce43a1..0cf58f4 100644 --- a/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AttrValueDAOImpl.java +++ b/core/src/main/java/org/apache/syncope/core/persistence/dao/impl/AttrValueDAOImpl.java @@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.dao.impl; import java.util.List; import javax.persistence.TypedQuery; +import org.apache.syncope.core.persistence.beans.AbstractAttrUniqueValue; import org.apache.syncope.core.persistence.beans.AbstractAttrValue; import org.apache.syncope.core.persistence.dao.AttrValueDAO; import org.springframework.stereotype.Repository; @@ -56,7 +57,11 @@ public class AttrValueDAOImpl extends AbstractDAOImpl implements AttrValueDAO { @Override public <T extends AbstractAttrValue> void delete(final T attributeValue) { if (attributeValue.getAttribute() != null) { - attributeValue.getAttribute().removeValue(attributeValue); + if (attributeValue instanceof AbstractAttrUniqueValue) { + attributeValue.getAttribute().setUniqueValue(null); + } else { + attributeValue.getAttribute().removeValue(attributeValue); + } } entityManager.remove(attributeValue); http://git-wip-us.apache.org/repos/asf/syncope/blob/be7c689a/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java b/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java index 43b6df7..4b43b23 100644 --- a/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java +++ b/core/src/main/java/org/apache/syncope/core/rest/data/AbstractAttributableDataBinder.java @@ -214,8 +214,8 @@ public abstract class AbstractAttributableDataBinder { 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 (value == null || value.isEmpty()) { @@ -410,7 +410,7 @@ public abstract class AbstractAttributableDataBinder { } else if (virAttr instanceof MVirAttr) { MVirAttrTemplate template = ((Membership) attributable).getSyncopeRole(). - getAttrTemplate(MVirAttrTemplate.class, virSchema.getName()); + getAttrTemplate(MVirAttrTemplate.class, virSchema.getName()); if (template != null) { ((MVirAttr) virAttr).setTemplate(template); } @@ -653,8 +653,10 @@ public abstract class AbstractAttributableDataBinder { } } } + Class<AbstractAttrValue> valueClass = + schema.isUniqueConstraint() ? attrUtil.attrUniqueValueClass() : attrUtil.attrValueClass(); for (Long attributeValueId : valuesToBeRemoved) { - attributeValueDAO.delete(attributeValueId, attrUtil.attrValueClass()); + attributeValueDAO.delete(attributeValueId, valueClass); } // 1.2 add values http://git-wip-us.apache.org/repos/asf/syncope/blob/be7c689a/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java b/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java index 0d60d33..07434b5 100644 --- a/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java +++ b/core/src/test/java/org/apache/syncope/core/rest/UserTestITCase.java @@ -2620,4 +2620,25 @@ public class UserTestITCase extends AbstractTest { assertEquals(1, userTO.getPropagationStatusTOs().size()); assertEquals(RESOURCE_NAME_TESTDB, userTO.getPropagationStatusTOs().get(0).getResource()); } + + @Test + public void issueSYNCOPE1102() { + UserTO userTO = getUniqueSampleTO("a...@gmail.com"); + userTO = createUser(userTO); + assertNotNull(userTO.getId()); + + UserMod userMod = new UserMod(); + userMod.setId(userTO.getId()); + + AttributeMod userIdMod = new AttributeMod(); + userIdMod.setSchema("userId"); + userIdMod.getValuesToBeAdded().add("b" + userTO.getUsername()); + userIdMod.getValuesToBeRemoved().add(userTO.getUsername()); + userMod.getAttrsToUpdate().add(userIdMod); + + userTO = updateUser(userMod); + assertEquals("b" + userTO.getUsername(), userTO.getAttrMap().get("userId").getValues().get(0)); + + userService.delete(100L); + } }