Thrift application exceptions in Java

Reviewed By: thrift


git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@665008 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lib/java/src/TApplicationException.java b/lib/java/src/TApplicationException.java
new file mode 100644
index 0000000..0890282
--- /dev/null
+++ b/lib/java/src/TApplicationException.java
@@ -0,0 +1,107 @@
+package com.facebook.thrift;
+
+import com.facebook.thrift.protocol.TField;
+import com.facebook.thrift.protocol.TProtocol;
+import com.facebook.thrift.protocol.TProtocolUtil;
+import com.facebook.thrift.protocol.TStruct;
+import com.facebook.thrift.protocol.TType;
+
+/**
+ * Application level exception
+ *
+ * @author Mark Slee <mcslee@facebook.com>
+ */
+public class TApplicationException extends TException {
+
+  public static final int UNKNOWN = 0;
+  public static final int UNKNOWN_METHOD = 1;
+  public static final int INVALID_MESSAGE_TYPE = 2;
+  public static final int WRONG_METHOD_NAME = 3;
+  public static final int BAD_SEQUENCE_ID = 4;
+  public static final int MISSING_RESULT = 5;
+
+  protected int type_ = 0;
+
+  public TApplicationException() {
+    super();
+  }
+
+  public TApplicationException(int type) {
+    super();
+    type_ = type;
+  }
+
+  public TApplicationException(int type, String message) {
+    super(message);
+    type_ = type;
+  }
+
+  public TApplicationException(String message) {
+    super(message);
+  }
+
+  public int getType() {
+    return type_;
+  }
+
+  public static TApplicationException read(TProtocol iprot) throws TException {
+    TField field;
+    TStruct struct = iprot.readStructBegin();
+
+    String message = null;
+    int type = UNKNOWN;
+
+    while (true) {
+      field = iprot.readFieldBegin();
+      if (field.type == TType.STOP) { 
+        break;
+      }
+      switch (field.id) {
+      case 1:
+        if (field.type == TType.STRING) {
+          message = iprot.readString();
+        } else { 
+          TProtocolUtil.skip(iprot, field.type);
+        }
+        break;
+      case 2:
+        if (field.type == TType.I32) {
+          type = iprot.readI32();
+        } else { 
+          TProtocolUtil.skip(iprot, field.type);
+        }
+        break;
+      default:
+        TProtocolUtil.skip(iprot, field.type);
+        break;
+      }
+      iprot.readFieldEnd();
+    }
+    iprot.readStructEnd();
+
+    return new TApplicationException(type, message);
+  }
+
+  public void write(TProtocol oprot) throws TException {
+    TStruct struct = new TStruct("TApplicationException");
+    TField field = new TField();
+    oprot.writeStructBegin(struct);
+    if (getMessage() != null) {
+      field.name = "message";
+      field.type = TType.STRING;
+      field.id = 1;
+      oprot.writeFieldBegin(field);
+      oprot.writeString(getMessage());
+      oprot.writeFieldEnd();
+    }
+    field.name = "type";
+    field.type = TType.I32;
+    field.id = 2;
+    oprot.writeFieldBegin(field);
+    oprot.writeI32(type_);
+    oprot.writeFieldEnd();
+    oprot.writeFieldStop();
+    oprot.writeStructEnd();
+
+  }
+}
diff --git a/lib/java/src/protocol/TMessageType.java b/lib/java/src/protocol/TMessageType.java
index 905f99a..0e0b8fd 100644
--- a/lib/java/src/protocol/TMessageType.java
+++ b/lib/java/src/protocol/TMessageType.java
@@ -8,4 +8,5 @@
 public final class TMessageType {
   public static final byte CALL  = 1;
   public static final byte REPLY = 2;
+  public static final byte EXCEPTION = 3;
 }