Repository: syncope Updated Branches: refs/heads/2_0_X f5f489e2b -> e64d79104 refs/heads/master be35817fe -> 06d9b452a
[SYNCOPE-1082] Remove half-management via JPA for dynamic members Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/e64d7910 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/e64d7910 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/e64d7910 Branch: refs/heads/2_0_X Commit: e64d791047683a80522ed4bb58136b25bf09e4c5 Parents: f5f489e Author: Francesco Chicchiriccò <[email protected]> Authored: Thu May 25 15:52:50 2017 +0200 Committer: Francesco Chicchiriccò <[email protected]> Committed: Thu May 25 15:52:50 2017 +0200 ---------------------------------------------------------------------- .../apache/syncope/core/logic/RoleLogic.java | 5 +- .../core/persistence/api/dao/GroupDAO.java | 8 +- .../core/persistence/api/dao/RoleDAO.java | 5 +- .../persistence/api/entity/DynMembership.java | 4 - .../jpa/content/XMLContentExporter.java | 3 +- .../jpa/content/XMLContentLoader.java | 41 ++--- .../persistence/jpa/dao/JPAAnyObjectDAO.java | 9 +- .../core/persistence/jpa/dao/JPAGroupDAO.java | 175 ++++++++++--------- .../core/persistence/jpa/dao/JPARoleDAO.java | 68 ++++--- .../core/persistence/jpa/dao/JPAUserDAO.java | 18 +- .../core/persistence/jpa/dao/SearchSupport.java | 6 +- .../anyobject/JPAADynGroupMembership.java | 26 --- .../jpa/entity/user/AbstractUDynMembership.java | 44 ----- .../jpa/entity/user/JPADynRoleMembership.java | 23 +-- .../jpa/entity/user/JPAUDynGroupMembership.java | 23 +-- .../src/main/resources/indexes.xml | 8 + .../src/main/resources/views.xml | 42 +++-- .../core/persistence/jpa/outer/GroupTest.java | 68 ++++--- .../core/persistence/jpa/outer/RoleTest.java | 36 ++-- .../provisioning/api/data/RoleDataBinder.java | 2 +- .../java/data/AnyObjectDataBinderImpl.java | 2 +- .../java/data/GroupDataBinderImpl.java | 4 + .../java/data/RoleDataBinderImpl.java | 19 +- .../java/data/UserDataBinderImpl.java | 42 ++--- .../client/ElasticsearchUtils.java | 4 +- 25 files changed, 319 insertions(+), 366 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java ---------------------------------------------------------------------- diff --git a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java index ced5dc7..13102a5 100644 --- a/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java +++ b/core/logic/src/main/java/org/apache/syncope/core/logic/RoleLogic.java @@ -80,10 +80,7 @@ public class RoleLogic extends AbstractTransactionalLogic<RoleTO> { throw new NotFoundException(roleTO.getKey()); } - binder.update(role, roleTO); - role = roleDAO.save(role); - - return binder.getRoleTO(role); + return binder.getRoleTO(roleDAO.save(binder.update(role, roleTO))); } @PreAuthorize("hasRole('" + StandardEntitlement.ROLE_DELETE + "')") http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java index b08c9b9..04ff490 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/GroupDAO.java @@ -46,13 +46,17 @@ public interface GroupDAO extends AnyDAO<Group> { List<TypeExtension> findTypeExtensions(AnyTypeClass anyTypeClass); - List<String> findADynMembersKeys(Group group); + List<String> findADynMembers(Group group); + + void clearADynMembers(Group group); void refreshDynMemberships(AnyObject anyObject); void removeDynMemberships(AnyObject anyObject); - List<String> findUDynMembersKeys(Group group); + List<String> findUDynMembers(Group group); + + void clearUDynMembers(Group group); void refreshDynMemberships(User user); http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java index 16f3003..f76b382 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/dao/RoleDAO.java @@ -39,9 +39,12 @@ public interface RoleDAO extends DAO<Role> { void delete(String key); - List<String> findDynMembersKeys(Role role); + List<String> findDynMembers(Role role); + + void clearDynMembers(Role role); void refreshDynMemberships(User user); void removeDynMemberships(User user); + } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java ---------------------------------------------------------------------- diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java index 2b12744..b62ea17 100644 --- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java +++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/entity/DynMembership.java @@ -23,8 +23,4 @@ public interface DynMembership<A extends Any<?>> extends Entity { String getFIQLCond(); void setFIQLCond(String fiql); - - boolean add(A any); - - void clear(); } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java index 6c7ce53..3fba66b 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentExporter.java @@ -55,6 +55,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.syncope.core.provisioning.api.utils.FormatUtils; import org.apache.syncope.core.spring.ApplicationContextProvider; import org.apache.syncope.core.persistence.api.content.ContentExporter; +import org.apache.syncope.core.persistence.jpa.entity.JPAAccessToken; import org.apache.syncope.core.persistence.jpa.entity.JPAReportExec; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAMembership; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAPlainAttr; @@ -86,7 +87,7 @@ public class XMLContentExporter extends AbstractContentDealer implements Content JPAUser.TABLE, JPAUPlainAttr.TABLE, JPAUPlainAttrValue.TABLE, JPAUPlainAttrUniqueValue.TABLE, JPAURelationship.TABLE, JPAUMembership.TABLE, JPAAnyObject.TABLE, JPAAPlainAttr.TABLE, JPAAPlainAttrValue.TABLE, JPAAPlainAttrUniqueValue.TABLE, - JPAARelationship.TABLE, JPAAMembership.TABLE + JPAARelationship.TABLE, JPAAMembership.TABLE, JPAAccessToken.TABLE })); protected static final Map<String, String> TABLES_TO_BE_FILTERED = http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentLoader.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentLoader.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentLoader.java index 3d46c89..8ebea1d 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentLoader.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/content/XMLContentLoader.java @@ -43,12 +43,12 @@ import org.springframework.stereotype.Component; @Component public class XMLContentLoader extends AbstractContentDealer implements ContentLoader { - @Resource(name = "indexesXML") - private ResourceWithFallbackLoader indexesXML; - @Resource(name = "viewsXML") private ResourceWithFallbackLoader viewsXML; + @Resource(name = "indexesXML") + private ResourceWithFallbackLoader indexesXML; + @Override public Integer getPriority() { return 0; @@ -83,8 +83,8 @@ public class XMLContentLoader extends AbstractContentDealer implements ContentLo LOG.error("[{}] While loading default content", entry.getKey(), e); } try { - createIndexes(entry.getKey(), entry.getValue()); createViews(entry.getKey(), entry.getValue()); + createIndexes(entry.getKey(), entry.getValue()); } catch (IOException e) { LOG.error("[{}] While creating indexes and views", entry.getKey(), e); } @@ -109,41 +109,42 @@ public class XMLContentLoader extends AbstractContentDealer implements ContentLo } } - private void createIndexes(final String domain, final DataSource dataSource) throws IOException { - LOG.debug("[{}] Creating indexes", domain); + private void createViews(final String domain, final DataSource dataSource) throws IOException { + LOG.debug("[{}] Creating views", domain); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - Properties indexes = PropertiesLoaderUtils.loadProperties(indexesXML.getResource()); - for (String idx : indexes.stringPropertyNames()) { - LOG.debug("[{}] Creating index {}", domain, indexes.get(idx).toString()); + Properties views = PropertiesLoaderUtils.loadProperties(viewsXML.getResource()); + for (String idx : views.stringPropertyNames()) { + LOG.debug("[{}] Creating view {}", domain, views.get(idx).toString()); try { - jdbcTemplate.execute(indexes.get(idx).toString()); + jdbcTemplate.execute(views.get(idx).toString().replaceAll("\\n", " ")); } catch (DataAccessException e) { - LOG.error("[{}] Could not create index", domain, e); + LOG.error("[{}] Could not create view", domain, e); } } - LOG.debug("Indexes created"); + LOG.debug("Views created"); } - private void createViews(final String domain, final DataSource dataSource) throws IOException { - LOG.debug("[{}] Creating views", domain); + private void createIndexes(final String domain, final DataSource dataSource) throws IOException { + LOG.debug("[{}] Creating indexes", domain); JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource); - Properties views = PropertiesLoaderUtils.loadProperties(viewsXML.getResource()); - for (String idx : views.stringPropertyNames()) { - LOG.debug("[{}] Creating view {}", domain, views.get(idx).toString()); + Properties indexes = PropertiesLoaderUtils.loadProperties(indexesXML.getResource()); + for (String idx : indexes.stringPropertyNames()) { + LOG.debug("[{}] Creating index {}", domain, indexes.get(idx).toString()); try { - jdbcTemplate.execute(views.get(idx).toString().replaceAll("\\n", " ")); + jdbcTemplate.execute(indexes.get(idx).toString()); } catch (DataAccessException e) { - LOG.error("[{}] Could not create view", domain, e); + LOG.error("[{}] Could not create index", domain, e); } } - LOG.debug("Views created"); + LOG.debug("Indexes created"); } + } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java index 4a7e490..f882ad7 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnyObjectDAO.java @@ -54,10 +54,8 @@ import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.resource.ExternalResource; import org.apache.syncope.core.persistence.api.entity.user.URelationship; import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory; -import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADynGroupMembership; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAARelationship; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAAnyObject; -import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup; import org.apache.syncope.core.persistence.jpa.entity.user.JPAURelationship; import org.apache.syncope.core.spring.ApplicationContextProvider; import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent; @@ -262,12 +260,7 @@ public class JPAAnyObjectDAO extends AbstractAnyDAO<AnyObject> implements AnyObj @Override public List<Group> findDynGroups(final AnyObject anyObject) { Query query = entityManager().createNativeQuery( - "SELECT t2.id FROM " + JPAADynGroupMembership.TABLE + " t0 " - + "INNER JOIN " + JPAADynGroupMembership.JOIN_TABLE + " t1 " - + "ON t0.id = t1.aDynGroupMembership_id " - + "LEFT OUTER JOIN " + JPAGroup.TABLE + " t2 " - + "ON t0.GROUP_ID = t2.id " - + "WHERE t1.anyObject_id = ?1"); + "SELECT group_id FROM " + JPAGroupDAO.ADYNMEMB_TABLE + " WHERE any_id=?"); query.setParameter(1, anyObject.getKey()); List<Group> result = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/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 e727572..cc70cd2 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 @@ -47,6 +47,7 @@ import org.apache.syncope.core.persistence.api.dao.NotFoundException; import org.apache.syncope.core.persistence.api.dao.PlainAttrDAO; import org.apache.syncope.core.persistence.api.dao.search.AssignableCond; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; +import org.apache.syncope.core.persistence.api.entity.AnyType; import org.apache.syncope.core.persistence.api.entity.AnyTypeClass; import org.apache.syncope.core.persistence.api.entity.AnyUtils; import org.apache.syncope.core.persistence.api.entity.Realm; @@ -55,6 +56,7 @@ import org.apache.syncope.core.persistence.api.entity.anyobject.AMembership; import org.apache.syncope.core.persistence.api.entity.anyobject.APlainAttr; import org.apache.syncope.core.persistence.api.entity.anyobject.AnyObject; import org.apache.syncope.core.persistence.api.entity.group.TypeExtension; +import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership; import org.apache.syncope.core.persistence.api.entity.user.UMembership; import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr; import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory; @@ -75,6 +77,10 @@ import org.springframework.transaction.annotation.Transactional; @Repository public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { + public static final String UDYNMEMB_TABLE = "UDynGroupMembers"; + + public static final String ADYNMEMB_TABLE = "ADynGroupMembers"; + @Autowired private PlainAttrDAO plainAttrDAO; @@ -274,15 +280,20 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { Group merged = super.save(group); publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, merged)); - // refresh dynaminc memberships + // refresh dynamic memberships if (merged.getUDynMembership() != null) { List<User> matching = searchDAO().search( buildDynMembershipCond(merged.getUDynMembership().getFIQLCond(), merged.getRealm()), AnyTypeKind.USER); - merged.getUDynMembership().clear(); + clearUDynMembers(merged); + for (User user : matching) { - merged.getUDynMembership().add(user); + Query insert = entityManager().createNativeQuery("INSERT INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)"); + insert.setParameter(1, user.getKey()); + insert.setParameter(2, merged.getKey()); + insert.executeUpdate(); + publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user)); } } @@ -291,9 +302,15 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { buildDynMembershipCond(memb.getFIQLCond(), merged.getRealm()), AnyTypeKind.ANY_OBJECT); - memb.clear(); + clearADynMembers(merged); + for (AnyObject anyObject : matching) { - memb.add(anyObject); + Query insert = entityManager().createNativeQuery("INSERT INTO " + ADYNMEMB_TABLE + " VALUES(?, ?, ?)"); + insert.setParameter(1, anyObject.getType().getKey()); + insert.setParameter(2, anyObject.getKey()); + insert.setParameter(3, merged.getKey()); + insert.executeUpdate(); + publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, anyObject)); } } @@ -347,13 +364,13 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { } @Override - public List<String> findADynMembersKeys(final Group group) { + public List<String> findADynMembers(final Group group) { List<String> result = new ArrayList<>(); for (ADynGroupMembership memb : group.getADynMemberships()) { Query query = entityManager().createNativeQuery( - "SELECT t.anyObject_id FROM " + JPAADynGroupMembership.JOIN_TABLE + " t " - + "WHERE t.aDynGroupMembership_id=?"); - query.setParameter(1, memb.getKey()); + "SELECT any_id FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND anyType_id=?"); + query.setParameter(1, group.getKey()); + query.setParameter(2, memb.getAnyType().getKey()); for (Object key : query.getResultList()) { String actualKey = key instanceof Object[] @@ -366,45 +383,44 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { return result; } - private List<Group> findWithADynMemberships(final int page, final int itemsPerPage) { - TypedQuery<Group> query = entityManager().createQuery( - "SELECT e FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.aDynMemberships IS NOT EMPTY", - Group.class); - query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1)); - query.setMaxResults(itemsPerPage); + @Override + public void clearADynMembers(final Group group) { + Query delete = entityManager().createNativeQuery("DELETE FROM " + ADYNMEMB_TABLE + " WHERE group_id=?"); + delete.setParameter(1, group.getKey()); + delete.executeUpdate(); + } + private List<ADynGroupMembership> findWithADynMemberships(final AnyType anyType) { + TypedQuery<ADynGroupMembership> query = entityManager().createQuery( + "SELECT e FROM " + JPAADynGroupMembership.class.getSimpleName() + " e WHERE e.anyType=:anyType", + ADynGroupMembership.class); + query.setParameter("anyType", anyType); return query.getResultList(); } @Transactional @Override public void refreshDynMemberships(final AnyObject anyObject) { - Query countQuery = entityManager().createQuery( - "SELECT COUNT(e) FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.aDynMemberships IS NOT EMPTY"); - int count = ((Number) countQuery.getSingleResult()).intValue(); - - for (int page = 1; page <= (count / DEFAULT_PAGE_SIZE) + 1; page++) { - for (Group group : findWithADynMemberships(page, DEFAULT_PAGE_SIZE)) { - if (!group.getADynMemberships().isEmpty()) { - for (ADynGroupMembership memb : group.getADynMemberships()) { - if (jpaAnySearchDAO().matches( - anyObject, - buildDynMembershipCond(memb.getFIQLCond(), group.getRealm()))) { - - memb.add(anyObject); - } else { - Query query = entityManager().createNativeQuery( - "DELETE FROM " + JPAADynGroupMembership.JOIN_TABLE + " t " - + "WHERE t.anyObject_id=? and t.aDynGroupMembership_id=?"); - query.setParameter(1, anyObject.getKey()); - query.setParameter(2, memb.getKey()); - query.executeUpdate(); - } - - publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group)); - } - } + for (ADynGroupMembership memb : findWithADynMemberships(anyObject.getType())) { + Query delete = entityManager().createNativeQuery( + "DELETE FROM " + ADYNMEMB_TABLE + " WHERE group_id=? AND any_id=?"); + delete.setParameter(1, memb.getGroup().getKey()); + delete.setParameter(2, anyObject.getKey()); + delete.executeUpdate(); + + if (jpaAnySearchDAO().matches( + anyObject, + buildDynMembershipCond(memb.getFIQLCond(), memb.getGroup().getRealm()))) { + + Query insert = entityManager().createNativeQuery( + "INSERT INTO " + ADYNMEMB_TABLE + " VALUES(?, ?, ?)"); + insert.setParameter(1, anyObject.getType().getKey()); + insert.setParameter(2, anyObject.getKey()); + insert.setParameter(3, memb.getGroup().getKey()); + insert.executeUpdate(); } + + publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, memb.getGroup())); } } @@ -412,10 +428,9 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { public void removeDynMemberships(final AnyObject anyObject) { List<Group> dynGroups = anyObjectDAO().findDynGroups(anyObject); - Query query = entityManager().createNativeQuery( - "DELETE FROM " + JPAADynGroupMembership.JOIN_TABLE + " t WHERE t.anyObject_id=?"); - query.setParameter(1, anyObject.getKey()); - query.executeUpdate(); + Query delete = entityManager().createNativeQuery("DELETE FROM " + ADYNMEMB_TABLE + " WHERE any_id=?"); + delete.setParameter(1, anyObject.getKey()); + delete.executeUpdate(); for (Group group : dynGroups) { publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group)); @@ -423,15 +438,14 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { } @Override - public List<String> findUDynMembersKeys(final Group group) { + public List<String> findUDynMembers(final Group group) { if (group.getUDynMembership() == null) { return Collections.emptyList(); } Query query = entityManager().createNativeQuery( - "SELECT t.user_id FROM " + JPAUDynGroupMembership.JOIN_TABLE + " t " - + "WHERE t.uDynGroupMembership_id=?"); - query.setParameter(1, group.getUDynMembership().getKey()); + "SELECT any_id FROM " + UDYNMEMB_TABLE + " WHERE group_id=?"); + query.setParameter(1, group.getKey()); List<String> result = new ArrayList<>(); for (Object key : query.getResultList()) { @@ -444,12 +458,17 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { return result; } - private List<Group> findWithUDynMemberships(final int page, final int itemsPerPage) { - TypedQuery<Group> query = entityManager().createQuery( - "SELECT e FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.uDynMembership IS NOT NULL", - Group.class); - query.setFirstResult(itemsPerPage * (page <= 0 ? 0 : page - 1)); - query.setMaxResults(itemsPerPage); + @Override + public void clearUDynMembers(final Group group) { + Query delete = entityManager().createNativeQuery("DELETE FROM " + UDYNMEMB_TABLE + " WHERE group_id=?"); + delete.setParameter(1, group.getKey()); + delete.executeUpdate(); + } + + private List<UDynGroupMembership> findWithUDynMemberships() { + TypedQuery<UDynGroupMembership> query = entityManager().createQuery( + "SELECT e FROM " + JPAUDynGroupMembership.class.getSimpleName() + " e", + UDynGroupMembership.class); return query.getResultList(); } @@ -457,30 +476,25 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { @Transactional @Override public void refreshDynMemberships(final User user) { - Query countQuery = entityManager().createQuery( - "SELECT COUNT(e) FROM " + JPAGroup.class.getSimpleName() + " e WHERE e.uDynMembership IS NOT NULL"); - int count = ((Number) countQuery.getSingleResult()).intValue(); - - for (int page = 1; page <= (count / DEFAULT_PAGE_SIZE) + 1; page++) { - for (Group group : findWithUDynMemberships(page, DEFAULT_PAGE_SIZE)) { - if (group.getUDynMembership() != null) { - if (jpaAnySearchDAO().matches( - user, - buildDynMembershipCond(group.getUDynMembership().getFIQLCond(), group.getRealm()))) { - - group.getUDynMembership().add(user); - } else { - Query query = entityManager().createNativeQuery( - "DELETE FROM " + JPAUDynGroupMembership.JOIN_TABLE + " t " - + "WHERE t.user_id=? and t.uDynGroupMembership_id=?"); - query.setParameter(1, user.getKey()); - query.setParameter(2, group.getUDynMembership().getKey()); - query.executeUpdate(); - } - - publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group)); - } + for (UDynGroupMembership memb : findWithUDynMemberships()) { + Query delete = entityManager().createNativeQuery( + "DELETE FROM " + UDYNMEMB_TABLE + " WHERE group_id=? AND any_id=?"); + delete.setParameter(1, memb.getGroup().getKey()); + delete.setParameter(2, user.getKey()); + delete.executeUpdate(); + + if (jpaAnySearchDAO().matches( + user, + buildDynMembershipCond(memb.getFIQLCond(), memb.getGroup().getRealm()))) { + + Query insert = entityManager().createNativeQuery( + "INSERT INTO " + UDYNMEMB_TABLE + " VALUES(?, ?)"); + insert.setParameter(1, user.getKey()); + insert.setParameter(2, memb.getGroup().getKey()); + insert.executeUpdate(); } + + publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, memb.getGroup())); } } @@ -488,10 +502,9 @@ public class JPAGroupDAO extends AbstractAnyDAO<Group> implements GroupDAO { public void removeDynMemberships(final User user) { List<Group> dynGroups = userDAO().findDynGroups(user); - Query query = entityManager().createNativeQuery( - "DELETE FROM " + JPAUDynGroupMembership.JOIN_TABLE + " t WHERE t.user_id=?"); - query.setParameter(1, user.getKey()); - query.executeUpdate(); + Query delete = entityManager().createNativeQuery("DELETE FROM " + UDYNMEMB_TABLE + " WHERE any_id=?"); + delete.setParameter(1, user.getKey()); + delete.executeUpdate(); for (Group group : dynGroups) { publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, group)); http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/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 7aa9300..b362778 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.api.entity.Realm; import org.apache.syncope.core.persistence.api.entity.Role; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.persistence.jpa.entity.JPARole; -import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership; import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser; import org.apache.syncope.core.spring.ApplicationContextProvider; import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent; @@ -43,6 +42,8 @@ import org.springframework.transaction.annotation.Transactional; @Repository public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO { + public static final String DYNMEMB_TABLE = "DynRoleMembers"; + @Autowired private ApplicationEventPublisher publisher; @@ -86,19 +87,26 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO { @Override public Role save(final Role role) { - // refresh dynaminc memberships - if (role.getDynMembership() != null) { - List<User> matchingUsers = searchDAO().search( - SearchCondConverter.convert(role.getDynMembership().getFIQLCond()), AnyTypeKind.USER); - - role.getDynMembership().clear(); - for (User user : matchingUsers) { - role.getDynMembership().add(user); + Role merged = entityManager().merge(role); + + // refresh dynamic memberships + if (merged.getDynMembership() != null) { + List<User> matching = searchDAO().search( + SearchCondConverter.convert(merged.getDynMembership().getFIQLCond()), AnyTypeKind.USER); + + clearDynMembers(merged); + + for (User user : matching) { + Query insert = entityManager().createNativeQuery("INSERT INTO " + DYNMEMB_TABLE + " VALUES(?, ?)"); + insert.setParameter(1, user.getKey()); + insert.setParameter(2, merged.getKey()); + insert.executeUpdate(); + publisher.publishEvent(new AnyCreatedUpdatedEvent<>(this, user)); } } - return entityManager().merge(role); + return merged; } @Override @@ -126,15 +134,13 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO { } @Override - public List<String> findDynMembersKeys(final Role role) { + public List<String> findDynMembers(final Role role) { if (role.getDynMembership() == null) { return Collections.emptyList(); } - Query query = entityManager().createNativeQuery( - "SELECT t.user_id FROM " + JPADynRoleMembership.JOIN_TABLE + " t " - + "WHERE t.dynRoleMembership_id=?"); - query.setParameter(1, role.getDynMembership().getKey()); + Query query = entityManager().createNativeQuery("SELECT any_id FROM " + DYNMEMB_TABLE + " WHERE role_id=?"); + query.setParameter(1, role.getKey()); List<String> result = new ArrayList<>(); for (Object key : query.getResultList()) { @@ -147,20 +153,29 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO { return result; } + @Override + public void clearDynMembers(final Role role) { + Query delete = entityManager().createNativeQuery("DELETE FROM " + DYNMEMB_TABLE + " WHERE role_id=?"); + delete.setParameter(1, role.getKey()); + delete.executeUpdate(); + } + @Transactional @Override public void refreshDynMemberships(final User user) { for (Role role : findAll()) { if (role.getDynMembership() != null) { + Query delete = entityManager().createNativeQuery( + "DELETE FROM " + DYNMEMB_TABLE + " WHERE role_id=? AND any_id=?"); + delete.setParameter(1, role.getKey()); + delete.setParameter(2, user.getKey()); + delete.executeUpdate(); + if (searchDAO().matches(user, SearchCondConverter.convert(role.getDynMembership().getFIQLCond()))) { - role.getDynMembership().add(user); - } else { - Query query = entityManager().createNativeQuery( - "DELETE FROM " + JPADynRoleMembership.JOIN_TABLE + " t " - + "WHERE t.user_id=? and t.dynRoleMembership_id=?"); - query.setParameter(1, user.getKey()); - query.setParameter(2, role.getDynMembership().getKey()); - query.executeUpdate(); + Query insert = entityManager().createNativeQuery("INSERT INTO " + DYNMEMB_TABLE + " VALUES(?, ?)"); + insert.setParameter(1, user.getKey()); + insert.setParameter(2, role.getKey()); + insert.executeUpdate(); } } } @@ -168,10 +183,9 @@ public class JPARoleDAO extends AbstractDAO<Role> implements RoleDAO { @Override public void removeDynMemberships(final User user) { - Query query = entityManager().createNativeQuery( - "DELETE FROM " + JPADynRoleMembership.JOIN_TABLE + " t WHERE t.user_id=?"); - query.setParameter(1, user.getKey()); - query.executeUpdate(); + Query delete = entityManager().createNativeQuery("DELETE FROM " + DYNMEMB_TABLE + " WHERE any_id=?"); + delete.setParameter(1, user.getKey()); + delete.executeUpdate(); } } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java index 292b69b..28af7e2 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAUserDAO.java @@ -71,10 +71,6 @@ import org.apache.syncope.core.persistence.api.entity.user.SecurityQuestion; import org.apache.syncope.core.persistence.api.entity.user.UMembership; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.persistence.jpa.entity.JPAAnyUtilsFactory; -import org.apache.syncope.core.persistence.jpa.entity.JPARole; -import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup; -import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership; -import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership; import org.apache.syncope.core.persistence.jpa.entity.user.JPAUser; import org.apache.syncope.core.provisioning.api.utils.EntityUtils; import org.apache.syncope.core.spring.event.AnyCreatedUpdatedEvent; @@ -480,12 +476,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO { @Override public List<Role> findDynRoles(final User user) { Query query = entityManager().createNativeQuery( - "SELECT t2.id FROM " + JPADynRoleMembership.TABLE + " t0 " - + "INNER JOIN " + JPADynRoleMembership.JOIN_TABLE + " t1 " - + "ON t0.id = t1.dynRoleMembership_id " - + "LEFT OUTER JOIN " + JPARole.TABLE + " t2 " - + "ON t0.ROLE_ID = t2.id " - + "WHERE (t1.user_id = ?1)"); + "SELECT role_id FROM " + JPARoleDAO.DYNMEMB_TABLE + " WHERE any_id=?"); query.setParameter(1, user.getKey()); List<Role> result = new ArrayList<>(); @@ -508,12 +499,7 @@ public class JPAUserDAO extends AbstractAnyDAO<User> implements UserDAO { @Override public List<Group> findDynGroups(final User user) { Query query = entityManager().createNativeQuery( - "SELECT t2.id FROM " + JPAUDynGroupMembership.TABLE + " t0 " - + "INNER JOIN " + JPAUDynGroupMembership.JOIN_TABLE + " t1 " - + "ON t0.id = t1.uDynGroupMembership_id " - + "LEFT OUTER JOIN " + JPAGroup.TABLE + " t2 " - + "ON t0.GROUP_ID = t2.id " - + "WHERE (t1.user_id = ?1)"); + "SELECT group_id FROM " + JPAGroupDAO.UDYNMEMB_TABLE + " WHERE any_id=?"); query.setParameter(1, user.getKey()); List<Group> result = new ArrayList<>(); http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/SearchSupport.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/SearchSupport.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/SearchSupport.java index 9964d89..fd40470 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/SearchSupport.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/SearchSupport.java @@ -123,8 +123,8 @@ class SearchSupport { } public SearchView dyngroupmembership() { - String kind = anyTypeKind == AnyTypeKind.USER ? "u" : "a"; - return new SearchView("sv" + kind + "dgm", field().name + "_" + kind + "dyngmemb"); + return new SearchView("sv" + anyTypeKind.name() + "dgm", + anyTypeKind == AnyTypeKind.USER ? JPAGroupDAO.UDYNMEMB_TABLE : JPAGroupDAO.ADYNMEMB_TABLE); } public SearchView role() { @@ -132,7 +132,7 @@ class SearchSupport { } public SearchView dynrolemembership() { - return new SearchView("svdr", field().name + "_dynrmemb"); + return new SearchView("svdr", JPARoleDAO.DYNMEMB_TABLE); } public SearchView nullAttr() { http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java index 5ae02d3..b1d55ff 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/anyobject/JPAADynGroupMembership.java @@ -18,12 +18,7 @@ */ package org.apache.syncope.core.persistence.jpa.entity.anyobject; -import java.util.ArrayList; -import java.util.List; import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; import javax.persistence.ManyToOne; import javax.persistence.OneToOne; import javax.persistence.Table; @@ -43,21 +38,12 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp public static final String TABLE = "ADynGroupMembership"; - public static final String JOIN_TABLE = TABLE + "_AnyObject"; - @OneToOne private JPAGroup group; @ManyToOne private JPAAnyType anyType; - @ManyToMany - @JoinTable(name = JOIN_TABLE, joinColumns = - @JoinColumn(name = "aDynGroupMembership_id"), - inverseJoinColumns = - @JoinColumn(name = "anyObject_id")) - private List<JPAAnyObject> anyObjects = new ArrayList<>(); - @Override public Group getGroup() { return group; @@ -79,16 +65,4 @@ public class JPAADynGroupMembership extends AbstractDynMembership<AnyObject> imp checkType(anyType, JPAAnyType.class); this.anyType = (JPAAnyType) anyType; } - - @Override - public boolean add(final AnyObject anyObject) { - checkType(anyObject, JPAAnyObject.class); - return anyObjects.add((JPAAnyObject) anyObject); - } - - @Override - public void clear() { - anyObjects.clear(); - } - } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java deleted file mode 100644 index 963b742..0000000 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/AbstractUDynMembership.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.syncope.core.persistence.jpa.entity.user; - -import java.util.List; -import javax.persistence.MappedSuperclass; -import org.apache.syncope.core.persistence.api.entity.user.User; -import org.apache.syncope.core.persistence.jpa.entity.AbstractDynMembership; - -@MappedSuperclass -public abstract class AbstractUDynMembership extends AbstractDynMembership<User> { - - private static final long serialVersionUID = 6296230283800203205L; - - protected abstract List<JPAUser> internalGetUsers(); - - @Override - public boolean add(final User user) { - checkType(user, JPAUser.class); - return internalGetUsers().add((JPAUser) user); - } - - @Override - public void clear() { - internalGetUsers().clear(); - } - -} http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java index aa310cd..d2a4480 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPADynRoleMembership.java @@ -18,43 +18,26 @@ */ package org.apache.syncope.core.persistence.jpa.entity.user; -import java.util.ArrayList; -import java.util.List; import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import org.apache.syncope.core.persistence.api.entity.user.DynRoleMembership; import org.apache.syncope.core.persistence.api.entity.Role; +import org.apache.syncope.core.persistence.api.entity.user.User; +import org.apache.syncope.core.persistence.jpa.entity.AbstractDynMembership; import org.apache.syncope.core.persistence.jpa.entity.JPARole; @Entity @Table(name = JPADynRoleMembership.TABLE) -public class JPADynRoleMembership extends AbstractUDynMembership implements DynRoleMembership { +public class JPADynRoleMembership extends AbstractDynMembership<User> implements DynRoleMembership { private static final long serialVersionUID = -7336814163949640354L; public static final String TABLE = "DynRoleMembership"; - public static final String JOIN_TABLE = TABLE + "_User"; - @OneToOne private JPARole role; - @ManyToMany - @JoinTable(name = JOIN_TABLE, joinColumns = - @JoinColumn(name = "dynRoleMembership_id"), - inverseJoinColumns = - @JoinColumn(name = "user_id")) - private List<JPAUser> users = new ArrayList<>(); - - @Override - protected List<JPAUser> internalGetUsers() { - return users; - } - @Override public Role getRole() { return role; http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java index 63228b3..875b572 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/entity/user/JPAUDynGroupMembership.java @@ -18,43 +18,26 @@ */ package org.apache.syncope.core.persistence.jpa.entity.user; -import java.util.ArrayList; -import java.util.List; import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; import javax.persistence.OneToOne; import javax.persistence.Table; import org.apache.syncope.core.persistence.api.entity.group.Group; import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership; +import org.apache.syncope.core.persistence.api.entity.user.User; +import org.apache.syncope.core.persistence.jpa.entity.AbstractDynMembership; import org.apache.syncope.core.persistence.jpa.entity.group.JPAGroup; @Entity @Table(name = JPAUDynGroupMembership.TABLE) -public class JPAUDynGroupMembership extends AbstractUDynMembership implements UDynGroupMembership { +public class JPAUDynGroupMembership extends AbstractDynMembership<User> implements UDynGroupMembership { private static final long serialVersionUID = -7336814163949640354L; public static final String TABLE = "UDynGroupMembership"; - public static final String JOIN_TABLE = TABLE + "_User"; - @OneToOne private JPAGroup group; - @ManyToMany - @JoinTable(name = JOIN_TABLE, joinColumns = - @JoinColumn(name = "uDynGroupMembership_id"), - inverseJoinColumns = - @JoinColumn(name = "user_id")) - private List<JPAUser> users = new ArrayList<>(); - - @Override - protected List<JPAUser> internalGetUsers() { - return users; - } - @Override public Group getGroup() { return group; http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/resources/indexes.xml ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/resources/indexes.xml b/core/persistence-jpa/src/main/resources/indexes.xml index 4d2ffcb..1dfa63d 100644 --- a/core/persistence-jpa/src/main/resources/indexes.xml +++ b/core/persistence-jpa/src/main/resources/indexes.xml @@ -21,6 +21,14 @@ under the License. <properties> <comment>Additional indexes (in respect to JPA's)</comment> + <entry key="UDynGroupMembers_any_id">CREATE INDEX UDynGroupMembers_any_id ON UDynGroupMembers(any_id)</entry> + <entry key="UDynGroupMembers_group_id">CREATE INDEX UDynGroupMembers_group_id ON UDynGroupMembers(group_id)</entry> + <entry key="ADynGroupMembers_any_id">CREATE INDEX ADynGroupMembers_any_id ON ADynGroupMembers(any_id)</entry> + <entry key="ADynGroupMembers_group_id">CREATE INDEX ADynGroupMembers_group_id ON ADynGroupMembers(group_id)</entry> + + <entry key="DynRoleMembers_any_id">CREATE INDEX DynRoleMembers_any_id ON DynRoleMembers(any_id)</entry> + <entry key="DynRoleMembers_role_id">CREATE INDEX DynRoleMembers_role_id ON DynRoleMembers(role_id)</entry> + <entry key="UPlainAttrValue_stringvalueIndex">CREATE INDEX UAttrValue_stringvalueIndex ON UPlainAttrValue(stringvalue)</entry> <entry key="UPlainAttrValue_datevalueIndex">CREATE INDEX UAttrValue_datevalueIndex ON UPlainAttrValue(datevalue)</entry> <entry key="UPlainAttrValue_longvalueIndex">CREATE INDEX UAttrValue_longvalueIndex ON UPlainAttrValue(longvalue)</entry> http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/main/resources/views.xml ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/resources/views.xml b/core/persistence-jpa/src/main/resources/views.xml index 59ec334..fb68516 100644 --- a/core/persistence-jpa/src/main/resources/views.xml +++ b/core/persistence-jpa/src/main/resources/views.xml @@ -19,8 +19,27 @@ under the License. --> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> - <comment>Views</comment> + <entry key="UDynGroupMembers"> + CREATE TABLE UDynGroupMembers( + any_id CHAR(36), + group_id CHAR(36), + UNIQUE(any_id, group_id)) + </entry> + <entry key="ADynGroupMembers"> + CREATE TABLE ADynGroupMembers( + anyType_id VARCHAR(255), + any_id CHAR(36), + group_id CHAR(36), + UNIQUE(anyType_id, any_id, group_id)) + </entry> + <entry key="DynRoleMembers"> + CREATE TABLE DynRoleMembers( + any_id CHAR(36), + role_id CHAR(36), + UNIQUE(any_id, role_id)) + </entry> + <!-- user --> <entry key="user_search"> CREATE VIEW user_search AS @@ -80,26 +99,12 @@ under the License. FROM UMembership m, SyncopeGroup g WHERE m.group_id = g.id </entry> - <entry key="user_search_udyngmemb"> - CREATE VIEW user_search_udyngmemb AS - - SELECT ds.user_id AS any_id, d.group_id AS group_id - FROM UDynGroupMembership d, UDynGroupMembership_User ds - WHERE d.id = ds.uDynGroupMembership_id - </entry> <entry key="user_search_role"> CREATE VIEW user_search_role AS SELECT ss.user_id AS any_id, ss.role_id AS role_id FROM SyncopeUser_SyncopeRole ss </entry> - <entry key="user_search_dynrmemb"> - CREATE VIEW user_search_dynrmemb AS - - SELECT ds.user_id AS any_id, d.role_id AS role_id - FROM DynRoleMembership d, DynRoleMembership_User ds - WHERE d.id = ds.dynRoleMembership_id - </entry> <entry key="user_search_resource"> CREATE VIEW user_search_resource AS @@ -173,13 +178,6 @@ under the License. FROM AMembership m, SyncopeGroup g WHERE m.group_id = g.id </entry> - <entry key="anyObject_search_adyngmemb"> - CREATE VIEW anyObject_search_adyngmemb AS - - SELECT ds.anyObject_id AS any_id, d.group_id AS group_id - FROM ADynGroupMembership d, ADynGroupMembership_AnyObject ds - WHERE d.id = ds.aDynGroupMembership_id - </entry> <entry key="anyObject_search_resource"> CREATE VIEW anyObject_search_resource AS http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java index ff050bf..fc359e3 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/GroupTest.java @@ -29,7 +29,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; -import javax.persistence.TypedQuery; +import javax.persistence.Query; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.syncope.common.lib.SyncopeConstants; @@ -55,6 +55,7 @@ import org.apache.syncope.core.persistence.api.entity.user.UDynGroupMembership; import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.persistence.jpa.AbstractTest; +import org.apache.syncope.core.persistence.jpa.dao.JPAGroupDAO; import org.apache.syncope.core.persistence.jpa.entity.anyobject.JPAADynGroupMembership; import org.apache.syncope.core.persistence.jpa.entity.user.JPAUDynGroupMembership; import org.junit.Test; @@ -178,13 +179,23 @@ public class GroupTest extends AbstractTest { * required for avoiding creating of a new transaction - good for general use case but bad for the way how * this test class is architected. */ - private Collection<Group> findDynGroupMemberships(final User user) { - TypedQuery<Group> query = entityManager().createQuery( - "SELECT e.group FROM " + JPAUDynGroupMembership.class.getSimpleName() - + " e WHERE :user MEMBER OF e.users", Group.class); - query.setParameter("user", user); - - return query.getResultList(); + private List<Group> findDynGroups(final User user) { + Query query = entityManager().createNativeQuery( + "SELECT group_id FROM " + JPAGroupDAO.UDYNMEMB_TABLE + " WHERE any_id=?"); + query.setParameter(1, user.getKey()); + + List<Group> result = new ArrayList<>(); + for (Object key : query.getResultList()) { + String actualKey = key instanceof Object[] + ? (String) ((Object[]) key)[0] + : ((String) key); + + Group group = groupDAO.find(actualKey); + if (group != null && !result.contains(group)) { + result.add(group); + } + } + return result; } @Test @@ -229,14 +240,14 @@ public class GroupTest extends AbstractTest { assertEquals(actual, actual.getUDynMembership().getGroup()); // 3. verify that expected users have the created group dynamically assigned - List<String> members = groupDAO.findUDynMembersKeys(actual); + List<String> members = groupDAO.findUDynMembers(actual); assertEquals(2, members.size()); assertEquals(new HashSet<>(Arrays.asList("c9b2dec2-00a7-4855-97c0-d854842b4b24", newUserKey)), new HashSet<>(members)); user = userDAO.findByUsername("bellini"); assertNotNull(user); - Collection<Group> dynGroupMemberships = findDynGroupMemberships(user); + Collection<Group> dynGroupMemberships = findDynGroups(user); assertEquals(1, dynGroupMemberships.size()); assertTrue(dynGroupMemberships.contains(actual.getUDynMembership().getGroup())); @@ -246,7 +257,7 @@ public class GroupTest extends AbstractTest { userDAO.flush(); actual = groupDAO.find(actual.getKey()); - members = groupDAO.findUDynMembersKeys(actual); + members = groupDAO.findUDynMembers(actual); assertEquals(1, members.size()); assertEquals("c9b2dec2-00a7-4855-97c0-d854842b4b24", members.get(0)); @@ -259,7 +270,7 @@ public class GroupTest extends AbstractTest { assertNull(entityManager().find(JPAUDynGroupMembership.class, dynMembershipKey)); - dynGroupMemberships = findDynGroupMemberships(user); + dynGroupMemberships = findDynGroups(user); assertTrue(dynGroupMemberships.isEmpty()); } @@ -268,13 +279,23 @@ public class GroupTest extends AbstractTest { * required for avoiding creating of a new transaction - good for general use case but bad for the way how * this test class is architected. */ - private List<Group> findDynGroupMemberships(final AnyObject anyObject) { - TypedQuery<Group> query = entityManager().createQuery( - "SELECT e.group FROM " + JPAADynGroupMembership.class.getSimpleName() - + " e WHERE :anyObject MEMBER OF e.anyObjects", Group.class); - query.setParameter("anyObject", anyObject); - - return query.getResultList(); + private List<Group> findDynGroups(final AnyObject anyObject) { + Query query = entityManager().createNativeQuery( + "SELECT group_id FROM " + JPAGroupDAO.ADYNMEMB_TABLE + " WHERE any_id=?"); + query.setParameter(1, anyObject.getKey()); + + List<Group> result = new ArrayList<>(); + for (Object key : query.getResultList()) { + String actualKey = key instanceof Object[] + ? (String) ((Object[]) key)[0] + : ((String) key); + + Group group = groupDAO.find(actualKey); + if (group != null && !result.contains(group)) { + result.add(group); + } + } + return result; } @Test @@ -320,8 +341,7 @@ public class GroupTest extends AbstractTest { assertEquals(actual, actual.getADynMembership(anyTypeDAO.find("PRINTER")).getGroup()); // 3. verify that expected any objects have the created group dynamically assigned - System.out.println("MMMMMMMMM " + groupDAO.findADynMembersKeys(actual)); - List<String> members = CollectionUtils.select(groupDAO.findADynMembersKeys(actual), new Predicate<String>() { + List<String> members = CollectionUtils.select(groupDAO.findADynMembers(actual), new Predicate<String>() { @Override public boolean evaluate(final String object) { @@ -335,7 +355,7 @@ public class GroupTest extends AbstractTest { anyObject = anyObjectDAO.find("fc6dbc3a-6c07-4965-8781-921e7401a4a5"); assertNotNull(anyObject); - Collection<Group> dynGroupMemberships = findDynGroupMemberships(anyObject); + Collection<Group> dynGroupMemberships = findDynGroups(anyObject); assertEquals(1, dynGroupMemberships.size()); assertTrue(dynGroupMemberships.contains(actual.getADynMembership(anyTypeDAO.find("PRINTER")).getGroup())); @@ -345,7 +365,7 @@ public class GroupTest extends AbstractTest { anyObjectDAO.flush(); actual = groupDAO.find(actual.getKey()); - members = CollectionUtils.select(groupDAO.findADynMembersKeys(actual), new Predicate<String>() { + members = CollectionUtils.select(groupDAO.findADynMembers(actual), new Predicate<String>() { @Override public boolean evaluate(final String object) { @@ -364,7 +384,7 @@ public class GroupTest extends AbstractTest { assertNull(entityManager().find(JPAADynGroupMembership.class, dynMembershipKey)); - dynGroupMemberships = findDynGroupMemberships(anyObject); + dynGroupMemberships = findDynGroups(anyObject); assertTrue(dynGroupMemberships.isEmpty()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java index 49d92c7..6ba7906 100644 --- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java +++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/RoleTest.java @@ -23,11 +23,12 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.List; -import javax.persistence.TypedQuery; +import javax.persistence.Query; import org.apache.syncope.common.lib.types.AnyTypeKind; import org.apache.syncope.common.lib.types.StandardEntitlement; import org.apache.syncope.core.persistence.api.dao.AnyTypeClassDAO; @@ -40,6 +41,7 @@ import org.apache.syncope.core.persistence.api.entity.Role; import org.apache.syncope.core.persistence.api.entity.user.UPlainAttr; import org.apache.syncope.core.persistence.api.entity.user.User; import org.apache.syncope.core.persistence.jpa.AbstractTest; +import org.apache.syncope.core.persistence.jpa.dao.JPARoleDAO; import org.apache.syncope.core.persistence.jpa.entity.user.JPADynRoleMembership; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -68,13 +70,23 @@ public class RoleTest extends AbstractTest { * required for avoiding creating new transaction - good for general use case but bad for the way how * this test class is architected. */ - private Collection<Role> findDynRoleMemberships(final User user) { - TypedQuery<Role> query = entityManager().createQuery( - "SELECT e.role FROM " + JPADynRoleMembership.class.getSimpleName() - + " e WHERE :user MEMBER OF e.users", Role.class); - query.setParameter("user", user); - - return query.getResultList(); + private List<Role> findDynRoles(final User user) { + Query query = entityManager().createNativeQuery( + "SELECT role_id FROM " + JPARoleDAO.DYNMEMB_TABLE + " WHERE any_id=?"); + query.setParameter(1, user.getKey()); + + List<Role> result = new ArrayList<>(); + for (Object key : query.getResultList()) { + String actualKey = key instanceof Object[] + ? (String) ((Object[]) key)[0] + : ((String) key); + + Role role = roleDAO.find(actualKey); + if (role != null && !result.contains(role)) { + result.add(role); + } + } + return result; } @Test @@ -122,7 +134,7 @@ public class RoleTest extends AbstractTest { assertEquals(actual, actual.getDynMembership().getRole()); // 3. verify that expected users have the created role dynamically assigned - List<String> members = roleDAO.findDynMembersKeys(actual); + List<String> members = roleDAO.findDynMembers(actual); assertEquals(2, members.size()); assertEquals( new HashSet<>(Arrays.asList("c9b2dec2-00a7-4855-97c0-d854842b4b24", newUserKey)), @@ -130,7 +142,7 @@ public class RoleTest extends AbstractTest { user = userDAO.find("c9b2dec2-00a7-4855-97c0-d854842b4b24"); assertNotNull(user); - Collection<Role> dynRoleMemberships = findDynRoleMemberships(user); + Collection<Role> dynRoleMemberships = findDynRoles(user); assertEquals(1, dynRoleMemberships.size()); assertTrue(dynRoleMemberships.contains(actual.getDynMembership().getRole())); @@ -140,7 +152,7 @@ public class RoleTest extends AbstractTest { userDAO.flush(); actual = roleDAO.find(actual.getKey()); - members = roleDAO.findDynMembersKeys(actual); + members = roleDAO.findDynMembers(actual); assertEquals(1, members.size()); assertEquals("c9b2dec2-00a7-4855-97c0-d854842b4b24", members.get(0)); @@ -153,7 +165,7 @@ public class RoleTest extends AbstractTest { assertNull(entityManager().find(JPADynRoleMembership.class, dynMembershipKey)); - dynRoleMemberships = findDynRoleMemberships(user); + dynRoleMemberships = findDynRoles(user); assertTrue(dynRoleMemberships.isEmpty()); } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RoleDataBinder.java ---------------------------------------------------------------------- diff --git a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RoleDataBinder.java b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RoleDataBinder.java index 7631543..3ebd707 100644 --- a/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RoleDataBinder.java +++ b/core/provisioning-api/src/main/java/org/apache/syncope/core/provisioning/api/data/RoleDataBinder.java @@ -25,7 +25,7 @@ public interface RoleDataBinder { Role create(RoleTO roleTO); - void update(Role role, RoleTO roleTO); + Role update(Role role, RoleTO roleTO); RoleTO getRoleTO(Role role); } http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java index fa17f20..dc944b5 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/AnyObjectDataBinderImpl.java @@ -251,7 +251,7 @@ public class AnyObjectDataBinderImpl extends AbstractAnyDataBinder implements An @Override public PropagationByResource update(final AnyObject toBeUpdated, final AnyObjectPatch anyObjectPatch) { // Re-merge any pending change from workflow tasks - final AnyObject anyObject = anyObjectDAO.save(toBeUpdated); + AnyObject anyObject = anyObjectDAO.save(toBeUpdated); PropagationByResource propByRes = new PropagationByResource(); http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java index d0d751a..32206aa 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/GroupDataBinderImpl.java @@ -230,11 +230,14 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD } } + group = groupDAO.save(group); + // dynamic membership if (groupPatch.getUDynMembershipCond() == null) { if (group.getUDynMembership() != null) { group.getUDynMembership().setGroup(null); group.setUDynMembership(null); + groupDAO.clearUDynMembers(group); } } else { setDynMembership(group, anyTypeDAO.findUser(), groupPatch.getUDynMembershipCond()); @@ -244,6 +247,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD memb.setGroup(null); itor.remove(); } + groupDAO.clearADynMembers(group); for (Map.Entry<String, String> entry : groupPatch.getADynMembershipConds().entrySet()) { AnyType anyType = anyTypeDAO.find(entry.getKey()); if (anyType == null) { http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java index 567739d..6ccb229 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/RoleDataBinderImpl.java @@ -25,6 +25,7 @@ import org.apache.syncope.common.lib.to.RoleTO; import org.apache.syncope.common.lib.types.ClientExceptionType; import org.apache.syncope.core.persistence.api.search.SearchCondConverter; import org.apache.syncope.core.persistence.api.dao.RealmDAO; +import org.apache.syncope.core.persistence.api.dao.RoleDAO; import org.apache.syncope.core.persistence.api.dao.search.SearchCond; import org.apache.syncope.core.persistence.api.entity.EntityFactory; import org.apache.syncope.core.persistence.api.entity.Realm; @@ -45,6 +46,9 @@ public class RoleDataBinderImpl implements RoleDataBinder { private RealmDAO realmDAO; @Autowired + private RoleDAO roleDAO; + + @Autowired private EntityFactory entityFactory; private void setDynMembership(final Role role, final String dynMembershipFIQL) { @@ -68,14 +72,13 @@ public class RoleDataBinderImpl implements RoleDataBinder { @Override public Role create(final RoleTO roleTO) { - Role role = entityFactory.newEntity(Role.class); - update(role, roleTO); - return role; + return update(entityFactory.newEntity(Role.class), roleTO); } @Override - public void update(final Role role, final RoleTO roleTO) { - role.setKey(roleTO.getKey()); + public Role update(final Role toBeUpdated, final RoleTO roleTO) { + toBeUpdated.setKey(roleTO.getKey()); + Role role = roleDAO.save(toBeUpdated); role.getEntitlements().clear(); role.getEntitlements().addAll(roleTO.getEntitlements()); @@ -90,7 +93,10 @@ public class RoleDataBinderImpl implements RoleDataBinder { } } + role = roleDAO.save(role); + // dynamic membership + roleDAO.clearDynMembers(role); if (role.getKey() == null && roleTO.getDynMembershipCond() != null) { setDynMembership(role, roleTO.getDynMembershipCond()); } else if (role.getDynMembership() != null && roleTO.getDynMembershipCond() == null) { @@ -100,9 +106,10 @@ public class RoleDataBinderImpl implements RoleDataBinder { } else if (role.getDynMembership() != null && roleTO.getDynMembershipCond() != null && !role.getDynMembership().getFIQLCond().equals(roleTO.getDynMembershipCond())) { - role.getDynMembership().clear(); setDynMembership(role, roleTO.getDynMembershipCond()); } + + return role; } @Override http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java ---------------------------------------------------------------------- diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java index 647e850..0140de3 100644 --- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java +++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/UserDataBinderImpl.java @@ -174,6 +174,27 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat public void create(final User user, final UserTO userTO, final boolean storePassword) { SyncopeClientCompositeException scce = SyncopeClientException.buildComposite(); + // set username + user.setUsername(userTO.getUsername()); + + // set password + if (StringUtils.isBlank(userTO.getPassword()) || !storePassword) { + LOG.debug("Password was not provided or not required to be stored"); + } else { + setPassword(user, userTO.getPassword(), scce); + } + + user.setMustChangePassword(userTO.isMustChangePassword()); + + // security question / answer + if (userTO.getSecurityQuestion() != null) { + SecurityQuestion securityQuestion = securityQuestionDAO.find(userTO.getSecurityQuestion()); + if (securityQuestion != null) { + user.setSecurityQuestion(securityQuestion); + } + } + user.setSecurityAnswer(userTO.getSecurityAnswer()); + // roles for (String roleKey : userTO.getRoles()) { Role role = roleDAO.find(roleKey); @@ -262,27 +283,6 @@ public class UserDataBinderImpl extends AbstractAnyDataBinder implements UserDat // attributes and resources fill(user, userTO, anyUtils, scce); - // set password - if (StringUtils.isBlank(userTO.getPassword()) || !storePassword) { - LOG.debug("Password was not provided or not required to be stored"); - } else { - setPassword(user, userTO.getPassword(), scce); - } - - // set username - user.setUsername(userTO.getUsername()); - - // security question / answer - if (userTO.getSecurityQuestion() != null) { - SecurityQuestion securityQuestion = securityQuestionDAO.find(userTO.getSecurityQuestion()); - if (securityQuestion != null) { - user.setSecurityQuestion(securityQuestion); - } - } - user.setSecurityAnswer(userTO.getSecurityAnswer()); - - user.setMustChangePassword(userTO.isMustChangePassword()); - // Throw composite exception if there is at least one element set in the composing exceptions if (scce.hasExceptions()) { throw scce; http://git-wip-us.apache.org/repos/asf/syncope/blob/e64d7910/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java ---------------------------------------------------------------------- diff --git a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java index 1ff146e..47bcf9d 100644 --- a/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java +++ b/ext/elasticsearch/client-elasticsearch/src/main/java/org/apache/syncope/ext/elasticsearch/client/ElasticsearchUtils.java @@ -138,7 +138,7 @@ public class ElasticsearchUtils { return input.getLeftEnd().getKey(); } }, new ArrayList<>()); - members.add(groupDAO.findUDynMembersKeys(group)); + members.add(groupDAO.findUDynMembers(group)); CollectionUtils.collect(groupDAO.findAMemberships(group), new Transformer<AMembership, Object>() { @@ -147,7 +147,7 @@ public class ElasticsearchUtils { return input.getLeftEnd().getKey(); } }, members); - members.add(groupDAO.findADynMembersKeys(group)); + members.add(groupDAO.findADynMembers(group)); builder = builder.field("members", members); } else if (any instanceof User) { User user = ((User) any);
