Author: carnold
Date: Mon Mar 15 02:30:16 2010
New Revision: 923034

URL: http://svn.apache.org/viewvc?rev=923034&view=rev
Log:
Bug 48910: LogSF did not support \\{ escape sequence

Modified:
    logging/log4j/companions/extras/trunk/src/changes/changes.xml
    
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogSF.java
    
logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogSF.java

Modified: logging/log4j/companions/extras/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/changes/changes.xml?rev=923034&r1=923033&r2=923034&view=diff
==============================================================================
--- logging/log4j/companions/extras/trunk/src/changes/changes.xml (original)
+++ logging/log4j/companions/extras/trunk/src/changes/changes.xml Mon Mar 15 
02:30:16 2010
@@ -29,6 +29,7 @@
        <action action="fix" issue="46741">Leaving out %throwable in 
ConversionPattern adds throwable to logging message regardless.</action>
        <action action="fix" issue="48531">Unit tests fail for system dates 
after 2009-12-31</action>
        <action action="fix" issue="48778">LogMF performance improvement for 
number and date types.</action>
+       <action action="fix" issue="48910">LogSF did not support \\{ escape 
sequence.</action>
     </release>
 
 

Modified: 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogSF.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogSF.java?rev=923034&r1=923033&r2=923034&view=diff
==============================================================================
--- 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogSF.java 
(original)
+++ 
logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogSF.java 
Mon Mar 15 02:30:16 2010
@@ -46,22 +46,34 @@ public final class LogSF extends LogXF {
      */
     private static String format(final String pattern,
                                  final Object[] arguments) {
-        if (arguments == null || pattern == null) {
-            return pattern;
-        }
-        StringBuffer buf = new StringBuffer(pattern);
-        int index = 0;
-        int pos = buf.indexOf("{");
-        while (pos >= 0 && pos < buf.length() - 1 && index < arguments.length) 
{
-            if (buf.charAt(pos + 1) == '}') {
-                String subst = String.valueOf(arguments[index++]);
-                buf.replace(pos, pos + 2, subst);
-                pos += subst.length();
-            } else {
-                pos = buf.indexOf("{", pos + 1);
+        if (pattern != null) {
+            String retval = "";
+            int count = 0;
+            int prev = 0;
+            int pos = pattern.indexOf("{");
+            while(pos >= 0) {
+                if (pos == 0 || pattern.charAt(pos-1) != '\\') {
+                    retval += pattern.substring(prev, pos);
+                    if (pos + 1 < pattern.length() && pattern.charAt(pos+1) == 
'}') {
+                        if(arguments != null && count < arguments.length) {
+                            retval += arguments[count++];
+                        } else {
+                            retval += "{}";
+                        }
+                        prev = pos + 2;
+                    } else {
+                        retval += "{";
+                        prev = pos + 1;
+                    }
+                } else {
+                    retval += pattern.substring(prev, pos - 1) + "{";
+                    prev = pos + 1;
+                }
+                pos = pattern.indexOf("{", prev);
             }
+            return retval + pattern.substring(prev);
         }
-        return buf.toString();
+        return null;
     }
 
     /**
@@ -71,7 +83,18 @@ public final class LogSF extends LogXF {
      * @return Message string
      */
     private static String format(final String pattern, final Object arg0) {
-        return format(pattern, toArray(arg0));
+        if (pattern != null) {
+            //
+            //  if there is an escaped brace, delegate to multi-param formatter
+            if (pattern.indexOf("\\{") >= 0) {
+                return format(pattern, new Object[] { arg0 });
+            }
+            int pos = pattern.indexOf("{}");
+            if (pos >= 0) {
+                return pattern.substring(0, pos) + arg0 + 
pattern.substring(pos+2);
+            }
+        }
+        return pattern;
     }
 
     /**

Modified: 
logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogSF.java
URL: 
http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogSF.java?rev=923034&r1=923033&r2=923034&view=diff
==============================================================================
--- 
logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogSF.java
 (original)
+++ 
logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogSF.java
 Mon Mar 15 02:30:16 2010
@@ -19,8 +19,6 @@ package org.apache.log4j;
 import junit.framework.TestCase;
 
 import java.io.CharArrayWriter;
-import java.text.MessageFormat;
-import java.util.Date;
 
 
 /**
@@ -1171,4 +1169,23 @@ public class TestLogSF extends TestCase 
         assertEquals("Hello, World.", capture.getMessage());
     }
 
+    /**
+     * Test \\{ escape sequence when only one parameter is present.
+     *
+     */
+    public void testEscapeOneParam() {
+        LogCapture capture = new LogCapture(Level.INFO);
+        LogSF.info(logger, "\\{}\\{{}}, World}\\{","Hello");
+        assertEquals("{}{Hello}, World}{", capture.getMessage());
+    }
+
+    /**
+     * Test \\{ escape sequence when more than one parameter is present.
+     *
+     */
+    public void testEscapeTwoParam() {
+        LogCapture capture = new LogCapture(Level.INFO);
+        LogSF.info(logger, "\\{}\\{{}}, {}}{}\\{","Hello", "World");
+        assertEquals("{}{Hello}, World}{}{", capture.getMessage());
+    }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to