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 2022/02/05 12:18:32 UTC

[syncope] branch 2_1_X updated (df4970b -> c2f2cac)

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

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


    from df4970b  Adding missing FIQL samples about relationships
     new b7bc077  Adding GH actions for pgjsonb, myjson and Elasticsearch
     new c2f2cac  [SYNCOPE-1663] Now returning appropriate error

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 ...it_Tomcat_H2_JSON.yml => fit_Elasticsearch.yml} | 14 ++----
 .../{fit_Tomcat_H2_JSON.yml => jpajson.yml}        | 16 +++---
 .../common/lib/types/ClientExceptionType.java      |  2 +-
 .../persistence/api/search/FilterConverter.java    |  2 +-
 .../api/search/SearchCondConverter.java            |  2 +-
 .../api/search/FilterConverterTest.java            | 14 +++---
 .../api/search/SearchCondConverterTest.java        |  1 -
 core/persistence-jpa-json/pom.xml                  |  4 +-
 .../persistence/jpa/dao/MyJPAJSONAnySearchDAO.java |  7 +--
 .../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java |  3 +-
 .../persistence/jpa/dao/AbstractAnySearchDAO.java  | 24 +++------
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 53 ++++----------------
 .../core/persistence/jpa/outer/AnySearchTest.java  |  2 +-
 .../java/data/DynRealmDataBinderImpl.java          |  2 +-
 .../java/data/GroupDataBinderImpl.java             |  2 +-
 .../provisioning/java/data/RoleDataBinderImpl.java |  2 +-
 .../core/rest/cxf/service/AbstractAnyService.java  | 28 +++++++----
 .../core/rest/cxf/service/AbstractServiceImpl.java |  2 +-
 .../rest/cxf/service/AnyObjectServiceImpl.java     |  2 +-
 .../cxf/service/ReconciliationServiceImpl.java     |  2 +-
 .../core/rest/cxf/service/ResourceServiceImpl.java |  2 +-
 .../jpa/dao/ElasticsearchAnySearchDAO.java         | 57 ++++------------------
 .../org/apache/syncope/fit/core/GroupITCase.java   |  6 ++-
 .../org/apache/syncope/fit/core/SearchITCase.java  | 42 +++++++++++-----
 24 files changed, 114 insertions(+), 177 deletions(-)
 copy .github/workflows/{fit_Tomcat_H2_JSON.yml => fit_Elasticsearch.yml} (77%)
 copy .github/workflows/{fit_Tomcat_H2_JSON.yml => jpajson.yml} (71%)

[syncope] 02/02: [SYNCOPE-1663] Now returning appropriate error

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit c2f2cac38400503946051722b332866759133a52
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Sat Feb 5 13:16:01 2022 +0100

    [SYNCOPE-1663] Now returning appropriate error
---
 .../common/lib/types/ClientExceptionType.java      |  2 +-
 .../persistence/api/search/FilterConverter.java    |  2 +-
 .../api/search/SearchCondConverter.java            |  2 +-
 .../api/search/FilterConverterTest.java            | 14 +++---
 .../api/search/SearchCondConverterTest.java        |  1 -
 .../persistence/jpa/dao/MyJPAJSONAnySearchDAO.java |  7 +--
 .../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java |  3 +-
 .../persistence/jpa/dao/AbstractAnySearchDAO.java  | 24 +++------
 .../core/persistence/jpa/dao/JPAAnySearchDAO.java  | 53 ++++----------------
 .../core/persistence/jpa/outer/AnySearchTest.java  |  2 +-
 .../java/data/DynRealmDataBinderImpl.java          |  2 +-
 .../java/data/GroupDataBinderImpl.java             |  2 +-
 .../provisioning/java/data/RoleDataBinderImpl.java |  2 +-
 .../core/rest/cxf/service/AbstractAnyService.java  | 28 +++++++----
 .../core/rest/cxf/service/AbstractServiceImpl.java |  2 +-
 .../rest/cxf/service/AnyObjectServiceImpl.java     |  2 +-
 .../cxf/service/ReconciliationServiceImpl.java     |  2 +-
 .../core/rest/cxf/service/ResourceServiceImpl.java |  2 +-
 .../jpa/dao/ElasticsearchAnySearchDAO.java         | 57 ++++------------------
 .../org/apache/syncope/fit/core/GroupITCase.java   |  6 ++-
 .../org/apache/syncope/fit/core/SearchITCase.java  | 42 +++++++++++-----
 21 files changed, 100 insertions(+), 157 deletions(-)

diff --git a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
index 8a8f744..7796897 100644
--- a/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
+++ b/common/lib/src/main/java/org/apache/syncope/common/lib/types/ClientExceptionType.java
@@ -51,7 +51,7 @@ public enum ClientExceptionType {
     InvalidAnyObject(Response.Status.BAD_REQUEST),
     InvalidGroup(Response.Status.BAD_REQUEST),
     InvalidSchemaDefinition(Response.Status.BAD_REQUEST),
-    InvalidSearchExpression(Response.Status.BAD_REQUEST),
+    InvalidSearchParameters(Response.Status.BAD_REQUEST),
     InvalidPageOrSize(Response.Status.BAD_REQUEST),
     InvalidPropagationTaskExecReport(Response.Status.BAD_REQUEST),
     InvalidPlainSchema(Response.Status.BAD_REQUEST),
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/FilterConverter.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/FilterConverter.java
index 124a478..d12589d 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/FilterConverter.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/FilterConverter.java
@@ -51,7 +51,7 @@ public final class FilterConverter {
 
             return visitor.getQuery();
         } catch (Exception e) {
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(fiql);
             sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
             throw sce;
diff --git a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondConverter.java b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondConverter.java
index 8a0198f..cf0ce63 100644
--- a/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondConverter.java
+++ b/core/persistence-api/src/main/java/org/apache/syncope/core/persistence/api/search/SearchCondConverter.java
@@ -55,7 +55,7 @@ public final class SearchCondConverter {
 
             return visitor.getQuery();
         } catch (Exception e) {
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(fiql);
             sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
             throw sce;
diff --git a/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/FilterConverterTest.java b/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/FilterConverterTest.java
index d314db0..84f73d8 100644
--- a/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/FilterConverterTest.java
+++ b/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/FilterConverterTest.java
@@ -117,7 +117,7 @@ public class FilterConverterTest {
             FilterConverter.convert(fiql);
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -130,7 +130,7 @@ public class FilterConverterTest {
             FilterConverter.convert(fiql);
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -143,7 +143,7 @@ public class FilterConverterTest {
             FilterConverter.convert(fiql);
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -178,7 +178,7 @@ public class FilterConverterTest {
             FilterConverter.convert(SpecialAttr.DYNREALMS + "==realm");
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -188,7 +188,7 @@ public class FilterConverterTest {
             FilterConverter.convert(SpecialAttr.DYNREALMS + "!=realm");
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -198,7 +198,7 @@ public class FilterConverterTest {
             FilterConverter.convert(SpecialAttr.RESOURCES + "==resource");
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -208,7 +208,7 @@ public class FilterConverterTest {
             FilterConverter.convert(SpecialAttr.RESOURCES + "!=resource");
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
diff --git a/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java b/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
index eafb313..111aa67 100644
--- a/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
+++ b/core/persistence-api/src/test/java/org/apache/syncope/core/persistence/api/search/SearchCondConverterTest.java
@@ -329,5 +329,4 @@ public class SearchCondConverterTest {
 
         assertEquals(SearchCond.getLeaf(cond), SearchCondConverter.convert(VISITOR, fiql));
     }
-
 }
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
index 5eddaf3..f570c24 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/MyJPAJSONAnySearchDAO.java
@@ -228,12 +228,7 @@ public class MyJPAJSONAnySearchDAO extends JPAAnySearchDAO {
             final List<Object> parameters,
             final SearchSupport svs) {
 
-        Pair<PlainSchema, PlainAttrValue> checked;
-        try {
-            checked = check(cond, svs.anyTypeKind);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        Pair<PlainSchema, PlainAttrValue> checked = check(cond, svs.anyTypeKind);
 
         // normalize NULL / NOT NULL checks
         if (not) {
diff --git a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
index 3ecc9c6..c22771c 100644
--- a/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
+++ b/core/persistence-jpa-json/src/main/java/org/apache/syncope/core/persistence/jpa/dao/PGJPAJSONAnySearchDAO.java
@@ -592,8 +592,7 @@ public class PGJPAJSONAnySearchDAO extends JPAAnySearchDAO {
 
             Realm realm = realmDAO.findByFullPath(cond.getExpression());
             if (realm == null) {
-                LOG.warn("Invalid Realm full path: {}", cond.getExpression());
-                return EMPTY_QUERY;
+                throw new IllegalArgumentException("Invalid Realm full path: " + cond.getExpression());
             }
             cond.setExpression(realm.getKey());
         }
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
index 14592e3..1ee4126 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/AbstractAnySearchDAO.java
@@ -178,8 +178,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
 
         PlainSchema schema = schemaDAO.find(cond.getSchema());
         if (schema == null) {
-            LOG.warn("Ignoring invalid schema '{}'", cond.getSchema());
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Invalid schema " + cond.getSchema());
         }
 
         PlainAttrValue attrValue = schema.isUniqueConstraint()
@@ -194,8 +193,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
                 ((JPAPlainSchema) schema).validator().validate(cond.getExpression(), attrValue);
             }
         } catch (ValidationException e) {
-            LOG.error("Could not validate expression '" + cond.getExpression() + "'", e);
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Could not validate expression " + cond.getExpression());
         }
 
         return Pair.of(schema, attrValue);
@@ -210,8 +208,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
 
         Field anyField = anyUtils.getField(computed.getSchema());
         if (anyField == null) {
-            LOG.warn("Ignoring invalid field '{}'", computed.getSchema());
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Invalid schema " + computed.getSchema());
         }
         // Keeps track of difference between entity's getKey() and JPA @Id fields
         if ("key".equals(computed.getSchema())) {
@@ -257,8 +254,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
             try {
                 ((JPAPlainSchema) schema).validator().validate(computed.getExpression(), attrValue);
             } catch (ValidationException e) {
-                LOG.error("Could not validate expression '" + computed.getExpression() + "'", e);
-                throw new IllegalArgumentException();
+                throw new IllegalArgumentException("Could not validate expression " + computed.getExpression());
             }
         }
 
@@ -275,8 +271,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
                         map(Collections::singletonList).orElseGet(() -> Collections.emptyList())
                 : groupDAO.findKeysByNamePattern(cond.getGroup());
         if (matching.isEmpty()) {
-            LOG.error("Could not find group(s) for '{}'", cond.getGroup());
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Could not find group(s) for " + cond.getGroup());
         }
 
         return matching;
@@ -291,8 +286,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
             rightAnyObjectKey = anyObject == null ? null : anyObject.getKey();
         }
         if (rightAnyObjectKey == null) {
-            LOG.error("Could not find any object for '" + cond.getAnyObject() + "'");
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Could not find any object for " + cond.getAnyObject());
         }
 
         return rightAnyObjectKey;
@@ -301,8 +295,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
     protected Realm check(final AssignableCond cond) {
         Realm realm = realmDAO.findByFullPath(cond.getRealmFullPath());
         if (realm == null) {
-            LOG.error("Could not find realm for '" + cond.getRealmFullPath() + "'");
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Could not find realm for " + cond.getRealmFullPath());
         }
 
         return realm;
@@ -320,8 +313,7 @@ public abstract class AbstractAnySearchDAO extends AbstractDAO<Any<?>> implement
             memberKey = member == null ? null : member.getKey();
         }
         if (memberKey == null) {
-            LOG.error("Could not find user or any object for '" + cond.getMember() + "'");
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Could not find user or any object for " + cond.getMember());
         }
 
         return memberKey;
diff --git a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
index 65bf645..042a688 100644
--- a/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
+++ b/core/persistence-jpa/src/main/java/org/apache/syncope/core/persistence/jpa/dao/JPAAnySearchDAO.java
@@ -65,8 +65,6 @@ import org.apache.syncope.core.persistence.api.entity.Realm;
  */
 public class JPAAnySearchDAO extends AbstractAnySearchDAO {
 
-    protected static final String EMPTY_QUERY = "SELECT any_id FROM user_search WHERE 1=2";
-
     protected String buildAdminRealmsFilter(
             final Set<String> realmKeys,
             final SearchSupport svs,
@@ -228,9 +226,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             if (parameters.get(i) instanceof Date) {
                 query.setParameter(i + 1, (Date) parameters.get(i), TemporalType.TIMESTAMP);
             } else if (parameters.get(i) instanceof Boolean) {
-                query.setParameter(i + 1, ((Boolean) parameters.get(i))
-                        ? 1
-                        : 0);
+                query.setParameter(i + 1, ((Boolean) parameters.get(i)) ? 1 : 0);
             } else {
                 query.setParameter(i + 1, parameters.get(i));
             }
@@ -443,7 +439,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
                         }
                         if (orderByUniquePlainSchemas.size() > 1 || orderByNonUniquePlainSchemas.size() > 1) {
                             SyncopeClientException invalidSearch =
-                                    SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+                                    SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
                             invalidSearch.getElements().add("Order by more than one attribute is not allowed; "
                                     + "remove one from " + (orderByUniquePlainSchemas.size() > 1
                                     ? orderByUniquePlainSchemas : orderByNonUniquePlainSchemas));
@@ -643,12 +639,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             final List<Object> parameters,
             final SearchSupport svs) {
 
-        String rightAnyObjectKey;
-        try {
-            rightAnyObjectKey = check(cond);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        String rightAnyObjectKey = check(cond);
 
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ").
                 append(svs.field().name).append(" WHERE ");
@@ -673,12 +664,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             final List<Object> parameters,
             final SearchSupport svs) {
 
-        List<String> groupKeys;
-        try {
-            groupKeys = check(cond);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        List<String> groupKeys = check(cond);
 
         String where = groupKeys.stream().
                 map(key -> "group_id=?" + setParameter(parameters, key)).
@@ -840,12 +826,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             final List<Object> parameters,
             final SearchSupport svs) {
 
-        Realm realm;
-        try {
-            realm = check(cond);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        Realm realm = check(cond);
 
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ").
                 append(svs.field().name).append(" WHERE (");
@@ -871,12 +852,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             final List<Object> parameters,
             final SearchSupport svs) {
 
-        String memberKey;
-        try {
-            memberKey = check(cond);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        String memberKey = check(cond);
 
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ").
                 append(svs.field().name).append(" WHERE ");
@@ -1044,12 +1020,7 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
             final List<Object> parameters,
             final SearchSupport svs) {
 
-        Pair<PlainSchema, PlainAttrValue> checked;
-        try {
-            checked = check(cond, svs.anyTypeKind);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        Pair<PlainSchema, PlainAttrValue> checked = check(cond, svs.anyTypeKind);
 
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ");
         switch (cond.getType()) {
@@ -1100,18 +1071,12 @@ public class JPAAnySearchDAO extends AbstractAnySearchDAO {
 
             Realm realm = realmDAO.findByFullPath(cond.getExpression());
             if (realm == null) {
-                LOG.warn("Invalid Realm full path: {}", cond.getExpression());
-                return EMPTY_QUERY;
+                throw new IllegalArgumentException("Invalid Realm full path: " + cond.getExpression());
             }
             cond.setExpression(realm.getKey());
         }
 
-        Triple<PlainSchema, PlainAttrValue, AnyCond> checked;
-        try {
-            checked = check(cond, svs.anyTypeKind);
-        } catch (IllegalArgumentException e) {
-            return EMPTY_QUERY;
-        }
+        Triple<PlainSchema, PlainAttrValue, AnyCond> checked = check(cond, svs.anyTypeKind);
 
         StringBuilder query = new StringBuilder("SELECT DISTINCT any_id FROM ").
                 append(svs.field().name).append(" WHERE ");
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
index 74a654e..0f92bca 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/outer/AnySearchTest.java
@@ -188,7 +188,7 @@ public class AnySearchTest extends AbstractTest {
             searchDAO.search(searchCondition, orderByClauses, AnyTypeKind.USER);
             fail();
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
diff --git a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
index 2f5cf0e..c5cc9d8 100644
--- a/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
+++ b/core/provisioning-java/src/main/java/org/apache/syncope/core/provisioning/java/data/DynRealmDataBinderImpl.java
@@ -57,7 +57,7 @@ public class DynRealmDataBinderImpl implements DynRealmDataBinder {
     private void setDynMembership(final DynRealm dynRealm, final AnyType anyType, final String dynMembershipFIQL) {
         SearchCond dynMembershipCond = SearchCondConverter.convert(searchCondVisitor, dynMembershipFIQL);
         if (!dynMembershipCond.isValid()) {
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(dynMembershipFIQL);
             throw sce;
         }
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 1771735..7cf5ba0 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
@@ -70,7 +70,7 @@ public class GroupDataBinderImpl extends AbstractAnyDataBinder implements GroupD
     private void setDynMembership(final Group group, final AnyType anyType, final String dynMembershipFIQL) {
         SearchCond dynMembershipCond = SearchCondConverter.convert(searchCondVisitor, dynMembershipFIQL);
         if (!dynMembershipCond.isValid()) {
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(dynMembershipFIQL);
             throw sce;
         }
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 bfe3059..544a902 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
@@ -68,7 +68,7 @@ public class RoleDataBinderImpl implements RoleDataBinder {
     private void setDynMembership(final Role role, final String dynMembershipFIQL) {
         SearchCond dynMembershipCond = SearchCondConverter.convert(searchCondVisitor, dynMembershipFIQL);
         if (!dynMembershipCond.isValid()) {
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(dynMembershipFIQL);
             throw sce;
         }
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
index f857cc1..d6ec1d8 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractAnyService.java
@@ -27,7 +27,9 @@ import java.util.stream.Collectors;
 import javax.ws.rs.BadRequestException;
 import javax.ws.rs.core.Response;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.exception.ExceptionUtils;
 import org.apache.commons.lang3.tuple.Pair;
+import org.apache.syncope.common.lib.SyncopeClientException;
 import org.apache.syncope.common.lib.SyncopeConstants;
 import org.apache.syncope.common.lib.patch.AnyPatch;
 import org.apache.syncope.common.lib.patch.AssociationPatch;
@@ -38,6 +40,7 @@ import org.apache.syncope.common.lib.to.AnyTO;
 import org.apache.syncope.common.lib.to.AttrTO;
 import org.apache.syncope.common.lib.to.PagedResult;
 import org.apache.syncope.common.lib.to.ProvisioningResult;
+import org.apache.syncope.common.lib.types.ClientExceptionType;
 import org.apache.syncope.common.lib.types.PatchOperation;
 import org.apache.syncope.common.lib.types.ResourceAssociationAction;
 import org.apache.syncope.common.lib.types.ResourceDeassociationAction;
@@ -130,15 +133,22 @@ public abstract class AbstractAnyService<TO extends AnyTO, P extends AnyPatch>
                 ? null
                 : getSearchCond(anyQuery.getFiql(), realm);
 
-        Pair<Integer, List<TO>> result = getAnyLogic().search(
-                searchCond,
-                anyQuery.getPage(),
-                anyQuery.getSize(),
-                getOrderByClauses(anyQuery.getOrderBy()),
-                isAssignableCond ? SyncopeConstants.ROOT_REALM : realm,
-                anyQuery.getDetails());
-
-        return buildPagedResult(result.getRight(), anyQuery.getPage(), anyQuery.getSize(), result.getLeft());
+        try {
+            Pair<Integer, List<TO>> result = getAnyLogic().search(
+                    searchCond,
+                    anyQuery.getPage(),
+                    anyQuery.getSize(),
+                    getOrderByClauses(anyQuery.getOrderBy()),
+                    isAssignableCond ? SyncopeConstants.ROOT_REALM : realm,
+                    anyQuery.getDetails());
+
+            return buildPagedResult(result.getRight(), anyQuery.getPage(), anyQuery.getSize(), result.getLeft());
+        } catch (IllegalArgumentException e) {
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
+            sce.getElements().add(anyQuery.getFiql());
+            sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
+            throw sce;
+        }
     }
 
     protected Date findLastChange(final String key) {
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java
index c1a7c7f..f93a68d 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AbstractServiceImpl.java
@@ -174,7 +174,7 @@ abstract class AbstractServiceImpl implements JAXRSService {
         } catch (Exception e) {
             LOG.error("Invalid FIQL expression: {}", fiql, e);
 
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(fiql);
             sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
             throw sce;
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyObjectServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyObjectServiceImpl.java
index fd2ead6..07e79d1 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyObjectServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/AnyObjectServiceImpl.java
@@ -91,7 +91,7 @@ public class AnyObjectServiceImpl extends AbstractAnyService<AnyObjectTO, AnyObj
         if (StringUtils.isBlank(anyQuery.getFiql())
                 || -1 == anyQuery.getFiql().indexOf(SpecialAttr.TYPE.toString())) {
 
-            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+            SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
             sce.getElements().add(SpecialAttr.TYPE.toString() + " is required in the FIQL string");
             throw sce;
         }
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ReconciliationServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ReconciliationServiceImpl.java
index 87a1a73..51b8ce1 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ReconciliationServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ReconciliationServiceImpl.java
@@ -85,7 +85,7 @@ public class ReconciliationServiceImpl extends AbstractServiceImpl implements Re
             } catch (Exception e) {
                 LOG.error("Invalid FIQL expression: {}", reconQuery.getFiql(), e);
 
-                SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+                SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
                 sce.getElements().add(reconQuery.getFiql());
                 sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
                 throw sce;
diff --git a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
index 9b80531..c68615d 100644
--- a/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
+++ b/core/rest-cxf/src/main/java/org/apache/syncope/core/rest/cxf/service/ResourceServiceImpl.java
@@ -125,7 +125,7 @@ public class ResourceServiceImpl extends AbstractServiceImpl implements Resource
             } catch (Exception e) {
                 LOG.error("Invalid FIQL expression: {}", query.getFiql(), e);
 
-                SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchExpression);
+                SyncopeClientException sce = SyncopeClientException.build(ClientExceptionType.InvalidSearchParameters);
                 sce.getElements().add(query.getFiql());
                 sce.getElements().add(ExceptionUtils.getRootCauseMessage(e));
                 throw sce;
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 16eb4d4..c11bb4d 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
@@ -66,8 +66,6 @@ import org.elasticsearch.client.RequestOptions;
 import org.elasticsearch.client.RestHighLevelClient;
 import org.elasticsearch.client.core.CountRequest;
 import org.elasticsearch.index.query.DisMaxQueryBuilder;
-import org.elasticsearch.index.query.MatchAllQueryBuilder;
-import org.elasticsearch.index.query.MatchNoneQueryBuilder;
 import org.elasticsearch.index.query.QueryBuilder;
 import org.elasticsearch.index.query.QueryBuilders;
 import org.elasticsearch.search.SearchHit;
@@ -82,10 +80,6 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
 
-    protected static final QueryBuilder MATCH_NONE_QUERY_BUILDER = new MatchNoneQueryBuilder();
-
-    protected static final QueryBuilder MATCH_ALL_QUERY_BUILDER = new MatchAllQueryBuilder();
-
     protected static final char[] ELASTICSEARCH_REGEX_CHARS = new char[] {
         '.', '?', '+', '*', '|', '{', '}', '[', ']', '(', ')', '"', '\\', '&' };
 
@@ -334,7 +328,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                 }
 
                 if (builder == null) {
-                    builder = MATCH_NONE_QUERY_BUILDER;
+                    throw new IllegalArgumentException("Cannot construct QueryBuilder");
                 }
 
                 if (cond.getType() == SearchCond.Type.NOT_LEAF) {
@@ -369,23 +363,13 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
     }
 
     protected QueryBuilder getQueryBuilder(final RelationshipCond cond) {
-        String rightAnyObjectKey;
-        try {
-            rightAnyObjectKey = check(cond);
-        } catch (IllegalArgumentException e) {
-            return MATCH_NONE_QUERY_BUILDER;
-        }
+        String rightAnyObjectKey = check(cond);
 
         return QueryBuilders.termQuery("relationships", rightAnyObjectKey);
     }
 
     protected QueryBuilder getQueryBuilder(final MembershipCond cond) {
-        List<String> groupKeys;
-        try {
-            groupKeys = check(cond);
-        } catch (IllegalArgumentException e) {
-            return MATCH_NONE_QUERY_BUILDER;
-        }
+        List<String> groupKeys = check(cond);
 
         if (groupKeys.size() == 1) {
             return QueryBuilders.termQuery("memberships", groupKeys.get(0));
@@ -397,12 +381,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
     }
 
     protected QueryBuilder getQueryBuilder(final AssignableCond cond) {
-        Realm realm;
-        try {
-            realm = check(cond);
-        } catch (IllegalArgumentException e) {
-            return MATCH_NONE_QUERY_BUILDER;
-        }
+        Realm realm = check(cond);
 
         DisMaxQueryBuilder builder = QueryBuilders.disMaxQuery();
         if (cond.isFromGroup()) {
@@ -431,12 +410,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
     }
 
     protected QueryBuilder getQueryBuilder(final MemberCond cond) {
-        String memberKey;
-        try {
-            memberKey = check(cond);
-        } catch (IllegalArgumentException e) {
-            return MATCH_NONE_QUERY_BUILDER;
-        }
+        String memberKey = check(cond);
 
         return QueryBuilders.termQuery("members", memberKey);
     }
@@ -454,7 +428,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
                 ? attrValue.getDateValue().getTime()
                 : attrValue.getValue();
 
-        QueryBuilder builder = MATCH_NONE_QUERY_BUILDER;
+        QueryBuilder builder = null;
 
         switch (cond.getType()) {
             case ISNOTNULL:
@@ -517,12 +491,7 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
     }
 
     protected QueryBuilder getQueryBuilder(final AttrCond cond, final AnyTypeKind kind) {
-        Pair<PlainSchema, PlainAttrValue> checked;
-        try {
-            checked = check(cond, kind);
-        } catch (IllegalArgumentException e) {
-            return MATCH_NONE_QUERY_BUILDER;
-        }
+        Pair<PlainSchema, PlainAttrValue> checked = check(cond, kind);
 
         return fillAttrQuery(checked.getLeft(), checked.getRight(), cond);
     }
@@ -533,23 +502,17 @@ public class ElasticsearchAnySearchDAO extends AbstractAnySearchDAO {
 
             Realm realm = realmDAO.find(cond.getExpression());
             if (realm == null) {
-                LOG.warn("Invalid Realm key: {}", cond.getExpression());
-                return MATCH_NONE_QUERY_BUILDER;
+                throw new IllegalArgumentException("Invalid Realm key: " + cond.getExpression());
             }
             cond.setExpression(realm.getFullPath());
         }
 
-        Triple<PlainSchema, PlainAttrValue, AnyCond> checked;
-        try {
-            checked = check(cond, kind);
-        } catch (IllegalArgumentException e) {
-            return MATCH_NONE_QUERY_BUILDER;
-        }
+        Triple<PlainSchema, PlainAttrValue, AnyCond> checked = check(cond, kind);
 
         return fillAttrQuery(checked.getLeft(), checked.getMiddle(), checked.getRight());
     }
 
     protected QueryBuilder getQueryBuilderForCustomConds(final SearchCond cond, final AnyTypeKind kind) {
-        return MATCH_ALL_QUERY_BUILDER;
+        return null;
     }
 }
diff --git a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
index 6a7e68d..ada06db 100644
--- a/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
+++ b/fit/core-reference/src/test/java/org/apache/syncope/fit/core/GroupITCase.java
@@ -248,10 +248,12 @@ public class GroupITCase extends AbstractITCase {
     @Test
     public void patch() {
         GroupTO original = getBasicSampleTO("patch");
-        original.setUDynMembershipCond("(($groups==3;$resources!=ws-target-resource-1);aLong==1)");
+        original.setUDynMembershipCond(
+                "(($groups==ebf97068-aa4b-4a85-9f01-680e8c4cf227;$resources!=ws-target-resource-1);aLong==1)");
         original.getADynMembershipConds().put(
                 PRINTER,
-                "(($groups==7;cool==ss);$resources==ws-target-resource-2);$type==PRINTER");
+                "(($groups==ece66293-8f31-4a84-8e8d-23da36e70846;cool==ss);$resources==ws-target-resource-2);"
+                + "$type==PRINTER");
 
         GroupTO created = createGroup(original).getEntity();
 
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 b22bce3..030b3d0 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
@@ -422,12 +422,15 @@ public class SearchITCase extends AbstractITCase {
         userTO = createUser(userTO).getEntity();
         assertNotNull(userTO.getSecurityQuestion());
 
-        PagedResult<UserTO> matchingUsers = userService.search(
-                new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                        fiql(SyncopeClient.getUserSearchConditionBuilder().
-                                is("securityAnswer").equalTo(securityAnswer).query()).build());
-        assertNotNull(matchingUsers);
-        assertTrue(matchingUsers.getResult().isEmpty());
+        try {
+            userService.search(
+                    new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                            fiql(SyncopeClient.getUserSearchConditionBuilder().
+                                    is("securityAnswer").equalTo(securityAnswer).query()).build());
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
+        }
     }
 
     @Test
@@ -761,7 +764,7 @@ public class SearchITCase extends AbstractITCase {
                 fail();
             }
         } catch (SyncopeClientException e) {
-            assertEquals(ClientExceptionType.InvalidSearchExpression, e.getType());
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
         }
     }
 
@@ -787,11 +790,26 @@ public class SearchITCase extends AbstractITCase {
 
     @Test
     public void issueSYNCOPE1648() {
-        PagedResult<UserTO> matching = userService.search(
-                new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
-                        fiql(SyncopeClient.getUserSearchConditionBuilder().
-                                is("username").notEqualTo("verdi").query()).
-                        build());
+        PagedResult<UserTO> matching = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                fiql(SyncopeClient.getUserSearchConditionBuilder().
+                        is("username").notEqualTo("verdi").query()).build());
         assertTrue(matching.getResult().stream().noneMatch(user -> "verdi".equals(user.getUsername())));
     }
+
+    @Test
+    public void issueSYNCOPE1663() {
+        try {
+            userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                    fiql("lastChangeDate=ge=2022-01-25T17:00:06Z").build());
+            fail();
+        } catch (SyncopeClientException e) {
+            assertEquals(ClientExceptionType.InvalidSearchParameters, e.getType());
+            assertTrue(e.getElements().stream().
+                    anyMatch(elem -> elem.contains("Could not validate expression 2022-01-25T17:00:06Z")));
+        }
+
+        PagedResult<UserTO> matching = userService.search(new AnyQuery.Builder().realm(SyncopeConstants.ROOT_REALM).
+                fiql("lastChangeDate=ge=2022-01-25T17:00:06+0000").build());
+        assertNotNull(matching);
+    }
 }

[syncope] 01/02: Adding GH actions for pgjsonb, myjson and Elasticsearch

Posted by il...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b7bc07774bc0668921b1b37d404e16ab79b850d7
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Sat Feb 5 12:50:41 2022 +0100

    Adding GH actions for pgjsonb, myjson and Elasticsearch
---
 .github/workflows/fit_Elasticsearch.yml | 47 +++++++++++++++++++++++++++++++
 .github/workflows/jpajson.yml           | 49 +++++++++++++++++++++++++++++++++
 core/persistence-jpa-json/pom.xml       |  4 +--
 3 files changed, 98 insertions(+), 2 deletions(-)

diff --git a/.github/workflows/fit_Elasticsearch.yml b/.github/workflows/fit_Elasticsearch.yml
new file mode 100644
index 0000000..89cd07c
--- /dev/null
+++ b/.github/workflows/fit_Elasticsearch.yml
@@ -0,0 +1,47 @@
+# 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
+name: "FIT Elasticsearch"
+
+on:
+  push:
+    branches: [2_1_X]
+  pull_request:
+    # The branches below must be a subset of the branches above
+    branches: [2_1_X]
+  schedule:
+    - cron: '0 13 * * 4'
+
+jobs:
+  fit_Elasticsearch:
+    runs-on: ubuntu-latest
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v2
+    - name: Setup Java JDK
+      uses: actions/setup-java@v1.4.3
+      with:
+        java-version: 8
+    - uses: actions/cache@v2.1.1
+      with:
+        path: ~/.m2
+        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+        restore-keys: ${{ runner.os }}-m2
+    - name: Build
+      run: mvn -U -T 1C -P 'skipTests,all'
+    - name: 'Elasticsearch / H2 / JSON'
+      run: mvn -f fit/core-reference/pom.xml -P elasticsearch-it -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
diff --git a/.github/workflows/jpajson.yml b/.github/workflows/jpajson.yml
new file mode 100644
index 0000000..b1370a4
--- /dev/null
+++ b/.github/workflows/jpajson.yml
@@ -0,0 +1,49 @@
+# 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
+name: "JPA JSON"
+
+on:
+  push:
+    branches: [2_1_X]
+  pull_request:
+    # The branches below must be a subset of the branches above
+    branches: [2_1_X]
+  schedule:
+    - cron: '0 13 * * 4'
+
+jobs:
+  PostgreSQL:
+    runs-on: ubuntu-latest
+
+    steps:
+    - name: Checkout repository
+      uses: actions/checkout@v2
+    - name: Setup Java JDK
+      uses: actions/setup-java@v1.4.3
+      with:
+        java-version: 8
+    - uses: actions/cache@v2.1.1
+      with:
+        path: ~/.m2
+        key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
+        restore-keys: ${{ runner.os }}-m2
+    - name: Build
+      run: mvn -U -T 1C -P 'skipTests,all'
+    - name: 'Unit Tests: PostgreSQL JPA JSON'
+      run: mvn -f core/persistence-jpa-json/pom.xml -P pgjsonb -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Dianal.phase=none -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
+    - name: 'Unit Tests: MySQL JPA JSON'
+      run: mvn -f core/persistence-jpa-json/pom.xml -P myjson -Dinvoker.streamLogs=true -Dmodernizer.skip=true -Dianal.phase=none -Drat.skip=true -Dcheckstyle.skip=true -Djacoco.skip=true
diff --git a/core/persistence-jpa-json/pom.xml b/core/persistence-jpa-json/pom.xml
index 935d3af..9c43f87 100644
--- a/core/persistence-jpa-json/pom.xml
+++ b/core/persistence-jpa-json/pom.xml
@@ -187,7 +187,7 @@ under the License.
     </profile>
 
     <profile>
-      <id>postgres</id>
+      <id>pgjsonb</id>
       
       <dependencies>
         <dependency>
@@ -303,7 +303,7 @@ under the License.
     </profile>
     
     <profile>
-      <id>mysql</id>
+      <id>myjson</id>
       
       <dependencies>
         <dependency>