You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by en...@apache.org on 2009/03/11 17:19:37 UTC

svn commit: r752496 - in /hadoop/core/trunk: CHANGES.txt src/core/org/apache/hadoop/util/StringUtils.java src/test/org/apache/hadoop/util/TestStringUtils.java

Author: enis
Date: Wed Mar 11 16:19:36 2009
New Revision: 752496

URL: http://svn.apache.org/viewvc?rev=752496&view=rev
Log:
HADOOP-5307. Fix null value handling in StringUtils#arrayToString() and #getStrings(). Contributed by Enis Soztutar. 

Modified:
    hadoop/core/trunk/CHANGES.txt
    hadoop/core/trunk/src/core/org/apache/hadoop/util/StringUtils.java
    hadoop/core/trunk/src/test/org/apache/hadoop/util/TestStringUtils.java

Modified: hadoop/core/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/CHANGES.txt?rev=752496&r1=752495&r2=752496&view=diff
==============================================================================
--- hadoop/core/trunk/CHANGES.txt (original)
+++ hadoop/core/trunk/CHANGES.txt Wed Mar 11 16:19:36 2009
@@ -992,6 +992,9 @@
 
     HADOOP-5392. Fixes a problem to do with JT crashing during recovery when
     the job files are garbled. (Amar Kamat vi ddas)
+
+    HADOOP-5307. Fix null value handling in StringUtils#arrayToString() and 
+    #getStrings(). (enis)
  
 Release 0.19.1 - Unreleased
 

Modified: hadoop/core/trunk/src/core/org/apache/hadoop/util/StringUtils.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/core/org/apache/hadoop/util/StringUtils.java?rev=752496&r1=752495&r2=752496&view=diff
==============================================================================
--- hadoop/core/trunk/src/core/org/apache/hadoop/util/StringUtils.java (original)
+++ hadoop/core/trunk/src/core/org/apache/hadoop/util/StringUtils.java Wed Mar 11 16:19:36 2009
@@ -118,20 +118,24 @@
     return percentFormat.format(rounded / scale);
   }
   
+  private static final String NULL_STR_VALUE = "__null__";
+  
   /**
    * Given an array of strings, return a comma-separated list of its elements.
    * @param strs Array of strings
    * @return Empty string if strs.length is 0, comma separated list of strings
    * otherwise
    */
-  
   public static String arrayToString(String[] strs) {
     if (strs.length == 0) { return ""; }
     StringBuffer sbuf = new StringBuffer();
-    sbuf.append(strs[0]);
-    for (int idx = 1; idx < strs.length; idx++) {
-      sbuf.append(",");
-      sbuf.append(strs[idx]);
+    for (int idx = 0; idx < strs.length; idx++) {
+      if(idx != 0)
+        sbuf.append(",");
+      if(strs[idx] == null)
+        sbuf.append(NULL_STR_VALUE);
+      else
+        sbuf.append(strs[idx]);
     }
     return sbuf.toString();
   }
@@ -313,7 +317,11 @@
     StringTokenizer tokenizer = new StringTokenizer (str,",");
     values = new ArrayList<String>();
     while (tokenizer.hasMoreTokens()) {
-      values.add(tokenizer.nextToken());
+      String value = tokenizer.nextToken();
+      if(value.equals(NULL_STR_VALUE))
+        values.add(null);
+      else
+        values.add(value);
     }
     return values;
   }
@@ -541,6 +549,7 @@
       );
 
     Runtime.getRuntime().addShutdownHook(new Thread() {
+      @Override
       public void run() {
         LOG.info(toStartupShutdownString("SHUTDOWN_MSG: ", new String[]{
           "Shutting down " + classname + " at " + hostname}));

Modified: hadoop/core/trunk/src/test/org/apache/hadoop/util/TestStringUtils.java
URL: http://svn.apache.org/viewvc/hadoop/core/trunk/src/test/org/apache/hadoop/util/TestStringUtils.java?rev=752496&r1=752495&r2=752496&view=diff
==============================================================================
--- hadoop/core/trunk/src/test/org/apache/hadoop/util/TestStringUtils.java (original)
+++ hadoop/core/trunk/src/test/org/apache/hadoop/util/TestStringUtils.java Wed Mar 11 16:19:36 2009
@@ -118,4 +118,89 @@
     assertEquals(-1259520L, StringUtils.TraditionalBinaryPrefix.string2long("-1230k"));
     assertEquals(956703965184L, StringUtils.TraditionalBinaryPrefix.string2long("891g"));
   }
+  
+  private <T> void assertEquals(T[] expected, T[] actual) {
+    assertEquals(expected.length, actual.length);
+    for (int i = 0; i < expected.length; i++) {
+      assertEquals(expected[i], actual[i]);
+    }
+  }
+  
+  //internal to StringUtils
+  private static final String NULL_STR_VALUE = "__null__";
+  
+  public void testArrayToString() {
+    
+    //normal test
+    String[] arr1 = new String[] {"1", "2", "3", "4", "5", "6" }; 
+    String expected1 = "1,2,3,4,5,6";
+    assertEquals(expected1, StringUtils.arrayToString(arr1));
+    
+    //test with whitespace
+    String[] arr2 = new String[] {"1 ", "2 ", "3 ", "4 ", "5 ", "6 " }; 
+    String expected2 = "1 ,2 ,3 ,4 ,5 ,6 ";
+    assertEquals(expected2, StringUtils.arrayToString(arr2));
+    
+    //test with empty array
+    String[] emptyArr = new String[0];
+    assertEquals("", StringUtils.arrayToString(emptyArr));
+    
+    //test with null
+    try {
+      StringUtils.arrayToString(null);
+      fail("Should have thrown NPE");
+    }catch(NullPointerException ex) {
+    }
+    
+    //test with one element 
+    assertEquals("1", StringUtils.arrayToString(new String[] {"1"}));
+    assertEquals("", StringUtils.arrayToString(new String[] {""}));
+    assertEquals(" ", StringUtils.arrayToString(new String[] {" "}));
+    
+    
+    assertEquals(" ,1", StringUtils.arrayToString(new String[] {" ", "1"}));
+    
+    //test with null values
+    assertEquals(NULL_STR_VALUE, StringUtils.arrayToString(new String[] {null}));
+    assertEquals(NULL_STR_VALUE+",1", StringUtils.arrayToString(new String[] {null,"1"}));
+    assertEquals("1," + NULL_STR_VALUE, StringUtils.arrayToString(new String[] {"1",null}));
+    
+  }
+  
+  public void testArrayToStringToArray() {
+    
+    //normal test
+    String[] arr1 = new String[] {"1", "2", "3", "4", "5", "6" };
+    assertEquals(arr1, StringUtils.getStrings(StringUtils.arrayToString(arr1)));
+    
+    //test with whitespace
+    String[] arr2 = new String[] {"1 ", "2 ", "3 ", "4 ", "5 ", "6 " }; 
+    assertEquals(arr2, StringUtils.getStrings(StringUtils.arrayToString(arr2)));
+    
+    //test with empty array
+    String[] emptyArr = new String[0];
+    //actually returns null for empty array
+    assertNull(StringUtils.getStrings(StringUtils.arrayToString(emptyArr)));
+    
+    //test with one element 
+    String[] one = new String[] {"1"};
+    String[] empty = new String[] {""};
+    String[] ws = new String[] {" "};
+    assertEquals(one, StringUtils.getStrings(StringUtils.arrayToString(one)));
+    assertNull(StringUtils.getStrings(StringUtils.arrayToString(empty)));
+    assertEquals(ws, StringUtils.getStrings(StringUtils.arrayToString(ws)));
+    
+    String[] wsone = new String[] {" ", "1"};
+    assertEquals(wsone, StringUtils.getStrings(StringUtils.arrayToString(wsone)));
+    
+    //test with null values
+    String[] nullArr = new String[] {null};
+    String[] nullArr2 =  new String[] {null, "1"};
+    String[] nullArr3 =  new String[] {null, "null", null};
+    String[] nullArr4 =  new String[] {null, null, null};
+    assertEquals(nullArr, StringUtils.getStrings(StringUtils.arrayToString(nullArr)));
+    assertEquals(nullArr2, StringUtils.getStrings(StringUtils.arrayToString(nullArr2)));
+    assertEquals(nullArr4, StringUtils.getStrings(StringUtils.arrayToString(nullArr4)));
+  }
+  
 }