diff --git a/CHANGES.txt b/CHANGES.txt index fa9f4282cbc..2d358c2475c 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -355,6 +355,8 @@ Release 0.21.0 - Unreleased (Ferdy via Stack) HBASE-2189 HCM trashes meta cache even when not needed HBASE-2190 HRS should report to master when HMsg are available + HBASE-2209 Support of List [ ] in HBaseOutputWritable for serialization + (Kay Kay via Stack) NEW FEATURES HBASE-1961 HBase EC2 scripts diff --git a/src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java b/src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java index e8e35a76524..45cde47917a 100644 --- a/src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java +++ b/src/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java @@ -22,7 +22,11 @@ import java.io.DataInput; 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 @@ public class HbaseObjectWritable implements Writable, Configurable { 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 @@ public class HbaseObjectWritable implements Writable, Configurable { 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 @@ public class HbaseObjectWritable implements Writable, Configurable { 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 @@ public class HbaseObjectWritable implements Writable, Configurable { 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 diff --git a/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java b/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java index 793a6f1f86c..28361fb6606 100644 --- a/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java +++ b/src/java/org/apache/hadoop/hbase/ipc/HBaseRPCProtocolVersion.java @@ -73,7 +73,8 @@ public interface HBaseRPCProtocolVersion extends VersionedProtocol { *