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/07/19 01:09:28 UTC

git commit: 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)

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 <sv...@apache.org>
Authored: Thu Jul 19 01:08:58 2012 +0200
Committer: svenmeier <sv...@apache.org>
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();
 


Re: git commit: 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)

Posted by Martin Grigorov <mg...@apache.org>.
On Sun, Jul 22, 2012 at 4:03 PM, Martin Grigorov <mg...@apache.org> wrote:
> On Thu, Jul 19, 2012 at 2:09 AM,  <sv...@apache.org> wrote:
>> 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 <sv...@apache.org>
>> Authored: Thu Jul 19 01:08:58 2012 +0200
>> Committer: svenmeier <sv...@apache.org>
>> 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());
>
> Is it better if we use component.getLocale() if 'component' is not null ?   ^^^^

Sorry. Just saw that a later commit actually does this.

>
>
>> +                               }
>> +                       }.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();
>>
>>
>
>
>
> --
> Martin Grigorov
> jWeekend
> Training, Consulting, Development
> http://jWeekend.com



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com

Re: git commit: 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)

Posted by Martin Grigorov <mg...@apache.org>.
On Thu, Jul 19, 2012 at 2:09 AM,  <sv...@apache.org> wrote:
> 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 <sv...@apache.org>
> Authored: Thu Jul 19 01:08:58 2012 +0200
> Committer: svenmeier <sv...@apache.org>
> 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());

Is it better if we use component.getLocale() if 'component' is not null ?   ^^^^


> +                               }
> +                       }.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();
>
>



-- 
Martin Grigorov
jWeekend
Training, Consulting, Development
http://jWeekend.com