Return-Path: Delivered-To: apmail-hadoop-core-commits-archive@www.apache.org Received: (qmail 75373 invoked from network); 28 Mar 2008 00:52:37 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 28 Mar 2008 00:52:37 -0000 Received: (qmail 32035 invoked by uid 500); 28 Mar 2008 00:52:36 -0000 Delivered-To: apmail-hadoop-core-commits-archive@hadoop.apache.org Received: (qmail 32004 invoked by uid 500); 28 Mar 2008 00:52:36 -0000 Mailing-List: contact core-commits-help@hadoop.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: core-dev@hadoop.apache.org Delivered-To: mailing list core-commits@hadoop.apache.org Received: (qmail 31995 invoked by uid 99); 28 Mar 2008 00:52:36 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 27 Mar 2008 17:52:36 -0700 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.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 28 Mar 2008 00:52:04 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 1A2531A9832; Thu, 27 Mar 2008 17:52:16 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r642053 - in /hadoop/core/trunk: CHANGES.txt src/java/org/apache/hadoop/mapred/JobConf.java src/java/org/apache/hadoop/util/StringUtils.java src/test/org/apache/hadoop/conf/TestJobConf.java src/test/org/apache/hadoop/util/TestStringUtils.java Date: Fri, 28 Mar 2008 00:52:15 -0000 To: core-commits@hadoop.apache.org From: shv@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080328005216.1A2531A9832@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: shv Date: Thu Mar 27 17:52:11 2008 New Revision: 642053 URL: http://svn.apache.org/viewvc?rev=642053&view=rev Log: HADOOP-3064. Commas in a file path should not be treated as delimiters. Contributed by Hairong Kuang. Added: hadoop/core/trunk/src/test/org/apache/hadoop/util/TestStringUtils.java Modified: hadoop/core/trunk/CHANGES.txt hadoop/core/trunk/src/java/org/apache/hadoop/mapred/JobConf.java hadoop/core/trunk/src/java/org/apache/hadoop/util/StringUtils.java hadoop/core/trunk/src/test/org/apache/hadoop/conf/TestJobConf.java Modified: hadoop/core/trunk/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/core/trunk/CHANGES.txt?rev=642053&r1=642052&r2=642053&view=diff ============================================================================== --- hadoop/core/trunk/CHANGES.txt (original) +++ hadoop/core/trunk/CHANGES.txt Thu Mar 27 17:52:11 2008 @@ -395,6 +395,9 @@ HADOOP-3065. Better logging message if the rack location of a datanode cannot be determined. (Devaraj Das via dhruba) + HADOOP-3064. Commas in a file path should not be treated as delimiters. + (Hairong Kuang via shv) + Release 0.16.2 - Unreleased BUG FIXES Modified: hadoop/core/trunk/src/java/org/apache/hadoop/mapred/JobConf.java URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/mapred/JobConf.java?rev=642053&r1=642052&r2=642053&view=diff ============================================================================== --- hadoop/core/trunk/src/java/org/apache/hadoop/mapred/JobConf.java (original) +++ hadoop/core/trunk/src/java/org/apache/hadoop/mapred/JobConf.java Thu Mar 27 17:52:11 2008 @@ -45,6 +45,7 @@ import org.apache.hadoop.mapred.lib.IdentityReducer; import org.apache.hadoop.mapred.lib.HashPartitioner; import org.apache.hadoop.util.ReflectionUtils; +import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.Tool; /** @@ -229,7 +230,7 @@ */ public void setInputPath(Path dir) { dir = new Path(getWorkingDirectory(), dir); - set("mapred.input.dir", dir.toString()); + set("mapred.input.dir", StringUtils.escapeString(dir.toString())); } /** @@ -240,8 +241,10 @@ */ public void addInputPath(Path dir) { dir = new Path(getWorkingDirectory(), dir); + String dirStr = StringUtils.escapeString(dir.toString()); String dirs = get("mapred.input.dir"); - set("mapred.input.dir", dirs == null ? dir.toString() : dirs + "," + dir); + set("mapred.input.dir", dirs == null ? dirStr : + dirs + StringUtils.COMMA_STR + dirStr); } /** @@ -251,10 +254,10 @@ */ public Path[] getInputPaths() { String dirs = get("mapred.input.dir", ""); - ArrayList list = Collections.list(new StringTokenizer(dirs, ",")); - Path[] result = new Path[list.size()]; - for (int i = 0; i < list.size(); i++) { - result[i] = new Path((String)list.get(i)); + String [] list = StringUtils.split(dirs); + Path[] result = new Path[list.length]; + for (int i = 0; i < list.length; i++) { + result[i] = new Path(StringUtils.unEscapeString(list[i])); } return result; } Modified: hadoop/core/trunk/src/java/org/apache/hadoop/util/StringUtils.java URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/java/org/apache/hadoop/util/StringUtils.java?rev=642053&r1=642052&r2=642053&view=diff ============================================================================== --- hadoop/core/trunk/src/java/org/apache/hadoop/util/StringUtils.java (original) +++ hadoop/core/trunk/src/java/org/apache/hadoop/util/StringUtils.java Thu Mar 27 17:52:11 2008 @@ -18,6 +18,7 @@ package org.apache.hadoop.util; +import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.InetAddress; @@ -276,6 +277,142 @@ return values.toArray(new String[values.size()]); } + final public static char COMMA = ','; + final public static String COMMA_STR = ","; + final public static char ESCAPE_CHAR = '\\'; + + /** + * Split a string using the default separator + * @param str a string that may have escaped separator + * @return an array of strings + */ + public static String[] split(String str) { + return split(str, ESCAPE_CHAR, COMMA); + } + + /** + * Split a string using the given separator + * @param str a string that may have escaped separator + * @param escapeChar a char that be used to escape the separator + * @param separator a separator char + * @return an array of strings + */ + public static String[] split( + String str, char escapeChar, char separator) { + if (str==null) { + return null; + } + ArrayList strList = new ArrayList(); + StringBuilder split = new StringBuilder(); + int numPreEscapes = 0; + for (int i=0; i=0 && "".equals(strList.get(last))) { + strList.remove(last); + } + return strList.toArray(new String[strList.size()]); + } + + /** + * Escape commas in the string using the default escape char + * @param str a string + * @return an escaped string + */ + public static String escapeString(String str) { + return escapeString(str, ESCAPE_CHAR, COMMA); + } + + /** + * Escape charToEscape in the string + * with the escape char escapeChar + * + * @param str string + * @param escapeChar escape char + * @param charToEscape the char to be escaped + * @return an escaped string + */ + public static String escapeString( + String str, char escapeChar, char charToEscape) { + if (str == null) { + return null; + } + StringBuilder result = new StringBuilder(); + for (int i=0; icharToEscape in the string + * with the escape char escapeChar + * + * @param str string + * @param escapeChar escape char + * @param charToEscape the escaped char + * @return an unescaped string + */ + public static String unEscapeString( + String str, char escapeChar, char charToEscape) { + if (str == null) { + return null; + } + StringBuilder result = new StringBuilder(str.length()); + boolean hasPreEscape = false; + for (int i=0; i