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

Reply via email to