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));
+       }
 }

Reply via email to