This is an automated email from the ASF dual-hosted git repository.
ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git
The following commit(s) were added to refs/heads/master by this push:
new 27f9d35 CAY-2399 Convert string values to Enum in qualifiers
27f9d35 is described below
commit 27f9d3500c7d46123673b95e97581983cfc8bb52
Author: Nikita Timofeev <[email protected]>
AuthorDate: Wed Jun 2 16:59:31 2021 +0300
CAY-2399 Convert string values to Enum in qualifiers
---
RELEASE-NOTES.txt | 2 ++
.../org/apache/cayenne/exp/parser/ASTObjPath.java | 38 +++++++++++++++++++-
.../cayenne/exp/parser/ASTObjPathEnumIT.java | 41 ++++++++++++++++++++++
.../apache/cayenne/exp/parser/ASTObjPathTest.java | 15 ++++++++
4 files changed, 95 insertions(+), 1 deletion(-)
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index b14933a..d9f9399 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -13,6 +13,8 @@ Date:
----------------------------------
Changes/New Features:
+CAY-2399 Convert string values to Enum in qualifiers
+
Bug Fixes:
CAY-2092 Exception for query that uses pagination and sorting on to-many
diff --git
a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
index 4bd29dd..b118a91 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
@@ -24,10 +24,14 @@ import java.util.List;
import org.apache.cayenne.CayenneRuntimeException;
import org.apache.cayenne.DataObject;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.ObjectId;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.ObjAttribute;
import org.apache.cayenne.map.ObjEntity;
import org.apache.cayenne.reflect.PropertyUtils;
+import org.apache.cayenne.util.CayenneMapEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -99,7 +103,8 @@ public class ASTObjPath extends ASTPath {
if (!getPath().contains(ObjEntity.PATH_SEPARATOR)) {
try {
if (source instanceof DataObject) {
- ((DataObject)
source).writeProperty(getPath(), value);
+ DataObject dataObject = (DataObject)
source;
+ dataObject.writeProperty(getPath(),
dynamicCastValue(dataObject, value));
} else {
PropertyUtils.setProperty(source,
getPath(), value);
}
@@ -108,4 +113,35 @@ public class ASTObjPath extends ASTPath {
}
}
}
+
+ private Object dynamicCastValue(DataObject source, Object value) {
+ Class<?> javaClass = getDataTypeForObject(source);
+ if(javaClass == null) {
+ return value;
+ }
+
+ if(javaClass.isEnum()) {
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ Enum enumValue = Enum.valueOf((Class<Enum>) javaClass,
value.toString());
+ return enumValue;
+ }
+
+ return value;
+ }
+
+ private Class<?> getDataTypeForObject(DataObject source) {
+ ObjectContext context = source.getObjectContext();
+ ObjectId objectId = source.getObjectId();
+ if(context == null || objectId == null) {
+ return null;
+ }
+
+ ObjEntity entity =
context.getEntityResolver().getObjEntity(objectId.getEntityName());
+ CayenneMapEntry entry = evaluateEntityNode(entity);
+ if(!(entry instanceof ObjAttribute)) {
+ return null;
+ }
+
+ return ((ObjAttribute) entry).getJavaClass();
+ }
}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathEnumIT.java
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathEnumIT.java
new file mode 100644
index 0000000..02bf202
--- /dev/null
+++
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathEnumIT.java
@@ -0,0 +1,41 @@
+package org.apache.cayenne.exp.parser;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.testdo.enum_test.Enum1;
+import org.apache.cayenne.testdo.enum_test.EnumEntity;
+import org.apache.cayenne.unit.di.server.CayenneProjects;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+@UseServerRuntime(CayenneProjects.ENUM_PROJECT)
+public class ASTObjPathEnumIT extends ServerCase {
+
+ @Inject
+ private ObjectContext context;
+
+ @Test
+ public void testInjectEnumByName() {
+ ASTObjPath node = new ASTObjPath("enumAttribute");
+
+ EnumEntity enumEntity = context.newObject(EnumEntity.class);
+ assertNull(enumEntity.getEnumAttribute());
+
+ node.injectValue(enumEntity, "one");
+ assertEquals(Enum1.one, enumEntity.getEnumAttribute());
+ }
+
+ @Test(expected = IllegalArgumentException.class)
+ public void testInjectUnknownEnumByName() {
+ ASTObjPath node = new ASTObjPath("enumAttribute");
+
+ EnumEntity enumEntity = context.newObject(EnumEntity.class);
+ assertNull(enumEntity.getEnumAttribute());
+
+ node.injectValue(enumEntity, "four");
+ }
+}
diff --git
a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathTest.java
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathTest.java
index 44c908c..98eda89 100644
---
a/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathTest.java
+++
b/cayenne-server/src/test/java/org/apache/cayenne/exp/parser/ASTObjPathTest.java
@@ -19,9 +19,12 @@
package org.apache.cayenne.exp.parser;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
import java.io.IOException;
+import org.apache.cayenne.testdo.enum_test.Enum1;
+import org.apache.cayenne.testdo.enum_test.EnumEntity;
import org.apache.cayenne.testdo.testmap.Artist;
import org.apache.cayenne.unit.util.TstBean;
import org.junit.Test;
@@ -75,4 +78,16 @@ public class ASTObjPathTest {
b2.setProperty2(-3);
assertEquals(-3, node.evaluate(b2));
}
+
+ @Test
+ public void testInjectDataObject() {
+ ASTObjPath node = new ASTObjPath("artistName");
+
+ Artist artist = new Artist();
+ assertNull(artist.getArtistName());
+
+ node.injectValue(artist, "test");
+ assertEquals("test", artist.getArtistName());
+ }
+
}