THRIFT-4177 fix java deep copy
Client: Java

Java compiler produces deep copy constructor that could make shallow copy accidentally.

This closes #1254
diff --git a/lib/java/build.xml b/lib/java/build.xml
index 6af9f27..e40eafa 100644
--- a/lib/java/build.xml
+++ b/lib/java/build.xml
@@ -287,6 +287,9 @@
     <exec executable="${thrift.compiler}" failonerror="true">
       <arg line="--gen java:reuse-objects -out ${genreuse} ${test.thrift.home}/ReuseObjects.thrift"/>
     </exec>
+    <exec executable="${thrift.compiler}" failonerror="true">
+      <arg line="--gen java ${test.thrift.home}/JavaDeepCopyTest.thrift"/>
+    </exec>
   </target>
 
   <target name="proxy" if="proxy.enabled">
diff --git a/lib/java/test/org/apache/thrift/TestDeepCopy.java b/lib/java/test/org/apache/thrift/TestDeepCopy.java
new file mode 100644
index 0000000..acafaef
--- /dev/null
+++ b/lib/java/test/org/apache/thrift/TestDeepCopy.java
@@ -0,0 +1,34 @@
+package org.apache.thrift;
+
+import junit.framework.TestCase;
+import thrift.test.DeepCopyBar;
+import thrift.test.DeepCopyFoo;
+
+public class TestDeepCopy extends TestCase {
+
+  public void testDeepCopy() throws Exception {
+    final DeepCopyFoo foo = new DeepCopyFoo();
+
+    foo.addToL(new DeepCopyBar());
+    foo.addToS(new DeepCopyBar());
+    foo.putToM("test 3", new DeepCopyBar());
+
+    foo.addToLi(new thrift.test.Object());
+    foo.addToSi(new thrift.test.Object());
+    foo.putToMi("test 3", new thrift.test.Object());
+
+    foo.setBar(new DeepCopyBar());
+
+    final DeepCopyFoo deepCopyFoo = foo.deepCopy();
+
+    assertNotSame(foo.getBar(), deepCopyFoo.getBar());
+
+    assertNotSame(foo.getL().get(0),                          deepCopyFoo.getL().get(0));
+    assertNotSame(foo.getS().toArray(new DeepCopyBar[0])[0],  deepCopyFoo.getS().toArray(new DeepCopyBar[0])[0]);
+    assertNotSame(foo.getM().get("test 3"),                   deepCopyFoo.getM().get("test 3"));
+
+    assertNotSame(foo.getLi().get(0),                                 deepCopyFoo.getLi().get(0));
+    assertNotSame(foo.getSi().toArray(new thrift.test.Object[0])[0],  deepCopyFoo.getSi().toArray(new thrift.test.Object[0])[0]);
+    assertNotSame(foo.getMi().get("test 3"),                          deepCopyFoo.getMi().get("test 3"));
+  }
+}