WICKET-4356 StringValueConversionException should not be thrown when requesting a conversion on StringValue with a default value
Improve the signature of to(Class) so the user don't need to cast. Add toOptional(Class). Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/2f57d707 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/2f57d707 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/2f57d707 Branch: refs/heads/sandbox/feedback Commit: 2f57d707bf86f512d16a3c1c4e2d34a3e544b915 Parents: 818620b Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Wed Feb 1 10:37:37 2012 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Wed Feb 1 10:37:37 2012 +0200 ---------------------------------------------------------------------- .../org/apache/wicket/util/string/StringValue.java | 31 ++++++++++---- .../apache/wicket/util/string/StringValueTest.java | 29 ++++++++++++++ 2 files changed, 51 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/2f57d707/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java ---------------------------------------------------------------------- diff --git a/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java b/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java index bbad52b..c483e8e 100755 --- a/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/string/StringValue.java @@ -308,46 +308,46 @@ public class StringValue implements IClusterable * @return The converted value * @throws StringValueConversionException */ - public final Object to(final Class<?> type) throws StringValueConversionException + public final <T> T to(final Class<T> type) throws StringValueConversionException { if (type == String.class) { - return toString(); + return (T) toString(); } if ((type == Integer.TYPE) || (type == Integer.class)) { - return toInteger(); + return (T) toInteger(); } if ((type == Long.TYPE) || (type == Long.class)) { - return toLongObject(); + return (T) toLongObject(); } if ((type == Boolean.TYPE) || (type == Boolean.class)) { - return toBooleanObject(); + return (T) toBooleanObject(); } if ((type == Double.TYPE) || (type == Double.class)) { - return toDoubleObject(); + return (T) toDoubleObject(); } if ((type == Character.TYPE) || (type == Character.class)) { - return toCharacter(); + return (T) toCharacter(); } if (type == Time.class) { - return toTime(); + return (T) toTime(); } if (type == Duration.class) { - return toDuration(); + return (T) toDuration(); } throw new StringValueConversionException("Cannot convert '" + toString() + "'to type " + @@ -355,6 +355,19 @@ public class StringValue implements IClusterable } /** + * Converts this StringValue to a given type or {@code null} if the value is empty. + * + * @param type + * The type to convert to + * @return The converted value + * @throws StringValueConversionException + */ + public final <T> T toOptional(final Class<T> type) throws StringValueConversionException + { + return Strings.isEmpty(text) ? null : to(type); + } + + /** * Convert this text to a boolean. * * @return This string value as a boolean http://git-wip-us.apache.org/repos/asf/wicket/blob/2f57d707/wicket-util/src/test/java/org/apache/wicket/util/string/StringValueTest.java ---------------------------------------------------------------------- diff --git a/wicket-util/src/test/java/org/apache/wicket/util/string/StringValueTest.java b/wicket-util/src/test/java/org/apache/wicket/util/string/StringValueTest.java index 0b3d4f5..9e7a8bd 100644 --- a/wicket-util/src/test/java/org/apache/wicket/util/string/StringValueTest.java +++ b/wicket-util/src/test/java/org/apache/wicket/util/string/StringValueTest.java @@ -80,4 +80,33 @@ public class StringValueTest extends Assert assertEquals("unknown", sv.toString("def")); } + + @Test + public void toType() + { + StringValue sv = new StringValue("4"); + + assertEquals(Long.valueOf(4), sv.to(Long.class)); + assertEquals(Integer.valueOf(4), sv.to(Integer.class)); + assertEquals(Double.valueOf(4), sv.to(Double.class)); + assertEquals(Character.valueOf('4'), sv.to(Character.class)); + assertEquals("4", sv.to(String.class)); + + try + { + sv.to(String[].class); + fail("Should not be able to convert to unsupported type!"); + } catch (StringValueConversionException svcx) + { + assertTrue(true); + } + + sv = new StringValue(null); + assertNull(sv.toOptional(String.class)); + assertNull(sv.toOptional(String[].class)); + + sv = new StringValue(""); + assertNull(sv.toOptional(String.class)); + assertNull(sv.toOptional(String[].class)); + } }
