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

import org.apache.thrift.scheme.IScheme;
import org.apache.thrift.scheme.SchemeFactory;
import org.apache.thrift.scheme.StandardScheme;

import org.apache.thrift.scheme.TupleScheme;
import org.apache.thrift.protocol.TTupleProtocol;
import org.apache.thrift.protocol.TProtocolException;
import org.apache.thrift.EncodingUtils;
import org.apache.thrift.TException;
import org.apache.thrift.async.AsyncMethodCallback;
import org.apache.thrift.server.AbstractNonblockingServer.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.EnumMap;
import java.util.Set;
import java.util.HashSet;
import java.util.EnumSet;
import java.util.Collections;
import java.util.BitSet;
import java.nio.ByteBuffer;
import java.util.Arrays;
import javax.annotation.Generated;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
@Generated(value = "Autogenerated by Thrift Compiler (0.9.3)")
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 GATEWAY_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayId", org.apache.thrift.protocol.TType.STRING, (short)1);
  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)2);
  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)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 GATEWAY_ACRONYM_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayAcronym", org.apache.thrift.protocol.TType.STRING, (short)6);
  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)7);
  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)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 GATEWAY_ADMIN_FIRST_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayAdminFirstName", org.apache.thrift.protocol.TType.STRING, (short)10);
  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)11);
  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)12);
  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)13);
  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)14);

  private static final Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
  static {
    schemes.put(StandardScheme.class, new GatewayStandardSchemeFactory());
    schemes.put(TupleScheme.class, new GatewayTupleSchemeFactory());
  }

  private String gatewayId; // required
  private GatewayApprovalStatus gatewayApprovalStatus; // required
  private String gatewayName; // optional
  private String domain; // optional
  private String emailAddress; // optional
  private String gatewayAcronym; // optional
  private String gatewayURL; // optional
  private String gatewayPublicAbstract; // optional
  private String reviewProposalDescription; // optional
  private String gatewayAdminFirstName; // optional
  private String gatewayAdminLastName; // optional
  private String gatewayAdminEmail; // optional
  private String identityServerUserName; // optional
  private String identityServerPasswordToken; // 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 {
    GATEWAY_ID((short)1, "gatewayId"),
    /**
     * 
     * @see GatewayApprovalStatus
     */
    GATEWAY_APPROVAL_STATUS((short)2, "gatewayApprovalStatus"),
    GATEWAY_NAME((short)3, "gatewayName"),
    DOMAIN((short)4, "domain"),
    EMAIL_ADDRESS((short)5, "emailAddress"),
    GATEWAY_ACRONYM((short)6, "gatewayAcronym"),
    GATEWAY_URL((short)7, "gatewayURL"),
    GATEWAY_PUBLIC_ABSTRACT((short)8, "gatewayPublicAbstract"),
    REVIEW_PROPOSAL_DESCRIPTION((short)9, "reviewProposalDescription"),
    GATEWAY_ADMIN_FIRST_NAME((short)10, "gatewayAdminFirstName"),
    GATEWAY_ADMIN_LAST_NAME((short)11, "gatewayAdminLastName"),
    GATEWAY_ADMIN_EMAIL((short)12, "gatewayAdminEmail"),
    IDENTITY_SERVER_USER_NAME((short)13, "identityServerUserName"),
    IDENTITY_SERVER_PASSWORD_TOKEN((short)14, "identityServerPasswordToken");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // GATEWAY_ID
          return GATEWAY_ID;
        case 2: // GATEWAY_APPROVAL_STATUS
          return GATEWAY_APPROVAL_STATUS;
        case 3: // GATEWAY_NAME
          return GATEWAY_NAME;
        case 4: // DOMAIN
          return DOMAIN;
        case 5: // EMAIL_ADDRESS
          return EMAIL_ADDRESS;
        case 6: // GATEWAY_ACRONYM
          return GATEWAY_ACRONYM;
        case 7: // GATEWAY_URL
          return GATEWAY_URL;
        case 8: // GATEWAY_PUBLIC_ABSTRACT
          return GATEWAY_PUBLIC_ABSTRACT;
        case 9: // REVIEW_PROPOSAL_DESCRIPTION
          return REVIEW_PROPOSAL_DESCRIPTION;
        case 10: // GATEWAY_ADMIN_FIRST_NAME
          return GATEWAY_ADMIN_FIRST_NAME;
        case 11: // GATEWAY_ADMIN_LAST_NAME
          return GATEWAY_ADMIN_LAST_NAME;
        case 12: // GATEWAY_ADMIN_EMAIL
          return GATEWAY_ADMIN_EMAIL;
        case 13: // IDENTITY_SERVER_USER_NAME
          return IDENTITY_SERVER_USER_NAME;
        case 14: // IDENTITY_SERVER_PASSWORD_TOKEN
          return IDENTITY_SERVER_PASSWORD_TOKEN;
        default:
          return null;
      }
    }

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

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

    private final short _thriftId;
    private final String _fieldName;

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

    public short getThriftFieldId() {
      return _thriftId;
    }

    public String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final _Fields optionals[] = {_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};
  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.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)));
    metaDataMap = Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(Gateway.class, metaDataMap);
  }

  public Gateway() {
  }

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

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public Gateway(Gateway other) {
    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;
    }
  }

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

  @Override
  public void clear() {
    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;
  }

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

  public void setGatewayId(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 String getGatewayName() {
    return this.gatewayName;
  }

  public void setGatewayName(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 String getDomain() {
    return this.domain;
  }

  public void setDomain(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 String getEmailAddress() {
    return this.emailAddress;
  }

  public void setEmailAddress(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 String getGatewayAcronym() {
    return this.gatewayAcronym;
  }

  public void setGatewayAcronym(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 String getGatewayURL() {
    return this.gatewayURL;
  }

  public void setGatewayURL(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 String getGatewayPublicAbstract() {
    return this.gatewayPublicAbstract;
  }

  public void setGatewayPublicAbstract(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 String getReviewProposalDescription() {
    return this.reviewProposalDescription;
  }

  public void setReviewProposalDescription(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 String getGatewayAdminFirstName() {
    return this.gatewayAdminFirstName;
  }

  public void setGatewayAdminFirstName(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 String getGatewayAdminLastName() {
    return this.gatewayAdminLastName;
  }

  public void setGatewayAdminLastName(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 String getGatewayAdminEmail() {
    return this.gatewayAdminEmail;
  }

  public void setGatewayAdminEmail(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 String getIdentityServerUserName() {
    return this.identityServerUserName;
  }

  public void setIdentityServerUserName(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 String getIdentityServerPasswordToken() {
    return this.identityServerPasswordToken;
  }

  public void setIdentityServerPasswordToken(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 void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case GATEWAY_ID:
      if (value == null) {
        unsetGatewayId();
      } else {
        setGatewayId((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((String)value);
      }
      break;

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

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

    case GATEWAY_ACRONYM:
      if (value == null) {
        unsetGatewayAcronym();
      } else {
        setGatewayAcronym((String)value);
      }
      break;

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

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

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

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

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

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

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

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

    }
  }

  public Object getFieldValue(_Fields field) {
    switch (field) {
    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();

    }
    throw new IllegalStateException();
  }

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

    switch (field) {
    case 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();
    }
    throw new IllegalStateException();
  }

  @Override
  public boolean equals(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;

    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;
    }

    return true;
  }

  @Override
  public int hashCode() {
    List<Object> list = new ArrayList<Object>();

    boolean present_gatewayId = true && (isSetGatewayId());
    list.add(present_gatewayId);
    if (present_gatewayId)
      list.add(gatewayId);

    boolean present_gatewayApprovalStatus = true && (isSetGatewayApprovalStatus());
    list.add(present_gatewayApprovalStatus);
    if (present_gatewayApprovalStatus)
      list.add(gatewayApprovalStatus.getValue());

    boolean present_gatewayName = true && (isSetGatewayName());
    list.add(present_gatewayName);
    if (present_gatewayName)
      list.add(gatewayName);

    boolean present_domain = true && (isSetDomain());
    list.add(present_domain);
    if (present_domain)
      list.add(domain);

    boolean present_emailAddress = true && (isSetEmailAddress());
    list.add(present_emailAddress);
    if (present_emailAddress)
      list.add(emailAddress);

    boolean present_gatewayAcronym = true && (isSetGatewayAcronym());
    list.add(present_gatewayAcronym);
    if (present_gatewayAcronym)
      list.add(gatewayAcronym);

    boolean present_gatewayURL = true && (isSetGatewayURL());
    list.add(present_gatewayURL);
    if (present_gatewayURL)
      list.add(gatewayURL);

    boolean present_gatewayPublicAbstract = true && (isSetGatewayPublicAbstract());
    list.add(present_gatewayPublicAbstract);
    if (present_gatewayPublicAbstract)
      list.add(gatewayPublicAbstract);

    boolean present_reviewProposalDescription = true && (isSetReviewProposalDescription());
    list.add(present_reviewProposalDescription);
    if (present_reviewProposalDescription)
      list.add(reviewProposalDescription);

    boolean present_gatewayAdminFirstName = true && (isSetGatewayAdminFirstName());
    list.add(present_gatewayAdminFirstName);
    if (present_gatewayAdminFirstName)
      list.add(gatewayAdminFirstName);

    boolean present_gatewayAdminLastName = true && (isSetGatewayAdminLastName());
    list.add(present_gatewayAdminLastName);
    if (present_gatewayAdminLastName)
      list.add(gatewayAdminLastName);

    boolean present_gatewayAdminEmail = true && (isSetGatewayAdminEmail());
    list.add(present_gatewayAdminEmail);
    if (present_gatewayAdminEmail)
      list.add(gatewayAdminEmail);

    boolean present_identityServerUserName = true && (isSetIdentityServerUserName());
    list.add(present_identityServerUserName);
    if (present_identityServerUserName)
      list.add(identityServerUserName);

    boolean present_identityServerPasswordToken = true && (isSetIdentityServerPasswordToken());
    list.add(present_identityServerPasswordToken);
    if (present_identityServerPasswordToken)
      list.add(identityServerPasswordToken);

    return list.hashCode();
  }

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

    int lastComparison = 0;

    lastComparison = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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;
      }
    }
    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 {
    schemes.get(iprot.getScheme()).getScheme().read(iprot, this);
  }

  public void write(org.apache.thrift.protocol.TProtocol oprot) throws org.apache.thrift.TException {
    schemes.get(oprot.getScheme()).getScheme().write(oprot, this);
  }

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

    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;
    }
    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, ClassNotFoundException {
    try {
      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 SchemeFactory {
    public GatewayStandardScheme getScheme() {
      return new GatewayStandardScheme();
    }
  }

  private static class GatewayStandardScheme extends 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: // 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 2: // 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 3: // 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 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: // 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 7: // 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 8: // 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 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 10: // 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 11: // 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 12: // 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 13: // 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 14: // 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;
          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.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();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class GatewayTupleSchemeFactory implements SchemeFactory {
    public GatewayTupleScheme getScheme() {
      return new GatewayTupleScheme();
    }
  }

  private static class GatewayTupleScheme extends TupleScheme<Gateway> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, Gateway struct) throws org.apache.thrift.TException {
      TTupleProtocol oprot = (TTupleProtocol) prot;
      oprot.writeString(struct.gatewayId);
      oprot.writeI32(struct.gatewayApprovalStatus.getValue());
      BitSet optionals = new BitSet();
      if (struct.isSetGatewayName()) {
        optionals.set(0);
      }
      if (struct.isSetDomain()) {
        optionals.set(1);
      }
      if (struct.isSetEmailAddress()) {
        optionals.set(2);
      }
      if (struct.isSetGatewayAcronym()) {
        optionals.set(3);
      }
      if (struct.isSetGatewayURL()) {
        optionals.set(4);
      }
      if (struct.isSetGatewayPublicAbstract()) {
        optionals.set(5);
      }
      if (struct.isSetReviewProposalDescription()) {
        optionals.set(6);
      }
      if (struct.isSetGatewayAdminFirstName()) {
        optionals.set(7);
      }
      if (struct.isSetGatewayAdminLastName()) {
        optionals.set(8);
      }
      if (struct.isSetGatewayAdminEmail()) {
        optionals.set(9);
      }
      if (struct.isSetIdentityServerUserName()) {
        optionals.set(10);
      }
      if (struct.isSetIdentityServerPasswordToken()) {
        optionals.set(11);
      }
      oprot.writeBitSet(optionals, 12);
      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);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, Gateway struct) throws org.apache.thrift.TException {
      TTupleProtocol iprot = (TTupleProtocol) prot;
      struct.gatewayId = iprot.readString();
      struct.setGatewayIdIsSet(true);
      struct.gatewayApprovalStatus = org.apache.airavata.model.workspace.GatewayApprovalStatus.findByValue(iprot.readI32());
      struct.setGatewayApprovalStatusIsSet(true);
      BitSet incoming = iprot.readBitSet(12);
      if (incoming.get(0)) {
        struct.gatewayName = iprot.readString();
        struct.setGatewayNameIsSet(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.gatewayAcronym = iprot.readString();
        struct.setGatewayAcronymIsSet(true);
      }
      if (incoming.get(4)) {
        struct.gatewayURL = iprot.readString();
        struct.setGatewayURLIsSet(true);
      }
      if (incoming.get(5)) {
        struct.gatewayPublicAbstract = iprot.readString();
        struct.setGatewayPublicAbstractIsSet(true);
      }
      if (incoming.get(6)) {
        struct.reviewProposalDescription = iprot.readString();
        struct.setReviewProposalDescriptionIsSet(true);
      }
      if (incoming.get(7)) {
        struct.gatewayAdminFirstName = iprot.readString();
        struct.setGatewayAdminFirstNameIsSet(true);
      }
      if (incoming.get(8)) {
        struct.gatewayAdminLastName = iprot.readString();
        struct.setGatewayAdminLastNameIsSet(true);
      }
      if (incoming.get(9)) {
        struct.gatewayAdminEmail = iprot.readString();
        struct.setGatewayAdminEmailIsSet(true);
      }
      if (incoming.get(10)) {
        struct.identityServerUserName = iprot.readString();
        struct.setIdentityServerUserNameIsSet(true);
      }
      if (incoming.get(11)) {
        struct.identityServerPasswordToken = iprot.readString();
        struct.setIdentityServerPasswordTokenIsSet(true);
      }
    }
  }

}

