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

Reply via email to