Fixing problems of DynRealms with Elasticsearch
Project: http://git-wip-us.apache.org/repos/asf/syncope/repo Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/c23c0d51 Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/c23c0d51 Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/c23c0d51 Branch: refs/heads/master Commit: c23c0d513ce05fbec378abcab8c76eb149c8994b Parents: 4fe8d08 Author: Francesco Chicchiriccò <ilgro...@apache.org> Authored: Wed Sep 27 17:07:51 2017 +0200 Committer: Francesco Chicchiriccò <ilgro...@apache.org> Committed: Wed Sep 27 17:09:36 2017 +0200 ---------------------------------------------------------------------- .../persistence/jpa/dao/JPADynRealmDAO.java | 22 ++++++++++++++++++-- .../apache/syncope/fit/core/DynRealmITCase.java | 9 ++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/syncope/blob/c23c0d51/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java ---------------------------------------------------------------------- diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java index 1c84be5..8e6f59b 100644 --- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java +++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPADynRealmDAO.java @@ -32,7 +32,9 @@ import org.apache.syncope.core.persistence.jpa.entity.JPADynRealm; import org.apache.syncope.core.provisioning.api.event.AnyCreatedUpdatedEvent; import org.apache.syncope.core.spring.ApplicationContextProvider; import org.apache.syncope.core.spring.security.AuthContextUtils; +import org.springframework.aop.support.AopUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -47,6 +49,8 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO private AnySearchDAO searchDAO; + private AnySearchDAO jpaAnySearchDAO; + private AnySearchDAO searchDAO() { synchronized (this) { if (searchDAO == null) { @@ -56,6 +60,20 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO return searchDAO; } + private AnySearchDAO jpaAnySearchDAO() { + synchronized (this) { + if (jpaAnySearchDAO == null) { + if (AopUtils.getTargetClass(searchDAO()).equals(JPAAnySearchDAO.class)) { + jpaAnySearchDAO = searchDAO(); + } else { + jpaAnySearchDAO = (AnySearchDAO) ApplicationContextProvider.getBeanFactory(). + createBean(JPAAnySearchDAO.class, AbstractBeanDefinition.AUTOWIRE_BY_TYPE, true); + } + } + } + return jpaAnySearchDAO; + } + @Override public DynRealm find(final String key) { return entityManager().find(JPADynRealm.class, key); @@ -75,7 +93,7 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO // refresh dynamic memberships clearDynMembers(merged); - merged.getDynMemberships().stream().map(memb -> searchDAO().search( + merged.getDynMemberships().stream().map(memb -> jpaAnySearchDAO().search( SearchCondConverter.convert(memb.getFIQLCond()), memb.getAnyType().getKind())). forEachOrdered(matching -> { matching.forEach(any -> { @@ -122,7 +140,7 @@ public class JPADynRealmDAO extends AbstractDAO<DynRealm> implements DynRealmDAO delete.setParameter(1, dynRealm.getKey()); delete.setParameter(2, any.getKey()); delete.executeUpdate(); - if (searchDAO().matches(any, SearchCondConverter.convert(memb.get().getFIQLCond()))) { + if (jpaAnySearchDAO().matches(any, SearchCondConverter.convert(memb.get().getFIQLCond()))) { Query insert = entityManager().createNativeQuery("INSERT INTO " + DYNMEMB_TABLE + " VALUES(?, ?)"); insert.setParameter(1, any.getKey()); insert.setParameter(2, dynRealm.getKey()); http://git-wip-us.apache.org/repos/asf/syncope/blob/c23c0d51/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java ---------------------------------------------------------------------- diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java index 2772092..c1348f8 100644 --- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java +++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/DynRealmITCase.java @@ -47,6 +47,7 @@ import org.apache.syncope.common.rest.api.service.DynRealmService; import org.apache.syncope.common.rest.api.service.GroupService; import org.apache.syncope.common.rest.api.service.UserService; import org.apache.syncope.fit.AbstractITCase; +import org.apache.syncope.fit.ElasticsearchDetector; import org.junit.Test; public class DynRealmITCase extends AbstractITCase { @@ -138,6 +139,14 @@ public class DynRealmITCase extends AbstractITCase { assertNotNull(group); final String groupKey = group.getKey(); + if (ElasticsearchDetector.isElasticSearchEnabled(syncopeService)) { + try { + Thread.sleep(2000); + } catch (InterruptedException ex) { + // ignore + } + } + // 5. verify that the new user and group are found when searching by dynamic realm PagedResult<UserTO> matchingUsers = userService.search(new AnyQuery.Builder().realm("/").fiql( SyncopeClient.getUserSearchConditionBuilder().inDynRealms(dynRealm.getKey()).query()).build());