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 2019/01/30 15:29:54 UTC

[syncope] branch 2_0_X updated: [SYNCOPE-1429] Using regexp query with some sauce

This is an automated email from the ASF dual-hosted git repository.

ilgrosso pushed a commit to branch 2_0_X
in repository https://gitbox.apache.org/repos/asf/syncope.git


The following commit(s) were added to refs/heads/2_0_X by this push:
     new 9d7449d  [SYNCOPE-1429] Using regexp query with some sauce
9d7449d is described below

commit 9d7449dc40fd17e9870c4a7883afad4a9a189797
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Wed Jan 30 16:29:43 2019 +0100

    [SYNCOPE-1429] Using regexp query with some sauce
---
 .../elasticsearch/client/ElasticsearchUtils.java   | 16 +++++++++------
 .../jpa/dao/ElasticsearchAnySearchDAO.java         | 16 +++++++++++++--
 fit/core-reference/pom.xml                         |  2 +-
 .../org/apache/syncope/fit/core/SearchITCase.java  | 24 ++++++++++++++++++----
 .../apache/syncope/fit/core/UserSelfITCase.java    |  8 ++++++++
 5 files changed, 53 insertions(+), 13 deletions(-)

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 09c7638..2dd3c7b 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
@@ -159,9 +159,15 @@ public class ElasticsearchUtils {
             User user = ((User) any);
             builder = builder.
                     field("username", user.getUsername()).
-                    field("lastLoginDate", user.getLastLoginDate()).
                     field("lastRecertification", user.getLastRecertification()).
-                    field("lastRecertificator", user.getLastRecertificator());
+                    field("lastRecertificator", user.getLastRecertificator()).
+                    field("token", user.getToken()).
+                    field("tokenExpireTime", user.getTokenExpireTime()).
+                    field("changePwdDate", user.getChangePwdDate()).
+                    field("failedLogins", user.getFailedLogins()).
+                    field("lastLoginDate", user.getLastLoginDate()).
+                    field("suspended", user.isSuspended()).
+                    field("mustChangePassword", user.isMustChangePassword());
 
             List<Object> roles = CollectionUtils.collect(userDAO.findAllRoles(user),
                     EntityUtils.<Role>keyTransformer(), new ArrayList<>());
@@ -194,12 +200,10 @@ public class ElasticsearchUtils {
                     values.add(plainAttr.getUniqueValue().getValue());
                 }
 
-                builder = builder.field(plainAttr.getSchema().getKey(), values);
+                builder = builder.field(plainAttr.getSchema().getKey(), values.size() == 1 ? values.get(0) : values);
             }
         }
 
-        builder = builder.endObject();
-
-        return builder;
+        return builder.endObject();
     }
 }
diff --git a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
index bb37c3d..db208a8 100644
--- a/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
+++ b/ext/elasticsearch/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/ElasticsearchAnySearchDAO.java
@@ -356,8 +356,20 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                 break;
 
             case ILIKE:
-                builder = QueryBuilders.queryStringQuery(
-                        schema.getKey() + ":" + cond.getExpression().replace('%', '*').toLowerCase());
+                StringBuilder output = new StringBuilder();
+                for (char c : cond.getExpression().toLowerCase().toCharArray()) {
+                    if (c == '%') {
+                        output.append(".*");
+                    } else if (Character.isLetter(c)) {
+                        output.append('[').
+                                append(c).
+                                append(Character.toUpperCase(c)).
+                                append(']');
+                    } else {
+                        output.append(c);
+                    }
+                }
+                builder = QueryBuilders.regexpQuery(schema.getKey(), output.toString());
                 break;
 
             case LIKE:
diff --git a/fit/core-reference/pom.xml b/fit/core-reference/pom.xml
index 85a9fa5..f4f5e09 100644
--- a/fit/core-reference/pom.xml
+++ b/fit/core-reference/pom.xml
@@ -454,7 +454,7 @@ under the License.
     </profile>
   
     <profile>
-      <id>elasticsearch</id>
+      <id>elasticsearch-it</id>
       
       <dependencies>
         <dependency>
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
index 696d8c2..56ded63 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/SearchITCase.java
@@ -99,7 +99,15 @@ public class SearchITCase extends AbstractITCase {
 
         matchingUsers = userService.search(
                 new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                        fiql("(fullname=~*oSsINi)").page(1).size(2).build());
+                        fiql("fullname=~*oSsINi").page(1).size(2).build());
+        assertNotNull(matchingUsers);
+        assertEquals(1, matchingUsers.getResult().size());
+        assertEquals("rossini", matchingUsers.getResult().iterator().next().getUsername());
+        assertEquals("1417acbe-cbf6-4277-9372-e75e04f97000", matchingUsers.getResult().iterator().next().getKey());
+
+        matchingUsers = userService.search(
+                new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                        fiql("fullname=~*ino*rossini*").page(1).size(2).build());
         assertNotNull(matchingUsers);
         assertEquals(1, matchingUsers.getResult().size());
         assertEquals("rossini", matchingUsers.getResult().iterator().next().getUsername());
@@ -567,6 +575,14 @@ public class SearchITCase extends AbstractITCase {
                     new MembershipPatch.Builder().group("29f96485-729e-4d31-88a1-6fc60e4677f3").build());
             updateAnyObject(anyObjectPatch);
 
+            if (ElasticsearchDetector.isElasticSearchEnabled(syncopeService)) {
+                try {
+                    Thread.sleep(2000);
+                } catch (InterruptedException ex) {
+                    // ignore
+                }
+            }
+
             PagedResult<AnyObjectTO> matching = anyObjectService.search(new AnyQuery.Builder().fiql(
                     SyncopeClient.getAnyObjectSearchConditionBuilder(service.getKey()).
                             inGroups("29f96485-729e-4d31-88a1-6fc60e4677f3").
@@ -631,7 +647,7 @@ public class SearchITCase extends AbstractITCase {
                 build());
         assertEquals(1, issueSYNCOPE1416.getSize());
         assertEquals("rossini", issueSYNCOPE1416.getResult().get(0).getUsername());
-        
+
         // search by attribute with unique constraint
         issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
                 realm(SyncopeConstants.ROOT_REALM).
@@ -640,7 +656,7 @@ public class SearchITCase extends AbstractITCase {
                 build());
         // some identities could have been imported by pull tasks executions
         assertTrue(issueSYNCOPE1416.getSize() >= 5);
-        
+
         issueSYNCOPE1416 = userService.search(new AnyQuery.Builder().
                 realm(SyncopeConstants.ROOT_REALM).
                 fiql(SyncopeClient.getUserSearchConditionBuilder().isNull("fullname").query()).
@@ -648,7 +664,7 @@ public class SearchITCase extends AbstractITCase {
                 build());
         assertEquals(0, issueSYNCOPE1416.getSize());
     }
-    
+
     @Test
     public void issueSYNCOPE1417() {
         try {
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
index c39a16c..cb4678e 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/UserSelfITCase.java
@@ -57,6 +57,7 @@ import org.apache.syncope.common.rest.api.service.AccessTokenService;
 import org.apache.syncope.common.rest.api.service.UserSelfService;
 import org.apache.syncope.common.rest.api.service.UserService;
 import org.apache.syncope.fit.AbstractITCase;
+import org.apache.syncope.fit.ElasticsearchDetector;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -347,6 +348,13 @@ public class UserSelfITCase extends AbstractITCase {
         anonClient.getService(UserSelfService.class).requestPasswordReset(user.getUsername(), "Rossi");
 
         // SYNCOPE-1293:get users with token not null before requesting password reset
+        if (ElasticsearchDetector.isElasticSearchEnabled(syncopeService)) {
+            try {
+                Thread.sleep(2000);
+            } catch (InterruptedException ex) {
+                // ignore
+            }
+        }
         PagedResult<UserTO> after = userService.search(new AnyQuery.Builder().fiql("token!=$null").build());
         assertEquals(before.getTotalCount() + 1, after.getTotalCount());