Thrift generation for Java

Summary: Java works, benchmark roundtrip at around 3ms, so right in between C++ and PHP


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@664775 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/protocol/TBinaryProtocol.java b/lib/java/src/protocol/TBinaryProtocol.java
index a759005..d90dece 100644
--- a/lib/java/src/protocol/TBinaryProtocol.java
+++ b/lib/java/src/protocol/TBinaryProtocol.java
@@ -9,13 +9,23 @@
  * @author Mark Slee <mcslee@facebook.com>
  */
 public class TBinaryProtocol implements TProtocol {
+
+  public void writeMessageBegin(TTransport out, TMessage message) throws TException {
+    writeString(out, message.name);
+    writeByte(out, message.type);
+    writeI32(out, message.seqid);
+  }
+
+  public void writeMessageEnd(TTransport out) throws TException {}
+
+
   public void writeStructBegin(TTransport out, TStruct struct) throws TException {}
 
   public void writeStructEnd(TTransport out) throws TException {}
 
   public void writeFieldBegin(TTransport out, TField field) throws TException {
     writeByte(out, field.type);
-    writeI32(out, field.id);
+    writeI16(out, field.id);
   }
 
   public void writeFieldEnd(TTransport out) throws TException {}
@@ -46,14 +56,21 @@
 
   public void writeSetEnd(TTransport out) throws TException {}
 
+  public void writeBool(TTransport out, boolean b) throws TException {
+    writeByte(out, b ? (byte)1 : (byte)0);
+  }
+
   byte[] bout = new byte[1];
   public void writeByte(TTransport out, byte b) throws TException {
     bout[0] = b;
     out.write(bout, 0, 1);
   }
 
-  public void writeU32(TTransport out, int u32) throws TException {
-    writeI32(out, u32);
+  byte[] i16out = new byte[2];
+  public void writeI16(TTransport out, short i16) throws TException {
+    i16out[0] = (byte)(0xff & (i16 >> 8));
+    i16out[1] = (byte)(0xff & (i16));
+    out.write(i16out, 0, 2);
   }
 
   byte[] i32out = new byte[4];
@@ -65,10 +82,6 @@
     out.write(i32out, 0, 4);
   }
 
-  public void writeU64(TTransport out, long u64) throws TException {
-    writeI64(out, u64);
-  }
-
   byte[] i64out = new byte[8];
   public void writeI64(TTransport out, long i64) throws TException {
     i64out[0] = (byte)(0xff & (i64 >> 56));
@@ -92,6 +105,16 @@
    * Reading methods.
    */
 
+  public TMessage readMessageBegin(TTransport in) throws TException {
+    TMessage message = new TMessage();
+    message.name = readString(in);
+    message.type = readByte(in);
+    message.seqid = readI32(in);
+    return message;
+  }
+
+  public void readMessageEnd(TTransport in) throws TException {}
+
   public TStruct readStructBegin(TTransport in) throws TException {
     return new TStruct();
   }
@@ -102,7 +125,7 @@
     TField field = new TField();
     field.type = readByte(in);
     if (field.type != TType.STOP) {
-      field.id = readI32(in);
+      field.id = readI16(in);
     }
     return field;
   }
@@ -137,14 +160,23 @@
 
   public void readSetEnd(TTransport in) throws TException {}
 
+  public boolean readBool(TTransport in) throws TException {
+    return (readByte(in) == 1);
+  }
+
   byte[] bin = new byte[1];
   public byte readByte(TTransport in) throws TException {
     in.readAll(bin, 0, 1);
     return bin[0];
   }
 
-  public int readU32(TTransport in) throws TException {
-    return readI32(in);
+  byte[] i16rd = new byte[2];
+  public short readI16(TTransport in) throws TException {
+    in.readAll(i16rd, 0, 2);
+    return
+      (short)
+      (((i16rd[0] & 0xff) << 8) |
+       ((i16rd[1] & 0xff)));
   }
 
   byte[] i32rd = new byte[4];
@@ -156,11 +188,7 @@
       ((i32rd[2] & 0xff) <<  8) |
       ((i32rd[3] & 0xff));
   }
-
-  public long readU64(TTransport in) throws TException {
-    return readI64(in);
-  }
-  
+ 
   byte[] i64rd = new byte[8];
   public long readI64(TTransport in) throws TException {
     in.readAll(i64rd, 0, 8);