/**
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * Autogenerated by Thrift Compiler (0.18.1)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.airavata.model.tenant;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.18.1)")
public class Tenant implements org.apache.thrift.TBase<Tenant, Tenant._Fields>, java.io.Serializable, Cloneable, Comparable<Tenant> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("Tenant");

  private static final org.apache.thrift.protocol.TField TENANT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("tenantId", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField TENANT_APPROVAL_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("tenantApprovalStatus", org.apache.thrift.protocol.TType.I32, (short)2);
  private static final org.apache.thrift.protocol.TField TENANT_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("tenantName", org.apache.thrift.protocol.TType.STRING, (short)3);
  private static final org.apache.thrift.protocol.TField DOMAIN_FIELD_DESC = new org.apache.thrift.protocol.TField("domain", org.apache.thrift.protocol.TType.STRING, (short)4);
  private static final org.apache.thrift.protocol.TField EMAIL_ADDRESS_FIELD_DESC = new org.apache.thrift.protocol.TField("emailAddress", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField TENANT_ACRONYM_FIELD_DESC = new org.apache.thrift.protocol.TField("tenantAcronym", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField TENANT_URL_FIELD_DESC = new org.apache.thrift.protocol.TField("tenantURL", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField TENANT_PUBLIC_ABSTRACT_FIELD_DESC = new org.apache.thrift.protocol.TField("tenantPublicAbstract", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField REVIEW_PROPOSAL_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("reviewProposalDescription", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField DECLINED_REASON_FIELD_DESC = new org.apache.thrift.protocol.TField("declinedReason", org.apache.thrift.protocol.TType.STRING, (short)15);
  private static final org.apache.thrift.protocol.TField REQUEST_CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("requestCreationTime", org.apache.thrift.protocol.TType.I64, (short)18);
  private static final org.apache.thrift.protocol.TField REQUESTER_USERNAME_FIELD_DESC = new org.apache.thrift.protocol.TField("requesterUsername", org.apache.thrift.protocol.TType.STRING, (short)19);

  private static final org.apache.thrift.scheme.SchemeFactory STANDARD_SCHEME_FACTORY = new TenantStandardSchemeFactory();
  private static final org.apache.thrift.scheme.SchemeFactory TUPLE_SCHEME_FACTORY = new TenantTupleSchemeFactory();

  private @org.apache.thrift.annotation.Nullable java.lang.String tenantId; // required
  private @org.apache.thrift.annotation.Nullable TenantApprovalStatus tenantApprovalStatus; // required
  private @org.apache.thrift.annotation.Nullable java.lang.String tenantName; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String domain; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String emailAddress; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String tenantAcronym; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String tenantURL; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String tenantPublicAbstract; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String reviewProposalDescription; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String declinedReason; // optional
  private long requestCreationTime; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String requesterUsername; // optional

  /** The set of fields this struct contains, along with convenience methods for finding and manipulating them. */
  public enum _Fields implements org.apache.thrift.TFieldIdEnum {
    TENANT_ID((short)1, "tenantId"),
    /**
     * 
     * @see TenantApprovalStatus
     */
    TENANT_APPROVAL_STATUS((short)2, "tenantApprovalStatus"),
    TENANT_NAME((short)3, "tenantName"),
    DOMAIN((short)4, "domain"),
    EMAIL_ADDRESS((short)5, "emailAddress"),
    TENANT_ACRONYM((short)6, "tenantAcronym"),
    TENANT_URL((short)7, "tenantURL"),
    TENANT_PUBLIC_ABSTRACT((short)8, "tenantPublicAbstract"),
    REVIEW_PROPOSAL_DESCRIPTION((short)9, "reviewProposalDescription"),
    DECLINED_REASON((short)15, "declinedReason"),
    REQUEST_CREATION_TIME((short)18, "requestCreationTime"),
    REQUESTER_USERNAME((short)19, "requesterUsername");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    @org.apache.thrift.annotation.Nullable
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // TENANT_ID
          return TENANT_ID;
        case 2: // TENANT_APPROVAL_STATUS
          return TENANT_APPROVAL_STATUS;
        case 3: // TENANT_NAME
          return TENANT_NAME;
        case 4: // DOMAIN
          return DOMAIN;
        case 5: // EMAIL_ADDRESS
          return EMAIL_ADDRESS;
        case 6: // TENANT_ACRONYM
          return TENANT_ACRONYM;
        case 7: // TENANT_URL
          return TENANT_URL;
        case 8: // TENANT_PUBLIC_ABSTRACT
          return TENANT_PUBLIC_ABSTRACT;
        case 9: // REVIEW_PROPOSAL_DESCRIPTION
          return REVIEW_PROPOSAL_DESCRIPTION;
        case 15: // DECLINED_REASON
          return DECLINED_REASON;
        case 18: // REQUEST_CREATION_TIME
          return REQUEST_CREATION_TIME;
        case 19: // REQUESTER_USERNAME
          return REQUESTER_USERNAME;
        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 java.lang.IllegalArgumentException("Field " + fieldId + " doesn't exist!");
      return fields;
    }

    /**
     * Find the _Fields constant that matches name, or null if its not found.
     */
    @org.apache.thrift.annotation.Nullable
    public static _Fields findByName(java.lang.String name) {
      return byName.get(name);
    }

    private final short _thriftId;
    private final java.lang.String _fieldName;

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

    @Override
    public short getThriftFieldId() {
      return _thriftId;
    }

    @Override
    public java.lang.String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __REQUESTCREATIONTIME_ISSET_ID = 0;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.TENANT_NAME,_Fields.DOMAIN,_Fields.EMAIL_ADDRESS,_Fields.TENANT_ACRONYM,_Fields.TENANT_URL,_Fields.TENANT_PUBLIC_ABSTRACT,_Fields.REVIEW_PROPOSAL_DESCRIPTION,_Fields.DECLINED_REASON,_Fields.REQUEST_CREATION_TIME,_Fields.REQUESTER_USERNAME};
  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.TENANT_ID, new org.apache.thrift.meta_data.FieldMetaData("tenantId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TENANT_APPROVAL_STATUS, new org.apache.thrift.meta_data.FieldMetaData("tenantApprovalStatus", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, TenantApprovalStatus.class)));
    tmpMap.put(_Fields.TENANT_NAME, new org.apache.thrift.meta_data.FieldMetaData("tenantName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.DOMAIN, new org.apache.thrift.meta_data.FieldMetaData("domain", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.EMAIL_ADDRESS, new org.apache.thrift.meta_data.FieldMetaData("emailAddress", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TENANT_ACRONYM, new org.apache.thrift.meta_data.FieldMetaData("tenantAcronym", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TENANT_URL, new org.apache.thrift.meta_data.FieldMetaData("tenantURL", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TENANT_PUBLIC_ABSTRACT, new org.apache.thrift.meta_data.FieldMetaData("tenantPublicAbstract", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REVIEW_PROPOSAL_DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("reviewProposalDescription", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.DECLINED_REASON, new org.apache.thrift.meta_data.FieldMetaData("declinedReason", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.REQUEST_CREATION_TIME, new org.apache.thrift.meta_data.FieldMetaData("requestCreationTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.REQUESTER_USERNAME, new org.apache.thrift.meta_data.FieldMetaData("requesterUsername", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(Tenant.class, metaDataMap);
  }

  public Tenant() {
  }

  public Tenant(
    java.lang.String tenantId,
    TenantApprovalStatus tenantApprovalStatus)
  {
    this();
    this.tenantId = tenantId;
    this.tenantApprovalStatus = tenantApprovalStatus;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Tenant(Tenant other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetTenantId()) {
      this.tenantId = other.tenantId;
    }
    if (other.isSetTenantApprovalStatus()) {
      this.tenantApprovalStatus = other.tenantApprovalStatus;
    }
    if (other.isSetTenantName()) {
      this.tenantName = other.tenantName;
    }
    if (other.isSetDomain()) {
      this.domain = other.domain;
    }
    if (other.isSetEmailAddress()) {
      this.emailAddress = other.emailAddress;
    }
    if (other.isSetTenantAcronym()) {
      this.tenantAcronym = other.tenantAcronym;
    }
    if (other.isSetTenantURL()) {
      this.tenantURL = other.tenantURL;
    }
    if (other.isSetTenantPublicAbstract()) {
      this.tenantPublicAbstract = other.tenantPublicAbstract;
    }
    if (other.isSetReviewProposalDescription()) {
      this.reviewProposalDescription = other.reviewProposalDescription;
    }
    if (other.isSetDeclinedReason()) {
      this.declinedReason = other.declinedReason;
    }
    this.requestCreationTime = other.requestCreationTime;
    if (other.isSetRequesterUsername()) {
      this.requesterUsername = other.requesterUsername;
    }
  }

  @Override
  public Tenant deepCopy() {
    return new Tenant(this);
  }

  @Override
  public void clear() {
    this.tenantId = null;
    this.tenantApprovalStatus = null;
    this.tenantName = null;
    this.domain = null;
    this.emailAddress = null;
    this.tenantAcronym = null;
    this.tenantURL = null;
    this.tenantPublicAbstract = null;
    this.reviewProposalDescription = null;
    this.declinedReason = null;
    setRequestCreationTimeIsSet(false);
    this.requestCreationTime = 0;
    this.requesterUsername = null;
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getTenantId() {
    return this.tenantId;
  }

  public void setTenantId(@org.apache.thrift.annotation.Nullable java.lang.String tenantId) {
    this.tenantId = tenantId;
  }

  public void unsetTenantId() {
    this.tenantId = null;
  }

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

  public void setTenantIdIsSet(boolean value) {
    if (!value) {
      this.tenantId = null;
    }
  }

  /**
   * 
   * @see TenantApprovalStatus
   */
  @org.apache.thrift.annotation.Nullable
  public TenantApprovalStatus getTenantApprovalStatus() {
    return this.tenantApprovalStatus;
  }

  /**
   * 
   * @see TenantApprovalStatus
   */
  public void setTenantApprovalStatus(@org.apache.thrift.annotation.Nullable TenantApprovalStatus tenantApprovalStatus) {
    this.tenantApprovalStatus = tenantApprovalStatus;
  }

  public void unsetTenantApprovalStatus() {
    this.tenantApprovalStatus = null;
  }

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

  public void setTenantApprovalStatusIsSet(boolean value) {
    if (!value) {
      this.tenantApprovalStatus = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getTenantName() {
    return this.tenantName;
  }

  public void setTenantName(@org.apache.thrift.annotation.Nullable java.lang.String tenantName) {
    this.tenantName = tenantName;
  }

  public void unsetTenantName() {
    this.tenantName = null;
  }

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

  public void setTenantNameIsSet(boolean value) {
    if (!value) {
      this.tenantName = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getDomain() {
    return this.domain;
  }

  public void setDomain(@org.apache.thrift.annotation.Nullable java.lang.String domain) {
    this.domain = domain;
  }

  public void unsetDomain() {
    this.domain = null;
  }

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

  public void setDomainIsSet(boolean value) {
    if (!value) {
      this.domain = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getEmailAddress() {
    return this.emailAddress;
  }

  public void setEmailAddress(@org.apache.thrift.annotation.Nullable java.lang.String emailAddress) {
    this.emailAddress = emailAddress;
  }

  public void unsetEmailAddress() {
    this.emailAddress = null;
  }

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

  public void setEmailAddressIsSet(boolean value) {
    if (!value) {
      this.emailAddress = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getTenantAcronym() {
    return this.tenantAcronym;
  }

  public void setTenantAcronym(@org.apache.thrift.annotation.Nullable java.lang.String tenantAcronym) {
    this.tenantAcronym = tenantAcronym;
  }

  public void unsetTenantAcronym() {
    this.tenantAcronym = null;
  }

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

  public void setTenantAcronymIsSet(boolean value) {
    if (!value) {
      this.tenantAcronym = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getTenantURL() {
    return this.tenantURL;
  }

  public void setTenantURL(@org.apache.thrift.annotation.Nullable java.lang.String tenantURL) {
    this.tenantURL = tenantURL;
  }

  public void unsetTenantURL() {
    this.tenantURL = null;
  }

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

  public void setTenantURLIsSet(boolean value) {
    if (!value) {
      this.tenantURL = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getTenantPublicAbstract() {
    return this.tenantPublicAbstract;
  }

  public void setTenantPublicAbstract(@org.apache.thrift.annotation.Nullable java.lang.String tenantPublicAbstract) {
    this.tenantPublicAbstract = tenantPublicAbstract;
  }

  public void unsetTenantPublicAbstract() {
    this.tenantPublicAbstract = null;
  }

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

  public void setTenantPublicAbstractIsSet(boolean value) {
    if (!value) {
      this.tenantPublicAbstract = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getReviewProposalDescription() {
    return this.reviewProposalDescription;
  }

  public void setReviewProposalDescription(@org.apache.thrift.annotation.Nullable java.lang.String reviewProposalDescription) {
    this.reviewProposalDescription = reviewProposalDescription;
  }

  public void unsetReviewProposalDescription() {
    this.reviewProposalDescription = null;
  }

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

  public void setReviewProposalDescriptionIsSet(boolean value) {
    if (!value) {
      this.reviewProposalDescription = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getDeclinedReason() {
    return this.declinedReason;
  }

  public void setDeclinedReason(@org.apache.thrift.annotation.Nullable java.lang.String declinedReason) {
    this.declinedReason = declinedReason;
  }

  public void unsetDeclinedReason() {
    this.declinedReason = null;
  }

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

  public void setDeclinedReasonIsSet(boolean value) {
    if (!value) {
      this.declinedReason = null;
    }
  }

  public long getRequestCreationTime() {
    return this.requestCreationTime;
  }

  public void setRequestCreationTime(long requestCreationTime) {
    this.requestCreationTime = requestCreationTime;
    setRequestCreationTimeIsSet(true);
  }

  public void unsetRequestCreationTime() {
    __isset_bitfield = org.apache.thrift.EncodingUtils.clearBit(__isset_bitfield, __REQUESTCREATIONTIME_ISSET_ID);
  }

  /** Returns true if field requestCreationTime is set (has been assigned a value) and false otherwise */
  public boolean isSetRequestCreationTime() {
    return org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __REQUESTCREATIONTIME_ISSET_ID);
  }

  public void setRequestCreationTimeIsSet(boolean value) {
    __isset_bitfield = org.apache.thrift.EncodingUtils.setBit(__isset_bitfield, __REQUESTCREATIONTIME_ISSET_ID, value);
  }

  @org.apache.thrift.annotation.Nullable
  public java.lang.String getRequesterUsername() {
    return this.requesterUsername;
  }

  public void setRequesterUsername(@org.apache.thrift.annotation.Nullable java.lang.String requesterUsername) {
    this.requesterUsername = requesterUsername;
  }

  public void unsetRequesterUsername() {
    this.requesterUsername = null;
  }

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

  public void setRequesterUsernameIsSet(boolean value) {
    if (!value) {
      this.requesterUsername = null;
    }
  }

  @Override
  public void setFieldValue(_Fields field, @org.apache.thrift.annotation.Nullable java.lang.Object value) {
    switch (field) {
    case TENANT_ID:
      if (value == null) {
        unsetTenantId();
      } else {
        setTenantId((java.lang.String)value);
      }
      break;

    case TENANT_APPROVAL_STATUS:
      if (value == null) {
        unsetTenantApprovalStatus();
      } else {
        setTenantApprovalStatus((TenantApprovalStatus)value);
      }
      break;

    case TENANT_NAME:
      if (value == null) {
        unsetTenantName();
      } else {
        setTenantName((java.lang.String)value);
      }
      break;

    case DOMAIN:
      if (value == null) {
        unsetDomain();
      } else {
        setDomain((java.lang.String)value);
      }
      break;

    case EMAIL_ADDRESS:
      if (value == null) {
        unsetEmailAddress();
      } else {
        setEmailAddress((java.lang.String)value);
      }
      break;

    case TENANT_ACRONYM:
      if (value == null) {
        unsetTenantAcronym();
      } else {
        setTenantAcronym((java.lang.String)value);
      }
      break;

    case TENANT_URL:
      if (value == null) {
        unsetTenantURL();
      } else {
        setTenantURL((java.lang.String)value);
      }
      break;

    case TENANT_PUBLIC_ABSTRACT:
      if (value == null) {
        unsetTenantPublicAbstract();
      } else {
        setTenantPublicAbstract((java.lang.String)value);
      }
      break;

    case REVIEW_PROPOSAL_DESCRIPTION:
      if (value == null) {
        unsetReviewProposalDescription();
      } else {
        setReviewProposalDescription((java.lang.String)value);
      }
      break;

    case DECLINED_REASON:
      if (value == null) {
        unsetDeclinedReason();
      } else {
        setDeclinedReason((java.lang.String)value);
      }
      break;

    case REQUEST_CREATION_TIME:
      if (value == null) {
        unsetRequestCreationTime();
      } else {
        setRequestCreationTime((java.lang.Long)value);
      }
      break;

    case REQUESTER_USERNAME:
      if (value == null) {
        unsetRequesterUsername();
      } else {
        setRequesterUsername((java.lang.String)value);
      }
      break;

    }
  }

  @org.apache.thrift.annotation.Nullable
  @Override
  public java.lang.Object getFieldValue(_Fields field) {
    switch (field) {
    case TENANT_ID:
      return getTenantId();

    case TENANT_APPROVAL_STATUS:
      return getTenantApprovalStatus();

    case TENANT_NAME:
      return getTenantName();

    case DOMAIN:
      return getDomain();

    case EMAIL_ADDRESS:
      return getEmailAddress();

    case TENANT_ACRONYM:
      return getTenantAcronym();

    case TENANT_URL:
      return getTenantURL();

    case TENANT_PUBLIC_ABSTRACT:
      return getTenantPublicAbstract();

    case REVIEW_PROPOSAL_DESCRIPTION:
      return getReviewProposalDescription();

    case DECLINED_REASON:
      return getDeclinedReason();

    case REQUEST_CREATION_TIME:
      return getRequestCreationTime();

    case REQUESTER_USERNAME:
      return getRequesterUsername();

    }
    throw new java.lang.IllegalStateException();
  }

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

    switch (field) {
    case TENANT_ID:
      return isSetTenantId();
    case TENANT_APPROVAL_STATUS:
      return isSetTenantApprovalStatus();
    case TENANT_NAME:
      return isSetTenantName();
    case DOMAIN:
      return isSetDomain();
    case EMAIL_ADDRESS:
      return isSetEmailAddress();
    case TENANT_ACRONYM:
      return isSetTenantAcronym();
    case TENANT_URL:
      return isSetTenantURL();
    case TENANT_PUBLIC_ABSTRACT:
      return isSetTenantPublicAbstract();
    case REVIEW_PROPOSAL_DESCRIPTION:
      return isSetReviewProposalDescription();
    case DECLINED_REASON:
      return isSetDeclinedReason();
    case REQUEST_CREATION_TIME:
      return isSetRequestCreationTime();
    case REQUESTER_USERNAME:
      return isSetRequesterUsername();
    }
    throw new java.lang.IllegalStateException();
  }

  @Override
  public boolean equals(java.lang.Object that) {
    if (that instanceof Tenant)
      return this.equals((Tenant)that);
    return false;
  }

  public boolean equals(Tenant that) {
    if (that == null)
      return false;
    if (this == that)
      return true;

    boolean this_present_tenantId = true && this.isSetTenantId();
    boolean that_present_tenantId = true && that.isSetTenantId();
    if (this_present_tenantId || that_present_tenantId) {
      if (!(this_present_tenantId && that_present_tenantId))
        return false;
      if (!this.tenantId.equals(that.tenantId))
        return false;
    }

    boolean this_present_tenantApprovalStatus = true && this.isSetTenantApprovalStatus();
    boolean that_present_tenantApprovalStatus = true && that.isSetTenantApprovalStatus();
    if (this_present_tenantApprovalStatus || that_present_tenantApprovalStatus) {
      if (!(this_present_tenantApprovalStatus && that_present_tenantApprovalStatus))
        return false;
      if (!this.tenantApprovalStatus.equals(that.tenantApprovalStatus))
        return false;
    }

    boolean this_present_tenantName = true && this.isSetTenantName();
    boolean that_present_tenantName = true && that.isSetTenantName();
    if (this_present_tenantName || that_present_tenantName) {
      if (!(this_present_tenantName && that_present_tenantName))
        return false;
      if (!this.tenantName.equals(that.tenantName))
        return false;
    }

    boolean this_present_domain = true && this.isSetDomain();
    boolean that_present_domain = true && that.isSetDomain();
    if (this_present_domain || that_present_domain) {
      if (!(this_present_domain && that_present_domain))
        return false;
      if (!this.domain.equals(that.domain))
        return false;
    }

    boolean this_present_emailAddress = true && this.isSetEmailAddress();
    boolean that_present_emailAddress = true && that.isSetEmailAddress();
    if (this_present_emailAddress || that_present_emailAddress) {
      if (!(this_present_emailAddress && that_present_emailAddress))
        return false;
      if (!this.emailAddress.equals(that.emailAddress))
        return false;
    }

    boolean this_present_tenantAcronym = true && this.isSetTenantAcronym();
    boolean that_present_tenantAcronym = true && that.isSetTenantAcronym();
    if (this_present_tenantAcronym || that_present_tenantAcronym) {
      if (!(this_present_tenantAcronym && that_present_tenantAcronym))
        return false;
      if (!this.tenantAcronym.equals(that.tenantAcronym))
        return false;
    }

    boolean this_present_tenantURL = true && this.isSetTenantURL();
    boolean that_present_tenantURL = true && that.isSetTenantURL();
    if (this_present_tenantURL || that_present_tenantURL) {
      if (!(this_present_tenantURL && that_present_tenantURL))
        return false;
      if (!this.tenantURL.equals(that.tenantURL))
        return false;
    }

    boolean this_present_tenantPublicAbstract = true && this.isSetTenantPublicAbstract();
    boolean that_present_tenantPublicAbstract = true && that.isSetTenantPublicAbstract();
    if (this_present_tenantPublicAbstract || that_present_tenantPublicAbstract) {
      if (!(this_present_tenantPublicAbstract && that_present_tenantPublicAbstract))
        return false;
      if (!this.tenantPublicAbstract.equals(that.tenantPublicAbstract))
        return false;
    }

    boolean this_present_reviewProposalDescription = true && this.isSetReviewProposalDescription();
    boolean that_present_reviewProposalDescription = true && that.isSetReviewProposalDescription();
    if (this_present_reviewProposalDescription || that_present_reviewProposalDescription) {
      if (!(this_present_reviewProposalDescription && that_present_reviewProposalDescription))
        return false;
      if (!this.reviewProposalDescription.equals(that.reviewProposalDescription))
        return false;
    }

    boolean this_present_declinedReason = true && this.isSetDeclinedReason();
    boolean that_present_declinedReason = true && that.isSetDeclinedReason();
    if (this_present_declinedReason || that_present_declinedReason) {
      if (!(this_present_declinedReason && that_present_declinedReason))
        return false;
      if (!this.declinedReason.equals(that.declinedReason))
        return false;
    }

    boolean this_present_requestCreationTime = true && this.isSetRequestCreationTime();
    boolean that_present_requestCreationTime = true && that.isSetRequestCreationTime();
    if (this_present_requestCreationTime || that_present_requestCreationTime) {
      if (!(this_present_requestCreationTime && that_present_requestCreationTime))
        return false;
      if (this.requestCreationTime != that.requestCreationTime)
        return false;
    }

    boolean this_present_requesterUsername = true && this.isSetRequesterUsername();
    boolean that_present_requesterUsername = true && that.isSetRequesterUsername();
    if (this_present_requesterUsername || that_present_requesterUsername) {
      if (!(this_present_requesterUsername && that_present_requesterUsername))
        return false;
      if (!this.requesterUsername.equals(that.requesterUsername))
        return false;
    }

    return true;
  }

  @Override
  public int hashCode() {
    int hashCode = 1;

    hashCode = hashCode * 8191 + ((isSetTenantId()) ? 131071 : 524287);
    if (isSetTenantId())
      hashCode = hashCode * 8191 + tenantId.hashCode();

    hashCode = hashCode * 8191 + ((isSetTenantApprovalStatus()) ? 131071 : 524287);
    if (isSetTenantApprovalStatus())
      hashCode = hashCode * 8191 + tenantApprovalStatus.getValue();

    hashCode = hashCode * 8191 + ((isSetTenantName()) ? 131071 : 524287);
    if (isSetTenantName())
      hashCode = hashCode * 8191 + tenantName.hashCode();

    hashCode = hashCode * 8191 + ((isSetDomain()) ? 131071 : 524287);
    if (isSetDomain())
      hashCode = hashCode * 8191 + domain.hashCode();

    hashCode = hashCode * 8191 + ((isSetEmailAddress()) ? 131071 : 524287);
    if (isSetEmailAddress())
      hashCode = hashCode * 8191 + emailAddress.hashCode();

    hashCode = hashCode * 8191 + ((isSetTenantAcronym()) ? 131071 : 524287);
    if (isSetTenantAcronym())
      hashCode = hashCode * 8191 + tenantAcronym.hashCode();

    hashCode = hashCode * 8191 + ((isSetTenantURL()) ? 131071 : 524287);
    if (isSetTenantURL())
      hashCode = hashCode * 8191 + tenantURL.hashCode();

    hashCode = hashCode * 8191 + ((isSetTenantPublicAbstract()) ? 131071 : 524287);
    if (isSetTenantPublicAbstract())
      hashCode = hashCode * 8191 + tenantPublicAbstract.hashCode();

    hashCode = hashCode * 8191 + ((isSetReviewProposalDescription()) ? 131071 : 524287);
    if (isSetReviewProposalDescription())
      hashCode = hashCode * 8191 + reviewProposalDescription.hashCode();

    hashCode = hashCode * 8191 + ((isSetDeclinedReason()) ? 131071 : 524287);
    if (isSetDeclinedReason())
      hashCode = hashCode * 8191 + declinedReason.hashCode();

    hashCode = hashCode * 8191 + ((isSetRequestCreationTime()) ? 131071 : 524287);
    if (isSetRequestCreationTime())
      hashCode = hashCode * 8191 + org.apache.thrift.TBaseHelper.hashCode(requestCreationTime);

    hashCode = hashCode * 8191 + ((isSetRequesterUsername()) ? 131071 : 524287);
    if (isSetRequesterUsername())
      hashCode = hashCode * 8191 + requesterUsername.hashCode();

    return hashCode;
  }

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

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.compare(isSetTenantId(), other.isSetTenantId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTenantId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tenantId, other.tenantId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTenantApprovalStatus(), other.isSetTenantApprovalStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTenantApprovalStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tenantApprovalStatus, other.tenantApprovalStatus);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTenantName(), other.isSetTenantName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTenantName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tenantName, other.tenantName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetDomain(), other.isSetDomain());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetDomain()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.domain, other.domain);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetEmailAddress(), other.isSetEmailAddress());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetEmailAddress()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.emailAddress, other.emailAddress);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTenantAcronym(), other.isSetTenantAcronym());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTenantAcronym()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tenantAcronym, other.tenantAcronym);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTenantURL(), other.isSetTenantURL());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTenantURL()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tenantURL, other.tenantURL);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTenantPublicAbstract(), other.isSetTenantPublicAbstract());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTenantPublicAbstract()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tenantPublicAbstract, other.tenantPublicAbstract);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetReviewProposalDescription(), other.isSetReviewProposalDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetReviewProposalDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.reviewProposalDescription, other.reviewProposalDescription);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetDeclinedReason(), other.isSetDeclinedReason());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetDeclinedReason()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.declinedReason, other.declinedReason);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetRequestCreationTime(), other.isSetRequestCreationTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetRequestCreationTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.requestCreationTime, other.requestCreationTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetRequesterUsername(), other.isSetRequesterUsername());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetRequesterUsername()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.requesterUsername, other.requesterUsername);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

  @org.apache.thrift.annotation.Nullable
  @Override
  public _Fields fieldForId(int fieldId) {
    return _Fields.findByThriftId(fieldId);
  }

  @Override
  public void read(org.apache.thrift.protocol.TProtocol iprot) throws org.apache.thrift.TException {
    scheme(iprot).read(iprot, this);
  }

  @Override
  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
    scheme(oprot).write(oprot, this);
  }

  @Override
  public java.lang.String toString() {
    java.lang.StringBuilder sb = new java.lang.StringBuilder("Tenant(");
    boolean first = true;

    sb.append("tenantId:");
    if (this.tenantId == null) {
      sb.append("null");
    } else {
      sb.append(this.tenantId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("tenantApprovalStatus:");
    if (this.tenantApprovalStatus == null) {
      sb.append("null");
    } else {
      sb.append(this.tenantApprovalStatus);
    }
    first = false;
    if (isSetTenantName()) {
      if (!first) sb.append(", ");
      sb.append("tenantName:");
      if (this.tenantName == null) {
        sb.append("null");
      } else {
        sb.append(this.tenantName);
      }
      first = false;
    }
    if (isSetDomain()) {
      if (!first) sb.append(", ");
      sb.append("domain:");
      if (this.domain == null) {
        sb.append("null");
      } else {
        sb.append(this.domain);
      }
      first = false;
    }
    if (isSetEmailAddress()) {
      if (!first) sb.append(", ");
      sb.append("emailAddress:");
      if (this.emailAddress == null) {
        sb.append("null");
      } else {
        sb.append(this.emailAddress);
      }
      first = false;
    }
    if (isSetTenantAcronym()) {
      if (!first) sb.append(", ");
      sb.append("tenantAcronym:");
      if (this.tenantAcronym == null) {
        sb.append("null");
      } else {
        sb.append(this.tenantAcronym);
      }
      first = false;
    }
    if (isSetTenantURL()) {
      if (!first) sb.append(", ");
      sb.append("tenantURL:");
      if (this.tenantURL == null) {
        sb.append("null");
      } else {
        sb.append(this.tenantURL);
      }
      first = false;
    }
    if (isSetTenantPublicAbstract()) {
      if (!first) sb.append(", ");
      sb.append("tenantPublicAbstract:");
      if (this.tenantPublicAbstract == null) {
        sb.append("null");
      } else {
        sb.append(this.tenantPublicAbstract);
      }
      first = false;
    }
    if (isSetReviewProposalDescription()) {
      if (!first) sb.append(", ");
      sb.append("reviewProposalDescription:");
      if (this.reviewProposalDescription == null) {
        sb.append("null");
      } else {
        sb.append(this.reviewProposalDescription);
      }
      first = false;
    }
    if (isSetDeclinedReason()) {
      if (!first) sb.append(", ");
      sb.append("declinedReason:");
      if (this.declinedReason == null) {
        sb.append("null");
      } else {
        sb.append(this.declinedReason);
      }
      first = false;
    }
    if (isSetRequestCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("requestCreationTime:");
      sb.append(this.requestCreationTime);
      first = false;
    }
    if (isSetRequesterUsername()) {
      if (!first) sb.append(", ");
      sb.append("requesterUsername:");
      if (this.requesterUsername == null) {
        sb.append("null");
      } else {
        sb.append(this.requesterUsername);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

  public void validate() throws org.apache.thrift.TException {
    // check for required fields
    if (!isSetTenantId()) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'tenantId' is unset! Struct:" + toString());
    }

    if (!isSetTenantApprovalStatus()) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'tenantApprovalStatus' is unset! Struct:" + toString());
    }

    // check for sub-struct validity
  }

  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, java.lang.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_bitfield = 0;
      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);
    }
  }

  private static class TenantStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    @Override
    public TenantStandardScheme getScheme() {
      return new TenantStandardScheme();
    }
  }

  private static class TenantStandardScheme extends org.apache.thrift.scheme.StandardScheme<Tenant> {

    @Override
    public void read(org.apache.thrift.protocol.TProtocol iprot, Tenant struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TField schemeField;
      iprot.readStructBegin();
      while (true)
      {
        schemeField = iprot.readFieldBegin();
        if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
          break;
        }
        switch (schemeField.id) {
          case 1: // TENANT_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.tenantId = iprot.readString();
              struct.setTenantIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // TENANT_APPROVAL_STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.tenantApprovalStatus = org.apache.airavata.model.tenant.TenantApprovalStatus.findByValue(iprot.readI32());
              struct.setTenantApprovalStatusIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // TENANT_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.tenantName = iprot.readString();
              struct.setTenantNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // DOMAIN
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.domain = iprot.readString();
              struct.setDomainIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // EMAIL_ADDRESS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.emailAddress = iprot.readString();
              struct.setEmailAddressIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // TENANT_ACRONYM
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.tenantAcronym = iprot.readString();
              struct.setTenantAcronymIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // TENANT_URL
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.tenantURL = iprot.readString();
              struct.setTenantURLIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // TENANT_PUBLIC_ABSTRACT
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.tenantPublicAbstract = iprot.readString();
              struct.setTenantPublicAbstractIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // REVIEW_PROPOSAL_DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.reviewProposalDescription = iprot.readString();
              struct.setReviewProposalDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // DECLINED_REASON
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.declinedReason = iprot.readString();
              struct.setDeclinedReasonIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // REQUEST_CREATION_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.requestCreationTime = iprot.readI64();
              struct.setRequestCreationTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // REQUESTER_USERNAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.requesterUsername = iprot.readString();
              struct.setRequesterUsernameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          default:
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

    @Override
    public void write(org.apache.thrift.protocol.TProtocol oprot, Tenant struct) throws org.apache.thrift.TException {
      struct.validate();

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.tenantId != null) {
        oprot.writeFieldBegin(TENANT_ID_FIELD_DESC);
        oprot.writeString(struct.tenantId);
        oprot.writeFieldEnd();
      }
      if (struct.tenantApprovalStatus != null) {
        oprot.writeFieldBegin(TENANT_APPROVAL_STATUS_FIELD_DESC);
        oprot.writeI32(struct.tenantApprovalStatus.getValue());
        oprot.writeFieldEnd();
      }
      if (struct.tenantName != null) {
        if (struct.isSetTenantName()) {
          oprot.writeFieldBegin(TENANT_NAME_FIELD_DESC);
          oprot.writeString(struct.tenantName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.domain != null) {
        if (struct.isSetDomain()) {
          oprot.writeFieldBegin(DOMAIN_FIELD_DESC);
          oprot.writeString(struct.domain);
          oprot.writeFieldEnd();
        }
      }
      if (struct.emailAddress != null) {
        if (struct.isSetEmailAddress()) {
          oprot.writeFieldBegin(EMAIL_ADDRESS_FIELD_DESC);
          oprot.writeString(struct.emailAddress);
          oprot.writeFieldEnd();
        }
      }
      if (struct.tenantAcronym != null) {
        if (struct.isSetTenantAcronym()) {
          oprot.writeFieldBegin(TENANT_ACRONYM_FIELD_DESC);
          oprot.writeString(struct.tenantAcronym);
          oprot.writeFieldEnd();
        }
      }
      if (struct.tenantURL != null) {
        if (struct.isSetTenantURL()) {
          oprot.writeFieldBegin(TENANT_URL_FIELD_DESC);
          oprot.writeString(struct.tenantURL);
          oprot.writeFieldEnd();
        }
      }
      if (struct.tenantPublicAbstract != null) {
        if (struct.isSetTenantPublicAbstract()) {
          oprot.writeFieldBegin(TENANT_PUBLIC_ABSTRACT_FIELD_DESC);
          oprot.writeString(struct.tenantPublicAbstract);
          oprot.writeFieldEnd();
        }
      }
      if (struct.reviewProposalDescription != null) {
        if (struct.isSetReviewProposalDescription()) {
          oprot.writeFieldBegin(REVIEW_PROPOSAL_DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.reviewProposalDescription);
          oprot.writeFieldEnd();
        }
      }
      if (struct.declinedReason != null) {
        if (struct.isSetDeclinedReason()) {
          oprot.writeFieldBegin(DECLINED_REASON_FIELD_DESC);
          oprot.writeString(struct.declinedReason);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetRequestCreationTime()) {
        oprot.writeFieldBegin(REQUEST_CREATION_TIME_FIELD_DESC);
        oprot.writeI64(struct.requestCreationTime);
        oprot.writeFieldEnd();
      }
      if (struct.requesterUsername != null) {
        if (struct.isSetRequesterUsername()) {
          oprot.writeFieldBegin(REQUESTER_USERNAME_FIELD_DESC);
          oprot.writeString(struct.requesterUsername);
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class TenantTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    @Override
    public TenantTupleScheme getScheme() {
      return new TenantTupleScheme();
    }
  }

  private static class TenantTupleScheme extends org.apache.thrift.scheme.TupleScheme<Tenant> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, Tenant struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      oprot.writeString(struct.tenantId);
      oprot.writeI32(struct.tenantApprovalStatus.getValue());
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.isSetTenantName()) {
        optionals.set(0);
      }
      if (struct.isSetDomain()) {
        optionals.set(1);
      }
      if (struct.isSetEmailAddress()) {
        optionals.set(2);
      }
      if (struct.isSetTenantAcronym()) {
        optionals.set(3);
      }
      if (struct.isSetTenantURL()) {
        optionals.set(4);
      }
      if (struct.isSetTenantPublicAbstract()) {
        optionals.set(5);
      }
      if (struct.isSetReviewProposalDescription()) {
        optionals.set(6);
      }
      if (struct.isSetDeclinedReason()) {
        optionals.set(7);
      }
      if (struct.isSetRequestCreationTime()) {
        optionals.set(8);
      }
      if (struct.isSetRequesterUsername()) {
        optionals.set(9);
      }
      oprot.writeBitSet(optionals, 10);
      if (struct.isSetTenantName()) {
        oprot.writeString(struct.tenantName);
      }
      if (struct.isSetDomain()) {
        oprot.writeString(struct.domain);
      }
      if (struct.isSetEmailAddress()) {
        oprot.writeString(struct.emailAddress);
      }
      if (struct.isSetTenantAcronym()) {
        oprot.writeString(struct.tenantAcronym);
      }
      if (struct.isSetTenantURL()) {
        oprot.writeString(struct.tenantURL);
      }
      if (struct.isSetTenantPublicAbstract()) {
        oprot.writeString(struct.tenantPublicAbstract);
      }
      if (struct.isSetReviewProposalDescription()) {
        oprot.writeString(struct.reviewProposalDescription);
      }
      if (struct.isSetDeclinedReason()) {
        oprot.writeString(struct.declinedReason);
      }
      if (struct.isSetRequestCreationTime()) {
        oprot.writeI64(struct.requestCreationTime);
      }
      if (struct.isSetRequesterUsername()) {
        oprot.writeString(struct.requesterUsername);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, Tenant struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      struct.tenantId = iprot.readString();
      struct.setTenantIdIsSet(true);
      struct.tenantApprovalStatus = org.apache.airavata.model.tenant.TenantApprovalStatus.findByValue(iprot.readI32());
      struct.setTenantApprovalStatusIsSet(true);
      java.util.BitSet incoming = iprot.readBitSet(10);
      if (incoming.get(0)) {
        struct.tenantName = iprot.readString();
        struct.setTenantNameIsSet(true);
      }
      if (incoming.get(1)) {
        struct.domain = iprot.readString();
        struct.setDomainIsSet(true);
      }
      if (incoming.get(2)) {
        struct.emailAddress = iprot.readString();
        struct.setEmailAddressIsSet(true);
      }
      if (incoming.get(3)) {
        struct.tenantAcronym = iprot.readString();
        struct.setTenantAcronymIsSet(true);
      }
      if (incoming.get(4)) {
        struct.tenantURL = iprot.readString();
        struct.setTenantURLIsSet(true);
      }
      if (incoming.get(5)) {
        struct.tenantPublicAbstract = iprot.readString();
        struct.setTenantPublicAbstractIsSet(true);
      }
      if (incoming.get(6)) {
        struct.reviewProposalDescription = iprot.readString();
        struct.setReviewProposalDescriptionIsSet(true);
      }
      if (incoming.get(7)) {
        struct.declinedReason = iprot.readString();
        struct.setDeclinedReasonIsSet(true);
      }
      if (incoming.get(8)) {
        struct.requestCreationTime = iprot.readI64();
        struct.setRequestCreationTimeIsSet(true);
      }
      if (incoming.get(9)) {
        struct.requesterUsername = iprot.readString();
        struct.setRequesterUsernameIsSet(true);
      }
    }
  }

  private static <S extends org.apache.thrift.scheme.IScheme> S scheme(org.apache.thrift.protocol.TProtocol proto) {
    return (org.apache.thrift.scheme.StandardScheme.class.equals(proto.getScheme()) ? STANDARD_SCHEME_FACTORY : TUPLE_SCHEME_FACTORY).getScheme();
  }
}

