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