From 13e55748a9a63c87a801ffb11a7a58b5fc944986 Mon Sep 17 00:00:00 2001 From: Ruben Dijkstra Date: Mon, 8 Dec 2014 21:29:28 +0100 Subject: [PATCH] Validate whether an enum type is supplied in EnumConversion --- .../mysema/query/support/EnumConversion.java | 21 +++++++++++-------- .../query/support/EnumConversionTest.java | 14 +++++++++++-- 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/querydsl-core/src/main/java/com/mysema/query/support/EnumConversion.java b/querydsl-core/src/main/java/com/mysema/query/support/EnumConversion.java index 27598cf8f..cd31a5077 100644 --- a/querydsl-core/src/main/java/com/mysema/query/support/EnumConversion.java +++ b/querydsl-core/src/main/java/com/mysema/query/support/EnumConversion.java @@ -16,6 +16,7 @@ package com.mysema.query.support; import java.util.Collections; import java.util.List; +import com.google.common.base.Preconditions; import com.mysema.query.types.Expression; import com.mysema.query.types.FactoryExpressionBase; import com.mysema.query.types.Visitor; @@ -34,16 +35,14 @@ public class EnumConversion extends FactoryExpressionBase { private final List> exprs; - private final Enum[] values; + private final T[] values; public EnumConversion(Expression expr) { super(expr.getType()); + Class type = getType(); + Preconditions.checkArgument(type.isEnum(), "%s is not an enum", type); exprs = Collections.>singletonList(expr); - try { - values = (Enum[]) expr.getType().getMethod("values").invoke(null); - } catch (Exception e) { - throw new RuntimeException(e.getMessage(), e); - } + values = type.getEnumConstants(); } @Override @@ -60,11 +59,15 @@ public class EnumConversion extends FactoryExpressionBase { public T newInstance(Object... args) { if (args[0] != null) { if (args[0] instanceof String) { - return (T)Enum.valueOf((Class)getType(), (String)args[0]); + @SuppressWarnings("unchecked") //The expression type is an enum + T rv = (T) Enum.valueOf(getType().asSubclass(Enum.class), (String)args[0]); + return rv; } else if (args[0] instanceof Number) { - return (T)values[((Number)args[0]).intValue()]; + return values[((Number)args[0]).intValue()]; } else { - return (T)args[0]; + @SuppressWarnings("unchecked") + T rv = (T)args[0]; + return rv; } } else { return null; diff --git a/querydsl-core/src/test/java/com/mysema/query/support/EnumConversionTest.java b/querydsl-core/src/test/java/com/mysema/query/support/EnumConversionTest.java index b82f5c00a..a42c09097 100644 --- a/querydsl-core/src/test/java/com/mysema/query/support/EnumConversionTest.java +++ b/querydsl-core/src/test/java/com/mysema/query/support/EnumConversionTest.java @@ -1,10 +1,12 @@ package com.mysema.query.support; import static org.junit.Assert.assertEquals; - -import org.junit.Test; +import static org.junit.Assert.fail; import com.mysema.query.types.path.EnumPath; +import com.mysema.query.types.path.StringPath; + +import org.junit.Test; public class EnumConversionTest { @@ -23,4 +25,12 @@ public class EnumConversionTest { EnumConversion conv = new EnumConversion(color); assertEquals(Color.RED, conv.newInstance(2)); } + + @Test(expected = IllegalArgumentException.class) + public void Illegal() { + StringPath string = new StringPath("path"); + EnumConversion conv = new EnumConversion(string); + fail("EnumConversion successfully created for a non-enum type"); + conv.newInstance(0); + } }