You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ab...@apache.org on 2019/06/26 12:19:32 UTC

[cayenne] branch STABLE-4.0 updated: CAY-2586 Char can't be materialized to EnumType in some cases

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

abulatski pushed a commit to branch STABLE-4.0
in repository https://gitbox.apache.org/repos/asf/cayenne.git


The following commit(s) were added to refs/heads/STABLE-4.0 by this push:
     new 24d82ad  CAY-2586 Char can't be materialized to EnumType in some cases
24d82ad is described below

commit 24d82ad4071b77fcb377927e0fcb013af05ea81e
Author: Arseni Bulatski <an...@gmail.com>
AuthorDate: Wed Jun 26 15:18:29 2019 +0300

    CAY-2586 Char can't be materialized to EnumType in some cases
---
 .../org/apache/cayenne/access/types/EnumType.java  | 10 ++++----
 .../java/org/apache/cayenne/access/EnumIT.java     | 17 +++++++++++++
 .../cayenne/testdo/enum_test/EnumEntity1.java      | 28 ++++++++++++++++++++++
 .../testdo/enum_test/auto/_EnumEntity1.java        | 28 ++++++++++++++++++++++
 cayenne-server/src/test/resources/enum.map.xml     |  9 ++++++-
 5 files changed, 86 insertions(+), 6 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java b/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
index 04182b2..c9b9ce9 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/types/EnumType.java
@@ -19,14 +19,14 @@
 
 package org.apache.cayenne.access.types;
 
-import org.apache.cayenne.ExtendedEnumeration;
-import org.apache.cayenne.dba.TypesMapping;
-
 import java.lang.reflect.Method;
 import java.sql.CallableStatement;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 
+import org.apache.cayenne.ExtendedEnumeration;
+import org.apache.cayenne.dba.TypesMapping;
+
 /**
  * An ExtendedType that handles an enum class. If Enum is mapped to a character column,
  * its name is used as persistent value; if it is mapped to a numeric column, its ordinal
@@ -87,7 +87,7 @@ public class EnumType<T extends Enum<T>> implements ExtendedType<T> {
             return (rs.wasNull() || index < 0) ? null : values[i];
         } else {
             String string = rs.getString(index);
-            return string != null ? Enum.valueOf(enumClass, string) : null;
+            return string != null ? Enum.valueOf(enumClass, string.trim()) : null;
         }
     }
 
@@ -98,7 +98,7 @@ public class EnumType<T extends Enum<T>> implements ExtendedType<T> {
             return (rs.wasNull() || index < 0) ? null : values[i];
         } else {
             String string = rs.getString(index);
-            return string != null ? Enum.valueOf(enumClass, string) : null;
+            return string != null ? Enum.valueOf(enumClass, string.trim()) : null;
         }
     }
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
index 035fc3a..96fa54a 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
@@ -18,21 +18,26 @@
  ****************************************************************/
 package org.apache.cayenne.access;
 
+import java.util.List;
+
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.query.CapsStrategy;
+import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.enum_test.Enum1;
 import org.apache.cayenne.testdo.enum_test.EnumEntity;
+import org.apache.cayenne.testdo.enum_test.EnumEntity1;
 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.assertNotNull;
 import static org.junit.Assert.assertSame;
 
@@ -85,4 +90,16 @@ public class EnumIT extends ServerCase {
         assertNotNull(e);
         assertSame(Enum1.one, e.getEnumAttribute());
     }
+
+    @Test
+    public void testEnumMappedToChar() {
+        EnumEntity1 enumEntity1 = context.newObject(EnumEntity1.class);
+        enumEntity1.setEnumAttribute(Enum1.two);
+        context.commitChanges();
+
+        List<EnumEntity1> enumEntity1s = ObjectSelect.query(EnumEntity1.class)
+                .select(context);
+        assertEquals(1, enumEntity1s.size());
+        assertEquals(Enum1.two, enumEntity1s.get(0).getEnumAttribute());
+    }
 }
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/EnumEntity1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/EnumEntity1.java
new file mode 100644
index 0000000..9a47345
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/EnumEntity1.java
@@ -0,0 +1,28 @@
+/*****************************************************************
+ *   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.
+ ****************************************************************/
+
+package org.apache.cayenne.testdo.enum_test;
+
+import org.apache.cayenne.testdo.enum_test.auto._EnumEntity1;
+
+public class EnumEntity1 extends _EnumEntity1 {
+
+    private static final long serialVersionUID = 1L; 
+
+}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity1.java b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity1.java
new file mode 100644
index 0000000..7c810fe
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/testdo/enum_test/auto/_EnumEntity1.java
@@ -0,0 +1,28 @@
+package org.apache.cayenne.testdo.enum_test.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.exp.Property;
+import org.apache.cayenne.testdo.enum_test.Enum1;
+
+/**
+ * Class _EnumEntity1 was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _EnumEntity1 extends CayenneDataObject {
+
+    private static final long serialVersionUID = 1L; 
+
+    public static final String ID_PK_COLUMN = "ID";
+
+    public static final Property<Enum1> ENUM_ATTRIBUTE = Property.create("enumAttribute", Enum1.class);
+
+    public void setEnumAttribute(Enum1 enumAttribute) {
+        writeProperty("enumAttribute", enumAttribute);
+    }
+    public Enum1 getEnumAttribute() {
+        return (Enum1)readProperty("enumAttribute");
+    }
+
+}
diff --git a/cayenne-server/src/test/resources/enum.map.xml b/cayenne-server/src/test/resources/enum.map.xml
index e4a2807..e498341 100644
--- a/cayenne-server/src/test/resources/enum.map.xml
+++ b/cayenne-server/src/test/resources/enum.map.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/9/modelMap"
 	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap http://cayenne.apache.org/schema/9/modelMap.xsd"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/9/modelMap https://cayenne.apache.org/schema/9/modelMap.xsd"
 	 project-version="9">
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.enum_test"/>
 	<property name="defaultSuperclass" value="org.apache.cayenne.CayenneDataObject"/>
@@ -12,7 +12,14 @@
 		<db-attribute name="ENUM_ATTRIBUTE" type="VARCHAR" length="250"/>
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 	</db-entity>
+	<db-entity name="ENUM_ENTITY1">
+		<db-attribute name="ENUM_ATTRIBUTE" type="CHAR" length="5"/>
+		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+	</db-entity>
 	<obj-entity name="EnumEntity" className="org.apache.cayenne.testdo.enum_test.EnumEntity" dbEntityName="ENUM_ENTITY">
 		<obj-attribute name="enumAttribute" type="org.apache.cayenne.testdo.enum_test.Enum1" db-attribute-path="ENUM_ATTRIBUTE"/>
 	</obj-entity>
+	<obj-entity name="EnumEntity1" className="org.apache.cayenne.testdo.enum_test.EnumEntity1" dbEntityName="ENUM_ENTITY1" superClassName="org.apache.cayenne.CayenneDataObject">
+		<obj-attribute name="enumAttribute" type="org.apache.cayenne.testdo.enum_test.Enum1" db-attribute-path="ENUM_ATTRIBUTE"/>
+	</obj-entity>
 </data-map>