Updated Branches: refs/heads/master af1cf1b29 -> a99ab59b3
WICKET-3753 moved converter handling from PropertyVariableInterpolator into Localizer, thus allowing Component relative converted lookup and interpolation without converters (needed by StringResourceModel for resources keys) Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a99ab59b Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a99ab59b Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a99ab59b Branch: refs/heads/master Commit: a99ab59b3169e2d0b1f8410f23e2e4bfb4239334 Parents: af1cf1b Author: svenmeier <[email protected]> Authored: Thu Jul 19 01:08:58 2012 +0200 Committer: svenmeier <[email protected]> Committed: Thu Jul 19 01:08:58 2012 +0200 ---------------------------------------------------------------------- .../src/main/java/org/apache/wicket/Localizer.java | 24 +++++- .../interpolator/PropertyVariableInterpolator.java | 74 ++++----------- .../apache/wicket/model/StringResourceModel.java | 10 +- .../test/java/org/apache/wicket/LocalizerTest.java | 16 ++- .../StringResourceModelTest$TestPage.properties | 4 +- .../wicket/model/StringResourceModelTest.java | 14 +++ .../wicket/resource/DummyApplication.properties | 2 +- .../PropertyVariableInterpolatorTest.java | 6 +- .../string/interpolator/VariableInterpolator.java | 6 + 9 files changed, 82 insertions(+), 74 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/main/java/org/apache/wicket/Localizer.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/Localizer.java b/wicket-core/src/main/java/org/apache/wicket/Localizer.java index b6d9bf2..0e33c36 100644 --- a/wicket-core/src/main/java/org/apache/wicket/Localizer.java +++ b/wicket-core/src/main/java/org/apache/wicket/Localizer.java @@ -25,13 +25,14 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicLong; +import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator; import org.apache.wicket.markup.repeater.AbstractRepeater; import org.apache.wicket.model.IModel; import org.apache.wicket.resource.loader.IStringResourceLoader; import org.apache.wicket.settings.IResourceSettings; +import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.util.lang.Generics; import org.apache.wicket.util.string.AppendingStringBuffer; -import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -533,7 +534,26 @@ public class Localizer { if ((string != null) && (model != null)) { - return PropertyVariableInterpolator.interpolate(string, model.getObject()); + return new PropertyVariableInterpolator(string, model.getObject()) + { + @Override + protected String toString(Object value) + { + IConverter converter; + if (component == null) + { + converter = Application.get() + .getConverterLocator() + .getConverter(value.getClass()); + } + else + { + converter = component.getConverter(value.getClass()); + } + + return converter.convertToString(value, Session.get().getLocale()); + } + }.toString(); } return string; } http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/main/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolator.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolator.java b/wicket-core/src/main/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolator.java index 0b74d77..40d8461 100644 --- a/wicket-core/src/main/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolator.java +++ b/wicket-core/src/main/java/org/apache/wicket/core/util/string/interpolator/PropertyVariableInterpolator.java @@ -16,11 +16,8 @@ */ package org.apache.wicket.core.util.string.interpolator; -import org.apache.wicket.Application; -import org.apache.wicket.IConverterLocator; -import org.apache.wicket.Session; import org.apache.wicket.core.util.lang.PropertyResolver; -import org.apache.wicket.util.convert.IConverter; +import org.apache.wicket.util.string.Strings; import org.apache.wicket.util.string.interpolator.VariableInterpolator; /** @@ -38,13 +35,11 @@ import org.apache.wicket.util.string.interpolator.VariableInterpolator; * "$" is the escape char. Thus "$${text}" can be used to escape it (ignore interpretation). If * '$3.24' is needed then '$$${amount}' should be used. The first $ sign escapes the second, and the * third is used to interpolate the variable. - * + * * @author Jonathan Locke * @since 1.2.6 */ -public final class PropertyVariableInterpolator extends VariableInterpolator - implements - IConverterLocator +public class PropertyVariableInterpolator extends VariableInterpolator { private static final long serialVersionUID = 1L; @@ -52,48 +47,19 @@ public final class PropertyVariableInterpolator extends VariableInterpolator private final Object model; /** - * Private constructor to force use of static interpolate method. - * + * Constructor. + * * @param string * a <code>String</code> to interpolate into * @param model * the model to apply property expressions to */ - private PropertyVariableInterpolator(final String string, final Object model) + public PropertyVariableInterpolator(final String string, final Object model) { super(string); this.model = model; } - /** - * Interpolates the given <code>String</code>, substituting values for property expressions. - * - * @param string - * a <code>String</code> containing property expressions like <code>${xyz}</code> - * @param object - * the <code>Object</code> to reflect on - * @return the interpolated <code>String</code> - */ - public static String interpolate(final String string, final Object object) - { - // If there's any reason to go to the expense of property expressions - if (string.contains("${")) - { - // Do property expression interpolation - return new PropertyVariableInterpolator(string, object).toString(); - } - - // Return simple string - return string; - } - - /** - * Retrieves a value for a variable name during interpolation. - * - * @param variableName - * the variable name - * @return the value - */ @Override protected String getValue(final String variableName) { @@ -101,29 +67,23 @@ public final class PropertyVariableInterpolator extends VariableInterpolator if (value != null) { - final IConverter converter = getConverter(value.getClass()); - if (converter != null) - { - return converter.convertToString(value, Session.get().getLocale()); - } - else - { - return value.toString(); - } + return toString(value); } return null; } /** - * {@inheritDoc} + * Convert the given value to a string for interpolation. + * <p> + * This default implementation delegates to {@link Strings#toString(Object)}. + * + * @param value + * the value, never {@code null} + * + * @return string representation */ - @Override - public <C> IConverter<C> getConverter(Class<C> type) + protected String toString(Object value) { - if (Application.exists()) - { - return Application.get().getConverterLocator().getConverter(type); - } - return null; + return Strings.toString(value); } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/main/java/org/apache/wicket/model/StringResourceModel.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/model/StringResourceModel.java b/wicket-core/src/main/java/org/apache/wicket/model/StringResourceModel.java index 5a36032..aa11126 100644 --- a/wicket-core/src/main/java/org/apache/wicket/model/StringResourceModel.java +++ b/wicket-core/src/main/java/org/apache/wicket/model/StringResourceModel.java @@ -24,9 +24,9 @@ import org.apache.wicket.Application; import org.apache.wicket.Component; import org.apache.wicket.Localizer; import org.apache.wicket.Session; +import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator; import org.apache.wicket.resource.loader.ComponentStringResourceLoader; import org.apache.wicket.util.string.Strings; -import org.apache.wicket.core.util.string.interpolator.PropertyVariableInterpolator; /** @@ -402,7 +402,7 @@ public class StringResourceModel extends LoadableDetachableModel<String> return getString(component); } - private String getString(Component component) + private String getString(final Component component) { final Localizer localizer = getLocalizer(); @@ -451,8 +451,8 @@ public class StringResourceModel extends LoadableDetachableModel<String> } else if (model != null && parameters[i] instanceof String) { - realParams[i] = PropertyVariableInterpolator.interpolate( - (String)parameters[i], model.getObject()); + realParams[i] = localizer.substitutePropertyExpressions(component, + (String)parameters[i], model); } else { @@ -568,7 +568,7 @@ public class StringResourceModel extends LoadableDetachableModel<String> { if (model != null) { - return PropertyVariableInterpolator.interpolate(resourceKey, model.getObject()); + return new PropertyVariableInterpolator(resourceKey, model.getObject()).toString(); } else { http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/test/java/org/apache/wicket/LocalizerTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/LocalizerTest.java b/wicket-core/src/test/java/org/apache/wicket/LocalizerTest.java index de8edce..16eec28 100644 --- a/wicket-core/src/test/java/org/apache/wicket/LocalizerTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/LocalizerTest.java @@ -167,10 +167,13 @@ public class LocalizerTest extends Assert @Test public void testGetStringPropertySubstitution() { + Session.get().setLocale(Locale.GERMAN); + ValueMap vm = new ValueMap(); vm.put("user", "John Doe"); + vm.put("rating", 4.5); IModel<ValueMap> model = new Model<ValueMap>(vm); - Assert.assertEquals("Property substitution should occur", "Welcome, John Doe", + Assert.assertEquals("Property substitution should occur", "John Doe gives 4,5 stars", localizer.getString("test.substitute", null, model, null)); } @@ -212,16 +215,19 @@ public class LocalizerTest extends Assert @Test public void testGetStringUseModel() { - HashMap<String, String> model = new HashMap<String, String>(); + Session.get().setLocale(Locale.GERMAN); + + HashMap<String, Object> model = new HashMap<String, Object>(); model.put("user", "juergen"); + model.put("rating", 4.5); - Assert.assertEquals("Expected string should be returned", "Welcome, juergen", + Assert.assertEquals("Expected string should be returned", "juergen gives 4,5 stars", localizer.getString("test.substitute", null, new PropertyModel<String>(model, null), "DEFAULT {user}")); Assert.assertEquals("Expected string should be returned", "DEFAULT juergen", - localizer.getString("test.substituteDoesNotExist", null, new PropertyModel<String>( - model, null), "DEFAULT ${user}")); + localizer.getString("test.substituteDoesNotExist", null, + new PropertyModel<HashMap<String, Object>>(model, null), "DEFAULT ${user}")); } /** http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest$TestPage.properties ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest$TestPage.properties b/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest$TestPage.properties index 2f38e11..51d45ed 100644 --- a/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest$TestPage.properties +++ b/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest$TestPage.properties @@ -26,4 +26,6 @@ weather.mixed=Weather station "${name}" reports that the temperature is {0} {1} weather.detail=The report for {0,date,medium}, shows the temperature as {2,number,###.##} {3} and the weather to be {1} with.quote={0,choice,-1#n/a|-1<'{1}{0,number,#,##0.00}'} with.quote.substitution=Let's play in the {0} -with.quote.and.no.substitution=Let's play in the rain! \ No newline at end of file +with.quote.and.no.substitution=Let's play in the rain! + +weather.25.7=Twenty-five dot seven \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest.java b/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest.java index 15e9dd7..b69fee2 100644 --- a/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/model/StringResourceModelTest.java @@ -24,6 +24,7 @@ import java.util.Locale; import junit.framework.Assert; import org.apache.wicket.Component; +import org.apache.wicket.Session; import org.apache.wicket.WicketTestCase; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.basic.Label; @@ -103,6 +104,19 @@ public class StringResourceModelTest extends WicketTestCase /** */ @Test + public void getSimpleResourceWithKeySubstitutionForNonString() + { + // German uses comma (,) as decimal separator + Session.get().setLocale(Locale.GERMAN); + + StringResourceModel model = new StringResourceModel("weather.${currentTemperature}", page, + wsModel); + Assert.assertEquals("Text should be as expected", "Twenty-five dot seven", + model.getString()); + } + + /** */ + @Test public void getPropertySubstitutedResource() { tester.getSession().setLocale(Locale.ENGLISH); http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/test/java/org/apache/wicket/resource/DummyApplication.properties ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/resource/DummyApplication.properties b/wicket-core/src/test/java/org/apache/wicket/resource/DummyApplication.properties index 132ca48..30dbe86 100644 --- a/wicket-core/src/test/java/org/apache/wicket/resource/DummyApplication.properties +++ b/wicket-core/src/test/java/org/apache/wicket/resource/DummyApplication.properties @@ -17,4 +17,4 @@ # limitations under the License. # test.string=This is a test -test.substitute=Welcome, ${user} +test.substitute=${user} gives ${rating} stars http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java b/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java index eeffe71..8438f81 100644 --- a/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java +++ b/wicket-core/src/test/java/org/apache/wicket/util/string/interpolator/PropertyVariableInterpolatorTest.java @@ -34,7 +34,7 @@ public class PropertyVariableInterpolatorTest extends Assert public void withValue() { TestClass object = new TestClass("value"); - String result = PropertyVariableInterpolator.interpolate("${key}", object); + String result = new PropertyVariableInterpolator("${key}", object).toString(); assertEquals("value", result.toString()); } @@ -46,7 +46,7 @@ public class PropertyVariableInterpolatorTest extends Assert public void withValueAndEscape() { TestClass object = new TestClass("3.24"); - String result = PropertyVariableInterpolator.interpolate("$$${key}", object); + String result = new PropertyVariableInterpolator("$$${key}", object).toString(); assertEquals("$3.24", result.toString()); } @@ -56,7 +56,7 @@ public class PropertyVariableInterpolatorTest extends Assert @Test public void withoutValue() { - String result = PropertyVariableInterpolator.interpolate("${key}", null); + String result = new PropertyVariableInterpolator("${key}", null).toString(); assertEquals("${key}", result.toString()); } http://git-wip-us.apache.org/repos/asf/wicket/blob/a99ab59b/wicket-util/src/main/java/org/apache/wicket/util/string/interpolator/VariableInterpolator.java ---------------------------------------------------------------------- diff --git a/wicket-util/src/main/java/org/apache/wicket/util/string/interpolator/VariableInterpolator.java b/wicket-util/src/main/java/org/apache/wicket/util/string/interpolator/VariableInterpolator.java index 0223837..86add15 100644 --- a/wicket-util/src/main/java/org/apache/wicket/util/string/interpolator/VariableInterpolator.java +++ b/wicket-util/src/main/java/org/apache/wicket/util/string/interpolator/VariableInterpolator.java @@ -105,6 +105,12 @@ public abstract class VariableInterpolator implements IClusterable @Override public String toString() { + // If there's any reason to go to the expense of property expressions + if (!string.contains("${")) + { + return string; + } + // Result buffer final StringBuilder buffer = new StringBuilder();
