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 <[email protected]> Authored: Fri Jun 15 08:14:22 2012 +0200 Committer: svenmeier <[email protected]> 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")); }
