Fix for #151 - IllegalArgumentException using enum in filter - toBeanType() throws

This commit is contained in:
Rob Bygrave
2014-06-24 00:04:32 +12:00
parent df526b8f3c
commit 0b2ba2a82e
5 changed files with 84 additions and 12 deletions
@@ -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();
@@ -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);
}
@@ -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<Order> allOrders = Ebean.find(Order.class).findList();
Filter<Order> filter = Ebean.filter(Order.class);
List<Order> newOrders = filter.eq("status", Order.Status.NEW).filter(allOrders);
Assert.assertNotNull(newOrders);
}
}
@@ -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);
}
}
@@ -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
}