You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2012/06/15 08:15:46 UTC

git commit: WICKET-4608 Vars in ValidationErrors should be properly converted

Updated Branches:
  refs/heads/master 52b5bea8b -> c5d26ae9f


WICKET-4608 Vars in ValidationErrors should be properly converted


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

Branch: refs/heads/master
Commit: c5d26ae9f2f6af7b86c0fb0599e3e3333f2eae3c
Parents: 52b5bea
Author: svenmeier <sv...@apache.org>
Authored: Fri Jun 15 08:14:22 2012 +0200
Committer: svenmeier <sv...@apache.org>
Committed: Fri Jun 15 08:14:22 2012 +0200

----------------------------------------------------------------------
 .../wicket/markup/html/form/FormComponent.java     |   51 +++++++++++----
 .../wicket/validation/IErrorMessageSource.java     |   27 +-------
 .../apache/wicket/validation/ValidationError.java  |   11 +--
 .../html/form/LocalizedErrorMessageTest.java       |   42 ++++++++-----
 .../markup/html/form/LocalizedMessagePage.html     |    2 +-
 .../markup/html/form/LocalizedMessagePage.java     |   10 ++-
 6 files changed, 79 insertions(+), 64 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/c5d26ae9/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
index a0d3cf3..e62cbd9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
+++ b/wicket-core/src/main/java/org/apache/wicket/markup/html/form/FormComponent.java
@@ -36,6 +36,7 @@ import org.apache.wicket.IConverterLocator;
 import org.apache.wicket.Localizer;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.behavior.Behavior;
+import org.apache.wicket.core.util.lang.WicketObjects;
 import org.apache.wicket.markup.ComponentTag;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.IPropertyReflectionAwareModel;
@@ -43,11 +44,10 @@ import org.apache.wicket.model.Model;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
 import org.apache.wicket.util.lang.Args;
-import org.apache.wicket.core.util.lang.WicketObjects;
 import org.apache.wicket.util.string.StringList;
 import org.apache.wicket.util.string.StringValue;
 import org.apache.wicket.util.string.Strings;
-import org.apache.wicket.util.string.interpolator.MapVariableInterpolator;
+import org.apache.wicket.util.string.interpolator.VariableInterpolator;
 import org.apache.wicket.util.visit.IVisit;
 import org.apache.wicket.util.visit.IVisitFilter;
 import org.apache.wicket.util.visit.IVisitor;
@@ -116,7 +116,7 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer
 		 * @see org.apache.wicket.validation.IErrorMessageSource#getMessage(java.lang.String)
 		 */
 		@Override
-		public String getMessage(String key)
+		public String getMessage(String key, Map<String, Object> vars)
 		{
 			final FormComponent<T> formComponent = FormComponent.this;
 
@@ -131,12 +131,12 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer
 			String prefix = formComponent.getValidatorKeyPrefix();
 			String message = null;
 
-			// first try the full form of key [form-component-id].[key]
+			// first try the full form of key [form-component-id].[prefix].[key]
 			String resource = getId() + "." + prefix(prefix, key);
 			message = getString(localizer, resource, formComponent);
 
 			// if not found, try a more general form (without prefix)
-			// [form-component-id].[prefix].[key]
+			// [form-component-id].[key]
 			if (Strings.isEmpty(message) && Strings.isEmpty(prefix))
 			{
 				resource = getId() + "." + key;
@@ -163,6 +163,10 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer
 			{
 				message = null;
 			}
+			else
+			{
+				message = substitute(message, addDefaultVars(vars));
+			}
 			return message;
 		}
 
@@ -195,17 +199,38 @@ public abstract class FormComponent<T> extends LabeledWebMarkupContainer
 			return localizer.getString(key, component, "");
 		}
 
-		/**
-		 * @see org.apache.wicket.validation.IErrorMessageSource#substitute(java.lang.String,
-		 *      java.util.Map)
-		 */
-		@Override
-		public String substitute(String string, Map<String, Object> vars)
+		private String substitute(String string, final Map<String, Object> vars)
 			throws IllegalStateException
 		{
-			return new MapVariableInterpolator(string, addDefaultVars(vars), Application.get()
+			return new VariableInterpolator(string, Application.get()
 				.getResourceSettings()
-				.getThrowExceptionOnMissingResource()).toString();
+				.getThrowExceptionOnMissingResource())
+			{
+				private static final long serialVersionUID = 1L;
+
+				@SuppressWarnings({ "rawtypes", "unchecked" })
+				@Override
+				protected String getValue(String variableName)
+				{
+					Object value = vars.get(variableName);
+					if (value == null)
+					{
+						return null;
+					}
+					else
+					{
+						IConverter converter = getConverter(value.getClass());
+						if (converter == null)
+						{
+							return Strings.toString(value);
+						}
+						else
+						{
+							return converter.convertToString(value, getLocale());
+						}
+					}
+				}
+			}.toString();
 		}
 
 		/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/c5d26ae9/wicket-core/src/main/java/org/apache/wicket/validation/IErrorMessageSource.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/validation/IErrorMessageSource.java b/wicket-core/src/main/java/org/apache/wicket/validation/IErrorMessageSource.java
index fec571e..da67311 100644
--- a/wicket-core/src/main/java/org/apache/wicket/validation/IErrorMessageSource.java
+++ b/wicket-core/src/main/java/org/apache/wicket/validation/IErrorMessageSource.java
@@ -18,7 +18,6 @@ package org.apache.wicket.validation;
 
 import java.util.Map;
 
-
 /**
  * Interface representing a message source that stores messages by key and can perform variable
  * substitution.
@@ -33,27 +32,9 @@ public interface IErrorMessageSource
 	 * 
 	 * @param key
 	 *            a message key
-	 * @return message or null if not found
-	 */
-	String getMessage(String key);
-
-	/**
-	 * Performs variable substitution on the given <code>String</code> using variables declared in
-	 * the <code>vars</code> <code>Map</code>.
-	 * <p>
-	 * Variables in the message are identified using <code>${varname}</code> syntax.
-	 * 
-	 * @param string
-	 *            a <code>String</code> to be altered
 	 * @param vars
-	 *            a <code>Map</code> of variables to process
-	 * 
-	 * @throws IllegalStateException
-	 *             if a variable defined in the given <code>String</code> cannot be found in the
-	 *             <code>vars</code> <code>Map</code>
-	 * 
-	 * @return the given <code>String</code> with the variables substituted
+	 *            variables to substitute
+	 * @return message or null if not found
 	 */
-	// FIXME 2.0 this doesnt need to be in this interface, its just a straight var substitution
-	String substitute(String string, Map<String, Object> vars) throws IllegalStateException;
-}
+	String getMessage(String key, Map<String, Object> vars);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/c5d26ae9/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java b/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java
index f9a2e8c..61e82e9 100644
--- a/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java
+++ b/wicket-core/src/main/java/org/apache/wicket/validation/ValidationError.java
@@ -237,6 +237,9 @@ public final class ValidationError implements IValidationError
 	@Override
 	public final Serializable getErrorMessage(IErrorMessageSource messageSource)
 	{
+
+		final Map<String, Object> p = (vars != null) ? vars : EMPTY_VARS;
+
 		String errorMessage = null;
 
 		if (keys != null)
@@ -244,7 +247,7 @@ public final class ValidationError implements IValidationError
 			// try any message keys ...
 			for (String key : keys)
 			{
-				errorMessage = messageSource.getMessage(key);
+				errorMessage = messageSource.getMessage(key, vars);
 				if (errorMessage != null)
 				{
 					break;
@@ -258,12 +261,6 @@ public final class ValidationError implements IValidationError
 			errorMessage = message;
 		}
 
-		// if a message was found perform variable substitution
-		if (errorMessage != null)
-		{
-			final Map<String, Object> p = (vars != null) ? vars : EMPTY_VARS;
-			errorMessage = messageSource.substitute(errorMessage, p);
-		}
 		return new ValidationErrorFeedback(this, errorMessage);
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/c5d26ae9/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedErrorMessageTest.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedErrorMessageTest.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedErrorMessageTest.java
index 17c128e..b86dfd1 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedErrorMessageTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedErrorMessageTest.java
@@ -38,12 +38,10 @@ public class LocalizedErrorMessageTest extends WicketTestCase
 		LocalizedMessagePage page = new LocalizedMessagePage();
 		tester.startPage(page);
 
-		tester.getRequest()
-			.getPostParameters()
-			.setParameterValue(page.integerField.getInputName(), "foo");
+		tester.getRequest().getPostParameters().setParameterValue(page.field.getInputName(), "foo");
 		tester.submitForm(page.form);
 
-		tester.assertErrorMessages("'Number' moet een geheel getal zijn. ");
+		tester.assertErrorMessages("'Number' moet een getal zijn. ");
 		tester.getSession().setLocale(new Locale("us"));
 
 		tester.clearFeedbackMessages();
@@ -51,13 +49,29 @@ public class LocalizedErrorMessageTest extends WicketTestCase
 		page = new LocalizedMessagePage();
 		tester.startPage(page);
 
-		tester.getRequest()
-			.getPostParameters()
-			.setParameterValue(page.integerField.getInputName(), "foo");
+		tester.getRequest().getPostParameters().setParameterValue(page.field.getInputName(), "foo");
 
 		tester.submitForm(page.form);
 
-		tester.assertErrorMessages("'Number' is not a valid Integer.");
+		tester.assertErrorMessages("'Number' is not a valid Double.");
+	}
+
+	/**
+	 * WICKET-4608 vars should be properly converted
+	 */
+	@Test
+	public void testConvertedVars()
+	{
+		tester.getSession().setLocale(new Locale("de"));
+
+		LocalizedMessagePage page = new LocalizedMessagePage();
+		tester.startPage(page);
+
+		tester.getRequest().getPostParameters().setParameterValue(page.field.getInputName(), "20");
+		tester.submitForm(page.form);
+
+		// decimal separator is ',' in German
+		tester.assertErrorMessages("Number muss zwischen 0,5 und 1,5 liegen.");
 	}
 
 	/**
@@ -75,13 +89,11 @@ public class LocalizedErrorMessageTest extends WicketTestCase
 		LocalizedMessagePage page = new LocalizedMessagePage();
 		tester.startPage(page);
 
-		tester.getRequest()
-			.getPostParameters()
-			.setParameterValue(page.integerField.getInputName(), "foo");
+		tester.getRequest().getPostParameters().setParameterValue(page.field.getInputName(), "foo");
 
 		tester.submitForm(page.form);
 
-		tester.assertErrorMessages("'Number' ist kein g\u00FCltiger Wert f\u00FCr 'Integer'.");
+		tester.assertErrorMessages("'Number' ist kein g\u00FCltiger Wert f\u00FCr 'Double'.");
 		tester.getSession().setLocale(new Locale("pl"));
 
 		tester.clearFeedbackMessages();
@@ -89,11 +101,9 @@ public class LocalizedErrorMessageTest extends WicketTestCase
 		page = new LocalizedMessagePage();
 		tester.startPage(page);
 
-		tester.getRequest()
-			.getPostParameters()
-			.setParameterValue(page.integerField.getInputName(), "foo");
+		tester.getRequest().getPostParameters().setParameterValue(page.field.getInputName(), "foo");
 
 		tester.submitForm(page.form);
-		tester.assertErrorMessages("'Number' nie jest w\u0142a\u015Bciwym Integer.");
+		tester.assertErrorMessages("'Number' nie jest w\u0142a\u015Bciwym Double.");
 	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/c5d26ae9/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.html b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.html
index 4b70fc5..3e4d69c 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.html
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.html
@@ -5,7 +5,7 @@
 <body>
 	<form wicket:id="form">
 		<div wicket:id="feedback"></div>
-		<input type="text" wicket:id="integer" />
+		<input type="text" wicket:id="field" />
 		<input type="submit" value="submit" />
 	</form>
 </body>

http://git-wip-us.apache.org/repos/asf/wicket/blob/c5d26ae9/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.java b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.java
index 7c2855a..3fa2c55 100644
--- a/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.java
+++ b/wicket-core/src/test/java/org/apache/wicket/markup/html/form/LocalizedMessagePage.java
@@ -19,6 +19,7 @@ package org.apache.wicket.markup.html.form;
 import org.apache.wicket.markup.html.WebPage;
 import org.apache.wicket.markup.html.panel.FeedbackPanel;
 import org.apache.wicket.model.Model;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * @author dashorst
@@ -31,7 +32,7 @@ public class LocalizedMessagePage extends WebPage
 	/** */
 	public Form<Void> form;
 	/** */
-	public TextField<Integer> integerField;
+	public TextField<Double> field;
 	/** */
 	public FeedbackPanel feedback;
 
@@ -42,9 +43,10 @@ public class LocalizedMessagePage extends WebPage
 	{
 		add(form = new Form<Void>("form"));
 
-		integerField = new TextField<Integer>("integer", Integer.class);
-		integerField.setLabel(Model.of("Number"));
-		form.add(integerField);
+		field = new TextField<Double>("field", Double.class);
+		field.setLabel(Model.of("Number"));
+		field.add(new RangeValidator<Double>(0.5d, 1.5d));
+		form.add(field);
 
 		form.add(feedback = new FeedbackPanel("feedback"));
 	}