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