Hi Jörn, At least someone is watching over the code. Cool.
I just realized that toString(primitive[]) methods in Arrays class were introduced in JDK 1.5. SLF4J needs to work on JDK 1.4 if not 1.3. Yikes. Jörn Huxhorn wrote: > Hi Ceki. > > You forgot the double[] in your last commit. > > Regards, Joern. > > On Thu, Jul 31, 2008 at 10:51 PM, <[EMAIL PROTECTED]> wrote: > >> Author: ceki >> Date: Thu Jul 31 22:51:04 2008 >> New Revision: 1086 >> >> Modified: >> >> slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java >> >> slf4j/trunk/slf4j-api/src/test/java/org/slf4j/helpers/MessageFormatterTest.java >> >> Log: >> - add support for array values in parameters >> >> For example, >> >> log.debug("a:{},i:{}", "A", new int[] {1, 2}}); >> will print as "a:A,i:[1, 2]" instead of "a:A,i:[EMAIL PROTECTED]" as >> previously >> >> log.debug("a:{},b:{},i:{},", new Object[] {"A", "B", new int[] {1, 2}}); >> will print as "a:A,b:B,i:[1, 2]" instead of "a:A,b:B,i:[EMAIL PROTECTED]" as >> previously >> >> This enhancement was proposed by "lizongbo" >> >> Modified: >> slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java >> >> ============================================================================== >> --- >> slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java >> (original) >> +++ >> slf4j/trunk/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java >> Thu Jul 31 22:51:04 2008 >> @@ -24,12 +24,20 @@ >> >> package org.slf4j.helpers; >> >> +import java.util.Arrays; >> + >> +// contributors: lizongbo >> + >> /** >> * Formats messages according to very simple substitution rules. >> Substitutions >> * can be made 1, 2 or more arguments. >> * <p> >> * For example, >> - * <pre>MessageFormatter.format("Hi {}.", >> "there");</pre> >> + * >> + * <pre> >> + * MessageFormatter.format("Hi {}.", "there"); >> + * </pre> >> + * >> * will return the string "Hi there.". >> * <p> >> * The {} pair is called the <em>formatting anchor</em>. It serves to >> @@ -40,14 +48,22 @@ >> * pattern itself but do not want them to be interpreted as a formatting >> * anchors, you can escape the '{' character with '\', that is the >> backslash >> * character. Only the '{' character should be escaped. There is no need to >> - * escape the '}' character. For example, >> - * <pre>MessageFormatter.format("Set \\{1,2,3} is not equal to >> {}.", "1,2");</pre> >> - * will return the string "Set {1,2,3} is not equal to 1,2.". >> + * escape the '}' character. For example, >> + * >> + * <pre> >> + * MessageFormatter.format("Set \\{1,2,3} is not equal to {}.", >> "1,2"); >> + * </pre> >> + * >> + * will return the string "Set {1,2,3} is not equal to 1,2.". >> * >> * <p> >> - * The escaping behavior just described can be overridden by >> - * escaping the escape character '\'. Calling >> - * <pre>MessageFormatter.format("File name is C:\\\\{}.", >> "file.zip");</pre> >> + * The escaping behavior just described can be overridden by escaping the >> escape >> + * character '\'. Calling >> + * >> + * <pre> >> + * MessageFormatter.format("File name is C:\\\\{}.", >> "file.zip"); >> + * </pre> >> + * >> * will return the string "File name is C:\file.zip". >> * >> * <p> >> @@ -60,7 +76,7 @@ >> static final char DELIM_START = '{'; >> static final char DELIM_STOP = '}'; >> private static final char ESCAPE_CHAR = '\\'; >> - >> + >> /** >> * Performs single argument substitution for the 'messagePattern' passed >> as >> * parameter. >> @@ -75,9 +91,10 @@ >> * <p> >> * >> * @param messagePattern >> - * The message pattern which will be parsed and formatted >> + * The message pattern which will be parsed and formatted >> * @param argument >> - * The argument to be substituted in place of the formatting >> anchor >> + * The argument to be substituted in place of the >> formatting >> + * anchor >> * @return The formatted message >> */ >> public static String format(String messagePattern, Object arg) { >> @@ -98,13 +115,13 @@ >> * will return the string "Hi Alice. My name is Bob.". >> * >> * @param messagePattern >> - * The message pattern which will be parsed and formatted >> + * The message pattern which will be parsed and formatted >> * @param arg1 >> - * The argument to be substituted in place of the first >> formatting >> - * anchor >> + * The argument to be substituted in place of the first >> + * formatting anchor >> * @param arg2 >> - * The argument to be substituted in place of the second >> formatting >> - * anchor >> + * The argument to be substituted in place of the second >> + * formatting anchor >> * @return The formatted message >> */ >> public static String format(String messagePattern, Object arg1, Object >> arg2) { >> @@ -117,10 +134,10 @@ >> * arguments can be passed in an array. >> * >> * @param messagePattern >> - * The message pattern which will be parsed and formatted >> + * The message pattern which will be parsed and formatted >> * @param argArray >> - * An array of arguments to be substituted in place of >> formatting >> - * anchors >> + * An array of arguments to be substituted in place of >> + * formatting anchors >> * @return The formatted message >> */ >> public static String arrayFormat(String messagePattern, Object[] >> argArray) { >> @@ -131,10 +148,10 @@ >> int len = messagePattern.length(); >> int j = messagePattern.indexOf(DELIM_START); >> >> - if(argArray == null) { >> + if (argArray == null) { >> return messagePattern; >> } >> - >> + >> StringBuffer sbuf = new StringBuffer(messagePattern.length() + 50); >> >> for (int L = 0; L < argArray.length; L++) { >> @@ -154,7 +171,7 @@ >> char delimStop = messagePattern.charAt(j + 1); >> >> if (isEscapedDelimeter(messagePattern, j)) { >> - if(!isDoubleEscaped(messagePattern, j)) { >> + if (!isDoubleEscaped(messagePattern, j)) { >> L--; // DELIM_START was escaped, thus should not be incremented >> sbuf.append(messagePattern.substring(i, j - 1)); >> sbuf.append(DELIM_START); >> @@ -163,8 +180,9 @@ >> // The escape character preceding the delemiter start is >> // itself escaped: "abc x:\\{}" >> // we have to consume one backward slash >> - sbuf.append(messagePattern.substring(i, j-1)); >> - sbuf.append(argArray[L]); >> + sbuf.append(messagePattern.substring(i, j - 1)); >> + appendParameter(sbuf, argArray[L]); >> + // sbuf.append(argArray[L]); >> i = j + 2; >> } >> } else if ((delimStop != DELIM_STOP)) { >> @@ -174,7 +192,7 @@ >> } else { >> // normal case >> sbuf.append(messagePattern.substring(i, j)); >> - sbuf.append(argArray[L]); >> + appendParameter(sbuf, argArray[L]); >> i = j + 2; >> } >> } >> @@ -206,4 +224,31 @@ >> return false; >> } >> } >> + >> + // special treatment of array values was suggested by 'lizongbo' >> + private static void appendParameter(StringBuffer sbuf, Object o) { >> + if (o != null && o.getClass().isArray()) { >> + // check for primitive arrays because they unfortunately >> + // cannot be cast to Object[] >> + if (o instanceof boolean[]) { >> + sbuf.append(Arrays.toString((boolean[]) o)); >> + } else if (o instanceof byte[]) { >> + sbuf.append(Arrays.toString((byte[]) o)); >> + } else if (o instanceof char[]) { >> + sbuf.append(Arrays.toString((char[]) o)); >> + } else if (o instanceof short[]) { >> + sbuf.append(Arrays.toString((short[]) o)); >> + } else if (o instanceof int[]) { >> + sbuf.append(Arrays.toString((int[]) o)); >> + } else if (o instanceof long[]) { >> + sbuf.append(Arrays.toString((long[]) o)); >> + } else if (o instanceof float[]) { >> + sbuf.append(Arrays.toString((float[]) o)); >> + } else { >> + sbuf.append(Arrays.toString((Object[]) o)); >> + } >> + } else { >> + sbuf.append(o); >> + } >> + } >> } >> >> Modified: >> slf4j/trunk/slf4j-api/src/test/java/org/slf4j/helpers/MessageFormatterTest.java >> >> ============================================================================== >> --- >> slf4j/trunk/slf4j-api/src/test/java/org/slf4j/helpers/MessageFormatterTest.java >> (original) >> +++ >> slf4j/trunk/slf4j-api/src/test/java/org/slf4j/helpers/MessageFormatterTest.java >> Thu Jul 31 22:51:04 2008 >> @@ -33,56 +33,59 @@ >> >> package org.slf4j.helpers; >> >> +import java.util.Arrays; >> + >> import org.slf4j.helpers.MessageFormatter; >> >> import junit.framework.TestCase; >> >> - >> /** >> * @author Ceki Gulcu >> - * >> + * >> */ >> public class MessageFormatterTest extends TestCase { >> - >> + >> Integer i1 = new Integer(1); >> Integer i2 = new Integer(2); >> Integer i3 = new Integer(3); >> - >> + >> public void testNull() { >> String result; >> result = MessageFormatter.format(null, i1); >> assertEquals(null, result); >> } >> - >> + >> public void testNullParam() { >> String result; >> - >> + >> result = MessageFormatter.format("Value is {}.", null); >> assertEquals("Value is null.", result); >> - >> + >> result = MessageFormatter.format("Val1 is {}, val2 is {}.", null, >> null); >> assertEquals("Val1 is null, val2 is null.", result); >> - >> + >> result = MessageFormatter.format("Val1 is {}, val2 is {}.", i1, null); >> assertEquals("Val1 is 1, val2 is null.", result); >> - >> + >> result = MessageFormatter.format("Val1 is {}, val2 is {}.", null, i2); >> assertEquals("Val1 is null, val2 is 2.", result); >> - >> - result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is >> {}", new Integer[]{null, null, null}); >> + >> + result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is >> {}", >> + new Integer[] { null, null, null }); >> assertEquals("Val1 is null, val2 is null, val3 is null", result); >> - >> - result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is >> {}", new Integer[]{null, i2, i3}); >> + >> + result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is >> {}", >> + new Integer[] { null, i2, i3 }); >> assertEquals("Val1 is null, val2 is 2, val3 is 3", result); >> - >> - result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is >> {}", new Integer[]{null, null, i3}); >> + >> + result = MessageFormatter.arrayFormat("Val1 is {}, val2 is {}, val3 is >> {}", >> + new Integer[] { null, null, i3 }); >> assertEquals("Val1 is null, val2 is null, val3 is 3", result); >> } >> - >> - >> + >> public void testOneParameter() { >> String result; >> - >> + >> result = MessageFormatter.format("Value is {}.", i3); >> assertEquals("Value is 3.", result); >> >> @@ -94,13 +97,13 @@ >> >> result = MessageFormatter.format("No subst", i3); >> assertEquals("No subst", result); >> - >> + >> result = MessageFormatter.format("Incorrect {subst", i3); >> assertEquals("Incorrect {subst", result); >> - >> + >> result = MessageFormatter.format("Value is \\{bla} {}", i3); >> assertEquals("Value is {bla} 3", result); >> - >> + >> result = MessageFormatter.format("Escaped \\{} subst", i3); >> assertEquals("Escaped {} subst", result); >> >> @@ -109,51 +112,52 @@ >> >> result = MessageFormatter.format("\\{}Escaped", i3); >> assertEquals("{}Escaped", result); >> - >> + >> result = MessageFormatter.format("File name is \\{{}}.", "App >> folder.zip"); >> assertEquals("File name is {App folder.zip}.", result); >> - >> + >> // escaping the escape character >> - result = MessageFormatter.format("File name is C:\\\\{}.", "App >> folder.zip"); >> + result = MessageFormatter >> + .format("File name is C:\\\\{}.", "App folder.zip"); >> assertEquals("File name is C:\\App folder.zip.", result); >> } >> - >> + >> public void testTwoParameters() { >> String result; >> >> - >> result = MessageFormatter.format("Value {} is smaller than {}.", i1, >> i2); >> assertEquals("Value 1 is smaller than 2.", result); >> - >> + >> result = MessageFormatter.format("Value {} is smaller than {}", i1, >> i2); >> assertEquals("Value 1 is smaller than 2", result); >> - >> + >> result = MessageFormatter.format("{}{}", i1, i2); >> assertEquals("12", result); >> - >> + >> result = MessageFormatter.format("Val1={}, Val2={", i1, i2); >> assertEquals("Val1=1, Val2={", result); >> >> result = MessageFormatter.format("Value {} is smaller than \\{}", i1, >> i2); >> assertEquals("Value 1 is smaller than {}", result); >> - >> - result = MessageFormatter.format("Value {} is smaller than \\{} tail", >> i1, i2); >> - assertEquals("Value 1 is smaller than {} tail", result); >> + >> + result = MessageFormatter.format("Value {} is smaller than \\{} tail", >> i1, >> + i2); >> + assertEquals("Value 1 is smaller than {} tail", result); >> >> result = MessageFormatter.format("Value {} is smaller than \\{", i1, >> i2); >> - assertEquals("Value 1 is smaller than \\{", result); >> - >> - result = MessageFormatter.format("Value {} is smaller than \\{tail", >> i1, i2); >> - assertEquals("Value 1 is smaller than {tail", result); >> - >> - >> + assertEquals("Value 1 is smaller than \\{", result); >> + >> + result = MessageFormatter >> + .format("Value {} is smaller than \\{tail", i1, i2); >> + assertEquals("Value 1 is smaller than {tail", result); >> + >> result = MessageFormatter.format("Value \\{} is smaller than {}", i1, >> i2); >> - assertEquals("Value {} is smaller than 1", result); >> + assertEquals("Value {} is smaller than 1", result); >> } >> - >> + >> public void testNullArray() { >> String result; >> - >> + >> String msg0 = "msg0"; >> String msg1 = "msg1 {}"; >> String msg2 = "msg2 {} {}"; >> @@ -163,44 +167,69 @@ >> >> result = MessageFormatter.arrayFormat(msg0, args); >> assertEquals(msg0, result); >> - >> + >> result = MessageFormatter.arrayFormat(msg1, args); >> assertEquals(msg1, result); >> - >> + >> result = MessageFormatter.arrayFormat(msg2, args); >> assertEquals(msg2, result); >> - >> + >> result = MessageFormatter.arrayFormat(msg3, args); >> assertEquals(msg3, result); >> } >> - public void testArray() { >> + >> + // tests the case when the parameters are supplied in a single array >> + public void testArrayFormat() { >> String result; >> >> - Integer[] ia = new Integer[] {i1, i2, i3}; >> + Integer[] ia = new Integer[] { i1, i2, i3 }; >> >> - result = MessageFormatter.arrayFormat("Value {} is smaller than {} and >> {}.", ia); >> + result = MessageFormatter.arrayFormat( >> + "Value {} is smaller than {} and {}.", ia); >> assertEquals("Value 1 is smaller than 2 and 3.", result); >> - >> + >> result = MessageFormatter.arrayFormat("{}{}{}", ia); >> assertEquals("123", result); >> - >> + >> result = MessageFormatter.arrayFormat("Value {} is smaller than {}.", >> ia); >> assertEquals("Value 1 is smaller than 2.", result); >> - >> + >> result = MessageFormatter.arrayFormat("Value {} is smaller than {}", >> ia); >> assertEquals("Value 1 is smaller than 2", result); >> - >> + >> result = MessageFormatter.arrayFormat("Val={}, {, Val={}", ia); >> assertEquals("Val=1, {, Val={}", result); >> - >> + >> result = MessageFormatter.arrayFormat("Val={}, \\{, Val={}", ia); >> assertEquals("Val=1, {, Val=2", result); >> - >> - >> + >> result = MessageFormatter.arrayFormat("Val1={}, Val2={", ia); >> assertEquals("Val1=1, Val2={", result); >> - >> + } >> + >> + public void testArrayValues() { >> + >> + String result; >> + >> + Integer p0 = i1; >> + Integer[] p1 = new Integer[] { i2, i3 }; >> + >> + System.out.println("[" + Arrays.toString(new int[] { 1, 2 }) + "]"); >> + >> + result = MessageFormatter.format("{}{}", p0, p1); >> + assertEquals(p0 + Arrays.toString(p1), result); >> + >> + { >> + Object[] pa = new Object[] { "a", p1 }; >> + result = MessageFormatter.arrayFormat("{}{}", pa); >> + assertEquals("a" + Arrays.toString(p1), result); >> + } >> >> + { >> + Object[] pa = new Object[] { "a", new int[] { 1, 2 } }; >> + result = MessageFormatter.arrayFormat("{}{}", pa); >> + assertEquals("a" + Arrays.toString(new int[] { 1, 2 }), result); >> + } >> } >> >> } >> _______________________________________________ >> dev mailing list >> dev@slf4j.org >> http://www.slf4j.org/mailman/listinfo/dev >> > > > ------------------------------------------------------------------------ > > _______________________________________________ > dev mailing list > dev@slf4j.org > http://www.slf4j.org/mailman/listinfo/dev -- Ceki Gülcü QOS.ch is looking to hire talented developers located in Switzerland to work on cutting-edge software projects. If you think you are qualified, then please contact [EMAIL PROTECTED] _______________________________________________ dev mailing list dev@slf4j.org http://www.slf4j.org/mailman/listinfo/dev