Hi,
Looks good to me. Maybe for 2.3 this patch could provide
MessageFormatting like proposed before without bloating the API. Does
this now mean that VariableFormatter is gone? I like the nameing
StrSubstitutor better.
Tom
Henri Yandell schrieb:
> On 7/23/06, Stephen Colebourne <[EMAIL PROTECTED]> wrote:
>> I have reworked the VariableFormatter class along the lines that I
>> was thinking. I have committed it as StrSubstitutor so it doesn't
>> clash for the moment and so it can be easiy reviewed.
>>
>> This version does not have a separate parser class, but still
>> supports escaping, and matchers for prefix/suffix (which can now be
>> set by users). The new class should perform better as a result.
>>
>> I have removed the edge cases wrt resolving Objects, as they were
>> rather ill-defined.
>>
>> Otherwise, the basic functionality it supported, and the test case
>> is slightly enlarged. I still want to break out the resolver as a
>> public abstract class before release.
>>
>> Opinions
>
> Oliver, Gary, Tom?
>
> Looking to get Lang 2.2 moving out the door and this is the only blocker.
>
> Hen
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
Index:
/home.local/tom/projects/eclipse-ws/bidi-forms/jakarta-commons-lang/src/java/org/apache/commons/lang/text/StrSubstitutor.java
===================================================================
---
/home.local/tom/projects/eclipse-ws/bidi-forms/jakarta-commons-lang/src/java/org/apache/commons/lang/text/StrSubstitutor.java
(revision 427468)
+++
/home.local/tom/projects/eclipse-ws/bidi-forms/jakarta-commons-lang/src/java/org/apache/commons/lang/text/StrSubstitutor.java
(working copy)
@@ -16,6 +16,7 @@
package org.apache.commons.lang.text;
+import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -725,5 +726,84 @@
return obj.toString();
}
}
+
+ /**
+ * Looks up a string value by name using a [EMAIL PROTECTED] Map} and can
use format
+ * expressions known from [EMAIL PROTECTED] MessageFormat}
+ */
+ static class MapVariableResolverFormat extends MapVariableResolver {
+
+ MapVariableResolverFormat(Map map) {
+ super(map);
+ }
+
+ public String resolveVariable(String varName) {
+ int index;
+
+ if (map != null && (index = varName.indexOf(",")) !=
-1) {
+ return MessageFormat.format("{0" +
varName.substring(index)
+ + "}", new Object[] { map.get(
+ varName.substring(0,
index)) });
+ } else {
+ return super.resolveVariable(varName);
+ }
+ }
+ }
+
+ /**
+ * Substitutes variables by value and allows to use the formats known from
+ * [EMAIL PROTECTED] MessageFormat}:
+ * <p>
+ * The following example demonstrates this:
+ * </p>
+ * <pre>
+ * Map map = new HashMap();
+ * map.put("num",new Double(1000.103));
+ * map.put("date", new SimpleDateFormat("yyyy-MM-dd").parse("1970-01-01"));
+ *
+ * StrSubstitutor.Format.replace("Number: ${num,number,integer}, Date:
${date,date,yyyy-MM-dd}", map)
+ * </pre>
+ * yielding in Locale.US
+ * <pre>
+ * Number: 1,000, Date: 1970-01-01
+ * </pre>
+ */
+ public static class Format {
+ private Format() {}
+
+ /**
+ * Replaces all the occurrences of variables in the given source
object with
+ * their matching values from the map.
+ *
+ * @param source the source text containing the variables to
substitute
+ * @param valueMap the map with the values
+ * @return the result of the replace operation
+ */
+ public static String replace(Object source, Map valueMap) {
+ StrSubstitutor tmp = new StrSubstitutor();
+ tmp.setVariableResolver(new
MapVariableResolverFormat(valueMap));
+
+ return tmp.replace(source);
+ }
+ /**
+ * Replaces all the occurrences of variables in the given source
object with
+ * their matching values from the map. This method allows to specifiy a
+ * custom variable prefix and suffix
+ *
+ * @param source the source text containing the variables to
substitute
+ * @param valueMap the map with the values
+ * @param prefix the prefix of variables
+ * @param suffix the suffix of variables
+ * @return the result of the replace operation
+ */
+ public static String replace(Object source, Map valueMap, String
prefix, String suffix) {
+ StrSubstitutor tmp = new StrSubstitutor();
+ tmp.setVariablePrefix(prefix);
+ tmp.setVariableSuffix(suffix);
+ tmp.setVariableResolver(new
MapVariableResolverFormat(valueMap));
+
+ return tmp.replace(source);
+ }
+ }
}
Index:
/home.local/tom/projects/eclipse-ws/bidi-forms/jakarta-commons-lang/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java
===================================================================
---
/home.local/tom/projects/eclipse-ws/bidi-forms/jakarta-commons-lang/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java
(revision 427468)
+++
/home.local/tom/projects/eclipse-ws/bidi-forms/jakarta-commons-lang/src/test/org/apache/commons/lang/text/StrSubstitutorTest.java
(working copy)
@@ -16,7 +16,10 @@
package org.apache.commons.lang.text;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
import java.util.HashMap;
+import java.util.Locale;
import java.util.Map;
import junit.framework.Test;
@@ -24,8 +27,6 @@
import junit.framework.TestSuite;
import junit.textui.TestRunner;
-import org.apache.commons.lang.text.StrSubstitutor.MapVariableResolver;
-
/**
* Test class for StrSubstitutor.
*
@@ -332,6 +333,26 @@
}
}
+ public void testWithFormating() {
+ Locale tmp = Locale.getDefault();
+
+ try {
+ Map map = new HashMap();
+ map.put("num",new Double(1000.103));
+ map.put("date", new
SimpleDateFormat("yyyy-MM-dd").parse("1970-01-01"));
+
+ Locale.setDefault(Locale.US);
+
+ String value = StrSubstitutor.Format.replace("Number:
${num,number,integer}, Date: ${date,date,yyyy-MM-dd}", map);
+ assertEquals("Number: 1,000, Date: 1970-01-01", value);
+
+ } catch (ParseException e) {
+ fail("Parsing failed");
+ } finally {
+ Locale.setDefault(tmp);
+ }
+ }
+
/**
* Tests interpolation with weird boundary patterns.
*/
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]