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

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

/**
 * ProcessModel: A structure holding the process details. The infromation is derived based on user provided
 *          configuration data or system inferred information from scheduling and QoS parameters.
 * 
 * processDetail:
 *   A friendly description of the process, usally used to communicate information to users.
 * 
 * 
 */
@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked", "unused"})
@javax.annotation.Generated(value = "Autogenerated by Thrift Compiler (0.18.1)")
public class ProcessModel implements org.apache.thrift.TBase<ProcessModel, ProcessModel._Fields>, java.io.Serializable, Cloneable, Comparable<ProcessModel> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("ProcessModel");

  private static final org.apache.thrift.protocol.TField PROCESS_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("processId", org.apache.thrift.protocol.TType.STRING, (short)1);
  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)2);
  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)3);
  private static final org.apache.thrift.protocol.TField LAST_UPDATE_TIME_FIELD_DESC = new org.apache.thrift.protocol.TField("lastUpdateTime", org.apache.thrift.protocol.TType.I64, (short)4);
  private static final org.apache.thrift.protocol.TField PROCESS_STATUSES_FIELD_DESC = new org.apache.thrift.protocol.TField("processStatuses", org.apache.thrift.protocol.TType.LIST, (short)5);
  private static final org.apache.thrift.protocol.TField PROCESS_DETAIL_FIELD_DESC = new org.apache.thrift.protocol.TField("processDetail", org.apache.thrift.protocol.TType.STRING, (short)6);
  private static final org.apache.thrift.protocol.TField APPLICATION_INTERFACE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("applicationInterfaceId", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField APPLICATION_DEPLOYMENT_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("applicationDeploymentId", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResourceId", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField PROCESS_INPUTS_FIELD_DESC = new org.apache.thrift.protocol.TField("processInputs", org.apache.thrift.protocol.TType.LIST, (short)10);
  private static final org.apache.thrift.protocol.TField PROCESS_OUTPUTS_FIELD_DESC = new org.apache.thrift.protocol.TField("processOutputs", org.apache.thrift.protocol.TType.LIST, (short)11);
  private static final org.apache.thrift.protocol.TField PROCESS_RESOURCE_SCHEDULE_FIELD_DESC = new org.apache.thrift.protocol.TField("processResourceSchedule", org.apache.thrift.protocol.TType.STRUCT, (short)12);
  private static final org.apache.thrift.protocol.TField TASKS_FIELD_DESC = new org.apache.thrift.protocol.TField("tasks", org.apache.thrift.protocol.TType.LIST, (short)13);
  private static final org.apache.thrift.protocol.TField TASK_DAG_FIELD_DESC = new org.apache.thrift.protocol.TField("taskDag", org.apache.thrift.protocol.TType.STRING, (short)14);
  private static final org.apache.thrift.protocol.TField PROCESS_ERRORS_FIELD_DESC = new org.apache.thrift.protocol.TField("processErrors", org.apache.thrift.protocol.TType.LIST, (short)15);
  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)16);
  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)17);
  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)18);
  private static final org.apache.thrift.protocol.TField STORAGE_RESOURCE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("storageResourceId", org.apache.thrift.protocol.TType.STRING, (short)19);
  private static final org.apache.thrift.protocol.TField USER_DN_FIELD_DESC = new org.apache.thrift.protocol.TField("userDn", org.apache.thrift.protocol.TType.STRING, (short)20);
  private static final org.apache.thrift.protocol.TField GENERATE_CERT_FIELD_DESC = new org.apache.thrift.protocol.TField("generateCert", org.apache.thrift.protocol.TType.BOOL, (short)21);
  private static final org.apache.thrift.protocol.TField EXPERIMENT_DATA_DIR_FIELD_DESC = new org.apache.thrift.protocol.TField("experimentDataDir", org.apache.thrift.protocol.TType.STRING, (short)22);
  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)23);
  private static final org.apache.thrift.protocol.TField USE_USER_CRPREF_FIELD_DESC = new org.apache.thrift.protocol.TField("useUserCRPref", org.apache.thrift.protocol.TType.BOOL, (short)24);
  private static final org.apache.thrift.protocol.TField GROUP_RESOURCE_PROFILE_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("groupResourceProfileId", org.apache.thrift.protocol.TType.STRING, (short)25);
  private static final org.apache.thrift.protocol.TField PROCESS_WORKFLOWS_FIELD_DESC = new org.apache.thrift.protocol.TField("processWorkflows", org.apache.thrift.protocol.TType.LIST, (short)26);

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

  private @org.apache.thrift.annotation.Nullable java.lang.String processId; // required
  private @org.apache.thrift.annotation.Nullable java.lang.String experimentId; // required
  private long creationTime; // optional
  private long lastUpdateTime; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.status.ProcessStatus> processStatuses; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String processDetail; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String applicationInterfaceId; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String applicationDeploymentId; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String computeResourceId; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.application.io.InputDataObjectType> processInputs; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.application.io.OutputDataObjectType> processOutputs; // optional
  private @org.apache.thrift.annotation.Nullable org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel processResourceSchedule; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.task.TaskModel> tasks; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String taskDag; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.commons.ErrorModel> processErrors; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String gatewayExecutionId; // optional
  private boolean enableEmailNotification; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<java.lang.String> emailAddresses; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String storageResourceId; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String userDn; // optional
  private boolean generateCert; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String experimentDataDir; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String userName; // optional
  private boolean useUserCRPref; // optional
  private @org.apache.thrift.annotation.Nullable java.lang.String groupResourceProfileId; // optional
  private @org.apache.thrift.annotation.Nullable java.util.List<ProcessWorkflow> processWorkflows; // 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 {
    PROCESS_ID((short)1, "processId"),
    EXPERIMENT_ID((short)2, "experimentId"),
    CREATION_TIME((short)3, "creationTime"),
    LAST_UPDATE_TIME((short)4, "lastUpdateTime"),
    PROCESS_STATUSES((short)5, "processStatuses"),
    PROCESS_DETAIL((short)6, "processDetail"),
    APPLICATION_INTERFACE_ID((short)7, "applicationInterfaceId"),
    APPLICATION_DEPLOYMENT_ID((short)8, "applicationDeploymentId"),
    COMPUTE_RESOURCE_ID((short)9, "computeResourceId"),
    PROCESS_INPUTS((short)10, "processInputs"),
    PROCESS_OUTPUTS((short)11, "processOutputs"),
    PROCESS_RESOURCE_SCHEDULE((short)12, "processResourceSchedule"),
    TASKS((short)13, "tasks"),
    TASK_DAG((short)14, "taskDag"),
    PROCESS_ERRORS((short)15, "processErrors"),
    GATEWAY_EXECUTION_ID((short)16, "gatewayExecutionId"),
    ENABLE_EMAIL_NOTIFICATION((short)17, "enableEmailNotification"),
    EMAIL_ADDRESSES((short)18, "emailAddresses"),
    STORAGE_RESOURCE_ID((short)19, "storageResourceId"),
    USER_DN((short)20, "userDn"),
    GENERATE_CERT((short)21, "generateCert"),
    EXPERIMENT_DATA_DIR((short)22, "experimentDataDir"),
    USER_NAME((short)23, "userName"),
    USE_USER_CRPREF((short)24, "useUserCRPref"),
    GROUP_RESOURCE_PROFILE_ID((short)25, "groupResourceProfileId"),
    PROCESS_WORKFLOWS((short)26, "processWorkflows");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    @org.apache.thrift.annotation.Nullable
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // PROCESS_ID
          return PROCESS_ID;
        case 2: // EXPERIMENT_ID
          return EXPERIMENT_ID;
        case 3: // CREATION_TIME
          return CREATION_TIME;
        case 4: // LAST_UPDATE_TIME
          return LAST_UPDATE_TIME;
        case 5: // PROCESS_STATUSES
          return PROCESS_STATUSES;
        case 6: // PROCESS_DETAIL
          return PROCESS_DETAIL;
        case 7: // APPLICATION_INTERFACE_ID
          return APPLICATION_INTERFACE_ID;
        case 8: // APPLICATION_DEPLOYMENT_ID
          return APPLICATION_DEPLOYMENT_ID;
        case 9: // COMPUTE_RESOURCE_ID
          return COMPUTE_RESOURCE_ID;
        case 10: // PROCESS_INPUTS
          return PROCESS_INPUTS;
        case 11: // PROCESS_OUTPUTS
          return PROCESS_OUTPUTS;
        case 12: // PROCESS_RESOURCE_SCHEDULE
          return PROCESS_RESOURCE_SCHEDULE;
        case 13: // TASKS
          return TASKS;
        case 14: // TASK_DAG
          return TASK_DAG;
        case 15: // PROCESS_ERRORS
          return PROCESS_ERRORS;
        case 16: // GATEWAY_EXECUTION_ID
          return GATEWAY_EXECUTION_ID;
        case 17: // ENABLE_EMAIL_NOTIFICATION
          return ENABLE_EMAIL_NOTIFICATION;
        case 18: // EMAIL_ADDRESSES
          return EMAIL_ADDRESSES;
        case 19: // STORAGE_RESOURCE_ID
          return STORAGE_RESOURCE_ID;
        case 20: // USER_DN
          return USER_DN;
        case 21: // GENERATE_CERT
          return GENERATE_CERT;
        case 22: // EXPERIMENT_DATA_DIR
          return EXPERIMENT_DATA_DIR;
        case 23: // USER_NAME
          return USER_NAME;
        case 24: // USE_USER_CRPREF
          return USE_USER_CRPREF;
        case 25: // GROUP_RESOURCE_PROFILE_ID
          return GROUP_RESOURCE_PROFILE_ID;
        case 26: // PROCESS_WORKFLOWS
          return PROCESS_WORKFLOWS;
        default:
          return null;
      }
    }

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

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

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

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

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

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

  // isset id assignments
  private static final int __CREATIONTIME_ISSET_ID = 0;
  private static final int __LASTUPDATETIME_ISSET_ID = 1;
  private static final int __ENABLEEMAILNOTIFICATION_ISSET_ID = 2;
  private static final int __GENERATECERT_ISSET_ID = 3;
  private static final int __USEUSERCRPREF_ISSET_ID = 4;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.CREATION_TIME,_Fields.LAST_UPDATE_TIME,_Fields.PROCESS_STATUSES,_Fields.PROCESS_DETAIL,_Fields.APPLICATION_INTERFACE_ID,_Fields.APPLICATION_DEPLOYMENT_ID,_Fields.COMPUTE_RESOURCE_ID,_Fields.PROCESS_INPUTS,_Fields.PROCESS_OUTPUTS,_Fields.PROCESS_RESOURCE_SCHEDULE,_Fields.TASKS,_Fields.TASK_DAG,_Fields.PROCESS_ERRORS,_Fields.GATEWAY_EXECUTION_ID,_Fields.ENABLE_EMAIL_NOTIFICATION,_Fields.EMAIL_ADDRESSES,_Fields.STORAGE_RESOURCE_ID,_Fields.USER_DN,_Fields.GENERATE_CERT,_Fields.EXPERIMENT_DATA_DIR,_Fields.USER_NAME,_Fields.USE_USER_CRPREF,_Fields.GROUP_RESOURCE_PROFILE_ID,_Fields.PROCESS_WORKFLOWS};
  public static final java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    java.util.Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new java.util.EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.PROCESS_ID, new org.apache.thrift.meta_data.FieldMetaData("processId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    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.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.LAST_UPDATE_TIME, new org.apache.thrift.meta_data.FieldMetaData("lastUpdateTime", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I64)));
    tmpMap.put(_Fields.PROCESS_STATUSES, new org.apache.thrift.meta_data.FieldMetaData("processStatuses", 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.status.ProcessStatus.class))));
    tmpMap.put(_Fields.PROCESS_DETAIL, new org.apache.thrift.meta_data.FieldMetaData("processDetail", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.APPLICATION_INTERFACE_ID, new org.apache.thrift.meta_data.FieldMetaData("applicationInterfaceId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.APPLICATION_DEPLOYMENT_ID, new org.apache.thrift.meta_data.FieldMetaData("applicationDeploymentId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.COMPUTE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("computeResourceId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PROCESS_INPUTS, new org.apache.thrift.meta_data.FieldMetaData("processInputs", 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.PROCESS_OUTPUTS, new org.apache.thrift.meta_data.FieldMetaData("processOutputs", 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.PROCESS_RESOURCE_SCHEDULE, new org.apache.thrift.meta_data.FieldMetaData("processResourceSchedule", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel.class)));
    tmpMap.put(_Fields.TASKS, new org.apache.thrift.meta_data.FieldMetaData("tasks", 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.task.TaskModel.class))));
    tmpMap.put(_Fields.TASK_DAG, new org.apache.thrift.meta_data.FieldMetaData("taskDag", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PROCESS_ERRORS, new org.apache.thrift.meta_data.FieldMetaData("processErrors", 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.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.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.STORAGE_RESOURCE_ID, new org.apache.thrift.meta_data.FieldMetaData("storageResourceId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.USER_DN, new org.apache.thrift.meta_data.FieldMetaData("userDn", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.GENERATE_CERT, new org.apache.thrift.meta_data.FieldMetaData("generateCert", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
    tmpMap.put(_Fields.EXPERIMENT_DATA_DIR, new org.apache.thrift.meta_data.FieldMetaData("experimentDataDir", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.USER_NAME, new org.apache.thrift.meta_data.FieldMetaData("userName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.USE_USER_CRPREF, new org.apache.thrift.meta_data.FieldMetaData("useUserCRPref", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.BOOL)));
    tmpMap.put(_Fields.GROUP_RESOURCE_PROFILE_ID, new org.apache.thrift.meta_data.FieldMetaData("groupResourceProfileId", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.PROCESS_WORKFLOWS, new org.apache.thrift.meta_data.FieldMetaData("processWorkflows", 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, ProcessWorkflow.class))));
    metaDataMap = java.util.Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(ProcessModel.class, metaDataMap);
  }

  public ProcessModel() {
    this.processId = "DO_NOT_SET_AT_CLIENTS";

    this.generateCert = false;

  }

  public ProcessModel(
    java.lang.String processId,
    java.lang.String experimentId)
  {
    this();
    this.processId = processId;
    this.experimentId = experimentId;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public ProcessModel(ProcessModel other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetProcessId()) {
      this.processId = other.processId;
    }
    if (other.isSetExperimentId()) {
      this.experimentId = other.experimentId;
    }
    this.creationTime = other.creationTime;
    this.lastUpdateTime = other.lastUpdateTime;
    if (other.isSetProcessStatuses()) {
      java.util.List<org.apache.airavata.model.status.ProcessStatus> __this__processStatuses = new java.util.ArrayList<org.apache.airavata.model.status.ProcessStatus>(other.processStatuses.size());
      for (org.apache.airavata.model.status.ProcessStatus other_element : other.processStatuses) {
        __this__processStatuses.add(new org.apache.airavata.model.status.ProcessStatus(other_element));
      }
      this.processStatuses = __this__processStatuses;
    }
    if (other.isSetProcessDetail()) {
      this.processDetail = other.processDetail;
    }
    if (other.isSetApplicationInterfaceId()) {
      this.applicationInterfaceId = other.applicationInterfaceId;
    }
    if (other.isSetApplicationDeploymentId()) {
      this.applicationDeploymentId = other.applicationDeploymentId;
    }
    if (other.isSetComputeResourceId()) {
      this.computeResourceId = other.computeResourceId;
    }
    if (other.isSetProcessInputs()) {
      java.util.List<org.apache.airavata.model.application.io.InputDataObjectType> __this__processInputs = new java.util.ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(other.processInputs.size());
      for (org.apache.airavata.model.application.io.InputDataObjectType other_element : other.processInputs) {
        __this__processInputs.add(new org.apache.airavata.model.application.io.InputDataObjectType(other_element));
      }
      this.processInputs = __this__processInputs;
    }
    if (other.isSetProcessOutputs()) {
      java.util.List<org.apache.airavata.model.application.io.OutputDataObjectType> __this__processOutputs = new java.util.ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(other.processOutputs.size());
      for (org.apache.airavata.model.application.io.OutputDataObjectType other_element : other.processOutputs) {
        __this__processOutputs.add(new org.apache.airavata.model.application.io.OutputDataObjectType(other_element));
      }
      this.processOutputs = __this__processOutputs;
    }
    if (other.isSetProcessResourceSchedule()) {
      this.processResourceSchedule = new org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel(other.processResourceSchedule);
    }
    if (other.isSetTasks()) {
      java.util.List<org.apache.airavata.model.task.TaskModel> __this__tasks = new java.util.ArrayList<org.apache.airavata.model.task.TaskModel>(other.tasks.size());
      for (org.apache.airavata.model.task.TaskModel other_element : other.tasks) {
        __this__tasks.add(new org.apache.airavata.model.task.TaskModel(other_element));
      }
      this.tasks = __this__tasks;
    }
    if (other.isSetTaskDag()) {
      this.taskDag = other.taskDag;
    }
    if (other.isSetProcessErrors()) {
      java.util.List<org.apache.airavata.model.commons.ErrorModel> __this__processErrors = new java.util.ArrayList<org.apache.airavata.model.commons.ErrorModel>(other.processErrors.size());
      for (org.apache.airavata.model.commons.ErrorModel other_element : other.processErrors) {
        __this__processErrors.add(new org.apache.airavata.model.commons.ErrorModel(other_element));
      }
      this.processErrors = __this__processErrors;
    }
    if (other.isSetGatewayExecutionId()) {
      this.gatewayExecutionId = other.gatewayExecutionId;
    }
    this.enableEmailNotification = other.enableEmailNotification;
    if (other.isSetEmailAddresses()) {
      java.util.List<java.lang.String> __this__emailAddresses = new java.util.ArrayList<java.lang.String>(other.emailAddresses);
      this.emailAddresses = __this__emailAddresses;
    }
    if (other.isSetStorageResourceId()) {
      this.storageResourceId = other.storageResourceId;
    }
    if (other.isSetUserDn()) {
      this.userDn = other.userDn;
    }
    this.generateCert = other.generateCert;
    if (other.isSetExperimentDataDir()) {
      this.experimentDataDir = other.experimentDataDir;
    }
    if (other.isSetUserName()) {
      this.userName = other.userName;
    }
    this.useUserCRPref = other.useUserCRPref;
    if (other.isSetGroupResourceProfileId()) {
      this.groupResourceProfileId = other.groupResourceProfileId;
    }
    if (other.isSetProcessWorkflows()) {
      java.util.List<ProcessWorkflow> __this__processWorkflows = new java.util.ArrayList<ProcessWorkflow>(other.processWorkflows.size());
      for (ProcessWorkflow other_element : other.processWorkflows) {
        __this__processWorkflows.add(new ProcessWorkflow(other_element));
      }
      this.processWorkflows = __this__processWorkflows;
    }
  }

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

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

    this.experimentId = null;
    setCreationTimeIsSet(false);
    this.creationTime = 0;
    setLastUpdateTimeIsSet(false);
    this.lastUpdateTime = 0;
    this.processStatuses = null;
    this.processDetail = null;
    this.applicationInterfaceId = null;
    this.applicationDeploymentId = null;
    this.computeResourceId = null;
    this.processInputs = null;
    this.processOutputs = null;
    this.processResourceSchedule = null;
    this.tasks = null;
    this.taskDag = null;
    this.processErrors = null;
    this.gatewayExecutionId = null;
    setEnableEmailNotificationIsSet(false);
    this.enableEmailNotification = false;
    this.emailAddresses = null;
    this.storageResourceId = null;
    this.userDn = null;
    this.generateCert = false;

    this.experimentDataDir = null;
    this.userName = null;
    setUseUserCRPrefIsSet(false);
    this.useUserCRPref = false;
    this.groupResourceProfileId = null;
    this.processWorkflows = null;
  }

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

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

  public void unsetProcessId() {
    this.processId = null;
  }

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

  public void setProcessIdIsSet(boolean value) {
    if (!value) {
      this.processId = null;
    }
  }

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

  public void setExperimentId(@org.apache.thrift.annotation.Nullable java.lang.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 long getCreationTime() {
    return this.creationTime;
  }

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

  public void unsetCreationTime() {
    __isset_bitfield = org.apache.thrift.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 org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __CREATIONTIME_ISSET_ID);
  }

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

  public long getLastUpdateTime() {
    return this.lastUpdateTime;
  }

  public void setLastUpdateTime(long lastUpdateTime) {
    this.lastUpdateTime = lastUpdateTime;
    setLastUpdateTimeIsSet(true);
  }

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

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

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

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<org.apache.airavata.model.status.ProcessStatus> getProcessStatusesIterator() {
    return (this.processStatuses == null) ? null : this.processStatuses.iterator();
  }

  public void addToProcessStatuses(org.apache.airavata.model.status.ProcessStatus elem) {
    if (this.processStatuses == null) {
      this.processStatuses = new java.util.ArrayList<org.apache.airavata.model.status.ProcessStatus>();
    }
    this.processStatuses.add(elem);
  }

  @org.apache.thrift.annotation.Nullable
  public java.util.List<org.apache.airavata.model.status.ProcessStatus> getProcessStatuses() {
    return this.processStatuses;
  }

  public void setProcessStatuses(@org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.status.ProcessStatus> processStatuses) {
    this.processStatuses = processStatuses;
  }

  public void unsetProcessStatuses() {
    this.processStatuses = null;
  }

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

  public void setProcessStatusesIsSet(boolean value) {
    if (!value) {
      this.processStatuses = null;
    }
  }

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

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

  public void unsetProcessDetail() {
    this.processDetail = null;
  }

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

  public void setProcessDetailIsSet(boolean value) {
    if (!value) {
      this.processDetail = null;
    }
  }

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

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

  public void unsetApplicationInterfaceId() {
    this.applicationInterfaceId = null;
  }

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

  public void setApplicationInterfaceIdIsSet(boolean value) {
    if (!value) {
      this.applicationInterfaceId = null;
    }
  }

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

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

  public void unsetApplicationDeploymentId() {
    this.applicationDeploymentId = null;
  }

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

  public void setApplicationDeploymentIdIsSet(boolean value) {
    if (!value) {
      this.applicationDeploymentId = null;
    }
  }

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

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

  public void unsetComputeResourceId() {
    this.computeResourceId = null;
  }

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

  public void setComputeResourceIdIsSet(boolean value) {
    if (!value) {
      this.computeResourceId = null;
    }
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<org.apache.airavata.model.application.io.InputDataObjectType> getProcessInputsIterator() {
    return (this.processInputs == null) ? null : this.processInputs.iterator();
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.List<org.apache.airavata.model.application.io.InputDataObjectType> getProcessInputs() {
    return this.processInputs;
  }

  public void setProcessInputs(@org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.application.io.InputDataObjectType> processInputs) {
    this.processInputs = processInputs;
  }

  public void unsetProcessInputs() {
    this.processInputs = null;
  }

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

  public void setProcessInputsIsSet(boolean value) {
    if (!value) {
      this.processInputs = null;
    }
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<org.apache.airavata.model.application.io.OutputDataObjectType> getProcessOutputsIterator() {
    return (this.processOutputs == null) ? null : this.processOutputs.iterator();
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.List<org.apache.airavata.model.application.io.OutputDataObjectType> getProcessOutputs() {
    return this.processOutputs;
  }

  public void setProcessOutputs(@org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.application.io.OutputDataObjectType> processOutputs) {
    this.processOutputs = processOutputs;
  }

  public void unsetProcessOutputs() {
    this.processOutputs = null;
  }

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

  public void setProcessOutputsIsSet(boolean value) {
    if (!value) {
      this.processOutputs = null;
    }
  }

  @org.apache.thrift.annotation.Nullable
  public org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel getProcessResourceSchedule() {
    return this.processResourceSchedule;
  }

  public void setProcessResourceSchedule(@org.apache.thrift.annotation.Nullable org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel processResourceSchedule) {
    this.processResourceSchedule = processResourceSchedule;
  }

  public void unsetProcessResourceSchedule() {
    this.processResourceSchedule = null;
  }

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

  public void setProcessResourceScheduleIsSet(boolean value) {
    if (!value) {
      this.processResourceSchedule = null;
    }
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<org.apache.airavata.model.task.TaskModel> getTasksIterator() {
    return (this.tasks == null) ? null : this.tasks.iterator();
  }

  public void addToTasks(org.apache.airavata.model.task.TaskModel elem) {
    if (this.tasks == null) {
      this.tasks = new java.util.ArrayList<org.apache.airavata.model.task.TaskModel>();
    }
    this.tasks.add(elem);
  }

  @org.apache.thrift.annotation.Nullable
  public java.util.List<org.apache.airavata.model.task.TaskModel> getTasks() {
    return this.tasks;
  }

  public void setTasks(@org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.task.TaskModel> tasks) {
    this.tasks = tasks;
  }

  public void unsetTasks() {
    this.tasks = null;
  }

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

  public void setTasksIsSet(boolean value) {
    if (!value) {
      this.tasks = null;
    }
  }

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

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

  public void unsetTaskDag() {
    this.taskDag = null;
  }

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

  public void setTaskDagIsSet(boolean value) {
    if (!value) {
      this.taskDag = null;
    }
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<org.apache.airavata.model.commons.ErrorModel> getProcessErrorsIterator() {
    return (this.processErrors == null) ? null : this.processErrors.iterator();
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.List<org.apache.airavata.model.commons.ErrorModel> getProcessErrors() {
    return this.processErrors;
  }

  public void setProcessErrors(@org.apache.thrift.annotation.Nullable java.util.List<org.apache.airavata.model.commons.ErrorModel> processErrors) {
    this.processErrors = processErrors;
  }

  public void unsetProcessErrors() {
    this.processErrors = null;
  }

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

  public void setProcessErrorsIsSet(boolean value) {
    if (!value) {
      this.processErrors = null;
    }
  }

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

  public void setGatewayExecutionId(@org.apache.thrift.annotation.Nullable java.lang.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 boolean isEnableEmailNotification() {
    return this.enableEmailNotification;
  }

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

  public void unsetEnableEmailNotification() {
    __isset_bitfield = org.apache.thrift.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 org.apache.thrift.EncodingUtils.testBit(__isset_bitfield, __ENABLEEMAILNOTIFICATION_ISSET_ID);
  }

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

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<java.lang.String> getEmailAddressesIterator() {
    return (this.emailAddresses == null) ? null : this.emailAddresses.iterator();
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.List<java.lang.String> getEmailAddresses() {
    return this.emailAddresses;
  }

  public void setEmailAddresses(@org.apache.thrift.annotation.Nullable java.util.List<java.lang.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;
    }
  }

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

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

  public void unsetStorageResourceId() {
    this.storageResourceId = null;
  }

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

  public void setStorageResourceIdIsSet(boolean value) {
    if (!value) {
      this.storageResourceId = null;
    }
  }

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

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

  public void unsetUserDn() {
    this.userDn = null;
  }

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

  public void setUserDnIsSet(boolean value) {
    if (!value) {
      this.userDn = null;
    }
  }

  public boolean isGenerateCert() {
    return this.generateCert;
  }

  public void setGenerateCert(boolean generateCert) {
    this.generateCert = generateCert;
    setGenerateCertIsSet(true);
  }

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

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

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

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

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

  public void unsetExperimentDataDir() {
    this.experimentDataDir = null;
  }

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

  public void setExperimentDataDirIsSet(boolean value) {
    if (!value) {
      this.experimentDataDir = null;
    }
  }

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

  public void setUserName(@org.apache.thrift.annotation.Nullable java.lang.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 boolean isUseUserCRPref() {
    return this.useUserCRPref;
  }

  public void setUseUserCRPref(boolean useUserCRPref) {
    this.useUserCRPref = useUserCRPref;
    setUseUserCRPrefIsSet(true);
  }

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

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

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

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

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

  public void unsetGroupResourceProfileId() {
    this.groupResourceProfileId = null;
  }

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

  public void setGroupResourceProfileIdIsSet(boolean value) {
    if (!value) {
      this.groupResourceProfileId = null;
    }
  }

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

  @org.apache.thrift.annotation.Nullable
  public java.util.Iterator<ProcessWorkflow> getProcessWorkflowsIterator() {
    return (this.processWorkflows == null) ? null : this.processWorkflows.iterator();
  }

  public void addToProcessWorkflows(ProcessWorkflow elem) {
    if (this.processWorkflows == null) {
      this.processWorkflows = new java.util.ArrayList<ProcessWorkflow>();
    }
    this.processWorkflows.add(elem);
  }

  @org.apache.thrift.annotation.Nullable
  public java.util.List<ProcessWorkflow> getProcessWorkflows() {
    return this.processWorkflows;
  }

  public void setProcessWorkflows(@org.apache.thrift.annotation.Nullable java.util.List<ProcessWorkflow> processWorkflows) {
    this.processWorkflows = processWorkflows;
  }

  public void unsetProcessWorkflows() {
    this.processWorkflows = null;
  }

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

  public void setProcessWorkflowsIsSet(boolean value) {
    if (!value) {
      this.processWorkflows = null;
    }
  }

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

    case EXPERIMENT_ID:
      if (value == null) {
        unsetExperimentId();
      } else {
        setExperimentId((java.lang.String)value);
      }
      break;

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

    case LAST_UPDATE_TIME:
      if (value == null) {
        unsetLastUpdateTime();
      } else {
        setLastUpdateTime((java.lang.Long)value);
      }
      break;

    case PROCESS_STATUSES:
      if (value == null) {
        unsetProcessStatuses();
      } else {
        setProcessStatuses((java.util.List<org.apache.airavata.model.status.ProcessStatus>)value);
      }
      break;

    case PROCESS_DETAIL:
      if (value == null) {
        unsetProcessDetail();
      } else {
        setProcessDetail((java.lang.String)value);
      }
      break;

    case APPLICATION_INTERFACE_ID:
      if (value == null) {
        unsetApplicationInterfaceId();
      } else {
        setApplicationInterfaceId((java.lang.String)value);
      }
      break;

    case APPLICATION_DEPLOYMENT_ID:
      if (value == null) {
        unsetApplicationDeploymentId();
      } else {
        setApplicationDeploymentId((java.lang.String)value);
      }
      break;

    case COMPUTE_RESOURCE_ID:
      if (value == null) {
        unsetComputeResourceId();
      } else {
        setComputeResourceId((java.lang.String)value);
      }
      break;

    case PROCESS_INPUTS:
      if (value == null) {
        unsetProcessInputs();
      } else {
        setProcessInputs((java.util.List<org.apache.airavata.model.application.io.InputDataObjectType>)value);
      }
      break;

    case PROCESS_OUTPUTS:
      if (value == null) {
        unsetProcessOutputs();
      } else {
        setProcessOutputs((java.util.List<org.apache.airavata.model.application.io.OutputDataObjectType>)value);
      }
      break;

    case PROCESS_RESOURCE_SCHEDULE:
      if (value == null) {
        unsetProcessResourceSchedule();
      } else {
        setProcessResourceSchedule((org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel)value);
      }
      break;

    case TASKS:
      if (value == null) {
        unsetTasks();
      } else {
        setTasks((java.util.List<org.apache.airavata.model.task.TaskModel>)value);
      }
      break;

    case TASK_DAG:
      if (value == null) {
        unsetTaskDag();
      } else {
        setTaskDag((java.lang.String)value);
      }
      break;

    case PROCESS_ERRORS:
      if (value == null) {
        unsetProcessErrors();
      } else {
        setProcessErrors((java.util.List<org.apache.airavata.model.commons.ErrorModel>)value);
      }
      break;

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

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

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

    case STORAGE_RESOURCE_ID:
      if (value == null) {
        unsetStorageResourceId();
      } else {
        setStorageResourceId((java.lang.String)value);
      }
      break;

    case USER_DN:
      if (value == null) {
        unsetUserDn();
      } else {
        setUserDn((java.lang.String)value);
      }
      break;

    case GENERATE_CERT:
      if (value == null) {
        unsetGenerateCert();
      } else {
        setGenerateCert((java.lang.Boolean)value);
      }
      break;

    case EXPERIMENT_DATA_DIR:
      if (value == null) {
        unsetExperimentDataDir();
      } else {
        setExperimentDataDir((java.lang.String)value);
      }
      break;

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

    case USE_USER_CRPREF:
      if (value == null) {
        unsetUseUserCRPref();
      } else {
        setUseUserCRPref((java.lang.Boolean)value);
      }
      break;

    case GROUP_RESOURCE_PROFILE_ID:
      if (value == null) {
        unsetGroupResourceProfileId();
      } else {
        setGroupResourceProfileId((java.lang.String)value);
      }
      break;

    case PROCESS_WORKFLOWS:
      if (value == null) {
        unsetProcessWorkflows();
      } else {
        setProcessWorkflows((java.util.List<ProcessWorkflow>)value);
      }
      break;

    }
  }

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

    case EXPERIMENT_ID:
      return getExperimentId();

    case CREATION_TIME:
      return getCreationTime();

    case LAST_UPDATE_TIME:
      return getLastUpdateTime();

    case PROCESS_STATUSES:
      return getProcessStatuses();

    case PROCESS_DETAIL:
      return getProcessDetail();

    case APPLICATION_INTERFACE_ID:
      return getApplicationInterfaceId();

    case APPLICATION_DEPLOYMENT_ID:
      return getApplicationDeploymentId();

    case COMPUTE_RESOURCE_ID:
      return getComputeResourceId();

    case PROCESS_INPUTS:
      return getProcessInputs();

    case PROCESS_OUTPUTS:
      return getProcessOutputs();

    case PROCESS_RESOURCE_SCHEDULE:
      return getProcessResourceSchedule();

    case TASKS:
      return getTasks();

    case TASK_DAG:
      return getTaskDag();

    case PROCESS_ERRORS:
      return getProcessErrors();

    case GATEWAY_EXECUTION_ID:
      return getGatewayExecutionId();

    case ENABLE_EMAIL_NOTIFICATION:
      return isEnableEmailNotification();

    case EMAIL_ADDRESSES:
      return getEmailAddresses();

    case STORAGE_RESOURCE_ID:
      return getStorageResourceId();

    case USER_DN:
      return getUserDn();

    case GENERATE_CERT:
      return isGenerateCert();

    case EXPERIMENT_DATA_DIR:
      return getExperimentDataDir();

    case USER_NAME:
      return getUserName();

    case USE_USER_CRPREF:
      return isUseUserCRPref();

    case GROUP_RESOURCE_PROFILE_ID:
      return getGroupResourceProfileId();

    case PROCESS_WORKFLOWS:
      return getProcessWorkflows();

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

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

    switch (field) {
    case PROCESS_ID:
      return isSetProcessId();
    case EXPERIMENT_ID:
      return isSetExperimentId();
    case CREATION_TIME:
      return isSetCreationTime();
    case LAST_UPDATE_TIME:
      return isSetLastUpdateTime();
    case PROCESS_STATUSES:
      return isSetProcessStatuses();
    case PROCESS_DETAIL:
      return isSetProcessDetail();
    case APPLICATION_INTERFACE_ID:
      return isSetApplicationInterfaceId();
    case APPLICATION_DEPLOYMENT_ID:
      return isSetApplicationDeploymentId();
    case COMPUTE_RESOURCE_ID:
      return isSetComputeResourceId();
    case PROCESS_INPUTS:
      return isSetProcessInputs();
    case PROCESS_OUTPUTS:
      return isSetProcessOutputs();
    case PROCESS_RESOURCE_SCHEDULE:
      return isSetProcessResourceSchedule();
    case TASKS:
      return isSetTasks();
    case TASK_DAG:
      return isSetTaskDag();
    case PROCESS_ERRORS:
      return isSetProcessErrors();
    case GATEWAY_EXECUTION_ID:
      return isSetGatewayExecutionId();
    case ENABLE_EMAIL_NOTIFICATION:
      return isSetEnableEmailNotification();
    case EMAIL_ADDRESSES:
      return isSetEmailAddresses();
    case STORAGE_RESOURCE_ID:
      return isSetStorageResourceId();
    case USER_DN:
      return isSetUserDn();
    case GENERATE_CERT:
      return isSetGenerateCert();
    case EXPERIMENT_DATA_DIR:
      return isSetExperimentDataDir();
    case USER_NAME:
      return isSetUserName();
    case USE_USER_CRPREF:
      return isSetUseUserCRPref();
    case GROUP_RESOURCE_PROFILE_ID:
      return isSetGroupResourceProfileId();
    case PROCESS_WORKFLOWS:
      return isSetProcessWorkflows();
    }
    throw new java.lang.IllegalStateException();
  }

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

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

    boolean this_present_processId = true && this.isSetProcessId();
    boolean that_present_processId = true && that.isSetProcessId();
    if (this_present_processId || that_present_processId) {
      if (!(this_present_processId && that_present_processId))
        return false;
      if (!this.processId.equals(that.processId))
        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_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_lastUpdateTime = true && this.isSetLastUpdateTime();
    boolean that_present_lastUpdateTime = true && that.isSetLastUpdateTime();
    if (this_present_lastUpdateTime || that_present_lastUpdateTime) {
      if (!(this_present_lastUpdateTime && that_present_lastUpdateTime))
        return false;
      if (this.lastUpdateTime != that.lastUpdateTime)
        return false;
    }

    boolean this_present_processStatuses = true && this.isSetProcessStatuses();
    boolean that_present_processStatuses = true && that.isSetProcessStatuses();
    if (this_present_processStatuses || that_present_processStatuses) {
      if (!(this_present_processStatuses && that_present_processStatuses))
        return false;
      if (!this.processStatuses.equals(that.processStatuses))
        return false;
    }

    boolean this_present_processDetail = true && this.isSetProcessDetail();
    boolean that_present_processDetail = true && that.isSetProcessDetail();
    if (this_present_processDetail || that_present_processDetail) {
      if (!(this_present_processDetail && that_present_processDetail))
        return false;
      if (!this.processDetail.equals(that.processDetail))
        return false;
    }

    boolean this_present_applicationInterfaceId = true && this.isSetApplicationInterfaceId();
    boolean that_present_applicationInterfaceId = true && that.isSetApplicationInterfaceId();
    if (this_present_applicationInterfaceId || that_present_applicationInterfaceId) {
      if (!(this_present_applicationInterfaceId && that_present_applicationInterfaceId))
        return false;
      if (!this.applicationInterfaceId.equals(that.applicationInterfaceId))
        return false;
    }

    boolean this_present_applicationDeploymentId = true && this.isSetApplicationDeploymentId();
    boolean that_present_applicationDeploymentId = true && that.isSetApplicationDeploymentId();
    if (this_present_applicationDeploymentId || that_present_applicationDeploymentId) {
      if (!(this_present_applicationDeploymentId && that_present_applicationDeploymentId))
        return false;
      if (!this.applicationDeploymentId.equals(that.applicationDeploymentId))
        return false;
    }

    boolean this_present_computeResourceId = true && this.isSetComputeResourceId();
    boolean that_present_computeResourceId = true && that.isSetComputeResourceId();
    if (this_present_computeResourceId || that_present_computeResourceId) {
      if (!(this_present_computeResourceId && that_present_computeResourceId))
        return false;
      if (!this.computeResourceId.equals(that.computeResourceId))
        return false;
    }

    boolean this_present_processInputs = true && this.isSetProcessInputs();
    boolean that_present_processInputs = true && that.isSetProcessInputs();
    if (this_present_processInputs || that_present_processInputs) {
      if (!(this_present_processInputs && that_present_processInputs))
        return false;
      if (!this.processInputs.equals(that.processInputs))
        return false;
    }

    boolean this_present_processOutputs = true && this.isSetProcessOutputs();
    boolean that_present_processOutputs = true && that.isSetProcessOutputs();
    if (this_present_processOutputs || that_present_processOutputs) {
      if (!(this_present_processOutputs && that_present_processOutputs))
        return false;
      if (!this.processOutputs.equals(that.processOutputs))
        return false;
    }

    boolean this_present_processResourceSchedule = true && this.isSetProcessResourceSchedule();
    boolean that_present_processResourceSchedule = true && that.isSetProcessResourceSchedule();
    if (this_present_processResourceSchedule || that_present_processResourceSchedule) {
      if (!(this_present_processResourceSchedule && that_present_processResourceSchedule))
        return false;
      if (!this.processResourceSchedule.equals(that.processResourceSchedule))
        return false;
    }

    boolean this_present_tasks = true && this.isSetTasks();
    boolean that_present_tasks = true && that.isSetTasks();
    if (this_present_tasks || that_present_tasks) {
      if (!(this_present_tasks && that_present_tasks))
        return false;
      if (!this.tasks.equals(that.tasks))
        return false;
    }

    boolean this_present_taskDag = true && this.isSetTaskDag();
    boolean that_present_taskDag = true && that.isSetTaskDag();
    if (this_present_taskDag || that_present_taskDag) {
      if (!(this_present_taskDag && that_present_taskDag))
        return false;
      if (!this.taskDag.equals(that.taskDag))
        return false;
    }

    boolean this_present_processErrors = true && this.isSetProcessErrors();
    boolean that_present_processErrors = true && that.isSetProcessErrors();
    if (this_present_processErrors || that_present_processErrors) {
      if (!(this_present_processErrors && that_present_processErrors))
        return false;
      if (!this.processErrors.equals(that.processErrors))
        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_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_storageResourceId = true && this.isSetStorageResourceId();
    boolean that_present_storageResourceId = true && that.isSetStorageResourceId();
    if (this_present_storageResourceId || that_present_storageResourceId) {
      if (!(this_present_storageResourceId && that_present_storageResourceId))
        return false;
      if (!this.storageResourceId.equals(that.storageResourceId))
        return false;
    }

    boolean this_present_userDn = true && this.isSetUserDn();
    boolean that_present_userDn = true && that.isSetUserDn();
    if (this_present_userDn || that_present_userDn) {
      if (!(this_present_userDn && that_present_userDn))
        return false;
      if (!this.userDn.equals(that.userDn))
        return false;
    }

    boolean this_present_generateCert = true && this.isSetGenerateCert();
    boolean that_present_generateCert = true && that.isSetGenerateCert();
    if (this_present_generateCert || that_present_generateCert) {
      if (!(this_present_generateCert && that_present_generateCert))
        return false;
      if (this.generateCert != that.generateCert)
        return false;
    }

    boolean this_present_experimentDataDir = true && this.isSetExperimentDataDir();
    boolean that_present_experimentDataDir = true && that.isSetExperimentDataDir();
    if (this_present_experimentDataDir || that_present_experimentDataDir) {
      if (!(this_present_experimentDataDir && that_present_experimentDataDir))
        return false;
      if (!this.experimentDataDir.equals(that.experimentDataDir))
        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_useUserCRPref = true && this.isSetUseUserCRPref();
    boolean that_present_useUserCRPref = true && that.isSetUseUserCRPref();
    if (this_present_useUserCRPref || that_present_useUserCRPref) {
      if (!(this_present_useUserCRPref && that_present_useUserCRPref))
        return false;
      if (this.useUserCRPref != that.useUserCRPref)
        return false;
    }

    boolean this_present_groupResourceProfileId = true && this.isSetGroupResourceProfileId();
    boolean that_present_groupResourceProfileId = true && that.isSetGroupResourceProfileId();
    if (this_present_groupResourceProfileId || that_present_groupResourceProfileId) {
      if (!(this_present_groupResourceProfileId && that_present_groupResourceProfileId))
        return false;
      if (!this.groupResourceProfileId.equals(that.groupResourceProfileId))
        return false;
    }

    boolean this_present_processWorkflows = true && this.isSetProcessWorkflows();
    boolean that_present_processWorkflows = true && that.isSetProcessWorkflows();
    if (this_present_processWorkflows || that_present_processWorkflows) {
      if (!(this_present_processWorkflows && that_present_processWorkflows))
        return false;
      if (!this.processWorkflows.equals(that.processWorkflows))
        return false;
    }

    return true;
  }

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

    hashCode = hashCode * 8191 + ((isSetProcessId()) ? 131071 : 524287);
    if (isSetProcessId())
      hashCode = hashCode * 8191 + processId.hashCode();

    hashCode = hashCode * 8191 + ((isSetExperimentId()) ? 131071 : 524287);
    if (isSetExperimentId())
      hashCode = hashCode * 8191 + experimentId.hashCode();

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

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

    hashCode = hashCode * 8191 + ((isSetProcessStatuses()) ? 131071 : 524287);
    if (isSetProcessStatuses())
      hashCode = hashCode * 8191 + processStatuses.hashCode();

    hashCode = hashCode * 8191 + ((isSetProcessDetail()) ? 131071 : 524287);
    if (isSetProcessDetail())
      hashCode = hashCode * 8191 + processDetail.hashCode();

    hashCode = hashCode * 8191 + ((isSetApplicationInterfaceId()) ? 131071 : 524287);
    if (isSetApplicationInterfaceId())
      hashCode = hashCode * 8191 + applicationInterfaceId.hashCode();

    hashCode = hashCode * 8191 + ((isSetApplicationDeploymentId()) ? 131071 : 524287);
    if (isSetApplicationDeploymentId())
      hashCode = hashCode * 8191 + applicationDeploymentId.hashCode();

    hashCode = hashCode * 8191 + ((isSetComputeResourceId()) ? 131071 : 524287);
    if (isSetComputeResourceId())
      hashCode = hashCode * 8191 + computeResourceId.hashCode();

    hashCode = hashCode * 8191 + ((isSetProcessInputs()) ? 131071 : 524287);
    if (isSetProcessInputs())
      hashCode = hashCode * 8191 + processInputs.hashCode();

    hashCode = hashCode * 8191 + ((isSetProcessOutputs()) ? 131071 : 524287);
    if (isSetProcessOutputs())
      hashCode = hashCode * 8191 + processOutputs.hashCode();

    hashCode = hashCode * 8191 + ((isSetProcessResourceSchedule()) ? 131071 : 524287);
    if (isSetProcessResourceSchedule())
      hashCode = hashCode * 8191 + processResourceSchedule.hashCode();

    hashCode = hashCode * 8191 + ((isSetTasks()) ? 131071 : 524287);
    if (isSetTasks())
      hashCode = hashCode * 8191 + tasks.hashCode();

    hashCode = hashCode * 8191 + ((isSetTaskDag()) ? 131071 : 524287);
    if (isSetTaskDag())
      hashCode = hashCode * 8191 + taskDag.hashCode();

    hashCode = hashCode * 8191 + ((isSetProcessErrors()) ? 131071 : 524287);
    if (isSetProcessErrors())
      hashCode = hashCode * 8191 + processErrors.hashCode();

    hashCode = hashCode * 8191 + ((isSetGatewayExecutionId()) ? 131071 : 524287);
    if (isSetGatewayExecutionId())
      hashCode = hashCode * 8191 + gatewayExecutionId.hashCode();

    hashCode = hashCode * 8191 + ((isSetEnableEmailNotification()) ? 131071 : 524287);
    if (isSetEnableEmailNotification())
      hashCode = hashCode * 8191 + ((enableEmailNotification) ? 131071 : 524287);

    hashCode = hashCode * 8191 + ((isSetEmailAddresses()) ? 131071 : 524287);
    if (isSetEmailAddresses())
      hashCode = hashCode * 8191 + emailAddresses.hashCode();

    hashCode = hashCode * 8191 + ((isSetStorageResourceId()) ? 131071 : 524287);
    if (isSetStorageResourceId())
      hashCode = hashCode * 8191 + storageResourceId.hashCode();

    hashCode = hashCode * 8191 + ((isSetUserDn()) ? 131071 : 524287);
    if (isSetUserDn())
      hashCode = hashCode * 8191 + userDn.hashCode();

    hashCode = hashCode * 8191 + ((isSetGenerateCert()) ? 131071 : 524287);
    if (isSetGenerateCert())
      hashCode = hashCode * 8191 + ((generateCert) ? 131071 : 524287);

    hashCode = hashCode * 8191 + ((isSetExperimentDataDir()) ? 131071 : 524287);
    if (isSetExperimentDataDir())
      hashCode = hashCode * 8191 + experimentDataDir.hashCode();

    hashCode = hashCode * 8191 + ((isSetUserName()) ? 131071 : 524287);
    if (isSetUserName())
      hashCode = hashCode * 8191 + userName.hashCode();

    hashCode = hashCode * 8191 + ((isSetUseUserCRPref()) ? 131071 : 524287);
    if (isSetUseUserCRPref())
      hashCode = hashCode * 8191 + ((useUserCRPref) ? 131071 : 524287);

    hashCode = hashCode * 8191 + ((isSetGroupResourceProfileId()) ? 131071 : 524287);
    if (isSetGroupResourceProfileId())
      hashCode = hashCode * 8191 + groupResourceProfileId.hashCode();

    hashCode = hashCode * 8191 + ((isSetProcessWorkflows()) ? 131071 : 524287);
    if (isSetProcessWorkflows())
      hashCode = hashCode * 8191 + processWorkflows.hashCode();

    return hashCode;
  }

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

    int lastComparison = 0;

    lastComparison = java.lang.Boolean.compare(isSetProcessId(), other.isSetProcessId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processId, other.processId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetExperimentId(), 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 = java.lang.Boolean.compare(isSetCreationTime(), 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 = java.lang.Boolean.compare(isSetLastUpdateTime(), other.isSetLastUpdateTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetLastUpdateTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.lastUpdateTime, other.lastUpdateTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessStatuses(), other.isSetProcessStatuses());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessStatuses()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processStatuses, other.processStatuses);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessDetail(), other.isSetProcessDetail());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessDetail()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processDetail, other.processDetail);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetApplicationInterfaceId(), other.isSetApplicationInterfaceId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetApplicationInterfaceId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.applicationInterfaceId, other.applicationInterfaceId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetApplicationDeploymentId(), other.isSetApplicationDeploymentId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetApplicationDeploymentId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.applicationDeploymentId, other.applicationDeploymentId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetComputeResourceId(), other.isSetComputeResourceId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetComputeResourceId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResourceId, other.computeResourceId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessInputs(), other.isSetProcessInputs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessInputs()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processInputs, other.processInputs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessOutputs(), other.isSetProcessOutputs());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessOutputs()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processOutputs, other.processOutputs);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessResourceSchedule(), other.isSetProcessResourceSchedule());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessResourceSchedule()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processResourceSchedule, other.processResourceSchedule);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTasks(), other.isSetTasks());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTasks()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.tasks, other.tasks);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetTaskDag(), other.isSetTaskDag());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTaskDag()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.taskDag, other.taskDag);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessErrors(), other.isSetProcessErrors());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessErrors()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processErrors, other.processErrors);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetGatewayExecutionId(), 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 = java.lang.Boolean.compare(isSetEnableEmailNotification(), 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 = java.lang.Boolean.compare(isSetEmailAddresses(), 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 = java.lang.Boolean.compare(isSetStorageResourceId(), other.isSetStorageResourceId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStorageResourceId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.storageResourceId, other.storageResourceId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetUserDn(), other.isSetUserDn());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetUserDn()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userDn, other.userDn);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetGenerateCert(), other.isSetGenerateCert());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGenerateCert()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.generateCert, other.generateCert);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetExperimentDataDir(), other.isSetExperimentDataDir());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentDataDir()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentDataDir, other.experimentDataDir);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetUserName(), 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 = java.lang.Boolean.compare(isSetUseUserCRPref(), other.isSetUseUserCRPref());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetUseUserCRPref()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.useUserCRPref, other.useUserCRPref);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetGroupResourceProfileId(), other.isSetGroupResourceProfileId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGroupResourceProfileId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.groupResourceProfileId, other.groupResourceProfileId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = java.lang.Boolean.compare(isSetProcessWorkflows(), other.isSetProcessWorkflows());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessWorkflows()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processWorkflows, other.processWorkflows);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

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

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

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

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

    sb.append("processId:");
    if (this.processId == null) {
      sb.append("null");
    } else {
      sb.append(this.processId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("experimentId:");
    if (this.experimentId == null) {
      sb.append("null");
    } else {
      sb.append(this.experimentId);
    }
    first = false;
    if (isSetCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("creationTime:");
      sb.append(this.creationTime);
      first = false;
    }
    if (isSetLastUpdateTime()) {
      if (!first) sb.append(", ");
      sb.append("lastUpdateTime:");
      sb.append(this.lastUpdateTime);
      first = false;
    }
    if (isSetProcessStatuses()) {
      if (!first) sb.append(", ");
      sb.append("processStatuses:");
      if (this.processStatuses == null) {
        sb.append("null");
      } else {
        sb.append(this.processStatuses);
      }
      first = false;
    }
    if (isSetProcessDetail()) {
      if (!first) sb.append(", ");
      sb.append("processDetail:");
      if (this.processDetail == null) {
        sb.append("null");
      } else {
        sb.append(this.processDetail);
      }
      first = false;
    }
    if (isSetApplicationInterfaceId()) {
      if (!first) sb.append(", ");
      sb.append("applicationInterfaceId:");
      if (this.applicationInterfaceId == null) {
        sb.append("null");
      } else {
        sb.append(this.applicationInterfaceId);
      }
      first = false;
    }
    if (isSetApplicationDeploymentId()) {
      if (!first) sb.append(", ");
      sb.append("applicationDeploymentId:");
      if (this.applicationDeploymentId == null) {
        sb.append("null");
      } else {
        sb.append(this.applicationDeploymentId);
      }
      first = false;
    }
    if (isSetComputeResourceId()) {
      if (!first) sb.append(", ");
      sb.append("computeResourceId:");
      if (this.computeResourceId == null) {
        sb.append("null");
      } else {
        sb.append(this.computeResourceId);
      }
      first = false;
    }
    if (isSetProcessInputs()) {
      if (!first) sb.append(", ");
      sb.append("processInputs:");
      if (this.processInputs == null) {
        sb.append("null");
      } else {
        sb.append(this.processInputs);
      }
      first = false;
    }
    if (isSetProcessOutputs()) {
      if (!first) sb.append(", ");
      sb.append("processOutputs:");
      if (this.processOutputs == null) {
        sb.append("null");
      } else {
        sb.append(this.processOutputs);
      }
      first = false;
    }
    if (isSetProcessResourceSchedule()) {
      if (!first) sb.append(", ");
      sb.append("processResourceSchedule:");
      if (this.processResourceSchedule == null) {
        sb.append("null");
      } else {
        sb.append(this.processResourceSchedule);
      }
      first = false;
    }
    if (isSetTasks()) {
      if (!first) sb.append(", ");
      sb.append("tasks:");
      if (this.tasks == null) {
        sb.append("null");
      } else {
        sb.append(this.tasks);
      }
      first = false;
    }
    if (isSetTaskDag()) {
      if (!first) sb.append(", ");
      sb.append("taskDag:");
      if (this.taskDag == null) {
        sb.append("null");
      } else {
        sb.append(this.taskDag);
      }
      first = false;
    }
    if (isSetProcessErrors()) {
      if (!first) sb.append(", ");
      sb.append("processErrors:");
      if (this.processErrors == null) {
        sb.append("null");
      } else {
        sb.append(this.processErrors);
      }
      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 (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 (isSetStorageResourceId()) {
      if (!first) sb.append(", ");
      sb.append("storageResourceId:");
      if (this.storageResourceId == null) {
        sb.append("null");
      } else {
        sb.append(this.storageResourceId);
      }
      first = false;
    }
    if (isSetUserDn()) {
      if (!first) sb.append(", ");
      sb.append("userDn:");
      if (this.userDn == null) {
        sb.append("null");
      } else {
        sb.append(this.userDn);
      }
      first = false;
    }
    if (isSetGenerateCert()) {
      if (!first) sb.append(", ");
      sb.append("generateCert:");
      sb.append(this.generateCert);
      first = false;
    }
    if (isSetExperimentDataDir()) {
      if (!first) sb.append(", ");
      sb.append("experimentDataDir:");
      if (this.experimentDataDir == null) {
        sb.append("null");
      } else {
        sb.append(this.experimentDataDir);
      }
      first = false;
    }
    if (isSetUserName()) {
      if (!first) sb.append(", ");
      sb.append("userName:");
      if (this.userName == null) {
        sb.append("null");
      } else {
        sb.append(this.userName);
      }
      first = false;
    }
    if (isSetUseUserCRPref()) {
      if (!first) sb.append(", ");
      sb.append("useUserCRPref:");
      sb.append(this.useUserCRPref);
      first = false;
    }
    if (isSetGroupResourceProfileId()) {
      if (!first) sb.append(", ");
      sb.append("groupResourceProfileId:");
      if (this.groupResourceProfileId == null) {
        sb.append("null");
      } else {
        sb.append(this.groupResourceProfileId);
      }
      first = false;
    }
    if (isSetProcessWorkflows()) {
      if (!first) sb.append(", ");
      sb.append("processWorkflows:");
      if (this.processWorkflows == null) {
        sb.append("null");
      } else {
        sb.append(this.processWorkflows);
      }
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

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

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

    // check for sub-struct validity
    if (processResourceSchedule != null) {
      processResourceSchedule.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, java.lang.ClassNotFoundException {
    try {
      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
      __isset_bitfield = 0;
      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
    } catch (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

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

  private static class ProcessModelStandardScheme extends org.apache.thrift.scheme.StandardScheme<ProcessModel> {

    @Override
    public void read(org.apache.thrift.protocol.TProtocol iprot, ProcessModel 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: // PROCESS_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.processId = iprot.readString();
              struct.setProcessIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // 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 3: // 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 4: // LAST_UPDATE_TIME
            if (schemeField.type == org.apache.thrift.protocol.TType.I64) {
              struct.lastUpdateTime = iprot.readI64();
              struct.setLastUpdateTimeIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // PROCESS_STATUSES
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list0 = iprot.readListBegin();
                struct.processStatuses = new java.util.ArrayList<org.apache.airavata.model.status.ProcessStatus>(_list0.size);
                @org.apache.thrift.annotation.Nullable org.apache.airavata.model.status.ProcessStatus _elem1;
                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
                {
                  _elem1 = new org.apache.airavata.model.status.ProcessStatus();
                  _elem1.read(iprot);
                  struct.processStatuses.add(_elem1);
                }
                iprot.readListEnd();
              }
              struct.setProcessStatusesIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 6: // PROCESS_DETAIL
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.processDetail = iprot.readString();
              struct.setProcessDetailIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // APPLICATION_INTERFACE_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.applicationInterfaceId = iprot.readString();
              struct.setApplicationInterfaceIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // APPLICATION_DEPLOYMENT_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.applicationDeploymentId = iprot.readString();
              struct.setApplicationDeploymentIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // COMPUTE_RESOURCE_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.computeResourceId = iprot.readString();
              struct.setComputeResourceIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // PROCESS_INPUTS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list3 = iprot.readListBegin();
                struct.processInputs = new java.util.ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(_list3.size);
                @org.apache.thrift.annotation.Nullable 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.processInputs.add(_elem4);
                }
                iprot.readListEnd();
              }
              struct.setProcessInputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // PROCESS_OUTPUTS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list6 = iprot.readListBegin();
                struct.processOutputs = new java.util.ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(_list6.size);
                @org.apache.thrift.annotation.Nullable 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.processOutputs.add(_elem7);
                }
                iprot.readListEnd();
              }
              struct.setProcessOutputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // PROCESS_RESOURCE_SCHEDULE
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.processResourceSchedule = new org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel();
              struct.processResourceSchedule.read(iprot);
              struct.setProcessResourceScheduleIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 13: // TASKS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list9 = iprot.readListBegin();
                struct.tasks = new java.util.ArrayList<org.apache.airavata.model.task.TaskModel>(_list9.size);
                @org.apache.thrift.annotation.Nullable org.apache.airavata.model.task.TaskModel _elem10;
                for (int _i11 = 0; _i11 < _list9.size; ++_i11)
                {
                  _elem10 = new org.apache.airavata.model.task.TaskModel();
                  _elem10.read(iprot);
                  struct.tasks.add(_elem10);
                }
                iprot.readListEnd();
              }
              struct.setTasksIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 14: // TASK_DAG
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.taskDag = iprot.readString();
              struct.setTaskDagIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 15: // PROCESS_ERRORS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list12 = iprot.readListBegin();
                struct.processErrors = new java.util.ArrayList<org.apache.airavata.model.commons.ErrorModel>(_list12.size);
                @org.apache.thrift.annotation.Nullable org.apache.airavata.model.commons.ErrorModel _elem13;
                for (int _i14 = 0; _i14 < _list12.size; ++_i14)
                {
                  _elem13 = new org.apache.airavata.model.commons.ErrorModel();
                  _elem13.read(iprot);
                  struct.processErrors.add(_elem13);
                }
                iprot.readListEnd();
              }
              struct.setProcessErrorsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 16: // 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 17: // 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 18: // EMAIL_ADDRESSES
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list15 = iprot.readListBegin();
                struct.emailAddresses = new java.util.ArrayList<java.lang.String>(_list15.size);
                @org.apache.thrift.annotation.Nullable java.lang.String _elem16;
                for (int _i17 = 0; _i17 < _list15.size; ++_i17)
                {
                  _elem16 = iprot.readString();
                  struct.emailAddresses.add(_elem16);
                }
                iprot.readListEnd();
              }
              struct.setEmailAddressesIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 19: // STORAGE_RESOURCE_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.storageResourceId = iprot.readString();
              struct.setStorageResourceIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 20: // USER_DN
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.userDn = iprot.readString();
              struct.setUserDnIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 21: // GENERATE_CERT
            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
              struct.generateCert = iprot.readBool();
              struct.setGenerateCertIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 22: // EXPERIMENT_DATA_DIR
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.experimentDataDir = iprot.readString();
              struct.setExperimentDataDirIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 23: // 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 24: // USE_USER_CRPREF
            if (schemeField.type == org.apache.thrift.protocol.TType.BOOL) {
              struct.useUserCRPref = iprot.readBool();
              struct.setUseUserCRPrefIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 25: // GROUP_RESOURCE_PROFILE_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.groupResourceProfileId = iprot.readString();
              struct.setGroupResourceProfileIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 26: // PROCESS_WORKFLOWS
            if (schemeField.type == org.apache.thrift.protocol.TType.LIST) {
              {
                org.apache.thrift.protocol.TList _list18 = iprot.readListBegin();
                struct.processWorkflows = new java.util.ArrayList<ProcessWorkflow>(_list18.size);
                @org.apache.thrift.annotation.Nullable ProcessWorkflow _elem19;
                for (int _i20 = 0; _i20 < _list18.size; ++_i20)
                {
                  _elem19 = new ProcessWorkflow();
                  _elem19.read(iprot);
                  struct.processWorkflows.add(_elem19);
                }
                iprot.readListEnd();
              }
              struct.setProcessWorkflowsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          default:
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

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

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.processId != null) {
        oprot.writeFieldBegin(PROCESS_ID_FIELD_DESC);
        oprot.writeString(struct.processId);
        oprot.writeFieldEnd();
      }
      if (struct.experimentId != null) {
        oprot.writeFieldBegin(EXPERIMENT_ID_FIELD_DESC);
        oprot.writeString(struct.experimentId);
        oprot.writeFieldEnd();
      }
      if (struct.isSetCreationTime()) {
        oprot.writeFieldBegin(CREATION_TIME_FIELD_DESC);
        oprot.writeI64(struct.creationTime);
        oprot.writeFieldEnd();
      }
      if (struct.isSetLastUpdateTime()) {
        oprot.writeFieldBegin(LAST_UPDATE_TIME_FIELD_DESC);
        oprot.writeI64(struct.lastUpdateTime);
        oprot.writeFieldEnd();
      }
      if (struct.processStatuses != null) {
        if (struct.isSetProcessStatuses()) {
          oprot.writeFieldBegin(PROCESS_STATUSES_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.processStatuses.size()));
            for (org.apache.airavata.model.status.ProcessStatus _iter21 : struct.processStatuses)
            {
              _iter21.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.processDetail != null) {
        if (struct.isSetProcessDetail()) {
          oprot.writeFieldBegin(PROCESS_DETAIL_FIELD_DESC);
          oprot.writeString(struct.processDetail);
          oprot.writeFieldEnd();
        }
      }
      if (struct.applicationInterfaceId != null) {
        if (struct.isSetApplicationInterfaceId()) {
          oprot.writeFieldBegin(APPLICATION_INTERFACE_ID_FIELD_DESC);
          oprot.writeString(struct.applicationInterfaceId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.applicationDeploymentId != null) {
        if (struct.isSetApplicationDeploymentId()) {
          oprot.writeFieldBegin(APPLICATION_DEPLOYMENT_ID_FIELD_DESC);
          oprot.writeString(struct.applicationDeploymentId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.computeResourceId != null) {
        if (struct.isSetComputeResourceId()) {
          oprot.writeFieldBegin(COMPUTE_RESOURCE_ID_FIELD_DESC);
          oprot.writeString(struct.computeResourceId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.processInputs != null) {
        if (struct.isSetProcessInputs()) {
          oprot.writeFieldBegin(PROCESS_INPUTS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.processInputs.size()));
            for (org.apache.airavata.model.application.io.InputDataObjectType _iter22 : struct.processInputs)
            {
              _iter22.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.processOutputs != null) {
        if (struct.isSetProcessOutputs()) {
          oprot.writeFieldBegin(PROCESS_OUTPUTS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.processOutputs.size()));
            for (org.apache.airavata.model.application.io.OutputDataObjectType _iter23 : struct.processOutputs)
            {
              _iter23.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.processResourceSchedule != null) {
        if (struct.isSetProcessResourceSchedule()) {
          oprot.writeFieldBegin(PROCESS_RESOURCE_SCHEDULE_FIELD_DESC);
          struct.processResourceSchedule.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.tasks != null) {
        if (struct.isSetTasks()) {
          oprot.writeFieldBegin(TASKS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.tasks.size()));
            for (org.apache.airavata.model.task.TaskModel _iter24 : struct.tasks)
            {
              _iter24.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.taskDag != null) {
        if (struct.isSetTaskDag()) {
          oprot.writeFieldBegin(TASK_DAG_FIELD_DESC);
          oprot.writeString(struct.taskDag);
          oprot.writeFieldEnd();
        }
      }
      if (struct.processErrors != null) {
        if (struct.isSetProcessErrors()) {
          oprot.writeFieldBegin(PROCESS_ERRORS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.processErrors.size()));
            for (org.apache.airavata.model.commons.ErrorModel _iter25 : struct.processErrors)
            {
              _iter25.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.gatewayExecutionId != null) {
        if (struct.isSetGatewayExecutionId()) {
          oprot.writeFieldBegin(GATEWAY_EXECUTION_ID_FIELD_DESC);
          oprot.writeString(struct.gatewayExecutionId);
          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 (java.lang.String _iter26 : struct.emailAddresses)
            {
              oprot.writeString(_iter26);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.storageResourceId != null) {
        if (struct.isSetStorageResourceId()) {
          oprot.writeFieldBegin(STORAGE_RESOURCE_ID_FIELD_DESC);
          oprot.writeString(struct.storageResourceId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.userDn != null) {
        if (struct.isSetUserDn()) {
          oprot.writeFieldBegin(USER_DN_FIELD_DESC);
          oprot.writeString(struct.userDn);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetGenerateCert()) {
        oprot.writeFieldBegin(GENERATE_CERT_FIELD_DESC);
        oprot.writeBool(struct.generateCert);
        oprot.writeFieldEnd();
      }
      if (struct.experimentDataDir != null) {
        if (struct.isSetExperimentDataDir()) {
          oprot.writeFieldBegin(EXPERIMENT_DATA_DIR_FIELD_DESC);
          oprot.writeString(struct.experimentDataDir);
          oprot.writeFieldEnd();
        }
      }
      if (struct.userName != null) {
        if (struct.isSetUserName()) {
          oprot.writeFieldBegin(USER_NAME_FIELD_DESC);
          oprot.writeString(struct.userName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetUseUserCRPref()) {
        oprot.writeFieldBegin(USE_USER_CRPREF_FIELD_DESC);
        oprot.writeBool(struct.useUserCRPref);
        oprot.writeFieldEnd();
      }
      if (struct.groupResourceProfileId != null) {
        if (struct.isSetGroupResourceProfileId()) {
          oprot.writeFieldBegin(GROUP_RESOURCE_PROFILE_ID_FIELD_DESC);
          oprot.writeString(struct.groupResourceProfileId);
          oprot.writeFieldEnd();
        }
      }
      if (struct.processWorkflows != null) {
        if (struct.isSetProcessWorkflows()) {
          oprot.writeFieldBegin(PROCESS_WORKFLOWS_FIELD_DESC);
          {
            oprot.writeListBegin(new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, struct.processWorkflows.size()));
            for (ProcessWorkflow _iter27 : struct.processWorkflows)
            {
              _iter27.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

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

  private static class ProcessModelTupleScheme extends org.apache.thrift.scheme.TupleScheme<ProcessModel> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, ProcessModel struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol oprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      oprot.writeString(struct.processId);
      oprot.writeString(struct.experimentId);
      java.util.BitSet optionals = new java.util.BitSet();
      if (struct.isSetCreationTime()) {
        optionals.set(0);
      }
      if (struct.isSetLastUpdateTime()) {
        optionals.set(1);
      }
      if (struct.isSetProcessStatuses()) {
        optionals.set(2);
      }
      if (struct.isSetProcessDetail()) {
        optionals.set(3);
      }
      if (struct.isSetApplicationInterfaceId()) {
        optionals.set(4);
      }
      if (struct.isSetApplicationDeploymentId()) {
        optionals.set(5);
      }
      if (struct.isSetComputeResourceId()) {
        optionals.set(6);
      }
      if (struct.isSetProcessInputs()) {
        optionals.set(7);
      }
      if (struct.isSetProcessOutputs()) {
        optionals.set(8);
      }
      if (struct.isSetProcessResourceSchedule()) {
        optionals.set(9);
      }
      if (struct.isSetTasks()) {
        optionals.set(10);
      }
      if (struct.isSetTaskDag()) {
        optionals.set(11);
      }
      if (struct.isSetProcessErrors()) {
        optionals.set(12);
      }
      if (struct.isSetGatewayExecutionId()) {
        optionals.set(13);
      }
      if (struct.isSetEnableEmailNotification()) {
        optionals.set(14);
      }
      if (struct.isSetEmailAddresses()) {
        optionals.set(15);
      }
      if (struct.isSetStorageResourceId()) {
        optionals.set(16);
      }
      if (struct.isSetUserDn()) {
        optionals.set(17);
      }
      if (struct.isSetGenerateCert()) {
        optionals.set(18);
      }
      if (struct.isSetExperimentDataDir()) {
        optionals.set(19);
      }
      if (struct.isSetUserName()) {
        optionals.set(20);
      }
      if (struct.isSetUseUserCRPref()) {
        optionals.set(21);
      }
      if (struct.isSetGroupResourceProfileId()) {
        optionals.set(22);
      }
      if (struct.isSetProcessWorkflows()) {
        optionals.set(23);
      }
      oprot.writeBitSet(optionals, 24);
      if (struct.isSetCreationTime()) {
        oprot.writeI64(struct.creationTime);
      }
      if (struct.isSetLastUpdateTime()) {
        oprot.writeI64(struct.lastUpdateTime);
      }
      if (struct.isSetProcessStatuses()) {
        {
          oprot.writeI32(struct.processStatuses.size());
          for (org.apache.airavata.model.status.ProcessStatus _iter28 : struct.processStatuses)
          {
            _iter28.write(oprot);
          }
        }
      }
      if (struct.isSetProcessDetail()) {
        oprot.writeString(struct.processDetail);
      }
      if (struct.isSetApplicationInterfaceId()) {
        oprot.writeString(struct.applicationInterfaceId);
      }
      if (struct.isSetApplicationDeploymentId()) {
        oprot.writeString(struct.applicationDeploymentId);
      }
      if (struct.isSetComputeResourceId()) {
        oprot.writeString(struct.computeResourceId);
      }
      if (struct.isSetProcessInputs()) {
        {
          oprot.writeI32(struct.processInputs.size());
          for (org.apache.airavata.model.application.io.InputDataObjectType _iter29 : struct.processInputs)
          {
            _iter29.write(oprot);
          }
        }
      }
      if (struct.isSetProcessOutputs()) {
        {
          oprot.writeI32(struct.processOutputs.size());
          for (org.apache.airavata.model.application.io.OutputDataObjectType _iter30 : struct.processOutputs)
          {
            _iter30.write(oprot);
          }
        }
      }
      if (struct.isSetProcessResourceSchedule()) {
        struct.processResourceSchedule.write(oprot);
      }
      if (struct.isSetTasks()) {
        {
          oprot.writeI32(struct.tasks.size());
          for (org.apache.airavata.model.task.TaskModel _iter31 : struct.tasks)
          {
            _iter31.write(oprot);
          }
        }
      }
      if (struct.isSetTaskDag()) {
        oprot.writeString(struct.taskDag);
      }
      if (struct.isSetProcessErrors()) {
        {
          oprot.writeI32(struct.processErrors.size());
          for (org.apache.airavata.model.commons.ErrorModel _iter32 : struct.processErrors)
          {
            _iter32.write(oprot);
          }
        }
      }
      if (struct.isSetGatewayExecutionId()) {
        oprot.writeString(struct.gatewayExecutionId);
      }
      if (struct.isSetEnableEmailNotification()) {
        oprot.writeBool(struct.enableEmailNotification);
      }
      if (struct.isSetEmailAddresses()) {
        {
          oprot.writeI32(struct.emailAddresses.size());
          for (java.lang.String _iter33 : struct.emailAddresses)
          {
            oprot.writeString(_iter33);
          }
        }
      }
      if (struct.isSetStorageResourceId()) {
        oprot.writeString(struct.storageResourceId);
      }
      if (struct.isSetUserDn()) {
        oprot.writeString(struct.userDn);
      }
      if (struct.isSetGenerateCert()) {
        oprot.writeBool(struct.generateCert);
      }
      if (struct.isSetExperimentDataDir()) {
        oprot.writeString(struct.experimentDataDir);
      }
      if (struct.isSetUserName()) {
        oprot.writeString(struct.userName);
      }
      if (struct.isSetUseUserCRPref()) {
        oprot.writeBool(struct.useUserCRPref);
      }
      if (struct.isSetGroupResourceProfileId()) {
        oprot.writeString(struct.groupResourceProfileId);
      }
      if (struct.isSetProcessWorkflows()) {
        {
          oprot.writeI32(struct.processWorkflows.size());
          for (ProcessWorkflow _iter34 : struct.processWorkflows)
          {
            _iter34.write(oprot);
          }
        }
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, ProcessModel struct) throws org.apache.thrift.TException {
      org.apache.thrift.protocol.TTupleProtocol iprot = (org.apache.thrift.protocol.TTupleProtocol) prot;
      struct.processId = iprot.readString();
      struct.setProcessIdIsSet(true);
      struct.experimentId = iprot.readString();
      struct.setExperimentIdIsSet(true);
      java.util.BitSet incoming = iprot.readBitSet(24);
      if (incoming.get(0)) {
        struct.creationTime = iprot.readI64();
        struct.setCreationTimeIsSet(true);
      }
      if (incoming.get(1)) {
        struct.lastUpdateTime = iprot.readI64();
        struct.setLastUpdateTimeIsSet(true);
      }
      if (incoming.get(2)) {
        {
          org.apache.thrift.protocol.TList _list35 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
          struct.processStatuses = new java.util.ArrayList<org.apache.airavata.model.status.ProcessStatus>(_list35.size);
          @org.apache.thrift.annotation.Nullable org.apache.airavata.model.status.ProcessStatus _elem36;
          for (int _i37 = 0; _i37 < _list35.size; ++_i37)
          {
            _elem36 = new org.apache.airavata.model.status.ProcessStatus();
            _elem36.read(iprot);
            struct.processStatuses.add(_elem36);
          }
        }
        struct.setProcessStatusesIsSet(true);
      }
      if (incoming.get(3)) {
        struct.processDetail = iprot.readString();
        struct.setProcessDetailIsSet(true);
      }
      if (incoming.get(4)) {
        struct.applicationInterfaceId = iprot.readString();
        struct.setApplicationInterfaceIdIsSet(true);
      }
      if (incoming.get(5)) {
        struct.applicationDeploymentId = iprot.readString();
        struct.setApplicationDeploymentIdIsSet(true);
      }
      if (incoming.get(6)) {
        struct.computeResourceId = iprot.readString();
        struct.setComputeResourceIdIsSet(true);
      }
      if (incoming.get(7)) {
        {
          org.apache.thrift.protocol.TList _list38 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
          struct.processInputs = new java.util.ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(_list38.size);
          @org.apache.thrift.annotation.Nullable org.apache.airavata.model.application.io.InputDataObjectType _elem39;
          for (int _i40 = 0; _i40 < _list38.size; ++_i40)
          {
            _elem39 = new org.apache.airavata.model.application.io.InputDataObjectType();
            _elem39.read(iprot);
            struct.processInputs.add(_elem39);
          }
        }
        struct.setProcessInputsIsSet(true);
      }
      if (incoming.get(8)) {
        {
          org.apache.thrift.protocol.TList _list41 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
          struct.processOutputs = new java.util.ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(_list41.size);
          @org.apache.thrift.annotation.Nullable org.apache.airavata.model.application.io.OutputDataObjectType _elem42;
          for (int _i43 = 0; _i43 < _list41.size; ++_i43)
          {
            _elem42 = new org.apache.airavata.model.application.io.OutputDataObjectType();
            _elem42.read(iprot);
            struct.processOutputs.add(_elem42);
          }
        }
        struct.setProcessOutputsIsSet(true);
      }
      if (incoming.get(9)) {
        struct.processResourceSchedule = new org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel();
        struct.processResourceSchedule.read(iprot);
        struct.setProcessResourceScheduleIsSet(true);
      }
      if (incoming.get(10)) {
        {
          org.apache.thrift.protocol.TList _list44 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
          struct.tasks = new java.util.ArrayList<org.apache.airavata.model.task.TaskModel>(_list44.size);
          @org.apache.thrift.annotation.Nullable org.apache.airavata.model.task.TaskModel _elem45;
          for (int _i46 = 0; _i46 < _list44.size; ++_i46)
          {
            _elem45 = new org.apache.airavata.model.task.TaskModel();
            _elem45.read(iprot);
            struct.tasks.add(_elem45);
          }
        }
        struct.setTasksIsSet(true);
      }
      if (incoming.get(11)) {
        struct.taskDag = iprot.readString();
        struct.setTaskDagIsSet(true);
      }
      if (incoming.get(12)) {
        {
          org.apache.thrift.protocol.TList _list47 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
          struct.processErrors = new java.util.ArrayList<org.apache.airavata.model.commons.ErrorModel>(_list47.size);
          @org.apache.thrift.annotation.Nullable org.apache.airavata.model.commons.ErrorModel _elem48;
          for (int _i49 = 0; _i49 < _list47.size; ++_i49)
          {
            _elem48 = new org.apache.airavata.model.commons.ErrorModel();
            _elem48.read(iprot);
            struct.processErrors.add(_elem48);
          }
        }
        struct.setProcessErrorsIsSet(true);
      }
      if (incoming.get(13)) {
        struct.gatewayExecutionId = iprot.readString();
        struct.setGatewayExecutionIdIsSet(true);
      }
      if (incoming.get(14)) {
        struct.enableEmailNotification = iprot.readBool();
        struct.setEnableEmailNotificationIsSet(true);
      }
      if (incoming.get(15)) {
        {
          org.apache.thrift.protocol.TList _list50 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRING);
          struct.emailAddresses = new java.util.ArrayList<java.lang.String>(_list50.size);
          @org.apache.thrift.annotation.Nullable java.lang.String _elem51;
          for (int _i52 = 0; _i52 < _list50.size; ++_i52)
          {
            _elem51 = iprot.readString();
            struct.emailAddresses.add(_elem51);
          }
        }
        struct.setEmailAddressesIsSet(true);
      }
      if (incoming.get(16)) {
        struct.storageResourceId = iprot.readString();
        struct.setStorageResourceIdIsSet(true);
      }
      if (incoming.get(17)) {
        struct.userDn = iprot.readString();
        struct.setUserDnIsSet(true);
      }
      if (incoming.get(18)) {
        struct.generateCert = iprot.readBool();
        struct.setGenerateCertIsSet(true);
      }
      if (incoming.get(19)) {
        struct.experimentDataDir = iprot.readString();
        struct.setExperimentDataDirIsSet(true);
      }
      if (incoming.get(20)) {
        struct.userName = iprot.readString();
        struct.setUserNameIsSet(true);
      }
      if (incoming.get(21)) {
        struct.useUserCRPref = iprot.readBool();
        struct.setUseUserCRPrefIsSet(true);
      }
      if (incoming.get(22)) {
        struct.groupResourceProfileId = iprot.readString();
        struct.setGroupResourceProfileIdIsSet(true);
      }
      if (incoming.get(23)) {
        {
          org.apache.thrift.protocol.TList _list53 = iprot.readListBegin(org.apache.thrift.protocol.TType.STRUCT);
          struct.processWorkflows = new java.util.ArrayList<ProcessWorkflow>(_list53.size);
          @org.apache.thrift.annotation.Nullable ProcessWorkflow _elem54;
          for (int _i55 = 0; _i55 < _list53.size; ++_i55)
          {
            _elem54 = new ProcessWorkflow();
            _elem54.read(iprot);
            struct.processWorkflows.add(_elem54);
          }
        }
        struct.setProcessWorkflowsIsSet(true);
      }
    }
  }

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

