/**
 * 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.10.0)
 *
 * DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
 *  @generated
 */
package org.apache.airavata.model.workspace;

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

  private static final org.apache.thrift.protocol.TField AIRAVATA_INTERNAL_GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("airavataInternalGatewayId", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)2);
  private static final org.apache.thrift.protocol.TField GATEWAY_APPROVAL_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayApprovalStatus", org.apache.thrift.protocol.TType.I32, (short)3);
  private static final org.apache.thrift.protocol.TField GATEWAY_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayName", org.apache.thrift.protocol.TType.STRING, (short)4);
  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)5);
  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)6);
  private static final org.apache.thrift.protocol.TField GATEWAY_ACRONYM_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayAcronym", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField GATEWAY_URL_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayURL", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField GATEWAY_PUBLIC_ABSTRACT_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayPublicAbstract", org.apache.thrift.protocol.TType.STRING, (short)9);
  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)10);
  private static final org.apache.thrift.protocol.TField GATEWAY_ADMIN_FIRST_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayAdminFirstName", org.apache.thrift.protocol.TType.STRING, (short)11);
  private static final org.apache.thrift.protocol.TField GATEWAY_ADMIN_LAST_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayAdminLastName", org.apache.thrift.protocol.TType.STRING, (short)12);
  private static final org.apache.thrift.protocol.TField GATEWAY_ADMIN_EMAIL_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayAdminEmail", org.apache.thrift.protocol.TType.STRING, (short)13);
  private static final org.apache.thrift.protocol.TField IDENTITY_SERVER_USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("identityServerUserName", org.apache.thrift.protocol.TType.STRING, (short)14);
  private static final org.apache.thrift.protocol.TField IDENTITY_SERVER_PASSWORD_TOKEN_FIELD_DESC = new org.apache.thrift.protocol.TField("identityServerPasswordToken", org.apache.thrift.protocol.TType.STRING, (short)15);
  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)16);
  private static final org.apache.thrift.protocol.TField OAUTH_CLIENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("oauthClientId", org.apache.thrift.protocol.TType.STRING, (short)17);
  private static final org.apache.thrift.protocol.TField OAUTH_CLIENT_SECRET_FIELD_DESC = new org.apache.thrift.protocol.TField("oauthClientSecret", org.apache.thrift.protocol.TType.STRING, (short)18);
  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)19);
  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)20);

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

  private java.lang.String airavataInternalGatewayId; // optional
  private java.lang.String gatewayId; // required
  private GatewayApprovalStatus gatewayApprovalStatus; // required
  private java.lang.String gatewayName; // optional
  private java.lang.String domain; // optional
  private java.lang.String emailAddress; // optional
  private java.lang.String gatewayAcronym; // optional
  private java.lang.String gatewayURL; // optional
  private java.lang.String gatewayPublicAbstract; // optional
  private java.lang.String reviewProposalDescription; // optional
  private java.lang.String gatewayAdminFirstName; // optional
  private java.lang.String gatewayAdminLastName; // optional
  private java.lang.String gatewayAdminEmail; // optional
  private java.lang.String identityServerUserName; // optional
  private java.lang.String identityServerPasswordToken; // optional
  private java.lang.String declinedReason; // optional
  private java.lang.String oauthClientId; // optional
  private java.lang.String oauthClientSecret; // optional
  private long requestCreationTime; // optional
  private 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 {
    AIRAVATA_INTERNAL_GATEWAY_ID((short)1, "airavataInternalGatewayId"),
    GATEWAY_ID((short)2, "gatewayId"),
    /**
     * 
     * @see GatewayApprovalStatus
     */
    GATEWAY_APPROVAL_STATUS((short)3, "gatewayApprovalStatus"),
    GATEWAY_NAME((short)4, "gatewayName"),
    DOMAIN((short)5, "domain"),
    EMAIL_ADDRESS((short)6, "emailAddress"),
    GATEWAY_ACRONYM((short)7, "gatewayAcronym"),
    GATEWAY_URL((short)8, "gatewayURL"),
    GATEWAY_PUBLIC_ABSTRACT((short)9, "gatewayPublicAbstract"),
    REVIEW_PROPOSAL_DESCRIPTION((short)10, "reviewProposalDescription"),
    GATEWAY_ADMIN_FIRST_NAME((short)11, "gatewayAdminFirstName"),
    GATEWAY_ADMIN_LAST_NAME((short)12, "gatewayAdminLastName"),
    GATEWAY_ADMIN_EMAIL((short)13, "gatewayAdminEmail"),
    IDENTITY_SERVER_USER_NAME((short)14, "identityServerUserName"),
    IDENTITY_SERVER_PASSWORD_TOKEN((short)15, "identityServerPasswordToken"),
    DECLINED_REASON((short)16, "declinedReason"),
    OAUTH_CLIENT_ID((short)17, "oauthClientId"),
    OAUTH_CLIENT_SECRET((short)18, "oauthClientSecret"),
    REQUEST_CREATION_TIME((short)19, "requestCreationTime"),
    REQUESTER_USERNAME((short)20, "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.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // AIRAVATA_INTERNAL_GATEWAY_ID
          return AIRAVATA_INTERNAL_GATEWAY_ID;
        case 2: // GATEWAY_ID
          return GATEWAY_ID;
        case 3: // GATEWAY_APPROVAL_STATUS
          return GATEWAY_APPROVAL_STATUS;
        case 4: // GATEWAY_NAME
          return GATEWAY_NAME;
        case 5: // DOMAIN
          return DOMAIN;
        case 6: // EMAIL_ADDRESS
          return EMAIL_ADDRESS;
        case 7: // GATEWAY_ACRONYM
          return GATEWAY_ACRONYM;
        case 8: // GATEWAY_URL
          return GATEWAY_URL;
        case 9: // GATEWAY_PUBLIC_ABSTRACT
          return GATEWAY_PUBLIC_ABSTRACT;
        case 10: // REVIEW_PROPOSAL_DESCRIPTION
          return REVIEW_PROPOSAL_DESCRIPTION;
        case 11: // GATEWAY_ADMIN_FIRST_NAME
          return GATEWAY_ADMIN_FIRST_NAME;
        case 12: // GATEWAY_ADMIN_LAST_NAME
          return GATEWAY_ADMIN_LAST_NAME;
        case 13: // GATEWAY_ADMIN_EMAIL
          return GATEWAY_ADMIN_EMAIL;
        case 14: // IDENTITY_SERVER_USER_NAME
          return IDENTITY_SERVER_USER_NAME;
        case 15: // IDENTITY_SERVER_PASSWORD_TOKEN
          return IDENTITY_SERVER_PASSWORD_TOKEN;
        case 16: // DECLINED_REASON
          return DECLINED_REASON;
        case 17: // OAUTH_CLIENT_ID
          return OAUTH_CLIENT_ID;
        case 18: // OAUTH_CLIENT_SECRET
          return OAUTH_CLIENT_SECRET;
        case 19: // REQUEST_CREATION_TIME
          return REQUEST_CREATION_TIME;
        case 20: // 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.
     */
    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;
    }

    public short getThriftFieldId() {
      return _thriftId;
    }

    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.AIRAVATA_INTERNAL_GATEWAY_ID,_Fields.GATEWAY_NAME,_Fields.DOMAIN,_Fields.EMAIL_ADDRESS,_Fields.GATEWAY_ACRONYM,_Fields.GATEWAY_URL,_Fields.GATEWAY_PUBLIC_ABSTRACT,_Fields.REVIEW_PROPOSAL_DESCRIPTION,_Fields.GATEWAY_ADMIN_FIRST_NAME,_Fields.GATEWAY_ADMIN_LAST_NAME,_Fields.GATEWAY_ADMIN_EMAIL,_Fields.IDENTITY_SERVER_USER_NAME,_Fields.IDENTITY_SERVER_PASSWORD_TOKEN,_Fields.DECLINED_REASON,_Fields.OAUTH_CLIENT_ID,_Fields.OAUTH_CLIENT_SECRET,_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.AIRAVATA_INTERNAL_GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("airavataInternalGatewayId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_APPROVAL_STATUS, new org.apache.thrift.meta_data.FieldMetaData("gatewayApprovalStatus", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, GatewayApprovalStatus.class)));
    tmpMap.put(_Fields.GATEWAY_NAME, new org.apache.thrift.meta_data.FieldMetaData("gatewayName", 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.GATEWAY_ACRONYM, new org.apache.thrift.meta_data.FieldMetaData("gatewayAcronym", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_URL, new org.apache.thrift.meta_data.FieldMetaData("gatewayURL", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_PUBLIC_ABSTRACT, new org.apache.thrift.meta_data.FieldMetaData("gatewayPublicAbstract", 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.GATEWAY_ADMIN_FIRST_NAME, new org.apache.thrift.meta_data.FieldMetaData("gatewayAdminFirstName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_ADMIN_LAST_NAME, new org.apache.thrift.meta_data.FieldMetaData("gatewayAdminLastName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_ADMIN_EMAIL, new org.apache.thrift.meta_data.FieldMetaData("gatewayAdminEmail", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.IDENTITY_SERVER_USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("identityServerUserName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.IDENTITY_SERVER_PASSWORD_TOKEN, new org.apache.thrift.meta_data.FieldMetaData("identityServerPasswordToken", 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.OAUTH_CLIENT_ID, new org.apache.thrift.meta_data.FieldMetaData("oauthClientId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.OAUTH_CLIENT_SECRET, new org.apache.thrift.meta_data.FieldMetaData("oauthClientSecret", 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(Gateway.class, metaDataMap);
  }

  public Gateway() {
  }

  public Gateway(
    java.lang.String gatewayId,
    GatewayApprovalStatus gatewayApprovalStatus)
  {
    this();
    this.gatewayId = gatewayId;
    this.gatewayApprovalStatus = gatewayApprovalStatus;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Gateway(Gateway other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetAiravataInternalGatewayId()) {
      this.airavataInternalGatewayId = other.airavataInternalGatewayId;
    }
    if (other.isSetGatewayId()) {
      this.gatewayId = other.gatewayId;
    }
    if (other.isSetGatewayApprovalStatus()) {
      this.gatewayApprovalStatus = other.gatewayApprovalStatus;
    }
    if (other.isSetGatewayName()) {
      this.gatewayName = other.gatewayName;
    }
    if (other.isSetDomain()) {
      this.domain = other.domain;
    }
    if (other.isSetEmailAddress()) {
      this.emailAddress = other.emailAddress;
    }
    if (other.isSetGatewayAcronym()) {
      this.gatewayAcronym = other.gatewayAcronym;
    }
    if (other.isSetGatewayURL()) {
      this.gatewayURL = other.gatewayURL;
    }
    if (other.isSetGatewayPublicAbstract()) {
      this.gatewayPublicAbstract = other.gatewayPublicAbstract;
    }
    if (other.isSetReviewProposalDescription()) {
      this.reviewProposalDescription = other.reviewProposalDescription;
    }
    if (other.isSetGatewayAdminFirstName()) {
      this.gatewayAdminFirstName = other.gatewayAdminFirstName;
    }
    if (other.isSetGatewayAdminLastName()) {
      this.gatewayAdminLastName = other.gatewayAdminLastName;
    }
    if (other.isSetGatewayAdminEmail()) {
      this.gatewayAdminEmail = other.gatewayAdminEmail;
    }
    if (other.isSetIdentityServerUserName()) {
      this.identityServerUserName = other.identityServerUserName;
    }
    if (other.isSetIdentityServerPasswordToken()) {
      this.identityServerPasswordToken = other.identityServerPasswordToken;
    }
    if (other.isSetDeclinedReason()) {
      this.declinedReason = other.declinedReason;
    }
    if (other.isSetOauthClientId()) {
      this.oauthClientId = other.oauthClientId;
    }
    if (other.isSetOauthClientSecret()) {
      this.oauthClientSecret = other.oauthClientSecret;
    }
    this.requestCreationTime = other.requestCreationTime;
    if (other.isSetRequesterUsername()) {
      this.requesterUsername = other.requesterUsername;
    }
  }

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

  @Override
  public void clear() {
    this.airavataInternalGatewayId = null;
    this.gatewayId = null;
    this.gatewayApprovalStatus = null;
    this.gatewayName = null;
    this.domain = null;
    this.emailAddress = null;
    this.gatewayAcronym = null;
    this.gatewayURL = null;
    this.gatewayPublicAbstract = null;
    this.reviewProposalDescription = null;
    this.gatewayAdminFirstName = null;
    this.gatewayAdminLastName = null;
    this.gatewayAdminEmail = null;
    this.identityServerUserName = null;
    this.identityServerPasswordToken = null;
    this.declinedReason = null;
    this.oauthClientId = null;
    this.oauthClientSecret = null;
    setRequestCreationTimeIsSet(false);
    this.requestCreationTime = 0;
    this.requesterUsername = null;
  }

  public java.lang.String getAiravataInternalGatewayId() {
    return this.airavataInternalGatewayId;
  }

  public void setAiravataInternalGatewayId(java.lang.String airavataInternalGatewayId) {
    this.airavataInternalGatewayId = airavataInternalGatewayId;
  }

  public void unsetAiravataInternalGatewayId() {
    this.airavataInternalGatewayId = null;
  }

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

  public void setAiravataInternalGatewayIdIsSet(boolean value) {
    if (!value) {
      this.airavataInternalGatewayId = null;
    }
  }

  public java.lang.String getGatewayId() {
    return this.gatewayId;
  }

  public void setGatewayId(java.lang.String gatewayId) {
    this.gatewayId = gatewayId;
  }

  public void unsetGatewayId() {
    this.gatewayId = null;
  }

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

  public void setGatewayIdIsSet(boolean value) {
    if (!value) {
      this.gatewayId = null;
    }
  }

  /**
   * 
   * @see GatewayApprovalStatus
   */
  public GatewayApprovalStatus getGatewayApprovalStatus() {
    return this.gatewayApprovalStatus;
  }

  /**
   * 
   * @see GatewayApprovalStatus
   */
  public void setGatewayApprovalStatus(GatewayApprovalStatus gatewayApprovalStatus) {
    this.gatewayApprovalStatus = gatewayApprovalStatus;
  }

  public void unsetGatewayApprovalStatus() {
    this.gatewayApprovalStatus = null;
  }

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

  public void setGatewayApprovalStatusIsSet(boolean value) {
    if (!value) {
      this.gatewayApprovalStatus = null;
    }
  }

  public java.lang.String getGatewayName() {
    return this.gatewayName;
  }

  public void setGatewayName(java.lang.String gatewayName) {
    this.gatewayName = gatewayName;
  }

  public void unsetGatewayName() {
    this.gatewayName = null;
  }

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

  public void setGatewayNameIsSet(boolean value) {
    if (!value) {
      this.gatewayName = null;
    }
  }

  public java.lang.String getDomain() {
    return this.domain;
  }

  public void setDomain(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;
    }
  }

  public java.lang.String getEmailAddress() {
    return this.emailAddress;
  }

  public void setEmailAddress(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;
    }
  }

  public java.lang.String getGatewayAcronym() {
    return this.gatewayAcronym;
  }

  public void setGatewayAcronym(java.lang.String gatewayAcronym) {
    this.gatewayAcronym = gatewayAcronym;
  }

  public void unsetGatewayAcronym() {
    this.gatewayAcronym = null;
  }

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

  public void setGatewayAcronymIsSet(boolean value) {
    if (!value) {
      this.gatewayAcronym = null;
    }
  }

  public java.lang.String getGatewayURL() {
    return this.gatewayURL;
  }

  public void setGatewayURL(java.lang.String gatewayURL) {
    this.gatewayURL = gatewayURL;
  }

  public void unsetGatewayURL() {
    this.gatewayURL = null;
  }

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

  public void setGatewayURLIsSet(boolean value) {
    if (!value) {
      this.gatewayURL = null;
    }
  }

  public java.lang.String getGatewayPublicAbstract() {
    return this.gatewayPublicAbstract;
  }

  public void setGatewayPublicAbstract(java.lang.String gatewayPublicAbstract) {
    this.gatewayPublicAbstract = gatewayPublicAbstract;
  }

  public void unsetGatewayPublicAbstract() {
    this.gatewayPublicAbstract = null;
  }

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

  public void setGatewayPublicAbstractIsSet(boolean value) {
    if (!value) {
      this.gatewayPublicAbstract = null;
    }
  }

  public java.lang.String getReviewProposalDescription() {
    return this.reviewProposalDescription;
  }

  public void setReviewProposalDescription(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;
    }
  }

  public java.lang.String getGatewayAdminFirstName() {
    return this.gatewayAdminFirstName;
  }

  public void setGatewayAdminFirstName(java.lang.String gatewayAdminFirstName) {
    this.gatewayAdminFirstName = gatewayAdminFirstName;
  }

  public void unsetGatewayAdminFirstName() {
    this.gatewayAdminFirstName = null;
  }

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

  public void setGatewayAdminFirstNameIsSet(boolean value) {
    if (!value) {
      this.gatewayAdminFirstName = null;
    }
  }

  public java.lang.String getGatewayAdminLastName() {
    return this.gatewayAdminLastName;
  }

  public void setGatewayAdminLastName(java.lang.String gatewayAdminLastName) {
    this.gatewayAdminLastName = gatewayAdminLastName;
  }

  public void unsetGatewayAdminLastName() {
    this.gatewayAdminLastName = null;
  }

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

  public void setGatewayAdminLastNameIsSet(boolean value) {
    if (!value) {
      this.gatewayAdminLastName = null;
    }
  }

  public java.lang.String getGatewayAdminEmail() {
    return this.gatewayAdminEmail;
  }

  public void setGatewayAdminEmail(java.lang.String gatewayAdminEmail) {
    this.gatewayAdminEmail = gatewayAdminEmail;
  }

  public void unsetGatewayAdminEmail() {
    this.gatewayAdminEmail = null;
  }

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

  public void setGatewayAdminEmailIsSet(boolean value) {
    if (!value) {
      this.gatewayAdminEmail = null;
    }
  }

  public java.lang.String getIdentityServerUserName() {
    return this.identityServerUserName;
  }

  public void setIdentityServerUserName(java.lang.String identityServerUserName) {
    this.identityServerUserName = identityServerUserName;
  }

  public void unsetIdentityServerUserName() {
    this.identityServerUserName = null;
  }

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

  public void setIdentityServerUserNameIsSet(boolean value) {
    if (!value) {
      this.identityServerUserName = null;
    }
  }

  public java.lang.String getIdentityServerPasswordToken() {
    return this.identityServerPasswordToken;
  }

  public void setIdentityServerPasswordToken(java.lang.String identityServerPasswordToken) {
    this.identityServerPasswordToken = identityServerPasswordToken;
  }

  public void unsetIdentityServerPasswordToken() {
    this.identityServerPasswordToken = null;
  }

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

  public void setIdentityServerPasswordTokenIsSet(boolean value) {
    if (!value) {
      this.identityServerPasswordToken = null;
    }
  }

  public java.lang.String getDeclinedReason() {
    return this.declinedReason;
  }

  public void setDeclinedReason(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 java.lang.String getOauthClientId() {
    return this.oauthClientId;
  }

  public void setOauthClientId(java.lang.String oauthClientId) {
    this.oauthClientId = oauthClientId;
  }

  public void unsetOauthClientId() {
    this.oauthClientId = null;
  }

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

  public void setOauthClientIdIsSet(boolean value) {
    if (!value) {
      this.oauthClientId = null;
    }
  }

  public java.lang.String getOauthClientSecret() {
    return this.oauthClientSecret;
  }

  public void setOauthClientSecret(java.lang.String oauthClientSecret) {
    this.oauthClientSecret = oauthClientSecret;
  }

  public void unsetOauthClientSecret() {
    this.oauthClientSecret = null;
  }

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

  public void setOauthClientSecretIsSet(boolean value) {
    if (!value) {
      this.oauthClientSecret = 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);
  }

  public java.lang.String getRequesterUsername() {
    return this.requesterUsername;
  }

  public void setRequesterUsername(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;
    }
  }

  public void setFieldValue(_Fields field, java.lang.Object value) {
    switch (field) {
    case AIRAVATA_INTERNAL_GATEWAY_ID:
      if (value == null) {
        unsetAiravataInternalGatewayId();
      } else {
        setAiravataInternalGatewayId((java.lang.String)value);
      }
      break;

    case GATEWAY_ID:
      if (value == null) {
        unsetGatewayId();
      } else {
        setGatewayId((java.lang.String)value);
      }
      break;

    case GATEWAY_APPROVAL_STATUS:
      if (value == null) {
        unsetGatewayApprovalStatus();
      } else {
        setGatewayApprovalStatus((GatewayApprovalStatus)value);
      }
      break;

    case GATEWAY_NAME:
      if (value == null) {
        unsetGatewayName();
      } else {
        setGatewayName((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 GATEWAY_ACRONYM:
      if (value == null) {
        unsetGatewayAcronym();
      } else {
        setGatewayAcronym((java.lang.String)value);
      }
      break;

    case GATEWAY_URL:
      if (value == null) {
        unsetGatewayURL();
      } else {
        setGatewayURL((java.lang.String)value);
      }
      break;

    case GATEWAY_PUBLIC_ABSTRACT:
      if (value == null) {
        unsetGatewayPublicAbstract();
      } else {
        setGatewayPublicAbstract((java.lang.String)value);
      }
      break;

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

    case GATEWAY_ADMIN_FIRST_NAME:
      if (value == null) {
        unsetGatewayAdminFirstName();
      } else {
        setGatewayAdminFirstName((java.lang.String)value);
      }
      break;

    case GATEWAY_ADMIN_LAST_NAME:
      if (value == null) {
        unsetGatewayAdminLastName();
      } else {
        setGatewayAdminLastName((java.lang.String)value);
      }
      break;

    case GATEWAY_ADMIN_EMAIL:
      if (value == null) {
        unsetGatewayAdminEmail();
      } else {
        setGatewayAdminEmail((java.lang.String)value);
      }
      break;

    case IDENTITY_SERVER_USER_NAME:
      if (value == null) {
        unsetIdentityServerUserName();
      } else {
        setIdentityServerUserName((java.lang.String)value);
      }
      break;

    case IDENTITY_SERVER_PASSWORD_TOKEN:
      if (value == null) {
        unsetIdentityServerPasswordToken();
      } else {
        setIdentityServerPasswordToken((java.lang.String)value);
      }
      break;

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

    case OAUTH_CLIENT_ID:
      if (value == null) {
        unsetOauthClientId();
      } else {
        setOauthClientId((java.lang.String)value);
      }
      break;

    case OAUTH_CLIENT_SECRET:
      if (value == null) {
        unsetOauthClientSecret();
      } else {
        setOauthClientSecret((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;

    }
  }

  public java.lang.Object getFieldValue(_Fields field) {
    switch (field) {
    case AIRAVATA_INTERNAL_GATEWAY_ID:
      return getAiravataInternalGatewayId();

    case GATEWAY_ID:
      return getGatewayId();

    case GATEWAY_APPROVAL_STATUS:
      return getGatewayApprovalStatus();

    case GATEWAY_NAME:
      return getGatewayName();

    case DOMAIN:
      return getDomain();

    case EMAIL_ADDRESS:
      return getEmailAddress();

    case GATEWAY_ACRONYM:
      return getGatewayAcronym();

    case GATEWAY_URL:
      return getGatewayURL();

    case GATEWAY_PUBLIC_ABSTRACT:
      return getGatewayPublicAbstract();

    case REVIEW_PROPOSAL_DESCRIPTION:
      return getReviewProposalDescription();

    case GATEWAY_ADMIN_FIRST_NAME:
      return getGatewayAdminFirstName();

    case GATEWAY_ADMIN_LAST_NAME:
      return getGatewayAdminLastName();

    case GATEWAY_ADMIN_EMAIL:
      return getGatewayAdminEmail();

    case IDENTITY_SERVER_USER_NAME:
      return getIdentityServerUserName();

    case IDENTITY_SERVER_PASSWORD_TOKEN:
      return getIdentityServerPasswordToken();

    case DECLINED_REASON:
      return getDeclinedReason();

    case OAUTH_CLIENT_ID:
      return getOauthClientId();

    case OAUTH_CLIENT_SECRET:
      return getOauthClientSecret();

    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 */
  public boolean isSet(_Fields field) {
    if (field == null) {
      throw new java.lang.IllegalArgumentException();
    }

    switch (field) {
    case AIRAVATA_INTERNAL_GATEWAY_ID:
      return isSetAiravataInternalGatewayId();
    case GATEWAY_ID:
      return isSetGatewayId();
    case GATEWAY_APPROVAL_STATUS:
      return isSetGatewayApprovalStatus();
    case GATEWAY_NAME:
      return isSetGatewayName();
    case DOMAIN:
      return isSetDomain();
    case EMAIL_ADDRESS:
      return isSetEmailAddress();
    case GATEWAY_ACRONYM:
      return isSetGatewayAcronym();
    case GATEWAY_URL:
      return isSetGatewayURL();
    case GATEWAY_PUBLIC_ABSTRACT:
      return isSetGatewayPublicAbstract();
    case REVIEW_PROPOSAL_DESCRIPTION:
      return isSetReviewProposalDescription();
    case GATEWAY_ADMIN_FIRST_NAME:
      return isSetGatewayAdminFirstName();
    case GATEWAY_ADMIN_LAST_NAME:
      return isSetGatewayAdminLastName();
    case GATEWAY_ADMIN_EMAIL:
      return isSetGatewayAdminEmail();
    case IDENTITY_SERVER_USER_NAME:
      return isSetIdentityServerUserName();
    case IDENTITY_SERVER_PASSWORD_TOKEN:
      return isSetIdentityServerPasswordToken();
    case DECLINED_REASON:
      return isSetDeclinedReason();
    case OAUTH_CLIENT_ID:
      return isSetOauthClientId();
    case OAUTH_CLIENT_SECRET:
      return isSetOauthClientSecret();
    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 == null)
      return false;
    if (that instanceof Gateway)
      return this.equals((Gateway)that);
    return false;
  }

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

    boolean this_present_airavataInternalGatewayId = true && this.isSetAiravataInternalGatewayId();
    boolean that_present_airavataInternalGatewayId = true && that.isSetAiravataInternalGatewayId();
    if (this_present_airavataInternalGatewayId || that_present_airavataInternalGatewayId) {
      if (!(this_present_airavataInternalGatewayId && that_present_airavataInternalGatewayId))
        return false;
      if (!this.airavataInternalGatewayId.equals(that.airavataInternalGatewayId))
        return false;
    }

    boolean this_present_gatewayId = true && this.isSetGatewayId();
    boolean that_present_gatewayId = true && that.isSetGatewayId();
    if (this_present_gatewayId || that_present_gatewayId) {
      if (!(this_present_gatewayId && that_present_gatewayId))
        return false;
      if (!this.gatewayId.equals(that.gatewayId))
        return false;
    }

    boolean this_present_gatewayApprovalStatus = true && this.isSetGatewayApprovalStatus();
    boolean that_present_gatewayApprovalStatus = true && that.isSetGatewayApprovalStatus();
    if (this_present_gatewayApprovalStatus || that_present_gatewayApprovalStatus) {
      if (!(this_present_gatewayApprovalStatus && that_present_gatewayApprovalStatus))
        return false;
      if (!this.gatewayApprovalStatus.equals(that.gatewayApprovalStatus))
        return false;
    }

    boolean this_present_gatewayName = true && this.isSetGatewayName();
    boolean that_present_gatewayName = true && that.isSetGatewayName();
    if (this_present_gatewayName || that_present_gatewayName) {
      if (!(this_present_gatewayName && that_present_gatewayName))
        return false;
      if (!this.gatewayName.equals(that.gatewayName))
        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_gatewayAcronym = true && this.isSetGatewayAcronym();
    boolean that_present_gatewayAcronym = true && that.isSetGatewayAcronym();
    if (this_present_gatewayAcronym || that_present_gatewayAcronym) {
      if (!(this_present_gatewayAcronym && that_present_gatewayAcronym))
        return false;
      if (!this.gatewayAcronym.equals(that.gatewayAcronym))
        return false;
    }

    boolean this_present_gatewayURL = true && this.isSetGatewayURL();
    boolean that_present_gatewayURL = true && that.isSetGatewayURL();
    if (this_present_gatewayURL || that_present_gatewayURL) {
      if (!(this_present_gatewayURL && that_present_gatewayURL))
        return false;
      if (!this.gatewayURL.equals(that.gatewayURL))
        return false;
    }

    boolean this_present_gatewayPublicAbstract = true && this.isSetGatewayPublicAbstract();
    boolean that_present_gatewayPublicAbstract = true && that.isSetGatewayPublicAbstract();
    if (this_present_gatewayPublicAbstract || that_present_gatewayPublicAbstract) {
      if (!(this_present_gatewayPublicAbstract && that_present_gatewayPublicAbstract))
        return false;
      if (!this.gatewayPublicAbstract.equals(that.gatewayPublicAbstract))
        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_gatewayAdminFirstName = true && this.isSetGatewayAdminFirstName();
    boolean that_present_gatewayAdminFirstName = true && that.isSetGatewayAdminFirstName();
    if (this_present_gatewayAdminFirstName || that_present_gatewayAdminFirstName) {
      if (!(this_present_gatewayAdminFirstName && that_present_gatewayAdminFirstName))
        return false;
      if (!this.gatewayAdminFirstName.equals(that.gatewayAdminFirstName))
        return false;
    }

    boolean this_present_gatewayAdminLastName = true && this.isSetGatewayAdminLastName();
    boolean that_present_gatewayAdminLastName = true && that.isSetGatewayAdminLastName();
    if (this_present_gatewayAdminLastName || that_present_gatewayAdminLastName) {
      if (!(this_present_gatewayAdminLastName && that_present_gatewayAdminLastName))
        return false;
      if (!this.gatewayAdminLastName.equals(that.gatewayAdminLastName))
        return false;
    }

    boolean this_present_gatewayAdminEmail = true && this.isSetGatewayAdminEmail();
    boolean that_present_gatewayAdminEmail = true && that.isSetGatewayAdminEmail();
    if (this_present_gatewayAdminEmail || that_present_gatewayAdminEmail) {
      if (!(this_present_gatewayAdminEmail && that_present_gatewayAdminEmail))
        return false;
      if (!this.gatewayAdminEmail.equals(that.gatewayAdminEmail))
        return false;
    }

    boolean this_present_identityServerUserName = true && this.isSetIdentityServerUserName();
    boolean that_present_identityServerUserName = true && that.isSetIdentityServerUserName();
    if (this_present_identityServerUserName || that_present_identityServerUserName) {
      if (!(this_present_identityServerUserName && that_present_identityServerUserName))
        return false;
      if (!this.identityServerUserName.equals(that.identityServerUserName))
        return false;
    }

    boolean this_present_identityServerPasswordToken = true && this.isSetIdentityServerPasswordToken();
    boolean that_present_identityServerPasswordToken = true && that.isSetIdentityServerPasswordToken();
    if (this_present_identityServerPasswordToken || that_present_identityServerPasswordToken) {
      if (!(this_present_identityServerPasswordToken && that_present_identityServerPasswordToken))
        return false;
      if (!this.identityServerPasswordToken.equals(that.identityServerPasswordToken))
        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_oauthClientId = true && this.isSetOauthClientId();
    boolean that_present_oauthClientId = true && that.isSetOauthClientId();
    if (this_present_oauthClientId || that_present_oauthClientId) {
      if (!(this_present_oauthClientId && that_present_oauthClientId))
        return false;
      if (!this.oauthClientId.equals(that.oauthClientId))
        return false;
    }

    boolean this_present_oauthClientSecret = true && this.isSetOauthClientSecret();
    boolean that_present_oauthClientSecret = true && that.isSetOauthClientSecret();
    if (this_present_oauthClientSecret || that_present_oauthClientSecret) {
      if (!(this_present_oauthClientSecret && that_present_oauthClientSecret))
        return false;
      if (!this.oauthClientSecret.equals(that.oauthClientSecret))
        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 + ((isSetAiravataInternalGatewayId()) ? 131071 : 524287);
    if (isSetAiravataInternalGatewayId())
      hashCode = hashCode * 8191 + airavataInternalGatewayId.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayId()) ? 131071 : 524287);
    if (isSetGatewayId())
      hashCode = hashCode * 8191 + gatewayId.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayApprovalStatus()) ? 131071 : 524287);
    if (isSetGatewayApprovalStatus())
      hashCode = hashCode * 8191 + gatewayApprovalStatus.getValue();

    hashCode = hashCode * 8191 + ((isSetGatewayName()) ? 131071 : 524287);
    if (isSetGatewayName())
      hashCode = hashCode * 8191 + gatewayName.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 + ((isSetGatewayAcronym()) ? 131071 : 524287);
    if (isSetGatewayAcronym())
      hashCode = hashCode * 8191 + gatewayAcronym.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayURL()) ? 131071 : 524287);
    if (isSetGatewayURL())
      hashCode = hashCode * 8191 + gatewayURL.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayPublicAbstract()) ? 131071 : 524287);
    if (isSetGatewayPublicAbstract())
      hashCode = hashCode * 8191 + gatewayPublicAbstract.hashCode();

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

    hashCode = hashCode * 8191 + ((isSetGatewayAdminFirstName()) ? 131071 : 524287);
    if (isSetGatewayAdminFirstName())
      hashCode = hashCode * 8191 + gatewayAdminFirstName.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayAdminLastName()) ? 131071 : 524287);
    if (isSetGatewayAdminLastName())
      hashCode = hashCode * 8191 + gatewayAdminLastName.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayAdminEmail()) ? 131071 : 524287);
    if (isSetGatewayAdminEmail())
      hashCode = hashCode * 8191 + gatewayAdminEmail.hashCode();

    hashCode = hashCode * 8191 + ((isSetIdentityServerUserName()) ? 131071 : 524287);
    if (isSetIdentityServerUserName())
      hashCode = hashCode * 8191 + identityServerUserName.hashCode();

    hashCode = hashCode * 8191 + ((isSetIdentityServerPasswordToken()) ? 131071 : 524287);
    if (isSetIdentityServerPasswordToken())
      hashCode = hashCode * 8191 + identityServerPasswordToken.hashCode();

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

    hashCode = hashCode * 8191 + ((isSetOauthClientId()) ? 131071 : 524287);
    if (isSetOauthClientId())
      hashCode = hashCode * 8191 + oauthClientId.hashCode();

    hashCode = hashCode * 8191 + ((isSetOauthClientSecret()) ? 131071 : 524287);
    if (isSetOauthClientSecret())
      hashCode = hashCode * 8191 + oauthClientSecret.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(Gateway other) {
    if (!getClass().equals(other.getClass())) {
      return getClass().getName().compareTo(other.getClass().getName());
    }

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.valueOf(isSetAiravataInternalGatewayId()).compareTo(other.isSetAiravataInternalGatewayId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetAiravataInternalGatewayId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.airavataInternalGatewayId, other.airavataInternalGatewayId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayId()).compareTo(other.isSetGatewayId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayId, other.gatewayId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayApprovalStatus()).compareTo(other.isSetGatewayApprovalStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayApprovalStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayApprovalStatus, other.gatewayApprovalStatus);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayName()).compareTo(other.isSetGatewayName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayName, other.gatewayName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetDomain()).compareTo(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.valueOf(isSetEmailAddress()).compareTo(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.valueOf(isSetGatewayAcronym()).compareTo(other.isSetGatewayAcronym());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayAcronym()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayAcronym, other.gatewayAcronym);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayURL()).compareTo(other.isSetGatewayURL());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayURL()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayURL, other.gatewayURL);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayPublicAbstract()).compareTo(other.isSetGatewayPublicAbstract());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayPublicAbstract()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayPublicAbstract, other.gatewayPublicAbstract);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetReviewProposalDescription()).compareTo(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.valueOf(isSetGatewayAdminFirstName()).compareTo(other.isSetGatewayAdminFirstName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayAdminFirstName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayAdminFirstName, other.gatewayAdminFirstName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayAdminLastName()).compareTo(other.isSetGatewayAdminLastName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayAdminLastName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayAdminLastName, other.gatewayAdminLastName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetGatewayAdminEmail()).compareTo(other.isSetGatewayAdminEmail());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayAdminEmail()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayAdminEmail, other.gatewayAdminEmail);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetIdentityServerUserName()).compareTo(other.isSetIdentityServerUserName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetIdentityServerUserName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.identityServerUserName, other.identityServerUserName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetIdentityServerPasswordToken()).compareTo(other.isSetIdentityServerPasswordToken());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetIdentityServerPasswordToken()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.identityServerPasswordToken, other.identityServerPasswordToken);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetDeclinedReason()).compareTo(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.valueOf(isSetOauthClientId()).compareTo(other.isSetOauthClientId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetOauthClientId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.oauthClientId, other.oauthClientId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetOauthClientSecret()).compareTo(other.isSetOauthClientSecret());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetOauthClientSecret()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.oauthClientSecret, other.oauthClientSecret);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.valueOf(isSetRequestCreationTime()).compareTo(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.valueOf(isSetRequesterUsername()).compareTo(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;
  }

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

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

  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("Gateway(");
    boolean first = true;

    if (isSetAiravataInternalGatewayId()) {
      sb.append("airavataInternalGatewayId:");
      if (this.airavataInternalGatewayId == null) {
        sb.append("null");
      } else {
        sb.append(this.airavataInternalGatewayId);
      }
      first = false;
    }
    if (!first) sb.append(", ");
    sb.append("gatewayId:");
    if (this.gatewayId == null) {
      sb.append("null");
    } else {
      sb.append(this.gatewayId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("gatewayApprovalStatus:");
    if (this.gatewayApprovalStatus == null) {
      sb.append("null");
    } else {
      sb.append(this.gatewayApprovalStatus);
    }
    first = false;
    if (isSetGatewayName()) {
      if (!first) sb.append(", ");
      sb.append("gatewayName:");
      if (this.gatewayName == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayName);
      }
      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 (isSetGatewayAcronym()) {
      if (!first) sb.append(", ");
      sb.append("gatewayAcronym:");
      if (this.gatewayAcronym == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayAcronym);
      }
      first = false;
    }
    if (isSetGatewayURL()) {
      if (!first) sb.append(", ");
      sb.append("gatewayURL:");
      if (this.gatewayURL == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayURL);
      }
      first = false;
    }
    if (isSetGatewayPublicAbstract()) {
      if (!first) sb.append(", ");
      sb.append("gatewayPublicAbstract:");
      if (this.gatewayPublicAbstract == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayPublicAbstract);
      }
      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 (isSetGatewayAdminFirstName()) {
      if (!first) sb.append(", ");
      sb.append("gatewayAdminFirstName:");
      if (this.gatewayAdminFirstName == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayAdminFirstName);
      }
      first = false;
    }
    if (isSetGatewayAdminLastName()) {
      if (!first) sb.append(", ");
      sb.append("gatewayAdminLastName:");
      if (this.gatewayAdminLastName == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayAdminLastName);
      }
      first = false;
    }
    if (isSetGatewayAdminEmail()) {
      if (!first) sb.append(", ");
      sb.append("gatewayAdminEmail:");
      if (this.gatewayAdminEmail == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayAdminEmail);
      }
      first = false;
    }
    if (isSetIdentityServerUserName()) {
      if (!first) sb.append(", ");
      sb.append("identityServerUserName:");
      if (this.identityServerUserName == null) {
        sb.append("null");
      } else {
        sb.append(this.identityServerUserName);
      }
      first = false;
    }
    if (isSetIdentityServerPasswordToken()) {
      if (!first) sb.append(", ");
      sb.append("identityServerPasswordToken:");
      if (this.identityServerPasswordToken == null) {
        sb.append("null");
      } else {
        sb.append(this.identityServerPasswordToken);
      }
      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 (isSetOauthClientId()) {
      if (!first) sb.append(", ");
      sb.append("oauthClientId:");
      if (this.oauthClientId == null) {
        sb.append("null");
      } else {
        sb.append(this.oauthClientId);
      }
      first = false;
    }
    if (isSetOauthClientSecret()) {
      if (!first) sb.append(", ");
      sb.append("oauthClientSecret:");
      if (this.oauthClientSecret == null) {
        sb.append("null");
      } else {
        sb.append(this.oauthClientSecret);
      }
      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 (!isSetGatewayId()) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayId' is unset! Struct:" + toString());
    }

    if (!isSetGatewayApprovalStatus()) {
      throw new org.apache.thrift.protocol.TProtocolException("Required field 'gatewayApprovalStatus' 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 GatewayStandardSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public GatewayStandardScheme getScheme() {
      return new GatewayStandardScheme();
    }
  }

  private static class GatewayStandardScheme extends org.apache.thrift.scheme.StandardScheme<Gateway> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, Gateway 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: // AIRAVATA_INTERNAL_GATEWAY_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.airavataInternalGatewayId = iprot.readString();
              struct.setAiravataInternalGatewayIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // GATEWAY_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayId = iprot.readString();
              struct.setGatewayIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // GATEWAY_APPROVAL_STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.gatewayApprovalStatus = org.apache.airavata.model.workspace.GatewayApprovalStatus.findByValue(iprot.readI32());
              struct.setGatewayApprovalStatusIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 4: // GATEWAY_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayName = iprot.readString();
              struct.setGatewayNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // 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 6: // 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 7: // GATEWAY_ACRONYM
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayAcronym = iprot.readString();
              struct.setGatewayAcronymIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // GATEWAY_URL
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayURL = iprot.readString();
              struct.setGatewayURLIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // GATEWAY_PUBLIC_ABSTRACT
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayPublicAbstract = iprot.readString();
              struct.setGatewayPublicAbstractIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // 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 11: // GATEWAY_ADMIN_FIRST_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayAdminFirstName = iprot.readString();
              struct.setGatewayAdminFirstNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // GATEWAY_ADMIN_LAST_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayAdminLastName = iprot.readString();
              struct.setGatewayAdminLastNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // GATEWAY_ADMIN_EMAIL
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayAdminEmail = iprot.readString();
              struct.setGatewayAdminEmailIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // IDENTITY_SERVER_USER_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.identityServerUserName = iprot.readString();
              struct.setIdentityServerUserNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // IDENTITY_SERVER_PASSWORD_TOKEN
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.identityServerPasswordToken = iprot.readString();
              struct.setIdentityServerPasswordTokenIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // 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 17: // OAUTH_CLIENT_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.oauthClientId = iprot.readString();
              struct.setOauthClientIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // OAUTH_CLIENT_SECRET
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.oauthClientSecret = iprot.readString();
              struct.setOauthClientSecretIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // 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 20: // 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();
    }

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

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.airavataInternalGatewayId != null) {
        if (struct.isSetAiravataInternalGatewayId()) {
          oprot.writeFieldBegin(AIRAVATA_INTERNAL_GATEWAY_ID_FIELD_DESC);
          oprot.writeString(struct.airavataInternalGatewayId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayId != null) {
        oprot.writeFieldBegin(GATEWAY_ID_FIELD_DESC);
        oprot.writeString(struct.gatewayId);
        oprot.writeFieldEnd();
      }
      if (struct.gatewayApprovalStatus != null) {
        oprot.writeFieldBegin(GATEWAY_APPROVAL_STATUS_FIELD_DESC);
        oprot.writeI32(struct.gatewayApprovalStatus.getValue());
        oprot.writeFieldEnd();
      }
      if (struct.gatewayName != null) {
        if (struct.isSetGatewayName()) {
          oprot.writeFieldBegin(GATEWAY_NAME_FIELD_DESC);
          oprot.writeString(struct.gatewayName);
          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.gatewayAcronym != null) {
        if (struct.isSetGatewayAcronym()) {
          oprot.writeFieldBegin(GATEWAY_ACRONYM_FIELD_DESC);
          oprot.writeString(struct.gatewayAcronym);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayURL != null) {
        if (struct.isSetGatewayURL()) {
          oprot.writeFieldBegin(GATEWAY_URL_FIELD_DESC);
          oprot.writeString(struct.gatewayURL);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayPublicAbstract != null) {
        if (struct.isSetGatewayPublicAbstract()) {
          oprot.writeFieldBegin(GATEWAY_PUBLIC_ABSTRACT_FIELD_DESC);
          oprot.writeString(struct.gatewayPublicAbstract);
          oprot.writeFieldEnd();
        }
      }
      if (struct.reviewProposalDescription != null) {
        if (struct.isSetReviewProposalDescription()) {
          oprot.writeFieldBegin(REVIEW_PROPOSAL_DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.reviewProposalDescription);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayAdminFirstName != null) {
        if (struct.isSetGatewayAdminFirstName()) {
          oprot.writeFieldBegin(GATEWAY_ADMIN_FIRST_NAME_FIELD_DESC);
          oprot.writeString(struct.gatewayAdminFirstName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayAdminLastName != null) {
        if (struct.isSetGatewayAdminLastName()) {
          oprot.writeFieldBegin(GATEWAY_ADMIN_LAST_NAME_FIELD_DESC);
          oprot.writeString(struct.gatewayAdminLastName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayAdminEmail != null) {
        if (struct.isSetGatewayAdminEmail()) {
          oprot.writeFieldBegin(GATEWAY_ADMIN_EMAIL_FIELD_DESC);
          oprot.writeString(struct.gatewayAdminEmail);
          oprot.writeFieldEnd();
        }
      }
      if (struct.identityServerUserName != null) {
        if (struct.isSetIdentityServerUserName()) {
          oprot.writeFieldBegin(IDENTITY_SERVER_USER_NAME_FIELD_DESC);
          oprot.writeString(struct.identityServerUserName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.identityServerPasswordToken != null) {
        if (struct.isSetIdentityServerPasswordToken()) {
          oprot.writeFieldBegin(IDENTITY_SERVER_PASSWORD_TOKEN_FIELD_DESC);
          oprot.writeString(struct.identityServerPasswordToken);
          oprot.writeFieldEnd();
        }
      }
      if (struct.declinedReason != null) {
        if (struct.isSetDeclinedReason()) {
          oprot.writeFieldBegin(DECLINED_REASON_FIELD_DESC);
          oprot.writeString(struct.declinedReason);
          oprot.writeFieldEnd();
        }
      }
      if (struct.oauthClientId != null) {
        if (struct.isSetOauthClientId()) {
          oprot.writeFieldBegin(OAUTH_CLIENT_ID_FIELD_DESC);
          oprot.writeString(struct.oauthClientId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.oauthClientSecret != null) {
        if (struct.isSetOauthClientSecret()) {
          oprot.writeFieldBegin(OAUTH_CLIENT_SECRET_FIELD_DESC);
          oprot.writeString(struct.oauthClientSecret);
          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 GatewayTupleSchemeFactory implements org.apache.thrift.scheme.SchemeFactory {
    public GatewayTupleScheme getScheme() {
      return new GatewayTupleScheme();
    }
  }

  private static class GatewayTupleScheme extends org.apache.thrift.scheme.TupleScheme<Gateway> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, Gateway struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      oprot.writeString(struct.gatewayId);
      oprot.writeI32(struct.gatewayApprovalStatus.getValue());
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.isSetAiravataInternalGatewayId()) {
        optionals.set(0);
      }
      if (struct.isSetGatewayName()) {
        optionals.set(1);
      }
      if (struct.isSetDomain()) {
        optionals.set(2);
      }
      if (struct.isSetEmailAddress()) {
        optionals.set(3);
      }
      if (struct.isSetGatewayAcronym()) {
        optionals.set(4);
      }
      if (struct.isSetGatewayURL()) {
        optionals.set(5);
      }
      if (struct.isSetGatewayPublicAbstract()) {
        optionals.set(6);
      }
      if (struct.isSetReviewProposalDescription()) {
        optionals.set(7);
      }
      if (struct.isSetGatewayAdminFirstName()) {
        optionals.set(8);
      }
      if (struct.isSetGatewayAdminLastName()) {
        optionals.set(9);
      }
      if (struct.isSetGatewayAdminEmail()) {
        optionals.set(10);
      }
      if (struct.isSetIdentityServerUserName()) {
        optionals.set(11);
      }
      if (struct.isSetIdentityServerPasswordToken()) {
        optionals.set(12);
      }
      if (struct.isSetDeclinedReason()) {
        optionals.set(13);
      }
      if (struct.isSetOauthClientId()) {
        optionals.set(14);
      }
      if (struct.isSetOauthClientSecret()) {
        optionals.set(15);
      }
      if (struct.isSetRequestCreationTime()) {
        optionals.set(16);
      }
      if (struct.isSetRequesterUsername()) {
        optionals.set(17);
      }
      oprot.writeBitSet(optionals, 18);
      if (struct.isSetAiravataInternalGatewayId()) {
        oprot.writeString(struct.airavataInternalGatewayId);
      }
      if (struct.isSetGatewayName()) {
        oprot.writeString(struct.gatewayName);
      }
      if (struct.isSetDomain()) {
        oprot.writeString(struct.domain);
      }
      if (struct.isSetEmailAddress()) {
        oprot.writeString(struct.emailAddress);
      }
      if (struct.isSetGatewayAcronym()) {
        oprot.writeString(struct.gatewayAcronym);
      }
      if (struct.isSetGatewayURL()) {
        oprot.writeString(struct.gatewayURL);
      }
      if (struct.isSetGatewayPublicAbstract()) {
        oprot.writeString(struct.gatewayPublicAbstract);
      }
      if (struct.isSetReviewProposalDescription()) {
        oprot.writeString(struct.reviewProposalDescription);
      }
      if (struct.isSetGatewayAdminFirstName()) {
        oprot.writeString(struct.gatewayAdminFirstName);
      }
      if (struct.isSetGatewayAdminLastName()) {
        oprot.writeString(struct.gatewayAdminLastName);
      }
      if (struct.isSetGatewayAdminEmail()) {
        oprot.writeString(struct.gatewayAdminEmail);
      }
      if (struct.isSetIdentityServerUserName()) {
        oprot.writeString(struct.identityServerUserName);
      }
      if (struct.isSetIdentityServerPasswordToken()) {
        oprot.writeString(struct.identityServerPasswordToken);
      }
      if (struct.isSetDeclinedReason()) {
        oprot.writeString(struct.declinedReason);
      }
      if (struct.isSetOauthClientId()) {
        oprot.writeString(struct.oauthClientId);
      }
      if (struct.isSetOauthClientSecret()) {
        oprot.writeString(struct.oauthClientSecret);
      }
      if (struct.isSetRequestCreationTime()) {
        oprot.writeI64(struct.requestCreationTime);
      }
      if (struct.isSetRequesterUsername()) {
        oprot.writeString(struct.requesterUsername);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, Gateway struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      struct.gatewayId = iprot.readString();
      struct.setGatewayIdIsSet(true);
      struct.gatewayApprovalStatus = org.apache.airavata.model.workspace.GatewayApprovalStatus.findByValue(iprot.readI32());
      struct.setGatewayApprovalStatusIsSet(true);
      java.util.BitSet incoming = iprot.readBitSet(18);
      if (incoming.get(0)) {
        struct.airavataInternalGatewayId = iprot.readString();
        struct.setAiravataInternalGatewayIdIsSet(true);
      }
      if (incoming.get(1)) {
        struct.gatewayName = iprot.readString();
        struct.setGatewayNameIsSet(true);
      }
      if (incoming.get(2)) {
        struct.domain = iprot.readString();
        struct.setDomainIsSet(true);
      }
      if (incoming.get(3)) {
        struct.emailAddress = iprot.readString();
        struct.setEmailAddressIsSet(true);
      }
      if (incoming.get(4)) {
        struct.gatewayAcronym = iprot.readString();
        struct.setGatewayAcronymIsSet(true);
      }
      if (incoming.get(5)) {
        struct.gatewayURL = iprot.readString();
        struct.setGatewayURLIsSet(true);
      }
      if (incoming.get(6)) {
        struct.gatewayPublicAbstract = iprot.readString();
        struct.setGatewayPublicAbstractIsSet(true);
      }
      if (incoming.get(7)) {
        struct.reviewProposalDescription = iprot.readString();
        struct.setReviewProposalDescriptionIsSet(true);
      }
      if (incoming.get(8)) {
        struct.gatewayAdminFirstName = iprot.readString();
        struct.setGatewayAdminFirstNameIsSet(true);
      }
      if (incoming.get(9)) {
        struct.gatewayAdminLastName = iprot.readString();
        struct.setGatewayAdminLastNameIsSet(true);
      }
      if (incoming.get(10)) {
        struct.gatewayAdminEmail = iprot.readString();
        struct.setGatewayAdminEmailIsSet(true);
      }
      if (incoming.get(11)) {
        struct.identityServerUserName = iprot.readString();
        struct.setIdentityServerUserNameIsSet(true);
      }
      if (incoming.get(12)) {
        struct.identityServerPasswordToken = iprot.readString();
        struct.setIdentityServerPasswordTokenIsSet(true);
      }
      if (incoming.get(13)) {
        struct.declinedReason = iprot.readString();
        struct.setDeclinedReasonIsSet(true);
      }
      if (incoming.get(14)) {
        struct.oauthClientId = iprot.readString();
        struct.setOauthClientIdIsSet(true);
      }
      if (incoming.get(15)) {
        struct.oauthClientSecret = iprot.readString();
        struct.setOauthClientSecretIsSet(true);
      }
      if (incoming.get(16)) {
        struct.requestCreationTime = iprot.readI64();
        struct.setRequestCreationTimeIsSet(true);
      }
      if (incoming.get(17)) {
        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();
  }
}

