THRIFT-1015. java: TUnion does not handle ByteBuffer in toString

This patch adds a test case and fixes the toString method of TBaseHelper for ByteBuffers.

Patch: Takashi Yonebayashi

git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1041590 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/org/apache/thrift/TUnion.java b/lib/java/src/org/apache/thrift/TUnion.java
index e33c7f2..cfe910b 100644
--- a/lib/java/src/org/apache/thrift/TUnion.java
+++ b/lib/java/src/org/apache/thrift/TUnion.java
@@ -104,7 +104,7 @@
     if (fieldId != setField_) {
       throw new IllegalArgumentException("Cannot get the value of field " + fieldId + " because union's set field is " + setField_);
     }
-    
+
     return getFieldValue();
   }
 
@@ -115,7 +115,7 @@
   public boolean isSet() {
     return setField_ != null;
   }
-  
+
   public boolean isSet(F fieldId) {
     return setField_ == fieldId;
   }
@@ -193,35 +193,22 @@
 
   @Override
   public String toString() {
-    String result = "<" + this.getClass().getSimpleName() + " ";
+    StringBuilder sb = new StringBuilder();
+    sb.append("<");
+    sb.append(this.getClass().getSimpleName());
+    sb.append(" ");
 
     if (getSetField() != null) {
       Object v = getFieldValue();
-      String vStr = null;
-      if (v instanceof byte[]) {
-        vStr = bytesToStr((byte[])v);
+      sb.append(getFieldDesc(getSetField()).name);
+      sb.append(":");
+      if(v instanceof ByteBuffer) {
+        TBaseHelper.toString((ByteBuffer)v, sb);
       } else {
-        vStr = v.toString();
+        sb.append(v.toString());
       }
-      result += getFieldDesc(getSetField()).name + ":" + vStr;
     }
-
-    return result + ">";
-  }
-
-  private static String bytesToStr(byte[] bytes) {
-    StringBuilder sb = new StringBuilder();
-    int size = Math.min(bytes.length, 128);
-    for (int i = 0; i < size; i++) {
-      if (i != 0) {
-        sb.append(" ");
-      }
-      String digit = Integer.toHexString(bytes[i] & 0xFF);
-      sb.append(digit.length() > 1 ? digit : "0" + digit);
-    }
-    if (bytes.length > 128) {
-      sb.append(" ...");
-    }
+    sb.append(">");
     return sb.toString();
   }
 
diff --git a/lib/java/test/org/apache/thrift/TestTUnion.java b/lib/java/test/org/apache/thrift/TestTUnion.java
index a9cb9c5..775db52 100644
--- a/lib/java/test/org/apache/thrift/TestTUnion.java
+++ b/lib/java/test/org/apache/thrift/TestTUnion.java
@@ -192,4 +192,12 @@
     assertEquals(cu, copy);
     assertNotSame(cu.bufferForBinary_field().array(), copy.bufferForBinary_field().array());
   }
+  
+  public void testToString() throws Exception {
+    byte[] bytes = {1, 2, 3};
+    ByteBuffer value = ByteBuffer.wrap(bytes);
+    ComparableUnion cu = ComparableUnion.binary_field(value);
+    String expectedString = "<ComparableUnion binary_field:01 02 03>";
+    assertEquals(expectedString, cu.toString());
+  }
 }