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

Reply via email to