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 2021/04/15 12:35:46 UTC

[syncope] branch 2_1_X updated: [SYNCOPE-1629] Ensure to provide date search values as milliseconds when using JPA JSON

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


The following commit(s) were added to refs/heads/2_1_X by this push:
     new d173da9  [SYNCOPE-1629] Ensure to provide date search values as milliseconds when using JPA JSON
d173da9 is described below

commit d173da98bf798ea6d9c0ea14ed7a983c20637272
Author: Francesco Chicchiriccò <il...@apache.org>
AuthorDate: Thu Apr 15 14:35:26 2021 +0200

    [SYNCOPE-1629] Ensure to provide date search values as milliseconds when using JPA JSON
---
 .../console/panels/search/SearchClausePanel.java   | 19 +++++++-------
 .../persistence/jpa/dao/MyJPAJSONAnySearchDAO.java |  8 +++++-
 .../persistence/jpa/dao/PGJPAJSONAnySearchDAO.java | 13 +++-------
 .../src/test/resources/domains/MasterContent.xml   |  2 +-
 .../core/persistence/jpa/inner/AnySearchTest.java  | 30 ++++++++++++++++++++++
 .../src/test/resources/domains/MasterContent.xml   |  2 +-
 6 files changed, 52 insertions(+), 22 deletions(-)

diff --git a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
index fd2fd22..8bb6722 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/panels/search/SearchClausePanel.java
@@ -22,7 +22,6 @@ import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.checkbox.boot
 import de.agilecoders.wicket.extensions.markup.html.bootstrap.form.checkbox.bootstraptoggle.BootstrapToggleConfig;
 import java.io.Serializable;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -34,6 +33,7 @@ import java.util.function.Consumer;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.FastDateFormat;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.syncope.client.console.commons.Constants;
 import org.apache.syncope.client.console.commons.SchemaUtils;
@@ -82,8 +82,6 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
 
     private static final long serialVersionUID = -527351923968737757L;
 
-    private static final ThreadLocal<SimpleDateFormat> DATE_FORMAT = ThreadLocal.withInitial(SimpleDateFormat::new);
-
     protected static final AttributeModifier PREVENT_DEFAULT_RETURN = AttributeModifier.replace(
             "onkeydown",
             Model.of("if (event.keyCode == 13) { event.preventDefault(); }"));
@@ -516,8 +514,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                 field.addOrReplace(value);
                 target.add(value);
             }
-        }
-        );
+        });
 
         AjaxDropDownChoicePanel<SearchClause.Type> type = new AjaxDropDownChoicePanel<>(
                 "type", "type", new PropertyModel<>(searchClause, "type"));
@@ -906,9 +903,12 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                 ((AjaxTextFieldPanel) value).setChoices(Arrays.asList("true", "false"));
 
                 break;
+
             case Date:
-                SimpleDateFormat df = DATE_FORMAT.get();
-                df.applyPattern(SyncopeConstants.DEFAULT_DATE_PATTERN);
+                FastDateFormat fdf = FastDateFormat.getInstance(
+                        plainSchemaTO.getConversionPattern() == null
+                        ? SyncopeConstants.DEFAULT_DATE_PATTERN
+                        : plainSchemaTO.getConversionPattern());
 
                 value = new AjaxDateTimeFieldPanel(
                         "value",
@@ -921,7 +921,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                     public Object getObject() {
                         String date = (String) super.getObject();
                         try {
-                            return date != null ? df.parse(date) : null;
+                            return date != null ? fdf.parse(date) : null;
                         } catch (ParseException ex) {
                             LOG.error("Date parse error {}", date, ex);
                         }
@@ -931,7 +931,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                     @Override
                     public void setObject(final Object object) {
                         if (object instanceof Date) {
-                            String valueDate = df.format(object);
+                            String valueDate = fdf.format(object);
                             super.setObject(valueDate);
                         } else {
                             super.setObject(object);
@@ -972,6 +972,7 @@ public class SearchClausePanel extends FieldPanel<SearchClause> {
                     });
                 }
                 break;
+
             case Long:
                 value = new AjaxSpinnerFieldPanel.Builder<Long>().enableOnChange().build(
                         "value",
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 fcb13f7..eb1a600 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
@@ -20,6 +20,7 @@ package org.apache.syncope.core.persistence.jpa.dao;
 
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
@@ -173,6 +174,11 @@ public class MyJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
                         append("')");
             } else {
                 String key = key(schema.getType());
+
+                String value = Optional.ofNullable(attrValue.getDateValue()).
+                        map(v -> String.valueOf(v.getTime())).
+                        orElse(cond.getExpression());
+
                 boolean lower = (schema.getType() == AttrSchemaType.String || schema.getType() == AttrSchemaType.Enum)
                         && (cond.getType() == AttrCond.Type.IEQ || cond.getType() == AttrCond.Type.ILIKE);
 
@@ -187,7 +193,7 @@ public class MyJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
                 appendOp(query, cond.getType(), not);
 
                 query.append(lower ? "LOWER(" : "").
-                        append("?").append(setParameter(parameters, cond.getExpression())).
+                        append("?").append(setParameter(parameters, value)).
                         append(lower ? ")" : "");
             }
         }
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 04ab0b6..cbaee83 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
@@ -18,7 +18,6 @@
  */
 package org.apache.syncope.core.persistence.jpa.dao;
 
-import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
@@ -60,7 +59,6 @@ import org.apache.syncope.core.persistence.api.entity.Entity;
 import org.apache.syncope.core.persistence.api.entity.PlainAttrValue;
 import org.apache.syncope.core.persistence.api.entity.PlainSchema;
 import org.apache.syncope.core.persistence.api.entity.Realm;
-import org.apache.syncope.core.provisioning.api.utils.FormatUtils;
 import org.apache.syncope.core.provisioning.api.utils.RealmUtils;
 
 public class PGJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
@@ -107,14 +105,9 @@ public class PGJPAJSONAnySearchDAO extends AbstractJPAJSONAnySearchDAO {
         } else {
             String key = key(schema.getType());
 
-            String value = cond.getExpression();
-            if (schema.getType() == AttrSchemaType.Date) {
-                try {
-                    value = String.valueOf(FormatUtils.parseDate(value).getTime());
-                } catch (ParseException e) {
-                    LOG.error("Could not parse {} as date", value, e);
-                }
-            }
+            String value = Optional.ofNullable(attrValue.getDateValue()).
+                    map(v -> String.valueOf(v.getTime())).
+                    orElse(cond.getExpression());
 
             boolean isStr = true;
             boolean lower;
diff --git a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
index b7f7b88..93da726 100644
--- a/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa-json/src/test/resources/domains/MasterContent.xml
@@ -279,7 +279,7 @@ under the License.
   <AnyObject id="9e1d130c-d6a3-48b1-98b3-182477ed0688" name="Epson Stylus Color"
              realm_id="0679e069-7355-4b20-bd11-a5a0a5453c7c" type_id="PRINTER"
              creator="admin" lastModifier="admin" 
-             creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
+             creationDate="2021-04-15 12:45:00" lastChangeDate="2010-10-20 11:00:00"/>
   
   <ARelationship id="11a0ec66-b59b-428a-af3d-f856950ff1c5" type_id="neighborhood"
                  left_anyObject_id="fc6dbc3a-6c07-4965-8781-921e7401a4a5"
diff --git a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
index 0cb0888..86c82e4 100644
--- a/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
+++ b/core/persistence-jpa/src/test/java/org/apache/syncope/core/persistence/jpa/inner/AnySearchTest.java
@@ -456,6 +456,36 @@ public class AnySearchTest extends AbstractTest {
     }
 
     @Test
+    public void searchByAnyCondDate() {
+        AnyCond creationDateCond = new AnyCond(AnyCond.Type.EQ);
+        creationDateCond.setSchema("creationDate");
+        creationDateCond.setExpression("2021-04-15 12:45:00");
+
+        SearchCond searchCondition = SearchCond.getLeaf(creationDateCond);
+        assertTrue(searchCondition.isValid());
+
+        List<AnyObject> anyObjects = searchDAO.search(searchCondition, AnyTypeKind.ANY_OBJECT);
+        assertNotNull(anyObjects);
+        assertEquals(1, anyObjects.size());
+        assertEquals("9e1d130c-d6a3-48b1-98b3-182477ed0688", anyObjects.iterator().next().getKey());
+    }
+
+    @Test
+    public void searchByAttrCondDate() {
+        AttrCond loginDateCond = new AttrCond(AnyCond.Type.LT);
+        loginDateCond.setSchema("loginDate");
+        loginDateCond.setExpression("2009-05-27");
+
+        SearchCond searchCondition = SearchCond.getLeaf(loginDateCond);
+        assertTrue(searchCondition.isValid());
+
+        List<User> users = searchDAO.search(searchCondition, AnyTypeKind.USER);
+        assertNotNull(users);
+        assertEquals(1, users.size());
+        assertEquals("1417acbe-cbf6-4277-9372-e75e04f97000", users.iterator().next().getKey());
+    }
+
+    @Test
     public void userOrderBy() {
         AnyCond usernameLeafCond = new AnyCond(AnyCond.Type.EQ);
         usernameLeafCond.setSchema("username");
diff --git a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
index 40a9121..749f87d 100644
--- a/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
+++ b/core/persistence-jpa/src/test/resources/domains/MasterContent.xml
@@ -203,7 +203,7 @@ under the License.
   <AnyObject id="9e1d130c-d6a3-48b1-98b3-182477ed0688" name="Epson Stylus Color"
              realm_id="0679e069-7355-4b20-bd11-a5a0a5453c7c" type_id="PRINTER"
              creator="admin" lastModifier="admin" 
-             creationDate="2010-10-20 11:00:00" lastChangeDate="2010-10-20 11:00:00"/>
+             creationDate="2021-04-15 12:45:00" lastChangeDate="2010-10-20 11:00:00"/>
   
   <ARelationship id="11a0ec66-b59b-428a-af3d-f856950ff1c5" type_id="neighborhood"
                  left_anyObject_id="fc6dbc3a-6c07-4965-8781-921e7401a4a5"