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);
+    }
 }

Reply via email to