You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2012/04/04 09:36:11 UTC

[1/2] git commit: WICKET-4486 Give StringValue toEnum methods

Updated Branches:
  refs/heads/master d7b32ce77 -> 0d87d94a6


WICKET-4486 Give StringValue toEnum methods


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/0d87d94a
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/0d87d94a
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/0d87d94a

Branch: refs/heads/master
Commit: 0d87d94a6084cb7c877921c786ef5270db8a8786
Parents: 6d708a1
Author: Martin Tzvetanov Grigorov <mg...@apache.org>
Authored: Wed Apr 4 09:35:06 2012 +0200
Committer: Martin Tzvetanov Grigorov <mg...@apache.org>
Committed: Wed Apr 4 09:35:06 2012 +0200

----------------------------------------------------------------------
 .../org/apache/wicket/util/string/StringValue.java |   72 +++++++++++++++
 .../org/apache/wicket/util/string/Strings.java     |   24 +++++
 .../apache/wicket/util/string/StringValueTest.java |   31 ++++++-
 3 files changed, 126 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/0d87d94a/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 366c52f..e8ed26b 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
@@ -23,6 +23,7 @@ import java.text.ParseException;
 import java.util.Locale;
 
 import org.apache.wicket.util.io.IClusterable;
+import org.apache.wicket.util.lang.Args;
 import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.time.Duration;
 import org.apache.wicket.util.time.Time;
@@ -848,6 +849,77 @@ public class StringValue implements IClusterable
 	}
 
 	/**
+	 * Convert this text to an enum.
+	 *
+	 * @param eClass
+	 *            enum type
+	 * @return The value as an enum
+	 * @throws StringValueConversionException
+	 */
+	public final <T extends Enum<T>> T toEnum(Class<T> eClass)
+		throws StringValueConversionException
+	{
+		return Strings.toEnum(text, eClass);
+	}
+
+	/**
+	 * Convert this text to an enum.
+	 *
+	 * @param defaultValue
+	 *            This will be returned if there is an error converting the value
+	 * @return The value as an enum
+	 */
+	public final <T extends Enum<T>> T toEnum(final T defaultValue)
+	{
+		Args.notNull(defaultValue, "defaultValue");
+		return toEnum((Class<T>)defaultValue.getClass(), defaultValue);
+	}
+
+	/**
+	 * Convert this text to an enum.
+	 *
+	 * @param eClass
+	 *            enum type
+	 * @param defaultValue
+	 *            This will be returned if there is an error converting the value
+	 * @return The value as an enum
+	 */
+	public final <T extends Enum<T>> T toEnum(Class<T> eClass, final T defaultValue)
+	{
+		if (text != null)
+		{
+			try
+			{
+				return toEnum(eClass);
+			}
+			catch (StringValueConversionException x)
+			{
+				if (LOG.isDebugEnabled())
+				{
+					LOG.debug(String.format("An error occurred while converting '%s' to a %s: %s",
+						text, eClass, x.getMessage()), x);
+				}
+			}
+		}
+		return defaultValue;
+	}
+
+	/**
+	 * Convert to enum, returning null if text is null or empty.
+	 *
+	 * @param eClass
+	 *            enum type
+	 *
+	 * @return converted
+	 * @throws StringValueConversionException
+	 */
+	public final <T extends Enum<T>> T toOptionalEnum(Class<T> eClass)
+		throws StringValueConversionException
+	{
+		return Strings.isEmpty(text) ? null : toEnum(eClass);
+	}
+
+	/**
 	 * Returns whether the text is null.
 	 * 
 	 * @return <code>true</code> if the text is <code>null</code>, <code>false</code> otherwise.

http://git-wip-us.apache.org/repos/asf/wicket/blob/0d87d94a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
----------------------------------------------------------------------
diff --git a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
index 5bf85ee..25d70db 100755
--- a/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
+++ b/wicket-util/src/main/java/org/apache/wicket/util/string/Strings.java
@@ -1515,4 +1515,28 @@ public final class Strings
 		}
 		return hex.toString();
 	}
+
+
+	/**
+	 * Return this value as en enum value.
+	 *
+	 * @param enumClass
+	 *            the enum type
+	 * @return an enum value
+	 */
+	public static <T extends Enum<T>> T toEnum(final CharSequence value, final Class<T> enumClass)
+	{
+		Args.notNull(enumClass, "enumClass");
+		Args.notNull(value, "value");
+
+		try
+		{
+			return Enum.valueOf(enumClass, value.toString());
+		}
+		catch (Exception e)
+		{
+			throw new StringValueConversionException(
+					String.format("Cannot convert '{}' to enum constant of type '{}'.", value, enumClass),					e);
+		}
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/0d87d94a/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 9e7a8bd..ef32462 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,7 +80,6 @@ public class StringValueTest extends Assert
 
 		assertEquals("unknown", sv.toString("def"));
 	}
-	
 	@Test
 	public void toType()
 	{
@@ -108,5 +107,35 @@ public class StringValueTest extends Assert
 		sv = new StringValue("");
 		assertNull(sv.toOptional(String.class));
 		assertNull(sv.toOptional(String[].class));
+    }
+
+	static enum TestEnum {
+		FOO, BAR, BAZ
+	}
+
+	@Test
+	public void enums() throws Exception
+	{
+		assertEquals(TestEnum.FOO, new StringValue("FOO").toEnum(TestEnum.class));
+		assertEquals(TestEnum.FOO, new StringValue("FOO").toEnum(TestEnum.BAR));
+		assertEquals(TestEnum.FOO, new StringValue("FOO").toEnum(TestEnum.class, TestEnum.BAR));
+
+		assertEquals(TestEnum.BAR, new StringValue(null).toEnum(TestEnum.BAR));
+		assertEquals(TestEnum.BAZ, new StringValue("killer rabbit").toEnum(TestEnum.BAZ));
+		assertEquals(TestEnum.BAZ,
+			new StringValue("killer rabbit").toEnum(TestEnum.class, TestEnum.BAZ));
+		assertNull(new StringValue(null).toOptionalEnum(TestEnum.class));
+	}
+
+	@Test(expected = StringValueConversionException.class)
+	public void failingEnum() throws Exception
+	{
+		new StringValue("camelot").toEnum(TestEnum.class);
+	}
+
+	@Test(expected = StringValueConversionException.class)
+	public void failingEnum2() throws Exception
+	{
+		new StringValue("camelot").toOptionalEnum(TestEnum.class);
 	}
 }