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"