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>