Return-Path: Delivered-To: apmail-logging-log4j-dev-archive@www.apache.org Received: (qmail 46353 invoked from network); 15 Mar 2010 04:45:33 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 15 Mar 2010 04:45:33 -0000 Received: (qmail 82097 invoked by uid 500); 15 Mar 2010 04:44:47 -0000 Delivered-To: apmail-logging-log4j-dev-archive@logging.apache.org Received: (qmail 81942 invoked by uid 500); 15 Mar 2010 04:44:45 -0000 Mailing-List: contact log4j-dev-help@logging.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "Log4J Developers List" Reply-To: "Log4J Developers List" Delivered-To: mailing list log4j-dev@logging.apache.org Received: (qmail 81934 invoked by uid 500); 15 Mar 2010 04:44:44 -0000 Received: (qmail 81931 invoked by uid 99); 15 Mar 2010 04:44:43 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 Mar 2010 04:44:43 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 15 Mar 2010 04:44:40 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 50E8323889B2; Mon, 15 Mar 2010 04:44:19 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r923055 - in /logging/log4j/companions/extras/trunk/src: changes/changes.xml main/java/org/apache/log4j/LogMF.java test/java/org/apache/log4j/TestLogMF.java Date: Mon, 15 Mar 2010 04:44:19 -0000 To: log4j-cvs@logging.apache.org From: carnold@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100315044419.50E8323889B2@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: carnold Date: Mon Mar 15 04:44:18 2010 New Revision: 923055 URL: http://svn.apache.org/viewvc?rev=923055&view=rev Log: Bug 48911: LogMF did not optimize simple patterns on multiple parameter log requests Modified: logging/log4j/companions/extras/trunk/src/changes/changes.xml logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogMF.java logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogMF.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=923055&r1=923054&r2=923055&view=diff ============================================================================== --- logging/log4j/companions/extras/trunk/src/changes/changes.xml (original) +++ logging/log4j/companions/extras/trunk/src/changes/changes.xml Mon Mar 15 04:44:18 2010 @@ -30,6 +30,7 @@ Unit tests fail for system dates after 2009-12-31 LogMF performance improvement for number and date types. LogSF did not support \\{ escape sequence. + LogMF did not optimize simple patterns on multiple parameter log requests. Modified: logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogMF.java URL: http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogMF.java?rev=923055&r1=923054&r2=923055&view=diff ============================================================================== --- logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogMF.java (original) +++ logging/log4j/companions/extras/trunk/src/main/java/org/apache/log4j/LogMF.java Mon Mar 15 04:44:18 2010 @@ -88,61 +88,48 @@ public final class LogMF extends LogXF { return dateFormat.format(d); } - /** - * Formats arguments using a minimal subset - * of MessageFormat syntax. - * @param pattern pattern, may not be null. - * @param arg0 argument, may be null. - * @return Message string or null if pattern - * is not supported. - */ - private static String subsetFormat(final String pattern, - final Object arg0) { - if (pattern != null) { - // - // find position of first brace - // if none then format is a literal - int bracePos = pattern.indexOf("{"); - - // - // if the first format is {0} - // and there are no other format specifiers - // and no quotes then substitute for {0} - if (bracePos != -1) { - if ((pattern.indexOf("{0}", bracePos) == bracePos) - && (pattern.indexOf("{", bracePos + 1) == -1) - && (pattern.indexOf("'") == -1)) { - String replacement; - - if (arg0 instanceof String) { - replacement = arg0.toString(); - } else if (arg0 instanceof Double || - arg0 instanceof Float) { - replacement = formatNumber(arg0); - } else if (arg0 instanceof Date) { - replacement = formatDate(arg0); - } else { - replacement = String.valueOf(arg0); - } + * Format a single parameter like a "{0}" formatting specifier. + * + * @param arg0 parameter, may be null. + * @return string representation of arg0. + */ + private static String formatObject(final Object arg0) { + if (arg0 instanceof String) { + return arg0.toString(); + } else if (arg0 instanceof Double || + arg0 instanceof Float) { + return formatNumber(arg0); + } else if (arg0 instanceof Date) { + return formatDate(arg0); + } + return String.valueOf(arg0); + } - final StringBuffer buf = new StringBuffer(pattern); - buf.replace(bracePos, - bracePos + "{0}".length(), replacement); - return buf.toString(); - } - } else { - // - // pattern is a literal with no braces - // and not quotes, return pattern. - if (pattern.indexOf("'") == -1) { - return pattern; - } + /** + * Determines if pattern contains only {n} format elements + * and not apostrophes. + * + * @param pattern pattern, may not be null. + * @return true if pattern only contains {n} format elements. + */ + private static boolean isSimple(final String pattern) { + if (pattern.indexOf('\'') != -1) { + return false; + } + for(int pos = pattern.indexOf('{'); + pos != -1; + pos = pattern.indexOf('{', pos + 1)) { + if (pos + 2 >= pattern.length() || + pattern.charAt(pos+2) != '}' || + pattern.charAt(pos+1) < '0' || + pattern.charAt(pos+1) > '9') { + return false; } } + return true; - return null; } /** @@ -155,6 +142,34 @@ public final class LogMF extends LogXF { final Object[] arguments) { if (pattern == null) { return null; + } else if(isSimple(pattern)) { + String formatted[] = new String[10]; + int prev = 0; + String retval = ""; + int pos = pattern.indexOf('{'); + while(pos >= 0) { + if(pos + 2 < pattern.length() && + pattern.charAt(pos+2) == '}' && + pattern.charAt(pos+1) >= '0' && + pattern.charAt(pos+1) <= '9') { + int index = pattern.charAt(pos+1) - '0'; + retval += pattern.substring(prev, pos); + if (formatted[index] == null) { + if (arguments == null || index >= arguments.length) { + formatted[index] = pattern.substring(pos, pos+3); + } else { + formatted[index] = formatObject(arguments[index]); + } + } + retval += formatted[index]; + prev = pos + 3; + pos = pattern.indexOf('{', prev); + } else { + pos = pattern.indexOf('{', pos + 1); + } + } + retval += pattern.substring(prev); + return retval; } try { return MessageFormat.format(pattern, arguments); @@ -164,21 +179,52 @@ public final class LogMF extends LogXF { } /** - * Formats arguments using MessageFormat. - * @param pattern pattern, may be malformed. - * @param arg0 argument, may be null or mismatched. - * @return Message string + * Formats a single argument using MessageFormat. + * @param pattern pattern, may be malformed or null. + * @param arguments arguments, may be null or mismatched. + * @return Message string or null */ - private static String format(final String pattern, final Object arg0) { - String msg = subsetFormat(pattern, arg0); - - if (msg == null) { - msg = format(pattern, toArray(arg0)); + private static String format(final String pattern, + final Object arg0) { + if (pattern == null) { + return null; + } else if(isSimple(pattern)) { + String formatted = null; + int prev = 0; + String retval = ""; + int pos = pattern.indexOf('{'); + while(pos >= 0) { + if(pos + 2 < pattern.length() && + pattern.charAt(pos+2) == '}' && + pattern.charAt(pos+1) >= '0' && + pattern.charAt(pos+1) <= '9') { + int index = pattern.charAt(pos+1) - '0'; + retval += pattern.substring(prev, pos); + if (index != 0) { + retval += pattern.substring(pos, pos+3); + } else { + if (formatted == null) { + formatted = formatObject(arg0); + } + retval += formatted; + } + prev = pos + 3; + pos = pattern.indexOf('{', prev); + } else { + pos = pattern.indexOf('{', pos + 1); + } + } + retval += pattern.substring(prev); + return retval; + } + try { + return MessageFormat.format(pattern, new Object[] { arg0 }); + } catch (IllegalArgumentException ex) { + return pattern; } - - return msg; } + /** * Formats arguments using MessageFormat using a pattern from * a resource bundle. Modified: logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogMF.java URL: http://svn.apache.org/viewvc/logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogMF.java?rev=923055&r1=923054&r2=923055&view=diff ============================================================================== --- logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogMF.java (original) +++ logging/log4j/companions/extras/trunk/src/test/java/org/apache/log4j/TestLogMF.java Mon Mar 15 04:44:18 2010 @@ -1236,4 +1236,45 @@ public class TestLogMF extends TestCase assertEquals("Hello, World.", capture.getMessage()); } + + /** + * Test LogMF.info with a pattern containing {9} and one argument. + */ + public void testInfo1ParamBrace9() { + LogCapture capture = new LogCapture(Level.INFO); + LogMF.info(logger, "Hello, {9}{0}", "World"); + assertEquals("Hello, {9}World", capture.getMessage()); + } + + /** + * Test LogMF.info with a pattern containing {9} and two arguments. + */ + public void testInfo2ParamBrace9() { + LogCapture capture = new LogCapture(Level.INFO); + LogMF.info(logger, "{1}, {9}{0}", "World", "Hello"); + assertEquals("Hello, {9}World", capture.getMessage()); + } + + /** + * Test LogMF.info with a pattern containing {9} and two arguments. + */ + public void testInfo10ParamBrace9() { + LogCapture capture = new LogCapture(Level.INFO); + LogMF.info(logger, "{1}, {9}{0}", + new Object[] { "World", "Hello", null, null, null, + null, null, null, null, "New " }); + assertEquals("Hello, New World", capture.getMessage()); + } + + /** + * Test LogMF.info with indexes just outside of 0 to 9. + */ + public void testInfo1ParamBraceSlashColon() { + LogCapture capture = new LogCapture(Level.INFO); + String pattern = "Hello, {/}{0}{:}"; + LogMF.info(logger, pattern, "World"); + assertEquals(pattern, capture.getMessage()); + } + + } --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-dev-unsubscribe@logging.apache.org For additional commands, e-mail: log4j-dev-help@logging.apache.org