/**
 * Autogenerated by Thrift Compiler (0.7.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 */
package com.cloudera.beeswax.api;

import org.apache.commons.lang.builder.HashCodeBuilder;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import java.util.Collections;
import java.util.BitSet;
import java.nio.ByteBuffer;
import java.util.Arrays;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class BeeswaxException extends Exception implements org.apache.thrift.TBase<BeeswaxException, BeeswaxException._Fields>, java.io.Serializable, Cloneable {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("BeeswaxException");

  private static final org.apache.thrift.protocol.TField MESSAGE_FIELD_DESC = new org.apache.thrift.protocol.TField("message", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField LOG_CONTEXT_FIELD_DESC = new org.apache.thrift.protocol.TField("log_context", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField HANDLE_FIELD_DESC = new org.apache.thrift.protocol.TField("handle", org.apache.thrift.protocol.TType.STRUCT, (short)3);
  private static final org.apache.thrift.protocol.TField ERROR_CODE_FIELD_DESC = new org.apache.thrift.protocol.TField("errorCode", org.apache.thrift.protocol.TType.I32, (short)4);
  private static final org.apache.thrift.protocol.TField SQLSTATE_FIELD_DESC = new org.apache.thrift.protocol.TField("SQLState", org.apache.thrift.protocol.TType.STRING, (short)5);

  public String message; // required
  public String log_context; // required
  public QueryHandle handle; // required
  public int errorCode; // required
  public String SQLState; // required

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
    MESSAGE((short)1, "message"),
    LOG_CONTEXT((short)2, "log_context"),
    HANDLE((short)3, "handle"),
    ERROR_CODE((short)4, "errorCode"),
    SQLSTATE((short)5, "SQLState");

    private static final Map<String, _Fields> byName = new HashMap<String, _Fields>();

    static {
      for (_Fields field : EnumSet.allOf(_Fields.class)) {
        byName.put(field.getFieldName(), field);
      }
    }

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // MESSAGE
          return MESSAGE;
        case 2: // LOG_CONTEXT
          return LOG_CONTEXT;
        case 3: // HANDLE
          return HANDLE;
        case 4: // ERROR_CODE
          return ERROR_CODE;
        case 5: // SQLSTATE
          return SQLSTATE;
        default:
          return null;
      }
    }

    /**
     * Find the _Fields constant that matches fieldId, throwing an exception
     * if it is not found.
     */
    public static _Fields findByThriftIdOrThrow(int fieldId) {
      _Fields fields = findByThriftId(fieldId);
      if (fields == null) throw new IllegalArgumentException("Field " + fieldId + " doesn't exist!");
      return fields;
    }

    /**
     * Find the _Fields constant that matches name, or null if its not found.
     */
    public static _Fields findByName(String name) {
      return byName.get(name);
    }

    private final short _thriftId;
    private final String _fieldName;

    _Fields(short thriftId, String fieldName) {
      _thriftId = thriftId;
      _fieldName = fieldName;
    }

    public short getThriftFieldId() {
      return _thriftId;
    }

    public String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __ERRORCODE_ISSET_ID = 0;
  private BitSet __isset_bit_vector = new BitSet(1);

  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.MESSAGE, new org.apache.thrift.meta_data.FieldMetaData("message", org.apache.thrift.TFieldRequirementType.DEFAULT, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.LOG_CONTEXT, new org.apache.thrift.meta_data.FieldMetaData("log_context", org.apache.thrift.TFieldRequirementType.DEFAULT, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING        , "LogContextId")));
    tmpMap.put(_Fields.HANDLE, new org.apache.thrift.meta_data.FieldMetaData("handle", org.apache.thrift.TFieldRequirementType.DEFAULT, 
        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, QueryHandle.class)));
    tmpMap.put(_Fields.ERROR_CODE, new org.apache.thrift.meta_data.FieldMetaData("errorCode", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    tmpMap.put(_Fields.SQLSTATE, new org.apache.thrift.meta_data.FieldMetaData("SQLState", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    metaDataMap = Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(BeeswaxException.class, metaDataMap);
  }

  public BeeswaxException() {
    this.errorCode = 0;

    this.SQLState = "     ";

  }

  public BeeswaxException(
    String message,
    String log_context,
    QueryHandle handle)
  {
    this();
    this.message = message;
    this.log_context = log_context;
    this.handle = handle;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public BeeswaxException(BeeswaxException other) {
    __isset_bit_vector.clear();
    __isset_bit_vector.or(other.__isset_bit_vector);
    if (other.isSetMessage()) {
      this.message = other.message;
    }
    if (other.isSetLog_context()) {
      this.log_context = other.log_context;
    }
    if (other.isSetHandle()) {
      this.handle = new QueryHandle(other.handle);
    }
    this.errorCode = other.errorCode;
    if (other.isSetSQLState()) {
      this.SQLState = other.SQLState;
    }
  }

  public BeeswaxException deepCopy() {
    return new BeeswaxException(this);
  }

  @Override
  public void clear() {
    this.message = null;
    this.log_context = null;
    this.handle = null;
    this.errorCode = 0;

    this.SQLState = "     ";

  }

  public String getMessage() {
    return this.message;
  }

  public BeeswaxException setMessage(String message) {
    this.message = message;
    return this;
  }

  public void unsetMessage() {
    this.message = null;
  }

  /** Returns true if field message is set (has been assigned a value) and false otherwise */
  public boolean isSetMessage() {
    return this.message != null;
  }

  public void setMessageIsSet(boolean value) {
    if (!value) {
      this.message = null;
    }
  }

  public String getLog_context() {
    return this.log_context;
  }

  public BeeswaxException setLog_context(String log_context) {
    this.log_context = log_context;
    return this;
  }

  public void unsetLog_context() {
    this.log_context = null;
  }

  /** Returns true if field log_context is set (has been assigned a value) and false otherwise */
  public boolean isSetLog_context() {
    return this.log_context != null;
  }

  public void setLog_contextIsSet(boolean value) {
    if (!value) {
      this.log_context = null;
    }
  }

  public QueryHandle getHandle() {
    return this.handle;
  }

  public BeeswaxException setHandle(QueryHandle handle) {
    this.handle = handle;
    return this;
  }

  public void unsetHandle() {
    this.handle = null;
  }

  /** Returns true if field handle is set (has been assigned a value) and false otherwise */
  public boolean isSetHandle() {
    return this.handle != null;
  }

  public void setHandleIsSet(boolean value) {
    if (!value) {
      this.handle = null;
    }
  }

  public int getErrorCode() {
    return this.errorCode;
  }

  public BeeswaxException setErrorCode(int errorCode) {
    this.errorCode = errorCode;
    setErrorCodeIsSet(true);
    return this;
  }

  public void unsetErrorCode() {
    __isset_bit_vector.clear(__ERRORCODE_ISSET_ID);
  }

  /** Returns true if field errorCode is set (has been assigned a value) and false otherwise */
  public boolean isSetErrorCode() {
    return __isset_bit_vector.get(__ERRORCODE_ISSET_ID);
  }

  public void setErrorCodeIsSet(boolean value) {
    __isset_bit_vector.set(__ERRORCODE_ISSET_ID, value);
  }

  public String getSQLState() {
    return this.SQLState;
  }

  public BeeswaxException setSQLState(String SQLState) {
    this.SQLState = SQLState;
    return this;
  }

  public void unsetSQLState() {
    this.SQLState = null;
  }

  /** Returns true if field SQLState is set (has been assigned a value) and false otherwise */
  public boolean isSetSQLState() {
    return this.SQLState != null;
  }

  public void setSQLStateIsSet(boolean value) {
    if (!value) {
      this.SQLState = null;
    }
  }

  public void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case MESSAGE:
      if (value == null) {
        unsetMessage();
      } else {
        setMessage((String)value);
      }
      break;

    case LOG_CONTEXT:
      if (value == null) {
        unsetLog_context();
      } else {
        setLog_context((String)value);
      }
      break;

    case HANDLE:
      if (value == null) {
        unsetHandle();
      } else {
        setHandle((QueryHandle)value);
      }
      break;

    case ERROR_CODE:
      if (value == null) {
        unsetErrorCode();
      } else {
        setErrorCode((Integer)value);
      }
      break;

    case SQLSTATE:
      if (value == null) {
        unsetSQLState();
      } else {
        setSQLState((String)value);
      }
      break;

    }
  }

  public Object getFieldValue(_Fields field) {
    switch (field) {
    case MESSAGE:
      return getMessage();

    case LOG_CONTEXT:
      return getLog_context();

    case HANDLE:
      return getHandle();

    case ERROR_CODE:
      return Integer.valueOf(getErrorCode());

    case SQLSTATE:
      return getSQLState();

    }
    throw new IllegalStateException();
  }

  /** Returns true if field corresponding to fieldID is set (has been assigned a value) and false otherwise */
  public boolean isSet(_Fields field) {
    if (field == null) {
      throw new IllegalArgumentException();
    }

    switch (field) {
    case MESSAGE:
      return isSetMessage();
    case LOG_CONTEXT:
      return isSetLog_context();
    case HANDLE:
      return isSetHandle();
    case ERROR_CODE:
      return isSetErrorCode();
    case SQLSTATE:
      return isSetSQLState();
    }
    throw new IllegalStateException();
  }

  @Override
  public boolean equals(Object that) {
    if (that == null)
      return false;
    if (that instanceof BeeswaxException)
      return this.equals((BeeswaxException)that);
    return false;
  }

  public boolean equals(BeeswaxException that) {
    if (that == null)
      return false;

    boolean this_present_message = true && this.isSetMessage();
    boolean that_present_message = true && that.isSetMessage();
    if (this_present_message || that_present_message) {
      if (!(this_present_message && that_present_message))
        return false;
      if (!this.message.equals(that.message))
        return false;
    }

    boolean this_present_log_context = true && this.isSetLog_context();
    boolean that_present_log_context = true && that.isSetLog_context();
    if (this_present_log_context || that_present_log_context) {
      if (!(this_present_log_context && that_present_log_context))
        return false;
      if (!this.log_context.equals(that.log_context))
        return false;
    }

    boolean this_present_handle = true && this.isSetHandle();
    boolean that_present_handle = true && that.isSetHandle();
    if (this_present_handle || that_present_handle) {
      if (!(this_present_handle && that_present_handle))
        return false;
      if (!this.handle.equals(that.handle))
        return false;
    }

    boolean this_present_errorCode = true && this.isSetErrorCode();
    boolean that_present_errorCode = true && that.isSetErrorCode();
    if (this_present_errorCode || that_present_errorCode) {
      if (!(this_present_errorCode && that_present_errorCode))
        return false;
      if (this.errorCode != that.errorCode)
        return false;
    }

    boolean this_present_SQLState = true && this.isSetSQLState();
    boolean that_present_SQLState = true && that.isSetSQLState();
    if (this_present_SQLState || that_present_SQLState) {
      if (!(this_present_SQLState && that_present_SQLState))
        return false;
      if (!this.SQLState.equals(that.SQLState))
        return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    HashCodeBuilder builder = new HashCodeBuilder();

    boolean present_message = true && (isSetMessage());
    builder.append(present_message);
    if (present_message)
      builder.append(message);

    boolean present_log_context = true && (isSetLog_context());
    builder.append(present_log_context);
    if (present_log_context)
      builder.append(log_context);

    boolean present_handle = true && (isSetHandle());
    builder.append(present_handle);
    if (present_handle)
      builder.append(handle);

    boolean present_errorCode = true && (isSetErrorCode());
    builder.append(present_errorCode);
    if (present_errorCode)
      builder.append(errorCode);

    boolean present_SQLState = true && (isSetSQLState());
    builder.append(present_SQLState);
    if (present_SQLState)
      builder.append(SQLState);

    return builder.toHashCode();
  }

  public int compareTo(BeeswaxException other) {
    if (!getClass().equals(other.getClass())) {
      return getClass().getName().compareTo(other.getClass().getName());
    }

    int lastComparison = 0;
    BeeswaxException typedOther = (BeeswaxException)other;

    lastComparison = Boolean.valueOf(isSetMessage()).compareTo(typedOther.isSetMessage());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetMessage()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.message, typedOther.message);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetLog_context()).compareTo(typedOther.isSetLog_context());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetLog_context()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.log_context, typedOther.log_context);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetHandle()).compareTo(typedOther.isSetHandle());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetHandle()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.handle, typedOther.handle);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetErrorCode()).compareTo(typedOther.isSetErrorCode());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetErrorCode()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.errorCode, typedOther.errorCode);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetSQLState()).compareTo(typedOther.isSetSQLState());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetSQLState()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.SQLState, typedOther.SQLState);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

  public _Fields fieldForId(int fieldId) {
    return _Fields.findByThriftId(fieldId);
  }

  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
    org.apache.thrift.protocol.TField field;
    iprot.readStructBegin();
    while (true)
    {
      field = iprot.readFieldBegin();
      if (field.type == org.apache.thrift.protocol.TType.STOP) { 
        break;
      }
      switch (field.id) {
        case 1: // MESSAGE
          if (field.type == org.apache.thrift.protocol.TType.STRING) {
            this.message = iprot.readString();
          } else { 
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
          }
          break;
        case 2: // LOG_CONTEXT
          if (field.type == org.apache.thrift.protocol.TType.STRING) {
            this.log_context = iprot.readString();
          } else { 
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
          }
          break;
        case 3: // HANDLE
          if (field.type == org.apache.thrift.protocol.TType.STRUCT) {
            this.handle = new QueryHandle();
            this.handle.read(iprot);
          } else { 
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
          }
          break;
        case 4: // ERROR_CODE
          if (field.type == org.apache.thrift.protocol.TType.I32) {
            this.errorCode = iprot.readI32();
            setErrorCodeIsSet(true);
          } else { 
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
          }
          break;
        case 5: // SQLSTATE
          if (field.type == org.apache.thrift.protocol.TType.STRING) {
            this.SQLState = iprot.readString();
          } else { 
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
          }
          break;
        default:
          org.apache.thrift.protocol.TProtocolUtil.skip(iprot, field.type);
      }
      iprot.readFieldEnd();
    }
    iprot.readStructEnd();

    // check for required fields of primitive type, which can't be checked in the validate method
    validate();
  }

  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
    validate();

    oprot.writeStructBegin(STRUCT_DESC);
    if (this.message != null) {
      oprot.writeFieldBegin(MESSAGE_FIELD_DESC);
      oprot.writeString(this.message);
      oprot.writeFieldEnd();
    }
    if (this.log_context != null) {
      oprot.writeFieldBegin(LOG_CONTEXT_FIELD_DESC);
      oprot.writeString(this.log_context);
      oprot.writeFieldEnd();
    }
    if (this.handle != null) {
      oprot.writeFieldBegin(HANDLE_FIELD_DESC);
      this.handle.write(oprot);
      oprot.writeFieldEnd();
    }
    if (isSetErrorCode()) {
      oprot.writeFieldBegin(ERROR_CODE_FIELD_DESC);
      oprot.writeI32(this.errorCode);
      oprot.writeFieldEnd();
    }
    if (this.SQLState != null) {
      if (isSetSQLState()) {
        oprot.writeFieldBegin(SQLSTATE_FIELD_DESC);
        oprot.writeString(this.SQLState);
        oprot.writeFieldEnd();
      }
    }
    oprot.writeFieldStop();
    oprot.writeStructEnd();
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("BeeswaxException(");
    boolean first = true;

    sb.append("message:");
    if (this.message == null) {
      sb.append("null");
    } else {
      sb.append(this.message);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("log_context:");
    if (this.log_context == null) {
      sb.append("null");
    } else {
      sb.append(this.log_context);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("handle:");
    if (this.handle == null) {
      sb.append("null");
    } else {
      sb.append(this.handle);
    }
    first = false;
    if (isSetErrorCode()) {
      if (!first) sb.append(", ");
      sb.append("errorCode:");
      sb.append(this.errorCode);
      first = false;
    }
    if (isSetSQLState()) {
      if (!first) sb.append(", ");
      sb.append("SQLState:");
      if (this.SQLState == null) {
        sb.append("null");
      } else {
        sb.append(this.SQLState);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws org.apache.thrift.TException {
    // check for required fields
  }

  private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException {
    try {
      write(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(out)));
    } catch (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
    try {
      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
      __isset_bit_vector = new BitSet(1);
      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
    } catch (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

}

