From 0b2ba2a82ec136a2f861e9ee238f475bb0cafa59 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 24 Jun 2014 00:04:32 +1200 Subject: [PATCH] Fix for #151 - IllegalArgumentException using enum in filter - toBeanType() throws --- .../server/type/ScalarTypeEnumStandard.java | 17 ++++---- .../type/ScalarTypeEnumWithMapping.java | 3 ++ .../com/avaje/ebean/TestFilterWithEnum.java | 27 +++++++++++++ .../server/type/TestEnumToBeanType.java | 39 +++++++++++++++++++ .../com/avaje/tests/model/basic/Customer.java | 10 +++-- 5 files changed, 84 insertions(+), 12 deletions(-) create mode 100644 src/test/java/com/avaje/ebean/TestFilterWithEnum.java create mode 100644 src/test/java/com/avaje/ebeaninternal/server/type/TestEnumToBeanType.java diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java index c9f53a53e..86bacbe31 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumStandard.java @@ -103,13 +103,12 @@ public class ScalarTypeEnumStandard { return ((Enum)beanValue).toString(); } - public Object toBeanType(Object dbValue) { - if (dbValue == null) { - return null; - } - - return Enum.valueOf(enumType, (String)dbValue); - } + public Object toBeanType(Object dbValue) { + if (dbValue == null || dbValue instanceof Enum) { + return dbValue; + } + return Enum.valueOf(enumType, (String) dbValue); + } } @@ -183,8 +182,8 @@ public class ScalarTypeEnumStandard { * Convert the db value to the Enum value. */ public Object toBeanType(Object dbValue) { - if (dbValue == null) { - return null; + if (dbValue == null || dbValue instanceof Enum) { + return dbValue; } int ordinal = ((Integer)dbValue).intValue(); diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java index 55fdecc84..dc97c9f56 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java +++ b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeEnumWithMapping.java @@ -72,6 +72,9 @@ public class ScalarTypeEnumWithMapping extends ScalarTypeEnumStandard.EnumBase i } public Object toBeanType(Object dbValue) { + if (dbValue == null || dbValue instanceof Enum) { + return dbValue; + } return beanDbMap.getBeanValue(dbValue); } diff --git a/src/test/java/com/avaje/ebean/TestFilterWithEnum.java b/src/test/java/com/avaje/ebean/TestFilterWithEnum.java new file mode 100644 index 000000000..1c6d72f2c --- /dev/null +++ b/src/test/java/com/avaje/ebean/TestFilterWithEnum.java @@ -0,0 +1,27 @@ +package com.avaje.ebean; + +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import com.avaje.tests.model.basic.Order; +import com.avaje.tests.model.basic.ResetBasicData; + +public class TestFilterWithEnum extends BaseTestCase { + + @Test + public void test() { + + ResetBasicData.reset(); + + List allOrders = Ebean.find(Order.class).findList(); + + Filter filter = Ebean.filter(Order.class); + List newOrders = filter.eq("status", Order.Status.NEW).filter(allOrders); + + Assert.assertNotNull(newOrders); + + } + +} diff --git a/src/test/java/com/avaje/ebeaninternal/server/type/TestEnumToBeanType.java b/src/test/java/com/avaje/ebeaninternal/server/type/TestEnumToBeanType.java new file mode 100644 index 000000000..2c3878fc1 --- /dev/null +++ b/src/test/java/com/avaje/ebeaninternal/server/type/TestEnumToBeanType.java @@ -0,0 +1,39 @@ +package com.avaje.ebeaninternal.server.type; + +import org.junit.Assert; +import org.junit.Test; + +import com.avaje.ebeaninternal.server.type.ScalarTypeEnumStandard.OrdinalEnum; +import com.avaje.ebeaninternal.server.type.ScalarTypeEnumStandard.StringEnum; +import com.avaje.tests.model.basic.Customer; +import com.avaje.tests.model.basic.Order; + +public class TestEnumToBeanType { + + @Test + public void test() { + + StringEnum stringEnum = new ScalarTypeEnumStandard.StringEnum(Order.Status.class); + + OrdinalEnum ordinalEnum = new ScalarTypeEnumStandard.OrdinalEnum(Order.Status.class); + + EnumToDbValueMap beanDbMap = EnumToDbValueMap.create(false); + beanDbMap.add(Customer.Status.ACTIVE, "A"); + beanDbMap.add(Customer.Status.NEW, "N"); + beanDbMap.add(Customer.Status.INACTIVE, "I"); + + ScalarTypeEnumWithMapping withMapping = new ScalarTypeEnumWithMapping(beanDbMap, Customer.Status.class, 1); + + + Object approved = stringEnum.toBeanType(Order.Status.APPROVED); + Assert.assertTrue(approved == Order.Status.APPROVED); + + approved = ordinalEnum.toBeanType(Order.Status.APPROVED); + Assert.assertTrue(approved == Order.Status.APPROVED); + + Object active = withMapping.toBeanType(Customer.Status.ACTIVE); + Assert.assertTrue(active == Customer.Status.ACTIVE); + + } + +} diff --git a/src/test/java/com/avaje/tests/model/basic/Customer.java b/src/test/java/com/avaje/tests/model/basic/Customer.java index 831f062ce..4106e2b0d 100644 --- a/src/test/java/com/avaje/tests/model/basic/Customer.java +++ b/src/test/java/com/avaje/tests/model/basic/Customer.java @@ -14,7 +14,7 @@ import javax.persistence.Transient; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import com.avaje.ebean.annotation.EnumMapping; +import com.avaje.ebean.annotation.EnumValue; import com.avaje.ebean.annotation.Where; /** @@ -28,12 +28,16 @@ public class Customer extends BasicDomain { private static final long serialVersionUID = 1L; /** - * EnumMapping is an Ebean specific mapping for enums. + * EnumValue is an Ebean specific mapping for enums. */ - @EnumMapping(nameValuePairs="NEW=N,ACTIVE=A,INACTIVE=I") public enum Status { + @EnumValue("N") NEW, + + @EnumValue("A") ACTIVE, + + @EnumValue("I") INACTIVE }