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 2015/12/09 16:41:25 UTC

syncope git commit: [SYNCOPE-666] Fixing dynamic memberships and group aDynMembership update

Repository: syncope
Updated Branches:
  refs/heads/master 666d73f1b -> 1e51b34ea


[SYNCOPE-666] Fixing dynamic memberships and group aDynMembership update


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

Branch: refs/heads/master
Commit: 1e51b34ea63c68f77f28c4e1111f7f248f8e420d
Parents: 666d73f
Author: Francesco Chicchiriccò <il...@apache.org>
Authored: Wed Dec 9 16:41:14 2015 +0100
Committer: Francesco Chicchiriccò <il...@apache.org>
Committed: Wed Dec 9 16:41:14 2015 +0100

----------------------------------------------------------------------
 .../syncope/common/lib/patch/GroupPatch.java    |  2 +-
 .../core/persistence/jpa/dao/JPAGroupDAO.java   | 25 +++++---
 .../core/persistence/jpa/dao/JPARoleDAO.java    | 15 +++--
 .../syncope/fit/core/reference/GroupITCase.java | 65 ++++++++++++++++++--
 4 files changed, 84 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/1e51b34e/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
----------------------------------------------------------------------
diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
index 5e6a05f..262d15a 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/patch/GroupPatch.java
@@ -86,7 +86,7 @@ public class GroupPatch extends AnyPatch {
         this.udynMembershipCond = udynMembershipCond;
     }
 
-    @JsonIgnore
+    @JsonProperty
     public Map<String, String> getADynMembershipConds() {
         return adynMembershipConds;
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e51b34e/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
index 66cee45..031c0ba 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAGroupDAO.java
@@ -59,7 +59,6 @@ import org.apache.syncope.core.persistence.jpa.entity.group.JPATypeExtension;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUMembership;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Repository
@@ -269,32 +268,38 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO {
         return query.getResultList();
     }
 
-    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
+    @Transactional
     @Override
     public void refreshDynMemberships(final AnyObject anyObject) {
         for (Group group : findAll()) {
             for (ADynGroupMembership memb : group.getADynMemberships()) {
-                if (!searchDAO.matches(
+                if (searchDAO.matches(
                         anyObject,
                         buildDynMembershipCond(memb.getFIQLCond(), group.getRealm()),
                         AnyTypeKind.ANY_OBJECT)) {
 
+                    memb.add(anyObject);
+                } else {
                     memb.remove(anyObject);
                 }
             }
         }
     }
 
-    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
+    @Transactional
     @Override
     public void refreshDynMemberships(final User user) {
         for (Group group : findAll()) {
-            if (group.getUDynMembership() != null && !searchDAO.matches(
-                    user,
-                    buildDynMembershipCond(group.getUDynMembership().getFIQLCond(), group.getRealm()),
-                    AnyTypeKind.USER)) {
-
-                group.getUDynMembership().remove(user);
+            if (group.getUDynMembership() != null) {
+                if (searchDAO.matches(
+                        user,
+                        buildDynMembershipCond(group.getUDynMembership().getFIQLCond(), group.getRealm()),
+                        AnyTypeKind.USER)) {
+
+                    group.getUDynMembership().add(user);
+                } else {
+                    group.getUDynMembership().remove(user);
+                }
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e51b34e/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
----------------------------------------------------------------------
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
index 6ecf444..ea47cf8 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPARoleDAO.java
@@ -31,7 +31,6 @@ import org.apache.syncope.core.persistence.jpa.entity.JPARole;
 import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Repository;
-import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
 @Repository
@@ -99,14 +98,18 @@ public class JPARoleDAO extends AbstractDAO<Role, String> implements RoleDAO {
         delete(role);
     }
 
-    @Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = true)
+    @Transactional
     @Override
     public void refreshDynMemberships(final User user) {
         for (Role role : findAll()) {
-            if (role.getDynMembership() != null && !searchDAO.matches(user,
-                    SearchCondConverter.convert(role.getDynMembership().getFIQLCond()), AnyTypeKind.USER)) {
-
-                role.getDynMembership().remove(user);
+            if (role.getDynMembership() != null) {
+                if (searchDAO.matches(user,
+                        SearchCondConverter.convert(role.getDynMembership().getFIQLCond()), AnyTypeKind.USER)) {
+
+                    role.getDynMembership().add(user);
+                } else {
+                    role.getDynMembership().remove(user);
+                }
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/syncope/blob/1e51b34e/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
----------------------------------------------------------------------
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
index 5d3ba01..942d039 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/reference/GroupITCase.java
@@ -36,16 +36,20 @@ import javax.ws.rs.core.GenericType;
 import javax.ws.rs.core.Response;
 import org.apache.commons.collections4.IterableUtils;
 import org.apache.commons.collections4.Predicate;
+import org.apache.syncope.client.lib.SyncopeClient;
 import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
+import org.apache.syncope.common.lib.patch.AnyObjectPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
 import org.apache.syncope.common.lib.patch.AttrPatch;
 import org.apache.syncope.common.lib.patch.DeassociationPatch;
 import org.apache.syncope.common.lib.patch.GroupPatch;
 import org.apache.syncope.common.lib.patch.LongReplacePatchItem;
 import org.apache.syncope.common.lib.patch.StringReplacePatchItem;
+import org.apache.syncope.common.lib.to.AnyObjectTO;
 import org.apache.syncope.common.lib.to.AnyTypeClassTO;
 import org.apache.syncope.common.lib.to.AnyTypeTO;
+import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.BulkActionResult;
 import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ConnObjectTO;
@@ -544,25 +548,74 @@ public class GroupITCase extends AbstractITCase {
     }
 
     @Test
-    public void dynMembership() {
+    public void uDynMembership() {
         assertTrue(userService.read(4L).getDynGroups().isEmpty());
 
-        GroupTO group = getBasicSampleTO("dynMembership");
+        GroupTO group = getBasicSampleTO("uDynMembership");
         group.setUDynMembershipCond("cool==true");
         group = createGroup(group).getAny();
         assertNotNull(group);
 
         assertTrue(userService.read(4L).getDynGroups().contains(group.getKey()));
 
-        GroupPatch mod = new GroupPatch();
-        mod.setKey(group.getKey());
-        mod.setUDynMembershipCond("cool==false");
-        groupService.update(mod);
+        GroupPatch patch = new GroupPatch();
+        patch.setKey(group.getKey());
+        patch.setUDynMembershipCond("cool==false");
+        groupService.update(patch);
 
         assertTrue(userService.read(4L).getDynGroups().isEmpty());
     }
 
     @Test
+    public void aDynMembership() {
+        String fiql = SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").is("location").notNullValue().query();
+
+        // 1. create group with a given aDynMembership condition
+        GroupTO group = getBasicSampleTO("aDynMembership");
+        group.getADynMembershipConds().put("PRINTER", fiql);
+        group = createGroup(group).getAny();
+        assertEquals(fiql, group.getADynMembershipConds().get("PRINTER"));
+
+        group = groupService.read(group.getKey());
+        assertEquals(fiql, group.getADynMembershipConds().get("PRINTER"));
+
+        // verify that the condition is dynamically applied
+        AnyObjectTO newAny = AnyObjectITCase.getSampleTO("aDynMembership");
+        newAny.getResources().clear();
+        newAny = createAnyObject(newAny).getAny();
+        assertNotNull(newAny.getPlainAttrMap().get("location"));
+        assertTrue(anyObjectService.read(1L).getDynGroups().contains(group.getKey()));
+        assertTrue(anyObjectService.read(2L).getDynGroups().contains(group.getKey()));
+        assertTrue(anyObjectService.read(newAny.getKey()).getDynGroups().contains(group.getKey()));
+
+        // 2. update group and change aDynMembership condition
+        fiql = SyncopeClient.getAnyObjectSearchConditionBuilder("PRINTER").is("location").nullValue().query();
+
+        GroupPatch patch = new GroupPatch();
+        patch.setKey(group.getKey());
+        patch.getADynMembershipConds().put("PRINTER", fiql);
+
+        group = updateGroup(patch).getAny();
+        assertEquals(fiql, group.getADynMembershipConds().get("PRINTER"));
+
+        group = groupService.read(group.getKey());
+        assertEquals(fiql, group.getADynMembershipConds().get("PRINTER"));
+
+        // verify that the condition is dynamically applied
+        AnyObjectPatch anyPatch = new AnyObjectPatch();
+        anyPatch.setKey(newAny.getKey());
+        anyPatch.getPlainAttrs().add(new AttrPatch.Builder().
+                operation(PatchOperation.DELETE).
+                attrTO(new AttrTO.Builder().schema("location").build()).
+                build());
+        newAny = updateAnyObject(anyPatch).getAny();
+        assertNull(newAny.getPlainAttrMap().get("location"));
+        assertFalse(anyObjectService.read(1L).getDynGroups().contains(group.getKey()));
+        assertFalse(anyObjectService.read(2L).getDynGroups().contains(group.getKey()));
+        assertTrue(anyObjectService.read(newAny.getKey()).getDynGroups().contains(group.getKey()));
+    }
+
+    @Test
     public void capabilitiesOverride() {
         // resource with no capability override
         ResourceTO ldap = resourceService.read(RESOURCE_NAME_LDAP);