Index: conf/configuration.xsl =================================================================== Index: src/test/org/apache/hadoop/hbase/io/TestHbaseObjectWritable.java =================================================================== --- src/test/org/apache/hadoop/hbase/io/TestHbaseObjectWritable.java (revision 908343) +++ src/test/org/apache/hadoop/hbase/io/TestHbaseObjectWritable.java (working copy) @@ -25,6 +25,8 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import junit.framework.TestCase; @@ -33,6 +35,7 @@ import org.apache.hadoop.hbase.filter.PrefixFilter; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.WritableComparator; +import org.junit.Assert; public class TestHbaseObjectWritable extends TestCase { @@ -74,6 +77,22 @@ // Do 'known' Writable type. obj = doType(conf, new Text(""), Text.class); assertTrue(obj instanceof Text); + //List.class + List list = new ArrayList(); + list.add("hello"); + list.add("world"); + list.add("universe"); + obj = doType(conf, list, List.class); + assertTrue(obj instanceof List); + Assert.assertArrayEquals(list.toArray(), ((List)obj).toArray() ); + //ArrayList.class + ArrayList arr = new ArrayList(); + arr.add("hello"); + arr.add("world"); + arr.add("universe"); + obj = doType(conf, arr, ArrayList.class); + assertTrue(obj instanceof ArrayList); + Assert.assertArrayEquals(list.toArray(), ((ArrayList)obj).toArray() ); // Check that filters can be serialized obj = doType(conf, new PrefixFilter(HConstants.EMPTY_BYTE_ARRAY), PrefixFilter.class); @@ -94,4 +113,5 @@ dis.close(); return product; } + } \ No newline at end of file Index: src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java =================================================================== --- src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java (revision 908343) +++ src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java (working copy) @@ -22,7 +22,11 @@ import java.io.DataOutput; import java.io.IOException; import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import java.util.Map; import org.apache.commons.logging.Log; @@ -156,6 +160,9 @@ addToMap(HLog.Entry.class, code++); addToMap(HLog.Entry[].class, code++); addToMap(HLogKey.class, code++); + + // List + addToMap(List.class, code++); } private Class declaredClass; @@ -248,6 +255,11 @@ static void writeClassCode(final DataOutput out, final Class c) throws IOException { Byte code = CLASS_TO_CODE.get(c); + if (code == null ) { + if ( List.class.isAssignableFrom(c)) { + code = CLASS_TO_CODE.get(List.class); + } + } if (code == null) { LOG.error("Unsupported type " + c); StackTraceElement[] els = new Exception().getStackTrace(); @@ -299,6 +311,14 @@ declClass.getComponentType(), conf); } } + } else if (List.class.isAssignableFrom(declClass)) { + List list = (List)instanceObj; + int length = list.size(); + out.writeInt(length); + for (int i = 0; i < length; i++) { + writeObject(out, list.get(i), + list.get(i).getClass(), conf); + } } else if (declClass == String.class) { // String Text.writeString(out, (String)instanceObj); } else if (declClass.isPrimitive()) { // primitive type @@ -402,6 +422,12 @@ Array.set(instance, i, readObject(in, conf)); } } + } else if (List.class.isAssignableFrom(declaredClass)) { // List + int length = in.readInt(); + instance = new ArrayList(length); + for (int i = 0; i < length; i++) { + ((ArrayList)instance).add(readObject(in, conf)); + } } else if (declaredClass == String.class) { // String instance = Text.readString(in); } else if (declaredClass.isEnum()) { // enum Index: src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java =================================================================== --- src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java (revision 908343) +++ src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java (working copy) @@ -73,7 +73,8 @@ *
  • Version 19: Added getClusterStatus().
  • *
  • Version 20: Backed Transaction HBase out of HBase core.
  • *
  • Version 21: HBASE-1665.
  • + *
  • Version 22: HBASE-2209. Added List support to RPC
  • * */ - public static final long versionID = 21L; + public static final long versionID = 22L; }