/**
 * 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.experiment;

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"})
/**
 * A structure holding the experiment metadata and its child models.
 * 
 * userName:
 *   The user name of the targeted gateway end user on whose behalf the experiment is being created.
 *     the associated gateway identity can only be inferred from the security hand-shake so as to avoid
 *     authorized Airavata Clients mimicking an unauthorized request. If a gateway is not registered with
 *     Airavata, an authorization exception is thrown.
 * 
 * experimentName:
 *   The name of the experiment as defined by the user. The name need not be unique as uniqueness is enforced
 *      by the generated experiment id.
 * 
 * experimentDescription:
 *    The verbose description of the experiment. This is an optional parameter.
 */
@Generated(value = "Autogenerated by Thrift Compiler (0.9.3)")
public class ExperimentModel implements org.apache.thrift.TBase<ExperimentModel, ExperimentModel._Fields>, java.io.Serializable, Cloneable, Comparable<ExperimentModel> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ExperimentModel");

  private static final org.apache.thrift.protocol.TField EXPERIMENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentId", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField PROJECT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("projectId", org.apache.thrift.protocol.TType.STRING, (short)2);
  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)3);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_TYPE_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentType", org.apache.thrift.protocol.TType.I32, (short)4);
  private static final org.apache.thrift.protocol.TField USER_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("userName", org.apache.thrift.protocol.TType.STRING, (short)5);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentName", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField CREATION_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("creationTime", org.apache.thrift.protocol.TType.I64, (short)7);
  private static final org.apache.thrift.protocol.TField DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("description", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField EXECUTION_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("executionId", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField GATEWAY_EXECUTION_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayExecutionId", org.apache.thrift.protocol.TType.STRING, (short)10);
  private static final org.apache.thrift.protocol.TField GATEWAY_INSTANCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("gatewayInstanceId", org.apache.thrift.protocol.TType.STRING, (short)11);
  private static final org.apache.thrift.protocol.TField ENABLE_EMAIL_NOTIFICATION_FIELD_DESC = new org.apache.thrift.protocol.TField("enableEmailNotification", org.apache.thrift.protocol.TType.BOOL, (short)12);
  private static final org.apache.thrift.protocol.TField EMAIL_ADDRESSES_FIELD_DESC = new org.apache.thrift.protocol.TField("emailAddresses", org.apache.thrift.protocol.TType.LIST, (short)13);
  private static final org.apache.thrift.protocol.TField USER_CONFIGURATION_DATA_FIELD_DESC = new org.apache.thrift.protocol.TField("userConfigurationData", org.apache.thrift.protocol.TType.STRUCT, (short)14);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_INPUTS_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentInputs", org.apache.thrift.protocol.TType.LIST, (short)15);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_OUTPUTS_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentOutputs", org.apache.thrift.protocol.TType.LIST, (short)16);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentStatus", org.apache.thrift.protocol.TType.STRUCT, (short)17);
  private static final org.apache.thrift.protocol.TField ERRORS_FIELD_DESC = new org.apache.thrift.protocol.TField("errors", org.apache.thrift.protocol.TType.LIST, (short)18);
  private static final org.apache.thrift.protocol.TField PROCESSES_FIELD_DESC = new org.apache.thrift.protocol.TField("processes", org.apache.thrift.protocol.TType.LIST, (short)19);

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

  private String experimentId; // required
  private String projectId; // required
  private String gatewayId; // required
  private ExperimentType experimentType; // required
  private String userName; // required
  private String experimentName; // required
  private long creationTime; // optional
  private String description; // optional
  private String executionId; // optional
  private String gatewayExecutionId; // optional
  private String gatewayInstanceId; // optional
  private boolean enableEmailNotification; // optional
  private List<String> emailAddresses; // optional
  private UserConfigurationDataModel userConfigurationData; // optional
  private List<org.apache.airavata.model.application.io.InputDataObjectType> experimentInputs; // optional
  private List<org.apache.airavata.model.application.io.OutputDataObjectType> experimentOutputs; // optional
  private org.apache.airavata.model.status.ExperimentStatus experimentStatus; // optional
  private List<org.apache.airavata.model.commons.ErrorModel> errors; // optional
  private List<org.apache.airavata.model.process.ProcessModel> processes; // 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 {
    EXPERIMENT_ID((short)1, "experimentId"),
    PROJECT_ID((short)2, "projectId"),
    GATEWAY_ID((short)3, "gatewayId"),
    /**
     * 
     * @see ExperimentType
     */
    EXPERIMENT_TYPE((short)4, "experimentType"),
    USER_NAME((short)5, "userName"),
    EXPERIMENT_NAME((short)6, "experimentName"),
    CREATION_TIME((short)7, "creationTime"),
    DESCRIPTION((short)8, "description"),
    EXECUTION_ID((short)9, "executionId"),
    GATEWAY_EXECUTION_ID((short)10, "gatewayExecutionId"),
    GATEWAY_INSTANCE_ID((short)11, "gatewayInstanceId"),
    ENABLE_EMAIL_NOTIFICATION((short)12, "enableEmailNotification"),
    EMAIL_ADDRESSES((short)13, "emailAddresses"),
    USER_CONFIGURATION_DATA((short)14, "userConfigurationData"),
    EXPERIMENT_INPUTS((short)15, "experimentInputs"),
    EXPERIMENT_OUTPUTS((short)16, "experimentOutputs"),
    EXPERIMENT_STATUS((short)17, "experimentStatus"),
    ERRORS((short)18, "errors"),
    PROCESSES((short)19, "processes");

    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: // EXPERIMENT_ID
          return EXPERIMENT_ID;
        case 2: // PROJECT_ID
          return PROJECT_ID;
        case 3: // GATEWAY_ID
          return GATEWAY_ID;
        case 4: // EXPERIMENT_TYPE
          return EXPERIMENT_TYPE;
        case 5: // USER_NAME
          return USER_NAME;
        case 6: // EXPERIMENT_NAME
          return EXPERIMENT_NAME;
        case 7: // CREATION_TIME
          return CREATION_TIME;
        case 8: // DESCRIPTION
          return DESCRIPTION;
        case 9: // EXECUTION_ID
          return EXECUTION_ID;
        case 10: // GATEWAY_EXECUTION_ID
          return GATEWAY_EXECUTION_ID;
        case 11: // GATEWAY_INSTANCE_ID
          return GATEWAY_INSTANCE_ID;
        case 12: // ENABLE_EMAIL_NOTIFICATION
          return ENABLE_EMAIL_NOTIFICATION;
        case 13: // EMAIL_ADDRESSES
          return EMAIL_ADDRESSES;
        case 14: // USER_CONFIGURATION_DATA
          return USER_CONFIGURATION_DATA;
        case 15: // EXPERIMENT_INPUTS
          return EXPERIMENT_INPUTS;
        case 16: // EXPERIMENT_OUTPUTS
          return EXPERIMENT_OUTPUTS;
        case 17: // EXPERIMENT_STATUS
          return EXPERIMENT_STATUS;
        case 18: // ERRORS
          return ERRORS;
        case 19: // PROCESSES
          return PROCESSES;
        default:
          return null;
      }
    }

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

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

    private final short _thriftId;
    private final String _fieldName;

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

    public short getThriftFieldId() {
      return _thriftId;
    }

    public String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __CREATIONTIME_ISSET_ID = 0;
  private static final int __ENABLEEMAILNOTIFICATION_ISSET_ID = 1;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.CREATION_TIME,_Fields.DESCRIPTION,_Fields.EXECUTION_ID,_Fields.GATEWAY_EXECUTION_ID,_Fields.GATEWAY_INSTANCE_ID,_Fields.ENABLE_EMAIL_NOTIFICATION,_Fields.EMAIL_ADDRESSES,_Fields.USER_CONFIGURATION_DATA,_Fields.EXPERIMENT_INPUTS,_Fields.EXPERIMENT_OUTPUTS,_Fields.EXPERIMENT_STATUS,_Fields.ERRORS,_Fields.PROCESSES};
  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.EXPERIMENT_ID, new org.apache.thrift.meta_data.FieldMetaData("experimentId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PROJECT_ID, new org.apache.thrift.meta_data.FieldMetaData("projectId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        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.EXPERIMENT_TYPE, new org.apache.thrift.meta_data.FieldMetaData("experimentType", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.EnumMetaData(org.apache.thrift.protocol.TType.ENUM, ExperimentType.class)));
    tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.EXPERIMENT_NAME, new org.apache.thrift.meta_data.FieldMetaData("experimentName", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.CREATION_TIME, new org.apache.thrift.meta_data.FieldMetaData("creationTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("description", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.EXECUTION_ID, new org.apache.thrift.meta_data.FieldMetaData("executionId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_EXECUTION_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayExecutionId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GATEWAY_INSTANCE_ID, new org.apache.thrift.meta_data.FieldMetaData("gatewayInstanceId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.ENABLE_EMAIL_NOTIFICATION, new org.apache.thrift.meta_data.FieldMetaData("enableEmailNotification", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
    tmpMap.put(_Fields.EMAIL_ADDRESSES, new org.apache.thrift.meta_data.FieldMetaData("emailAddresses", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
            new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING))));
    tmpMap.put(_Fields.USER_CONFIGURATION_DATA, new org.apache.thrift.meta_data.FieldMetaData("userConfigurationData", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, UserConfigurationDataModel.class)));
    tmpMap.put(_Fields.EXPERIMENT_INPUTS, new org.apache.thrift.meta_data.FieldMetaData("experimentInputs", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.application.io.InputDataObjectType.class))));
    tmpMap.put(_Fields.EXPERIMENT_OUTPUTS, new org.apache.thrift.meta_data.FieldMetaData("experimentOutputs", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.application.io.OutputDataObjectType.class))));
    tmpMap.put(_Fields.EXPERIMENT_STATUS, new org.apache.thrift.meta_data.FieldMetaData("experimentStatus", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.status.ExperimentStatus.class)));
    tmpMap.put(_Fields.ERRORS, new org.apache.thrift.meta_data.FieldMetaData("errors", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.commons.ErrorModel.class))));
    tmpMap.put(_Fields.PROCESSES, new org.apache.thrift.meta_data.FieldMetaData("processes", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.ListMetaData(org.apache.thrift.protocol.TType.LIST, 
            new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.process.ProcessModel.class))));
    metaDataMap = Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ExperimentModel.class, metaDataMap);
  }

  public ExperimentModel() {
    this.experimentId = "DO_NOT_SET_AT_CLIENTS";

    this.experimentType = org.apache.airavata.model.experiment.ExperimentType.SINGLE_APPLICATION;

  }

  public ExperimentModel(
    String experimentId,
    String projectId,
    String gatewayId,
    ExperimentType experimentType,
    String userName,
    String experimentName)
  {
    this();
    this.experimentId = experimentId;
    this.projectId = projectId;
    this.gatewayId = gatewayId;
    this.experimentType = experimentType;
    this.userName = userName;
    this.experimentName = experimentName;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public ExperimentModel(ExperimentModel other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetExperimentId()) {
      this.experimentId = other.experimentId;
    }
    if (other.isSetProjectId()) {
      this.projectId = other.projectId;
    }
    if (other.isSetGatewayId()) {
      this.gatewayId = other.gatewayId;
    }
    if (other.isSetExperimentType()) {
      this.experimentType = other.experimentType;
    }
    if (other.isSetUserName()) {
      this.userName = other.userName;
    }
    if (other.isSetExperimentName()) {
      this.experimentName = other.experimentName;
    }
    this.creationTime = other.creationTime;
    if (other.isSetDescription()) {
      this.description = other.description;
    }
    if (other.isSetExecutionId()) {
      this.executionId = other.executionId;
    }
    if (other.isSetGatewayExecutionId()) {
      this.gatewayExecutionId = other.gatewayExecutionId;
    }
    if (other.isSetGatewayInstanceId()) {
      this.gatewayInstanceId = other.gatewayInstanceId;
    }
    this.enableEmailNotification = other.enableEmailNotification;
    if (other.isSetEmailAddresses()) {
      List<String> __this__emailAddresses = new ArrayList<String>(other.emailAddresses);
      this.emailAddresses = __this__emailAddresses;
    }
    if (other.isSetUserConfigurationData()) {
      this.userConfigurationData = new UserConfigurationDataModel(other.userConfigurationData);
    }
    if (other.isSetExperimentInputs()) {
      List<org.apache.airavata.model.application.io.InputDataObjectType> __this__experimentInputs = new ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(other.experimentInputs.size());
      for (org.apache.airavata.model.application.io.InputDataObjectType other_element : other.experimentInputs) {
        __this__experimentInputs.add(new org.apache.airavata.model.application.io.InputDataObjectType(other_element));
      }
      this.experimentInputs = __this__experimentInputs;
    }
    if (other.isSetExperimentOutputs()) {
      List<org.apache.airavata.model.application.io.OutputDataObjectType> __this__experimentOutputs = new ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(other.experimentOutputs.size());
      for (org.apache.airavata.model.application.io.OutputDataObjectType other_element : other.experimentOutputs) {
        __this__experimentOutputs.add(new org.apache.airavata.model.application.io.OutputDataObjectType(other_element));
      }
      this.experimentOutputs = __this__experimentOutputs;
    }
    if (other.isSetExperimentStatus()) {
      this.experimentStatus = new org.apache.airavata.model.status.ExperimentStatus(other.experimentStatus);
    }
    if (other.isSetErrors()) {
      List<org.apache.airavata.model.commons.ErrorModel> __this__errors = new ArrayList<org.apache.airavata.model.commons.ErrorModel>(other.errors.size());
      for (org.apache.airavata.model.commons.ErrorModel other_element : other.errors) {
        __this__errors.add(new org.apache.airavata.model.commons.ErrorModel(other_element));
      }
      this.errors = __this__errors;
    }
    if (other.isSetProcesses()) {
      List<org.apache.airavata.model.process.ProcessModel> __this__processes = new ArrayList<org.apache.airavata.model.process.ProcessModel>(other.processes.size());
      for (org.apache.airavata.model.process.ProcessModel other_element : other.processes) {
        __this__processes.add(new org.apache.airavata.model.process.ProcessModel(other_element));
      }
      this.processes = __this__processes;
    }
  }

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

  @Override
  public void clear() {
    this.experimentId = "DO_NOT_SET_AT_CLIENTS";

    this.projectId = null;
    this.gatewayId = null;
    this.experimentType = org.apache.airavata.model.experiment.ExperimentType.SINGLE_APPLICATION;

    this.userName = null;
    this.experimentName = null;
    setCreationTimeIsSet(false);
    this.creationTime = 0;
    this.description = null;
    this.executionId = null;
    this.gatewayExecutionId = null;
    this.gatewayInstanceId = null;
    setEnableEmailNotificationIsSet(false);
    this.enableEmailNotification = false;
    this.emailAddresses = null;
    this.userConfigurationData = null;
    this.experimentInputs = null;
    this.experimentOutputs = null;
    this.experimentStatus = null;
    this.errors = null;
    this.processes = null;
  }

  public String getExperimentId() {
    return this.experimentId;
  }

  public void setExperimentId(String experimentId) {
    this.experimentId = experimentId;
  }

  public void unsetExperimentId() {
    this.experimentId = null;
  }

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

  public void setExperimentIdIsSet(boolean value) {
    if (!value) {
      this.experimentId = null;
    }
  }

  public String getProjectId() {
    return this.projectId;
  }

  public void setProjectId(String projectId) {
    this.projectId = projectId;
  }

  public void unsetProjectId() {
    this.projectId = null;
  }

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

  public void setProjectIdIsSet(boolean value) {
    if (!value) {
      this.projectId = 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 ExperimentType
   */
  public ExperimentType getExperimentType() {
    return this.experimentType;
  }

  /**
   * 
   * @see ExperimentType
   */
  public void setExperimentType(ExperimentType experimentType) {
    this.experimentType = experimentType;
  }

  public void unsetExperimentType() {
    this.experimentType = null;
  }

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

  public void setExperimentTypeIsSet(boolean value) {
    if (!value) {
      this.experimentType = null;
    }
  }

  public String getUserName() {
    return this.userName;
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public void unsetUserName() {
    this.userName = null;
  }

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

  public void setUserNameIsSet(boolean value) {
    if (!value) {
      this.userName = null;
    }
  }

  public String getExperimentName() {
    return this.experimentName;
  }

  public void setExperimentName(String experimentName) {
    this.experimentName = experimentName;
  }

  public void unsetExperimentName() {
    this.experimentName = null;
  }

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

  public void setExperimentNameIsSet(boolean value) {
    if (!value) {
      this.experimentName = null;
    }
  }

  public long getCreationTime() {
    return this.creationTime;
  }

  public void setCreationTime(long creationTime) {
    this.creationTime = creationTime;
    setCreationTimeIsSet(true);
  }

  public void unsetCreationTime() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
  }

  /** Returns true if field creationTime is set (has been assigned a value) and false otherwise */
  public boolean isSetCreationTime() {
    return EncodingUtils.testBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
  }

  public void setCreationTimeIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __CREATIONTIME_ISSET_ID, value);
  }

  public String getDescription() {
    return this.description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public void unsetDescription() {
    this.description = null;
  }

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

  public void setDescriptionIsSet(boolean value) {
    if (!value) {
      this.description = null;
    }
  }

  public String getExecutionId() {
    return this.executionId;
  }

  public void setExecutionId(String executionId) {
    this.executionId = executionId;
  }

  public void unsetExecutionId() {
    this.executionId = null;
  }

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

  public void setExecutionIdIsSet(boolean value) {
    if (!value) {
      this.executionId = null;
    }
  }

  public String getGatewayExecutionId() {
    return this.gatewayExecutionId;
  }

  public void setGatewayExecutionId(String gatewayExecutionId) {
    this.gatewayExecutionId = gatewayExecutionId;
  }

  public void unsetGatewayExecutionId() {
    this.gatewayExecutionId = null;
  }

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

  public void setGatewayExecutionIdIsSet(boolean value) {
    if (!value) {
      this.gatewayExecutionId = null;
    }
  }

  public String getGatewayInstanceId() {
    return this.gatewayInstanceId;
  }

  public void setGatewayInstanceId(String gatewayInstanceId) {
    this.gatewayInstanceId = gatewayInstanceId;
  }

  public void unsetGatewayInstanceId() {
    this.gatewayInstanceId = null;
  }

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

  public void setGatewayInstanceIdIsSet(boolean value) {
    if (!value) {
      this.gatewayInstanceId = null;
    }
  }

  public boolean isEnableEmailNotification() {
    return this.enableEmailNotification;
  }

  public void setEnableEmailNotification(boolean enableEmailNotification) {
    this.enableEmailNotification = enableEmailNotification;
    setEnableEmailNotificationIsSet(true);
  }

  public void unsetEnableEmailNotification() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __ENABLEEMAILNOTIFICATION_ISSET_ID);
  }

  /** Returns true if field enableEmailNotification is set (has been assigned a value) and false otherwise */
  public boolean isSetEnableEmailNotification() {
    return EncodingUtils.testBit(__isset_bitfield, __ENABLEEMAILNOTIFICATION_ISSET_ID);
  }

  public void setEnableEmailNotificationIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __ENABLEEMAILNOTIFICATION_ISSET_ID, value);
  }

  public int getEmailAddressesSize() {
    return (this.emailAddresses == null) ? 0 : this.emailAddresses.size();
  }

  public java.util.Iterator<String> getEmailAddressesIterator() {
    return (this.emailAddresses == null) ? null : this.emailAddresses.iterator();
  }

  public void addToEmailAddresses(String elem) {
    if (this.emailAddresses == null) {
      this.emailAddresses = new ArrayList<String>();
    }
    this.emailAddresses.add(elem);
  }

  public List<String> getEmailAddresses() {
    return this.emailAddresses;
  }

  public void setEmailAddresses(List<String> emailAddresses) {
    this.emailAddresses = emailAddresses;
  }

  public void unsetEmailAddresses() {
    this.emailAddresses = null;
  }

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

  public void setEmailAddressesIsSet(boolean value) {
    if (!value) {
      this.emailAddresses = null;
    }
  }

  public UserConfigurationDataModel getUserConfigurationData() {
    return this.userConfigurationData;
  }

  public void setUserConfigurationData(UserConfigurationDataModel userConfigurationData) {
    this.userConfigurationData = userConfigurationData;
  }

  public void unsetUserConfigurationData() {
    this.userConfigurationData = null;
  }

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

  public void setUserConfigurationDataIsSet(boolean value) {
    if (!value) {
      this.userConfigurationData = null;
    }
  }

  public int getExperimentInputsSize() {
    return (this.experimentInputs == null) ? 0 : this.experimentInputs.size();
  }

  public java.util.Iterator<org.apache.airavata.model.application.io.InputDataObjectType> getExperimentInputsIterator() {
    return (this.experimentInputs == null) ? null : this.experimentInputs.iterator();
  }

  public void addToExperimentInputs(org.apache.airavata.model.application.io.InputDataObjectType elem) {
    if (this.experimentInputs == null) {
      this.experimentInputs = new ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>();
    }
    this.experimentInputs.add(elem);
  }

  public List<org.apache.airavata.model.application.io.InputDataObjectType> getExperimentInputs() {
    return this.experimentInputs;
  }

  public void setExperimentInputs(List<org.apache.airavata.model.application.io.InputDataObjectType> experimentInputs) {
    this.experimentInputs = experimentInputs;
  }

  public void unsetExperimentInputs() {
    this.experimentInputs = null;
  }

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

  public void setExperimentInputsIsSet(boolean value) {
    if (!value) {
      this.experimentInputs = null;
    }
  }

  public int getExperimentOutputsSize() {
    return (this.experimentOutputs == null) ? 0 : this.experimentOutputs.size();
  }

  public java.util.Iterator<org.apache.airavata.model.application.io.OutputDataObjectType> getExperimentOutputsIterator() {
    return (this.experimentOutputs == null) ? null : this.experimentOutputs.iterator();
  }

  public void addToExperimentOutputs(org.apache.airavata.model.application.io.OutputDataObjectType elem) {
    if (this.experimentOutputs == null) {
      this.experimentOutputs = new ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>();
    }
    this.experimentOutputs.add(elem);
  }

  public List<org.apache.airavata.model.application.io.OutputDataObjectType> getExperimentOutputs() {
    return this.experimentOutputs;
  }

  public void setExperimentOutputs(List<org.apache.airavata.model.application.io.OutputDataObjectType> experimentOutputs) {
    this.experimentOutputs = experimentOutputs;
  }

  public void unsetExperimentOutputs() {
    this.experimentOutputs = null;
  }

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

  public void setExperimentOutputsIsSet(boolean value) {
    if (!value) {
      this.experimentOutputs = null;
    }
  }

  public org.apache.airavata.model.status.ExperimentStatus getExperimentStatus() {
    return this.experimentStatus;
  }

  public void setExperimentStatus(org.apache.airavata.model.status.ExperimentStatus experimentStatus) {
    this.experimentStatus = experimentStatus;
  }

  public void unsetExperimentStatus() {
    this.experimentStatus = null;
  }

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

  public void setExperimentStatusIsSet(boolean value) {
    if (!value) {
      this.experimentStatus = null;
    }
  }

  public int getErrorsSize() {
    return (this.errors == null) ? 0 : this.errors.size();
  }

  public java.util.Iterator<org.apache.airavata.model.commons.ErrorModel> getErrorsIterator() {
    return (this.errors == null) ? null : this.errors.iterator();
  }

  public void addToErrors(org.apache.airavata.model.commons.ErrorModel elem) {
    if (this.errors == null) {
      this.errors = new ArrayList<org.apache.airavata.model.commons.ErrorModel>();
    }
    this.errors.add(elem);
  }

  public List<org.apache.airavata.model.commons.ErrorModel> getErrors() {
    return this.errors;
  }

  public void setErrors(List<org.apache.airavata.model.commons.ErrorModel> errors) {
    this.errors = errors;
  }

  public void unsetErrors() {
    this.errors = null;
  }

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

  public void setErrorsIsSet(boolean value) {
    if (!value) {
      this.errors = null;
    }
  }

  public int getProcessesSize() {
    return (this.processes == null) ? 0 : this.processes.size();
  }

  public java.util.Iterator<org.apache.airavata.model.process.ProcessModel> getProcessesIterator() {
    return (this.processes == null) ? null : this.processes.iterator();
  }

  public void addToProcesses(org.apache.airavata.model.process.ProcessModel elem) {
    if (this.processes == null) {
      this.processes = new ArrayList<org.apache.airavata.model.process.ProcessModel>();
    }
    this.processes.add(elem);
  }

  public List<org.apache.airavata.model.process.ProcessModel> getProcesses() {
    return this.processes;
  }

  public void setProcesses(List<org.apache.airavata.model.process.ProcessModel> processes) {
    this.processes = processes;
  }

  public void unsetProcesses() {
    this.processes = null;
  }

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

  public void setProcessesIsSet(boolean value) {
    if (!value) {
      this.processes = null;
    }
  }

  public void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case EXPERIMENT_ID:
      if (value == null) {
        unsetExperimentId();
      } else {
        setExperimentId((String)value);
      }
      break;

    case PROJECT_ID:
      if (value == null) {
        unsetProjectId();
      } else {
        setProjectId((String)value);
      }
      break;

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

    case EXPERIMENT_TYPE:
      if (value == null) {
        unsetExperimentType();
      } else {
        setExperimentType((ExperimentType)value);
      }
      break;

    case USER_NAME:
      if (value == null) {
        unsetUserName();
      } else {
        setUserName((String)value);
      }
      break;

    case EXPERIMENT_NAME:
      if (value == null) {
        unsetExperimentName();
      } else {
        setExperimentName((String)value);
      }
      break;

    case CREATION_TIME:
      if (value == null) {
        unsetCreationTime();
      } else {
        setCreationTime((Long)value);
      }
      break;

    case DESCRIPTION:
      if (value == null) {
        unsetDescription();
      } else {
        setDescription((String)value);
      }
      break;

    case EXECUTION_ID:
      if (value == null) {
        unsetExecutionId();
      } else {
        setExecutionId((String)value);
      }
      break;

    case GATEWAY_EXECUTION_ID:
      if (value == null) {
        unsetGatewayExecutionId();
      } else {
        setGatewayExecutionId((String)value);
      }
      break;

    case GATEWAY_INSTANCE_ID:
      if (value == null) {
        unsetGatewayInstanceId();
      } else {
        setGatewayInstanceId((String)value);
      }
      break;

    case ENABLE_EMAIL_NOTIFICATION:
      if (value == null) {
        unsetEnableEmailNotification();
      } else {
        setEnableEmailNotification((Boolean)value);
      }
      break;

    case EMAIL_ADDRESSES:
      if (value == null) {
        unsetEmailAddresses();
      } else {
        setEmailAddresses((List<String>)value);
      }
      break;

    case USER_CONFIGURATION_DATA:
      if (value == null) {
        unsetUserConfigurationData();
      } else {
        setUserConfigurationData((UserConfigurationDataModel)value);
      }
      break;

    case EXPERIMENT_INPUTS:
      if (value == null) {
        unsetExperimentInputs();
      } else {
        setExperimentInputs((List<org.apache.airavata.model.application.io.InputDataObjectType>)value);
      }
      break;

    case EXPERIMENT_OUTPUTS:
      if (value == null) {
        unsetExperimentOutputs();
      } else {
        setExperimentOutputs((List<org.apache.airavata.model.application.io.OutputDataObjectType>)value);
      }
      break;

    case EXPERIMENT_STATUS:
      if (value == null) {
        unsetExperimentStatus();
      } else {
        setExperimentStatus((org.apache.airavata.model.status.ExperimentStatus)value);
      }
      break;

    case ERRORS:
      if (value == null) {
        unsetErrors();
      } else {
        setErrors((List<org.apache.airavata.model.commons.ErrorModel>)value);
      }
      break;

    case PROCESSES:
      if (value == null) {
        unsetProcesses();
      } else {
        setProcesses((List<org.apache.airavata.model.process.ProcessModel>)value);
      }
      break;

    }
  }

  public Object getFieldValue(_Fields field) {
    switch (field) {
    case EXPERIMENT_ID:
      return getExperimentId();

    case PROJECT_ID:
      return getProjectId();

    case GATEWAY_ID:
      return getGatewayId();

    case EXPERIMENT_TYPE:
      return getExperimentType();

    case USER_NAME:
      return getUserName();

    case EXPERIMENT_NAME:
      return getExperimentName();

    case CREATION_TIME:
      return getCreationTime();

    case DESCRIPTION:
      return getDescription();

    case EXECUTION_ID:
      return getExecutionId();

    case GATEWAY_EXECUTION_ID:
      return getGatewayExecutionId();

    case GATEWAY_INSTANCE_ID:
      return getGatewayInstanceId();

    case ENABLE_EMAIL_NOTIFICATION:
      return isEnableEmailNotification();

    case EMAIL_ADDRESSES:
      return getEmailAddresses();

    case USER_CONFIGURATION_DATA:
      return getUserConfigurationData();

    case EXPERIMENT_INPUTS:
      return getExperimentInputs();

    case EXPERIMENT_OUTPUTS:
      return getExperimentOutputs();

    case EXPERIMENT_STATUS:
      return getExperimentStatus();

    case ERRORS:
      return getErrors();

    case PROCESSES:
      return getProcesses();

    }
    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 EXPERIMENT_ID:
      return isSetExperimentId();
    case PROJECT_ID:
      return isSetProjectId();
    case GATEWAY_ID:
      return isSetGatewayId();
    case EXPERIMENT_TYPE:
      return isSetExperimentType();
    case USER_NAME:
      return isSetUserName();
    case EXPERIMENT_NAME:
      return isSetExperimentName();
    case CREATION_TIME:
      return isSetCreationTime();
    case DESCRIPTION:
      return isSetDescription();
    case EXECUTION_ID:
      return isSetExecutionId();
    case GATEWAY_EXECUTION_ID:
      return isSetGatewayExecutionId();
    case GATEWAY_INSTANCE_ID:
      return isSetGatewayInstanceId();
    case ENABLE_EMAIL_NOTIFICATION:
      return isSetEnableEmailNotification();
    case EMAIL_ADDRESSES:
      return isSetEmailAddresses();
    case USER_CONFIGURATION_DATA:
      return isSetUserConfigurationData();
    case EXPERIMENT_INPUTS:
      return isSetExperimentInputs();
    case EXPERIMENT_OUTPUTS:
      return isSetExperimentOutputs();
    case EXPERIMENT_STATUS:
      return isSetExperimentStatus();
    case ERRORS:
      return isSetErrors();
    case PROCESSES:
      return isSetProcesses();
    }
    throw new IllegalStateException();
  }

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

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

    boolean this_present_experimentId = true && this.isSetExperimentId();
    boolean that_present_experimentId = true && that.isSetExperimentId();
    if (this_present_experimentId || that_present_experimentId) {
      if (!(this_present_experimentId && that_present_experimentId))
        return false;
      if (!this.experimentId.equals(that.experimentId))
        return false;
    }

    boolean this_present_projectId = true && this.isSetProjectId();
    boolean that_present_projectId = true && that.isSetProjectId();
    if (this_present_projectId || that_present_projectId) {
      if (!(this_present_projectId && that_present_projectId))
        return false;
      if (!this.projectId.equals(that.projectId))
        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_experimentType = true && this.isSetExperimentType();
    boolean that_present_experimentType = true && that.isSetExperimentType();
    if (this_present_experimentType || that_present_experimentType) {
      if (!(this_present_experimentType && that_present_experimentType))
        return false;
      if (!this.experimentType.equals(that.experimentType))
        return false;
    }

    boolean this_present_userName = true && this.isSetUserName();
    boolean that_present_userName = true && that.isSetUserName();
    if (this_present_userName || that_present_userName) {
      if (!(this_present_userName && that_present_userName))
        return false;
      if (!this.userName.equals(that.userName))
        return false;
    }

    boolean this_present_experimentName = true && this.isSetExperimentName();
    boolean that_present_experimentName = true && that.isSetExperimentName();
    if (this_present_experimentName || that_present_experimentName) {
      if (!(this_present_experimentName && that_present_experimentName))
        return false;
      if (!this.experimentName.equals(that.experimentName))
        return false;
    }

    boolean this_present_creationTime = true && this.isSetCreationTime();
    boolean that_present_creationTime = true && that.isSetCreationTime();
    if (this_present_creationTime || that_present_creationTime) {
      if (!(this_present_creationTime && that_present_creationTime))
        return false;
      if (this.creationTime != that.creationTime)
        return false;
    }

    boolean this_present_description = true && this.isSetDescription();
    boolean that_present_description = true && that.isSetDescription();
    if (this_present_description || that_present_description) {
      if (!(this_present_description && that_present_description))
        return false;
      if (!this.description.equals(that.description))
        return false;
    }

    boolean this_present_executionId = true && this.isSetExecutionId();
    boolean that_present_executionId = true && that.isSetExecutionId();
    if (this_present_executionId || that_present_executionId) {
      if (!(this_present_executionId && that_present_executionId))
        return false;
      if (!this.executionId.equals(that.executionId))
        return false;
    }

    boolean this_present_gatewayExecutionId = true && this.isSetGatewayExecutionId();
    boolean that_present_gatewayExecutionId = true && that.isSetGatewayExecutionId();
    if (this_present_gatewayExecutionId || that_present_gatewayExecutionId) {
      if (!(this_present_gatewayExecutionId && that_present_gatewayExecutionId))
        return false;
      if (!this.gatewayExecutionId.equals(that.gatewayExecutionId))
        return false;
    }

    boolean this_present_gatewayInstanceId = true && this.isSetGatewayInstanceId();
    boolean that_present_gatewayInstanceId = true && that.isSetGatewayInstanceId();
    if (this_present_gatewayInstanceId || that_present_gatewayInstanceId) {
      if (!(this_present_gatewayInstanceId && that_present_gatewayInstanceId))
        return false;
      if (!this.gatewayInstanceId.equals(that.gatewayInstanceId))
        return false;
    }

    boolean this_present_enableEmailNotification = true && this.isSetEnableEmailNotification();
    boolean that_present_enableEmailNotification = true && that.isSetEnableEmailNotification();
    if (this_present_enableEmailNotification || that_present_enableEmailNotification) {
      if (!(this_present_enableEmailNotification && that_present_enableEmailNotification))
        return false;
      if (this.enableEmailNotification != that.enableEmailNotification)
        return false;
    }

    boolean this_present_emailAddresses = true && this.isSetEmailAddresses();
    boolean that_present_emailAddresses = true && that.isSetEmailAddresses();
    if (this_present_emailAddresses || that_present_emailAddresses) {
      if (!(this_present_emailAddresses && that_present_emailAddresses))
        return false;
      if (!this.emailAddresses.equals(that.emailAddresses))
        return false;
    }

    boolean this_present_userConfigurationData = true && this.isSetUserConfigurationData();
    boolean that_present_userConfigurationData = true && that.isSetUserConfigurationData();
    if (this_present_userConfigurationData || that_present_userConfigurationData) {
      if (!(this_present_userConfigurationData && that_present_userConfigurationData))
        return false;
      if (!this.userConfigurationData.equals(that.userConfigurationData))
        return false;
    }

    boolean this_present_experimentInputs = true && this.isSetExperimentInputs();
    boolean that_present_experimentInputs = true && that.isSetExperimentInputs();
    if (this_present_experimentInputs || that_present_experimentInputs) {
      if (!(this_present_experimentInputs && that_present_experimentInputs))
        return false;
      if (!this.experimentInputs.equals(that.experimentInputs))
        return false;
    }

    boolean this_present_experimentOutputs = true && this.isSetExperimentOutputs();
    boolean that_present_experimentOutputs = true && that.isSetExperimentOutputs();
    if (this_present_experimentOutputs || that_present_experimentOutputs) {
      if (!(this_present_experimentOutputs && that_present_experimentOutputs))
        return false;
      if (!this.experimentOutputs.equals(that.experimentOutputs))
        return false;
    }

    boolean this_present_experimentStatus = true && this.isSetExperimentStatus();
    boolean that_present_experimentStatus = true && that.isSetExperimentStatus();
    if (this_present_experimentStatus || that_present_experimentStatus) {
      if (!(this_present_experimentStatus && that_present_experimentStatus))
        return false;
      if (!this.experimentStatus.equals(that.experimentStatus))
        return false;
    }

    boolean this_present_errors = true && this.isSetErrors();
    boolean that_present_errors = true && that.isSetErrors();
    if (this_present_errors || that_present_errors) {
      if (!(this_present_errors && that_present_errors))
        return false;
      if (!this.errors.equals(that.errors))
        return false;
    }

    boolean this_present_processes = true && this.isSetProcesses();
    boolean that_present_processes = true && that.isSetProcesses();
    if (this_present_processes || that_present_processes) {
      if (!(this_present_processes && that_present_processes))
        return false;
      if (!this.processes.equals(that.processes))
        return false;
    }

    return true;
  }

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

    boolean present_experimentId = true && (isSetExperimentId());
    list.add(present_experimentId);
    if (present_experimentId)
      list.add(experimentId);

    boolean present_projectId = true && (isSetProjectId());
    list.add(present_projectId);
    if (present_projectId)
      list.add(projectId);

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

    boolean present_experimentType = true && (isSetExperimentType());
    list.add(present_experimentType);
    if (present_experimentType)
      list.add(experimentType.getValue());

    boolean present_userName = true && (isSetUserName());
    list.add(present_userName);
    if (present_userName)
      list.add(userName);

    boolean present_experimentName = true && (isSetExperimentName());
    list.add(present_experimentName);
    if (present_experimentName)
      list.add(experimentName);

    boolean present_creationTime = true && (isSetCreationTime());
    list.add(present_creationTime);
    if (present_creationTime)
      list.add(creationTime);

    boolean present_description = true && (isSetDescription());
    list.add(present_description);
    if (present_description)
      list.add(description);

    boolean present_executionId = true && (isSetExecutionId());
    list.add(present_executionId);
    if (present_executionId)
      list.add(executionId);

    boolean present_gatewayExecutionId = true && (isSetGatewayExecutionId());
    list.add(present_gatewayExecutionId);
    if (present_gatewayExecutionId)
      list.add(gatewayExecutionId);

    boolean present_gatewayInstanceId = true && (isSetGatewayInstanceId());
    list.add(present_gatewayInstanceId);
    if (present_gatewayInstanceId)
      list.add(gatewayInstanceId);

    boolean present_enableEmailNotification = true && (isSetEnableEmailNotification());
    list.add(present_enableEmailNotification);
    if (present_enableEmailNotification)
      list.add(enableEmailNotification);

    boolean present_emailAddresses = true && (isSetEmailAddresses());
    list.add(present_emailAddresses);
    if (present_emailAddresses)
      list.add(emailAddresses);

    boolean present_userConfigurationData = true && (isSetUserConfigurationData());
    list.add(present_userConfigurationData);
    if (present_userConfigurationData)
      list.add(userConfigurationData);

    boolean present_experimentInputs = true && (isSetExperimentInputs());
    list.add(present_experimentInputs);
    if (present_experimentInputs)
      list.add(experimentInputs);

    boolean present_experimentOutputs = true && (isSetExperimentOutputs());
    list.add(present_experimentOutputs);
    if (present_experimentOutputs)
      list.add(experimentOutputs);

    boolean present_experimentStatus = true && (isSetExperimentStatus());
    list.add(present_experimentStatus);
    if (present_experimentStatus)
      list.add(experimentStatus);

    boolean present_errors = true && (isSetErrors());
    list.add(present_errors);
    if (present_errors)
      list.add(errors);

    boolean present_processes = true && (isSetProcesses());
    list.add(present_processes);
    if (present_processes)
      list.add(processes);

    return list.hashCode();
  }

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

    int lastComparison = 0;

    lastComparison = Boolean.valueOf(isSetExperimentId()).compareTo(other.isSetExperimentId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentId, other.experimentId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetProjectId()).compareTo(other.isSetProjectId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProjectId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.projectId, other.projectId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    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(isSetExperimentType()).compareTo(other.isSetExperimentType());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentType()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentType, other.experimentType);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetUserName()).compareTo(other.isSetUserName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetUserName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetExperimentName()).compareTo(other.isSetExperimentName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentName, other.experimentName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetCreationTime()).compareTo(other.isSetCreationTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetCreationTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.creationTime, other.creationTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetDescription()).compareTo(other.isSetDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.description, other.description);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetExecutionId()).compareTo(other.isSetExecutionId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExecutionId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.executionId, other.executionId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetGatewayExecutionId()).compareTo(other.isSetGatewayExecutionId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayExecutionId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayExecutionId, other.gatewayExecutionId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetGatewayInstanceId()).compareTo(other.isSetGatewayInstanceId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayInstanceId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayInstanceId, other.gatewayInstanceId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetEnableEmailNotification()).compareTo(other.isSetEnableEmailNotification());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetEnableEmailNotification()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.enableEmailNotification, other.enableEmailNotification);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetEmailAddresses()).compareTo(other.isSetEmailAddresses());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetEmailAddresses()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.emailAddresses, other.emailAddresses);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetUserConfigurationData()).compareTo(other.isSetUserConfigurationData());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetUserConfigurationData()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userConfigurationData, other.userConfigurationData);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetExperimentInputs()).compareTo(other.isSetExperimentInputs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentInputs()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentInputs, other.experimentInputs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetExperimentOutputs()).compareTo(other.isSetExperimentOutputs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentOutputs()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentOutputs, other.experimentOutputs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetExperimentStatus()).compareTo(other.isSetExperimentStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentStatus, other.experimentStatus);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetErrors()).compareTo(other.isSetErrors());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetErrors()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.errors, other.errors);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetProcesses()).compareTo(other.isSetProcesses());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcesses()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processes, other.processes);
      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("ExperimentModel(");
    boolean first = true;

    sb.append("experimentId:");
    if (this.experimentId == null) {
      sb.append("null");
    } else {
      sb.append(this.experimentId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("projectId:");
    if (this.projectId == null) {
      sb.append("null");
    } else {
      sb.append(this.projectId);
    }
    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("experimentType:");
    if (this.experimentType == null) {
      sb.append("null");
    } else {
      sb.append(this.experimentType);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("userName:");
    if (this.userName == null) {
      sb.append("null");
    } else {
      sb.append(this.userName);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("experimentName:");
    if (this.experimentName == null) {
      sb.append("null");
    } else {
      sb.append(this.experimentName);
    }
    first = false;
    if (isSetCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("creationTime:");
      sb.append(this.creationTime);
      first = false;
    }
    if (isSetDescription()) {
      if (!first) sb.append(", ");
      sb.append("description:");
      if (this.description == null) {
        sb.append("null");
      } else {
        sb.append(this.description);
      }
      first = false;
    }
    if (isSetExecutionId()) {
      if (!first) sb.append(", ");
      sb.append("executionId:");
      if (this.executionId == null) {
        sb.append("null");
      } else {
        sb.append(this.executionId);
      }
      first = false;
    }
    if (isSetGatewayExecutionId()) {
      if (!first) sb.append(", ");
      sb.append("gatewayExecutionId:");
      if (this.gatewayExecutionId == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayExecutionId);
      }
      first = false;
    }
    if (isSetGatewayInstanceId()) {
      if (!first) sb.append(", ");
      sb.append("gatewayInstanceId:");
      if (this.gatewayInstanceId == null) {
        sb.append("null");
      } else {
        sb.append(this.gatewayInstanceId);
      }
      first = false;
    }
    if (isSetEnableEmailNotification()) {
      if (!first) sb.append(", ");
      sb.append("enableEmailNotification:");
      sb.append(this.enableEmailNotification);
      first = false;
    }
    if (isSetEmailAddresses()) {
      if (!first) sb.append(", ");
      sb.append("emailAddresses:");
      if (this.emailAddresses == null) {
        sb.append("null");
      } else {
        sb.append(this.emailAddresses);
      }
      first = false;
    }
    if (isSetUserConfigurationData()) {
      if (!first) sb.append(", ");
      sb.append("userConfigurationData:");
      if (this.userConfigurationData == null) {
        sb.append("null");
      } else {
        sb.append(this.userConfigurationData);
      }
      first = false;
    }
    if (isSetExperimentInputs()) {
      if (!first) sb.append(", ");
      sb.append("experimentInputs:");
      if (this.experimentInputs == null) {
        sb.append("null");
      } else {
        sb.append(this.experimentInputs);
      }
      first = false;
    }
    if (isSetExperimentOutputs()) {
      if (!first) sb.append(", ");
      sb.append("experimentOutputs:");
      if (this.experimentOutputs == null) {
        sb.append("null");
      } else {
        sb.append(this.experimentOutputs);
      }
      first = false;
    }
    if (isSetExperimentStatus()) {
      if (!first) sb.append(", ");
      sb.append("experimentStatus:");
      if (this.experimentStatus == null) {
        sb.append("null");
      } else {
        sb.append(this.experimentStatus);
      }
      first = false;
    }
    if (isSetErrors()) {
      if (!first) sb.append(", ");
      sb.append("errors:");
      if (this.errors == null) {
        sb.append("null");
      } else {
        sb.append(this.errors);
      }
      first = false;
    }
    if (isSetProcesses()) {
      if (!first) sb.append(", ");
      sb.append("processes:");
      if (this.processes == null) {
        sb.append("null");
      } else {
        sb.append(this.processes);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

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

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

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

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

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

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

    // check for sub-struct validity
    if (userConfigurationData != null) {
      userConfigurationData.validate();
    }
    if (experimentStatus != null) {
      experimentStatus.validate();
    }
  }

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

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
    try {
      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
      __isset_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 ExperimentModelStandardSchemeFactory implements SchemeFactory {
    public ExperimentModelStandardScheme getScheme() {
      return new ExperimentModelStandardScheme();
    }
  }

  private static class ExperimentModelStandardScheme extends StandardScheme<ExperimentModel> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, ExperimentModel 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: // EXPERIMENT_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.experimentId = iprot.readString();
              struct.setExperimentIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // PROJECT_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.projectId = iprot.readString();
              struct.setProjectIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // 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 4: // EXPERIMENT_TYPE
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.experimentType = org.apache.airavata.model.experiment.ExperimentType.findByValue(iprot.readI32());
              struct.setExperimentTypeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // USER_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.userName = iprot.readString();
              struct.setUserNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // EXPERIMENT_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.experimentName = iprot.readString();
              struct.setExperimentNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // CREATION_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.creationTime = iprot.readI64();
              struct.setCreationTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.description = iprot.readString();
              struct.setDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // EXECUTION_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.executionId = iprot.readString();
              struct.setExecutionIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // GATEWAY_EXECUTION_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayExecutionId = iprot.readString();
              struct.setGatewayExecutionIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // GATEWAY_INSTANCE_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.gatewayInstanceId = iprot.readString();
              struct.setGatewayInstanceIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // ENABLE_EMAIL_NOTIFICATION
            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
              struct.enableEmailNotification = iprot.readBool();
              struct.setEnableEmailNotificationIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // EMAIL_ADDRESSES
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
                struct.emailAddresses = new ArrayList<String>(_list0.size);
                String _elem1;
                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
                {
                  _elem1 = iprot.readString();
                  struct.emailAddresses.add(_elem1);
                }
                iprot.readListEnd();
              }
              struct.setEmailAddressesIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // USER_CONFIGURATION_DATA
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.userConfigurationData = new UserConfigurationDataModel();
              struct.userConfigurationData.read(iprot);
              struct.setUserConfigurationDataIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // EXPERIMENT_INPUTS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list3 = iprot.readListBegin();
                struct.experimentInputs = new ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(_list3.size);
                org.apache.airavata.model.application.io.InputDataObjectType _elem4;
                for (int _i5 = 0; _i5 < _list3.size; ++_i5)
                {
                  _elem4 = new org.apache.airavata.model.application.io.InputDataObjectType();
                  _elem4.read(iprot);
                  struct.experimentInputs.add(_elem4);
                }
                iprot.readListEnd();
              }
              struct.setExperimentInputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // EXPERIMENT_OUTPUTS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list6 = iprot.readListBegin();
                struct.experimentOutputs = new ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(_list6.size);
                org.apache.airavata.model.application.io.OutputDataObjectType _elem7;
                for (int _i8 = 0; _i8 < _list6.size; ++_i8)
                {
                  _elem7 = new org.apache.airavata.model.application.io.OutputDataObjectType();
                  _elem7.read(iprot);
                  struct.experimentOutputs.add(_elem7);
                }
                iprot.readListEnd();
              }
              struct.setExperimentOutputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 17: // EXPERIMENT_STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.experimentStatus = new org.apache.airavata.model.status.ExperimentStatus();
              struct.experimentStatus.read(iprot);
              struct.setExperimentStatusIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 18: // ERRORS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list9 = iprot.readListBegin();
                struct.errors = new ArrayList<org.apache.airavata.model.commons.ErrorModel>(_list9.size);
                org.apache.airavata.model.commons.ErrorModel _elem10;
                for (int _i11 = 0; _i11 < _list9.size; ++_i11)
                {
                  _elem10 = new org.apache.airavata.model.commons.ErrorModel();
                  _elem10.read(iprot);
                  struct.errors.add(_elem10);
                }
                iprot.readListEnd();
              }
              struct.setErrorsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // PROCESSES
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list12 = iprot.readListBegin();
                struct.processes = new ArrayList<org.apache.airavata.model.process.ProcessModel>(_list12.size);
                org.apache.airavata.model.process.ProcessModel _elem13;
                for (int _i14 = 0; _i14 < _list12.size; ++_i14)
                {
                  _elem13 = new org.apache.airavata.model.process.ProcessModel();
                  _elem13.read(iprot);
                  struct.processes.add(_elem13);
                }
                iprot.readListEnd();
              }
              struct.setProcessesIsSet(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, ExperimentModel struct) throws org.apache.thrift.TException {
      struct.validate();

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.experimentId != null) {
        oprot.writeFieldBegin(EXPERIMENT_ID_FIELD_DESC);
        oprot.writeString(struct.experimentId);
        oprot.writeFieldEnd();
      }
      if (struct.projectId != null) {
        oprot.writeFieldBegin(PROJECT_ID_FIELD_DESC);
        oprot.writeString(struct.projectId);
        oprot.writeFieldEnd();
      }
      if (struct.gatewayId != null) {
        oprot.writeFieldBegin(GATEWAY_ID_FIELD_DESC);
        oprot.writeString(struct.gatewayId);
        oprot.writeFieldEnd();
      }
      if (struct.experimentType != null) {
        oprot.writeFieldBegin(EXPERIMENT_TYPE_FIELD_DESC);
        oprot.writeI32(struct.experimentType.getValue());
        oprot.writeFieldEnd();
      }
      if (struct.userName != null) {
        oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
        oprot.writeString(struct.userName);
        oprot.writeFieldEnd();
      }
      if (struct.experimentName != null) {
        oprot.writeFieldBegin(EXPERIMENT_NAME_FIELD_DESC);
        oprot.writeString(struct.experimentName);
        oprot.writeFieldEnd();
      }
      if (struct.isSetCreationTime()) {
        oprot.writeFieldBegin(CREATION_TIME_FIELD_DESC);
        oprot.writeI64(struct.creationTime);
        oprot.writeFieldEnd();
      }
      if (struct.description != null) {
        if (struct.isSetDescription()) {
          oprot.writeFieldBegin(DESCRIPTION_FIELD_DESC);
          oprot.writeString(struct.description);
          oprot.writeFieldEnd();
        }
      }
      if (struct.executionId != null) {
        if (struct.isSetExecutionId()) {
          oprot.writeFieldBegin(EXECUTION_ID_FIELD_DESC);
          oprot.writeString(struct.executionId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayExecutionId != null) {
        if (struct.isSetGatewayExecutionId()) {
          oprot.writeFieldBegin(GATEWAY_EXECUTION_ID_FIELD_DESC);
          oprot.writeString(struct.gatewayExecutionId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayInstanceId != null) {
        if (struct.isSetGatewayInstanceId()) {
          oprot.writeFieldBegin(GATEWAY_INSTANCE_ID_FIELD_DESC);
          oprot.writeString(struct.gatewayInstanceId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetEnableEmailNotification()) {
        oprot.writeFieldBegin(ENABLE_EMAIL_NOTIFICATION_FIELD_DESC);
        oprot.writeBool(struct.enableEmailNotification);
        oprot.writeFieldEnd();
      }
      if (struct.emailAddresses != null) {
        if (struct.isSetEmailAddresses()) {
          oprot.writeFieldBegin(EMAIL_ADDRESSES_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, struct.emailAddresses.size()));
            for (String _iter15 : struct.emailAddresses)
            {
              oprot.writeString(_iter15);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.userConfigurationData != null) {
        if (struct.isSetUserConfigurationData()) {
          oprot.writeFieldBegin(USER_CONFIGURATION_DATA_FIELD_DESC);
          struct.userConfigurationData.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.experimentInputs != null) {
        if (struct.isSetExperimentInputs()) {
          oprot.writeFieldBegin(EXPERIMENT_INPUTS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.experimentInputs.size()));
            for (org.apache.airavata.model.application.io.InputDataObjectType _iter16 : struct.experimentInputs)
            {
              _iter16.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.experimentOutputs != null) {
        if (struct.isSetExperimentOutputs()) {
          oprot.writeFieldBegin(EXPERIMENT_OUTPUTS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.experimentOutputs.size()));
            for (org.apache.airavata.model.application.io.OutputDataObjectType _iter17 : struct.experimentOutputs)
            {
              _iter17.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.experimentStatus != null) {
        if (struct.isSetExperimentStatus()) {
          oprot.writeFieldBegin(EXPERIMENT_STATUS_FIELD_DESC);
          struct.experimentStatus.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.errors != null) {
        if (struct.isSetErrors()) {
          oprot.writeFieldBegin(ERRORS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.errors.size()));
            for (org.apache.airavata.model.commons.ErrorModel _iter18 : struct.errors)
            {
              _iter18.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.processes != null) {
        if (struct.isSetProcesses()) {
          oprot.writeFieldBegin(PROCESSES_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.processes.size()));
            for (org.apache.airavata.model.process.ProcessModel _iter19 : struct.processes)
            {
              _iter19.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class ExperimentModelTupleSchemeFactory implements SchemeFactory {
    public ExperimentModelTupleScheme getScheme() {
      return new ExperimentModelTupleScheme();
    }
  }

  private static class ExperimentModelTupleScheme extends TupleScheme<ExperimentModel> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, ExperimentModel struct) throws org.apache.thrift.TException {
      TTupleProtocol oprot = (TTupleProtocol) prot;
      oprot.writeString(struct.experimentId);
      oprot.writeString(struct.projectId);
      oprot.writeString(struct.gatewayId);
      oprot.writeI32(struct.experimentType.getValue());
      oprot.writeString(struct.userName);
      oprot.writeString(struct.experimentName);
      BitSet optionals = new BitSet();
      if (struct.isSetCreationTime()) {
        optionals.set(0);
      }
      if (struct.isSetDescription()) {
        optionals.set(1);
      }
      if (struct.isSetExecutionId()) {
        optionals.set(2);
      }
      if (struct.isSetGatewayExecutionId()) {
        optionals.set(3);
      }
      if (struct.isSetGatewayInstanceId()) {
        optionals.set(4);
      }
      if (struct.isSetEnableEmailNotification()) {
        optionals.set(5);
      }
      if (struct.isSetEmailAddresses()) {
        optionals.set(6);
      }
      if (struct.isSetUserConfigurationData()) {
        optionals.set(7);
      }
      if (struct.isSetExperimentInputs()) {
        optionals.set(8);
      }
      if (struct.isSetExperimentOutputs()) {
        optionals.set(9);
      }
      if (struct.isSetExperimentStatus()) {
        optionals.set(10);
      }
      if (struct.isSetErrors()) {
        optionals.set(11);
      }
      if (struct.isSetProcesses()) {
        optionals.set(12);
      }
      oprot.writeBitSet(optionals, 13);
      if (struct.isSetCreationTime()) {
        oprot.writeI64(struct.creationTime);
      }
      if (struct.isSetDescription()) {
        oprot.writeString(struct.description);
      }
      if (struct.isSetExecutionId()) {
        oprot.writeString(struct.executionId);
      }
      if (struct.isSetGatewayExecutionId()) {
        oprot.writeString(struct.gatewayExecutionId);
      }
      if (struct.isSetGatewayInstanceId()) {
        oprot.writeString(struct.gatewayInstanceId);
      }
      if (struct.isSetEnableEmailNotification()) {
        oprot.writeBool(struct.enableEmailNotification);
      }
      if (struct.isSetEmailAddresses()) {
        {
          oprot.writeI32(struct.emailAddresses.size());
          for (String _iter20 : struct.emailAddresses)
          {
            oprot.writeString(_iter20);
          }
        }
      }
      if (struct.isSetUserConfigurationData()) {
        struct.userConfigurationData.write(oprot);
      }
      if (struct.isSetExperimentInputs()) {
        {
          oprot.writeI32(struct.experimentInputs.size());
          for (org.apache.airavata.model.application.io.InputDataObjectType _iter21 : struct.experimentInputs)
          {
            _iter21.write(oprot);
          }
        }
      }
      if (struct.isSetExperimentOutputs()) {
        {
          oprot.writeI32(struct.experimentOutputs.size());
          for (org.apache.airavata.model.application.io.OutputDataObjectType _iter22 : struct.experimentOutputs)
          {
            _iter22.write(oprot);
          }
        }
      }
      if (struct.isSetExperimentStatus()) {
        struct.experimentStatus.write(oprot);
      }
      if (struct.isSetErrors()) {
        {
          oprot.writeI32(struct.errors.size());
          for (org.apache.airavata.model.commons.ErrorModel _iter23 : struct.errors)
          {
            _iter23.write(oprot);
          }
        }
      }
      if (struct.isSetProcesses()) {
        {
          oprot.writeI32(struct.processes.size());
          for (org.apache.airavata.model.process.ProcessModel _iter24 : struct.processes)
          {
            _iter24.write(oprot);
          }
        }
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, ExperimentModel struct) throws org.apache.thrift.TException {
      TTupleProtocol iprot = (TTupleProtocol) prot;
      struct.experimentId = iprot.readString();
      struct.setExperimentIdIsSet(true);
      struct.projectId = iprot.readString();
      struct.setProjectIdIsSet(true);
      struct.gatewayId = iprot.readString();
      struct.setGatewayIdIsSet(true);
      struct.experimentType = org.apache.airavata.model.experiment.ExperimentType.findByValue(iprot.readI32());
      struct.setExperimentTypeIsSet(true);
      struct.userName = iprot.readString();
      struct.setUserNameIsSet(true);
      struct.experimentName = iprot.readString();
      struct.setExperimentNameIsSet(true);
      BitSet incoming = iprot.readBitSet(13);
      if (incoming.get(0)) {
        struct.creationTime = iprot.readI64();
        struct.setCreationTimeIsSet(true);
      }
      if (incoming.get(1)) {
        struct.description = iprot.readString();
        struct.setDescriptionIsSet(true);
      }
      if (incoming.get(2)) {
        struct.executionId = iprot.readString();
        struct.setExecutionIdIsSet(true);
      }
      if (incoming.get(3)) {
        struct.gatewayExecutionId = iprot.readString();
        struct.setGatewayExecutionIdIsSet(true);
      }
      if (incoming.get(4)) {
        struct.gatewayInstanceId = iprot.readString();
        struct.setGatewayInstanceIdIsSet(true);
      }
      if (incoming.get(5)) {
        struct.enableEmailNotification = iprot.readBool();
        struct.setEnableEmailNotificationIsSet(true);
      }
      if (incoming.get(6)) {
        {
          org.apache.thrift.protocol.TList _list25 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
          struct.emailAddresses = new ArrayList<String>(_list25.size);
          String _elem26;
          for (int _i27 = 0; _i27 < _list25.size; ++_i27)
          {
            _elem26 = iprot.readString();
            struct.emailAddresses.add(_elem26);
          }
        }
        struct.setEmailAddressesIsSet(true);
      }
      if (incoming.get(7)) {
        struct.userConfigurationData = new UserConfigurationDataModel();
        struct.userConfigurationData.read(iprot);
        struct.setUserConfigurationDataIsSet(true);
      }
      if (incoming.get(8)) {
        {
          org.apache.thrift.protocol.TList _list28 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.experimentInputs = new ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(_list28.size);
          org.apache.airavata.model.application.io.InputDataObjectType _elem29;
          for (int _i30 = 0; _i30 < _list28.size; ++_i30)
          {
            _elem29 = new org.apache.airavata.model.application.io.InputDataObjectType();
            _elem29.read(iprot);
            struct.experimentInputs.add(_elem29);
          }
        }
        struct.setExperimentInputsIsSet(true);
      }
      if (incoming.get(9)) {
        {
          org.apache.thrift.protocol.TList _list31 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.experimentOutputs = new ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(_list31.size);
          org.apache.airavata.model.application.io.OutputDataObjectType _elem32;
          for (int _i33 = 0; _i33 < _list31.size; ++_i33)
          {
            _elem32 = new org.apache.airavata.model.application.io.OutputDataObjectType();
            _elem32.read(iprot);
            struct.experimentOutputs.add(_elem32);
          }
        }
        struct.setExperimentOutputsIsSet(true);
      }
      if (incoming.get(10)) {
        struct.experimentStatus = new org.apache.airavata.model.status.ExperimentStatus();
        struct.experimentStatus.read(iprot);
        struct.setExperimentStatusIsSet(true);
      }
      if (incoming.get(11)) {
        {
          org.apache.thrift.protocol.TList _list34 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.errors = new ArrayList<org.apache.airavata.model.commons.ErrorModel>(_list34.size);
          org.apache.airavata.model.commons.ErrorModel _elem35;
          for (int _i36 = 0; _i36 < _list34.size; ++_i36)
          {
            _elem35 = new org.apache.airavata.model.commons.ErrorModel();
            _elem35.read(iprot);
            struct.errors.add(_elem35);
          }
        }
        struct.setErrorsIsSet(true);
      }
      if (incoming.get(12)) {
        {
          org.apache.thrift.protocol.TList _list37 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.processes = new ArrayList<org.apache.airavata.model.process.ProcessModel>(_list37.size);
          org.apache.airavata.model.process.ProcessModel _elem38;
          for (int _i39 = 0; _i39 < _list37.size; ++_i39)
          {
            _elem38 = new org.apache.airavata.model.process.ProcessModel();
            _elem38.read(iprot);
            struct.processes.add(_elem38);
          }
        }
        struct.setProcessesIsSet(true);
      }
    }
  }

}

