From e7b12c89e11d8339b1e508555720a21616e8bdbd Mon Sep 17 00:00:00 2001 From: Suresh Srinivas Date: Tue, 28 Aug 2012 13:05:31 +0000 Subject: [PATCH] HADOOP-8619. WritableComparator must implement no-arg constructor. Contributed by Chris Douglas. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1378120 13f79535-47bb-0310-9956-ffa450edef68 --- .../hadoop-common/CHANGES.txt | 3 ++ .../apache/hadoop/io/WritableComparator.java | 4 ++ .../serializer/TestWritableSerialization.java | 51 ++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) diff --git a/hadoop-common-project/hadoop-common/CHANGES.txt b/hadoop-common-project/hadoop-common/CHANGES.txt index 2482aa7156..fdecdc2027 100644 --- a/hadoop-common-project/hadoop-common/CHANGES.txt +++ b/hadoop-common-project/hadoop-common/CHANGES.txt @@ -98,6 +98,9 @@ Trunk (unreleased changes) HADOOP-8719. Workaround for kerberos-related log errors upon running any hadoop command on OSX. (Jianbin Wei via harsh) + HADOOP-8619. WritableComparator must implement no-arg constructor. + (Chris Douglas via Suresh) + BUG FIXES HADOOP-8177. MBeans shouldn't try to register when it fails to create MBeanName. diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/WritableComparator.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/WritableComparator.java index eb3c8d322c..9d4087f1cd 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/WritableComparator.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/WritableComparator.java @@ -87,6 +87,10 @@ public static synchronized void define(Class c, private final WritableComparable key2; private final DataInputBuffer buffer; + protected WritableComparator() { + this(null); + } + /** Construct for a {@link WritableComparable} implementation. */ protected WritableComparator(Class keyClass) { this(keyClass, false); diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/serializer/TestWritableSerialization.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/serializer/TestWritableSerialization.java index 28e37add5e..7ef5749bfb 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/serializer/TestWritableSerialization.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/io/serializer/TestWritableSerialization.java @@ -18,25 +18,34 @@ package org.apache.hadoop.io.serializer; +import java.io.Serializable; + +import org.apache.hadoop.io.DataInputBuffer; +import org.apache.hadoop.io.DataOutputBuffer; import static org.apache.hadoop.io.TestGenericWritable.CONF_TEST_KEY; import static org.apache.hadoop.io.TestGenericWritable.CONF_TEST_VALUE; -import junit.framework.TestCase; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.TestGenericWritable.Baz; import org.apache.hadoop.io.TestGenericWritable.FooGenericWritable; +import org.apache.hadoop.io.WritableComparator; -public class TestWritableSerialization extends TestCase { +import org.junit.Test; +import static org.junit.Assert.*; + +public class TestWritableSerialization { private static final Configuration conf = new Configuration(); + @Test public void testWritableSerialization() throws Exception { Text before = new Text("test writable"); Text after = SerializationTestUtil.testSerialization(conf, before); assertEquals(before, after); } + @Test public void testWritableConfigurable() throws Exception { //set the configuration parameter @@ -52,4 +61,42 @@ public void testWritableConfigurable() throws Exception { assertEquals(baz, result); assertNotNull(result.getConf()); } + + @Test + @SuppressWarnings({"rawtypes", "unchecked"}) + public void testWritableComparatorJavaSerialization() throws Exception { + Serialization ser = new JavaSerialization(); + + Serializer serializer = ser.getSerializer(TestWC.class); + DataOutputBuffer dob = new DataOutputBuffer(); + serializer.open(dob); + TestWC orig = new TestWC(0); + serializer.serialize(orig); + serializer.close(); + + Deserializer deserializer = ser.getDeserializer(TestWC.class); + DataInputBuffer dib = new DataInputBuffer(); + dib.reset(dob.getData(), 0, dob.getLength()); + deserializer.open(dib); + TestWC deser = deserializer.deserialize(null); + deserializer.close(); + assertEquals(orig, deser); + } + + static class TestWC extends WritableComparator implements Serializable { + static final long serialVersionUID = 0x4344; + final int val; + TestWC() { this(7); } + TestWC(int val) { this.val = val; } + @Override + public boolean equals(Object o) { + if (o instanceof TestWC) { + return ((TestWC)o).val == val; + } + return false; + } + @Override + public int hashCode() { return val; } + } + }