From 708971351fd0136dce390ad3d76bb9f3e76ef9f6 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Tue, 30 Nov 2010 00:33:48 +0000 Subject: [PATCH] THRIFT-1009. java: TUnion does not correctly deep copy a ByteBuffer This patch adds a case to deepCopyObject for ByteBuffer, along with a test case that verifies the change in functionality. git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1040358 13f79535-47bb-0310-9956-ffa450edef68 --- lib/java/src/org/apache/thrift/TUnion.java | 8 +++----- lib/java/test/org/apache/thrift/TestTUnion.java | 9 +++++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/java/src/org/apache/thrift/TUnion.java b/lib/java/src/org/apache/thrift/TUnion.java index 2af891b2..e33c7f21 100644 --- a/lib/java/src/org/apache/thrift/TUnion.java +++ b/lib/java/src/org/apache/thrift/TUnion.java @@ -23,6 +23,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.nio.ByteBuffer; import org.apache.thrift.protocol.TField; import org.apache.thrift.protocol.TProtocol; @@ -54,11 +55,8 @@ public abstract class TUnion implement private static Object deepCopyObject(Object o) { if (o instanceof TBase) { return ((TBase)o).deepCopy(); - } else if (o instanceof byte[]) { - byte[] other_val = (byte[])o; - byte[] this_val = new byte[other_val.length]; - System.arraycopy(other_val, 0, this_val, 0, other_val.length); - return this_val; + } else if (o instanceof ByteBuffer) { + return TBaseHelper.copyBinary((ByteBuffer)o); } else if (o instanceof List) { return deepCopyList((List)o); } else if (o instanceof Set) { diff --git a/lib/java/test/org/apache/thrift/TestTUnion.java b/lib/java/test/org/apache/thrift/TestTUnion.java index b6032cc3..a9cb9c56 100644 --- a/lib/java/test/org/apache/thrift/TestTUnion.java +++ b/lib/java/test/org/apache/thrift/TestTUnion.java @@ -183,4 +183,13 @@ public class TestTUnion extends TestCase { assertNull(tums.getSetField()); assertNull(tums.getFieldValue()); } + + public void testDeepCopy() throws Exception { + byte[] bytes = {1, 2, 3}; + ByteBuffer value = ByteBuffer.wrap(bytes); + ComparableUnion cu = ComparableUnion.binary_field(value); + ComparableUnion copy = cu.deepCopy(); + assertEquals(cu, copy); + assertNotSame(cu.bufferForBinary_field().array(), copy.bufferForBinary_field().array()); + } } -- 2.17.1