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

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

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

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

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
/**
 * 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.
 * 
 * 
 */
@Generated(value = "Autogenerated by Thrift Compiler (0.9.3)")
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_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("processStatus", org.apache.thrift.protocol.TType.STRUCT, (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 RESOURCE_SCHEDULE_FIELD_DESC = new org.apache.thrift.protocol.TField("resourceSchedule", 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_ERROR_FIELD_DESC = new org.apache.thrift.protocol.TField("processError", org.apache.thrift.protocol.TType.STRUCT, (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 Map<Class<? extends IScheme>, SchemeFactory> schemes = new HashMap<Class<? extends IScheme>, SchemeFactory>();
  static {
    schemes.put(StandardScheme.class, new ProcessModelStandardSchemeFactory());
    schemes.put(TupleScheme.class, new ProcessModelTupleSchemeFactory());
  }

  private String processId; // required
  private String experimentId; // required
  private long creationTime; // optional
  private long lastUpdateTime; // optional
  private org.apache.airavata.model.status.ProcessStatus processStatus; // optional
  private String processDetail; // optional
  private String applicationInterfaceId; // optional
  private String applicationDeploymentId; // optional
  private String computeResourceId; // optional
  private List<org.apache.airavata.model.application.io.InputDataObjectType> processInputs; // optional
  private List<org.apache.airavata.model.application.io.OutputDataObjectType> processOutputs; // optional
  private org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel resourceSchedule; // optional
  private List<org.apache.airavata.model.task.TaskModel> tasks; // optional
  private String taskDag; // optional
  private org.apache.airavata.model.commons.ErrorModel processError; // optional
  private String gatewayExecutionId; // optional
  private boolean enableEmailNotification; // optional
  private List<String> emailAddresses; // optional
  private String storageResourceId; // optional
  private String userDn; // optional
  private boolean generateCert; // optional
  private String experimentDataDir; // optional
  private String userName; // 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_STATUS((short)5, "processStatus"),
    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"),
    RESOURCE_SCHEDULE((short)12, "resourceSchedule"),
    TASKS((short)13, "tasks"),
    TASK_DAG((short)14, "taskDag"),
    PROCESS_ERROR((short)15, "processError"),
    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");

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

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

    /**
     * Find the _Fields constant that matches fieldId, or null if its not found.
     */
    public static _Fields findByThriftId(int fieldId) {
      switch(fieldId) {
        case 1: // 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_STATUS
          return PROCESS_STATUS;
        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: // RESOURCE_SCHEDULE
          return RESOURCE_SCHEDULE;
        case 13: // TASKS
          return TASKS;
        case 14: // TASK_DAG
          return TASK_DAG;
        case 15: // PROCESS_ERROR
          return PROCESS_ERROR;
        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;
        default:
          return null;
      }
    }

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

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

    private final short _thriftId;
    private final String _fieldName;

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

    public short getThriftFieldId() {
      return _thriftId;
    }

    public String getFieldName() {
      return _fieldName;
    }
  }

  // isset id assignments
  private static final int __CREATIONTIME_ISSET_ID = 0;
  private static final int __LASTUPDATETIME_ISSET_ID = 1;
  private static final int __ENABLEEMAILNOTIFICATION_ISSET_ID = 2;
  private static final int __GENERATECERT_ISSET_ID = 3;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.CREATION_TIME,_Fields.LAST_UPDATE_TIME,_Fields.PROCESS_STATUS,_Fields.PROCESS_DETAIL,_Fields.APPLICATION_INTERFACE_ID,_Fields.APPLICATION_DEPLOYMENT_ID,_Fields.COMPUTE_RESOURCE_ID,_Fields.PROCESS_INPUTS,_Fields.PROCESS_OUTPUTS,_Fields.RESOURCE_SCHEDULE,_Fields.TASKS,_Fields.TASK_DAG,_Fields.PROCESS_ERROR,_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};
  public static final Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> metaDataMap;
  static {
    Map<_Fields, org.apache.thrift.meta_data.FieldMetaData> tmpMap = new EnumMap<_Fields, org.apache.thrift.meta_data.FieldMetaData>(_Fields.class);
    tmpMap.put(_Fields.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_STATUS, new org.apache.thrift.meta_data.FieldMetaData("processStatus", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        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.RESOURCE_SCHEDULE, new org.apache.thrift.meta_data.FieldMetaData("resourceSchedule", 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_ERROR, new org.apache.thrift.meta_data.FieldMetaData("processError", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        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)));
    metaDataMap = 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(
    String processId,
    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.isSetProcessStatus()) {
      this.processStatus = new org.apache.airavata.model.status.ProcessStatus(other.processStatus);
    }
    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()) {
      List<org.apache.airavata.model.application.io.InputDataObjectType> __this__processInputs = new 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()) {
      List<org.apache.airavata.model.application.io.OutputDataObjectType> __this__processOutputs = new 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.isSetResourceSchedule()) {
      this.resourceSchedule = new org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel(other.resourceSchedule);
    }
    if (other.isSetTasks()) {
      List<org.apache.airavata.model.task.TaskModel> __this__tasks = new 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.isSetProcessError()) {
      this.processError = new org.apache.airavata.model.commons.ErrorModel(other.processError);
    }
    if (other.isSetGatewayExecutionId()) {
      this.gatewayExecutionId = other.gatewayExecutionId;
    }
    this.enableEmailNotification = other.enableEmailNotification;
    if (other.isSetEmailAddresses()) {
      List<String> __this__emailAddresses = new ArrayList<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;
    }
  }

  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.processStatus = null;
    this.processDetail = null;
    this.applicationInterfaceId = null;
    this.applicationDeploymentId = null;
    this.computeResourceId = null;
    this.processInputs = null;
    this.processOutputs = null;
    this.resourceSchedule = null;
    this.tasks = null;
    this.taskDag = null;
    this.processError = 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;
  }

  public String getProcessId() {
    return this.processId;
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

  public void unsetLastUpdateTime() {
    __isset_bitfield = 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 EncodingUtils.testBit(__isset_bitfield, __LASTUPDATETIME_ISSET_ID);
  }

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

  public org.apache.airavata.model.status.ProcessStatus getProcessStatus() {
    return this.processStatus;
  }

  public void setProcessStatus(org.apache.airavata.model.status.ProcessStatus processStatus) {
    this.processStatus = processStatus;
  }

  public void unsetProcessStatus() {
    this.processStatus = null;
  }

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

  public void setProcessStatusIsSet(boolean value) {
    if (!value) {
      this.processStatus = null;
    }
  }

  public String getProcessDetail() {
    return this.processDetail;
  }

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

  public String getApplicationInterfaceId() {
    return this.applicationInterfaceId;
  }

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

  public String getApplicationDeploymentId() {
    return this.applicationDeploymentId;
  }

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

  public String getComputeResourceId() {
    return this.computeResourceId;
  }

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

  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 ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>();
    }
    this.processInputs.add(elem);
  }

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

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

  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 ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>();
    }
    this.processOutputs.add(elem);
  }

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

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

  public org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel getResourceSchedule() {
    return this.resourceSchedule;
  }

  public void setResourceSchedule(org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel resourceSchedule) {
    this.resourceSchedule = resourceSchedule;
  }

  public void unsetResourceSchedule() {
    this.resourceSchedule = null;
  }

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

  public void setResourceScheduleIsSet(boolean value) {
    if (!value) {
      this.resourceSchedule = null;
    }
  }

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

  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 ArrayList<org.apache.airavata.model.task.TaskModel>();
    }
    this.tasks.add(elem);
  }

  public List<org.apache.airavata.model.task.TaskModel> getTasks() {
    return this.tasks;
  }

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

  public String getTaskDag() {
    return this.taskDag;
  }

  public void setTaskDag(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 org.apache.airavata.model.commons.ErrorModel getProcessError() {
    return this.processError;
  }

  public void setProcessError(org.apache.airavata.model.commons.ErrorModel processError) {
    this.processError = processError;
  }

  public void unsetProcessError() {
    this.processError = null;
  }

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

  public void setProcessErrorIsSet(boolean value) {
    if (!value) {
      this.processError = null;
    }
  }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  public String getStorageResourceId() {
    return this.storageResourceId;
  }

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

  public String getUserDn() {
    return this.userDn;
  }

  public void setUserDn(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 = 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 EncodingUtils.testBit(__isset_bitfield, __GENERATECERT_ISSET_ID);
  }

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

  public String getExperimentDataDir() {
    return this.experimentDataDir;
  }

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

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

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

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

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

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

  public void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case PROCESS_ID:
      if (value == null) {
        unsetProcessId();
      } else {
        setProcessId((String)value);
      }
      break;

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

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

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

    case PROCESS_STATUS:
      if (value == null) {
        unsetProcessStatus();
      } else {
        setProcessStatus((org.apache.airavata.model.status.ProcessStatus)value);
      }
      break;

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

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

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

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

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

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

    case RESOURCE_SCHEDULE:
      if (value == null) {
        unsetResourceSchedule();
      } else {
        setResourceSchedule((org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel)value);
      }
      break;

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

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

    case PROCESS_ERROR:
      if (value == null) {
        unsetProcessError();
      } else {
        setProcessError((org.apache.airavata.model.commons.ErrorModel)value);
      }
      break;

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

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

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

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

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

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

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

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

    }
  }

  public 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_STATUS:
      return getProcessStatus();

    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 RESOURCE_SCHEDULE:
      return getResourceSchedule();

    case TASKS:
      return getTasks();

    case TASK_DAG:
      return getTaskDag();

    case PROCESS_ERROR:
      return getProcessError();

    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();

    }
    throw new IllegalStateException();
  }

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

    switch (field) {
    case PROCESS_ID:
      return isSetProcessId();
    case EXPERIMENT_ID:
      return isSetExperimentId();
    case CREATION_TIME:
      return isSetCreationTime();
    case LAST_UPDATE_TIME:
      return isSetLastUpdateTime();
    case PROCESS_STATUS:
      return isSetProcessStatus();
    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 RESOURCE_SCHEDULE:
      return isSetResourceSchedule();
    case TASKS:
      return isSetTasks();
    case TASK_DAG:
      return isSetTaskDag();
    case PROCESS_ERROR:
      return isSetProcessError();
    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();
    }
    throw new IllegalStateException();
  }

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

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

    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_processStatus = true && this.isSetProcessStatus();
    boolean that_present_processStatus = true && that.isSetProcessStatus();
    if (this_present_processStatus || that_present_processStatus) {
      if (!(this_present_processStatus && that_present_processStatus))
        return false;
      if (!this.processStatus.equals(that.processStatus))
        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_resourceSchedule = true && this.isSetResourceSchedule();
    boolean that_present_resourceSchedule = true && that.isSetResourceSchedule();
    if (this_present_resourceSchedule || that_present_resourceSchedule) {
      if (!(this_present_resourceSchedule && that_present_resourceSchedule))
        return false;
      if (!this.resourceSchedule.equals(that.resourceSchedule))
        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_processError = true && this.isSetProcessError();
    boolean that_present_processError = true && that.isSetProcessError();
    if (this_present_processError || that_present_processError) {
      if (!(this_present_processError && that_present_processError))
        return false;
      if (!this.processError.equals(that.processError))
        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;
    }

    return true;
  }

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

    boolean present_processId = true && (isSetProcessId());
    list.add(present_processId);
    if (present_processId)
      list.add(processId);

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

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

    boolean present_lastUpdateTime = true && (isSetLastUpdateTime());
    list.add(present_lastUpdateTime);
    if (present_lastUpdateTime)
      list.add(lastUpdateTime);

    boolean present_processStatus = true && (isSetProcessStatus());
    list.add(present_processStatus);
    if (present_processStatus)
      list.add(processStatus);

    boolean present_processDetail = true && (isSetProcessDetail());
    list.add(present_processDetail);
    if (present_processDetail)
      list.add(processDetail);

    boolean present_applicationInterfaceId = true && (isSetApplicationInterfaceId());
    list.add(present_applicationInterfaceId);
    if (present_applicationInterfaceId)
      list.add(applicationInterfaceId);

    boolean present_applicationDeploymentId = true && (isSetApplicationDeploymentId());
    list.add(present_applicationDeploymentId);
    if (present_applicationDeploymentId)
      list.add(applicationDeploymentId);

    boolean present_computeResourceId = true && (isSetComputeResourceId());
    list.add(present_computeResourceId);
    if (present_computeResourceId)
      list.add(computeResourceId);

    boolean present_processInputs = true && (isSetProcessInputs());
    list.add(present_processInputs);
    if (present_processInputs)
      list.add(processInputs);

    boolean present_processOutputs = true && (isSetProcessOutputs());
    list.add(present_processOutputs);
    if (present_processOutputs)
      list.add(processOutputs);

    boolean present_resourceSchedule = true && (isSetResourceSchedule());
    list.add(present_resourceSchedule);
    if (present_resourceSchedule)
      list.add(resourceSchedule);

    boolean present_tasks = true && (isSetTasks());
    list.add(present_tasks);
    if (present_tasks)
      list.add(tasks);

    boolean present_taskDag = true && (isSetTaskDag());
    list.add(present_taskDag);
    if (present_taskDag)
      list.add(taskDag);

    boolean present_processError = true && (isSetProcessError());
    list.add(present_processError);
    if (present_processError)
      list.add(processError);

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

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

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

    boolean present_storageResourceId = true && (isSetStorageResourceId());
    list.add(present_storageResourceId);
    if (present_storageResourceId)
      list.add(storageResourceId);

    boolean present_userDn = true && (isSetUserDn());
    list.add(present_userDn);
    if (present_userDn)
      list.add(userDn);

    boolean present_generateCert = true && (isSetGenerateCert());
    list.add(present_generateCert);
    if (present_generateCert)
      list.add(generateCert);

    boolean present_experimentDataDir = true && (isSetExperimentDataDir());
    list.add(present_experimentDataDir);
    if (present_experimentDataDir)
      list.add(experimentDataDir);

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

    return list.hashCode();
  }

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

    int lastComparison = 0;

    lastComparison = Boolean.valueOf(isSetProcessId()).compareTo(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 = Boolean.valueOf(isSetExperimentId()).compareTo(other.isSetExperimentId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExperimentId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.experimentId, other.experimentId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetCreationTime()).compareTo(other.isSetCreationTime());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetCreationTime()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.creationTime, other.creationTime);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetLastUpdateTime()).compareTo(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 = Boolean.valueOf(isSetProcessStatus()).compareTo(other.isSetProcessStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processStatus, other.processStatus);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetProcessDetail()).compareTo(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 = Boolean.valueOf(isSetApplicationInterfaceId()).compareTo(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 = Boolean.valueOf(isSetApplicationDeploymentId()).compareTo(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 = Boolean.valueOf(isSetComputeResourceId()).compareTo(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 = Boolean.valueOf(isSetProcessInputs()).compareTo(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 = Boolean.valueOf(isSetProcessOutputs()).compareTo(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 = Boolean.valueOf(isSetResourceSchedule()).compareTo(other.isSetResourceSchedule());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetResourceSchedule()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.resourceSchedule, other.resourceSchedule);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetTasks()).compareTo(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 = Boolean.valueOf(isSetTaskDag()).compareTo(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 = Boolean.valueOf(isSetProcessError()).compareTo(other.isSetProcessError());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetProcessError()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.processError, other.processError);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetGatewayExecutionId()).compareTo(other.isSetGatewayExecutionId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetGatewayExecutionId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.gatewayExecutionId, other.gatewayExecutionId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetEnableEmailNotification()).compareTo(other.isSetEnableEmailNotification());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetEnableEmailNotification()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.enableEmailNotification, other.enableEmailNotification);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetEmailAddresses()).compareTo(other.isSetEmailAddresses());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetEmailAddresses()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.emailAddresses, other.emailAddresses);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetStorageResourceId()).compareTo(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 = Boolean.valueOf(isSetUserDn()).compareTo(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 = Boolean.valueOf(isSetGenerateCert()).compareTo(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 = Boolean.valueOf(isSetExperimentDataDir()).compareTo(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 = Boolean.valueOf(isSetUserName()).compareTo(other.isSetUserName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetUserName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.userName, other.userName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    return 0;
  }

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

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

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

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("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 (isSetProcessStatus()) {
      if (!first) sb.append(", ");
      sb.append("processStatus:");
      if (this.processStatus == null) {
        sb.append("null");
      } else {
        sb.append(this.processStatus);
      }
      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 (isSetResourceSchedule()) {
      if (!first) sb.append(", ");
      sb.append("resourceSchedule:");
      if (this.resourceSchedule == null) {
        sb.append("null");
      } else {
        sb.append(this.resourceSchedule);
      }
      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 (isSetProcessError()) {
      if (!first) sb.append(", ");
      sb.append("processError:");
      if (this.processError == null) {
        sb.append("null");
      } else {
        sb.append(this.processError);
      }
      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;
    }
    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 (processStatus != null) {
      processStatus.validate();
    }
    if (resourceSchedule != null) {
      resourceSchedule.validate();
    }
    if (processError != null) {
      processError.validate();
    }
  }

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

  private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException {
    try {
      // it doesn't seem like you should have to do this, but java serialization is wacky, and doesn't call the default constructor.
      __isset_bitfield = 0;
      read(new org.apache.thrift.protocol.TCompactProtocol(new org.apache.thrift.transport.TIOStreamTransport(in)));
    } catch (org.apache.thrift.TException te) {
      throw new java.io.IOException(te);
    }
  }

  private static class ProcessModelStandardSchemeFactory implements SchemeFactory {
    public ProcessModelStandardScheme getScheme() {
      return new ProcessModelStandardScheme();
    }
  }

  private static class ProcessModelStandardScheme extends StandardScheme<ProcessModel> {

    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_STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.processStatus = new org.apache.airavata.model.status.ProcessStatus();
              struct.processStatus.read(iprot);
              struct.setProcessStatusIsSet(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 _list0 = iprot.readListBegin();
                struct.processInputs = new ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(_list0.size);
                org.apache.airavata.model.application.io.InputDataObjectType _elem1;
                for (int _i2 = 0; _i2 < _list0.size; ++_i2)
                {
                  _elem1 = new org.apache.airavata.model.application.io.InputDataObjectType();
                  _elem1.read(iprot);
                  struct.processInputs.add(_elem1);
                }
                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 _list3 = iprot.readListBegin();
                struct.processOutputs = new ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(_list3.size);
                org.apache.airavata.model.application.io.OutputDataObjectType _elem4;
                for (int _i5 = 0; _i5 < _list3.size; ++_i5)
                {
                  _elem4 = new org.apache.airavata.model.application.io.OutputDataObjectType();
                  _elem4.read(iprot);
                  struct.processOutputs.add(_elem4);
                }
                iprot.readListEnd();
              }
              struct.setProcessOutputsIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // RESOURCE_SCHEDULE
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.resourceSchedule = new org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel();
              struct.resourceSchedule.read(iprot);
              struct.setResourceScheduleIsSet(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 _list6 = iprot.readListBegin();
                struct.tasks = new ArrayList<org.apache.airavata.model.task.TaskModel>(_list6.size);
                org.apache.airavata.model.task.TaskModel _elem7;
                for (int _i8 = 0; _i8 < _list6.size; ++_i8)
                {
                  _elem7 = new org.apache.airavata.model.task.TaskModel();
                  _elem7.read(iprot);
                  struct.tasks.add(_elem7);
                }
                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_ERROR
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.processError = new org.apache.airavata.model.commons.ErrorModel();
              struct.processError.read(iprot);
              struct.setProcessErrorIsSet(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 _list9 = iprot.readListBegin();
                struct.emailAddresses = new ArrayList<String>(_list9.size);
                String _elem10;
                for (int _i11 = 0; _i11 < _list9.size; ++_i11)
                {
                  _elem10 = iprot.readString();
                  struct.emailAddresses.add(_elem10);
                }
                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;
          default:
            org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        iprot.readFieldEnd();
      }
      iprot.readStructEnd();
      struct.validate();
    }

    public void write(org.apache.thrift.protocol.TProtocol oprot, 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.processStatus != null) {
        if (struct.isSetProcessStatus()) {
          oprot.writeFieldBegin(PROCESS_STATUS_FIELD_DESC);
          struct.processStatus.write(oprot);
          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 _iter12 : struct.processInputs)
            {
              _iter12.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 _iter13 : struct.processOutputs)
            {
              _iter13.write(oprot);
            }
            oprot.writeListEnd();
          }
          oprot.writeFieldEnd();
        }
      }
      if (struct.resourceSchedule != null) {
        if (struct.isSetResourceSchedule()) {
          oprot.writeFieldBegin(RESOURCE_SCHEDULE_FIELD_DESC);
          struct.resourceSchedule.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 _iter14 : struct.tasks)
            {
              _iter14.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.processError != null) {
        if (struct.isSetProcessError()) {
          oprot.writeFieldBegin(PROCESS_ERROR_FIELD_DESC);
          struct.processError.write(oprot);
          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 (String _iter15 : struct.emailAddresses)
            {
              oprot.writeString(_iter15);
            }
            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();
        }
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class ProcessModelTupleSchemeFactory implements SchemeFactory {
    public ProcessModelTupleScheme getScheme() {
      return new ProcessModelTupleScheme();
    }
  }

  private static class ProcessModelTupleScheme extends TupleScheme<ProcessModel> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, ProcessModel struct) throws org.apache.thrift.TException {
      TTupleProtocol oprot = (TTupleProtocol) prot;
      oprot.writeString(struct.processId);
      oprot.writeString(struct.experimentId);
      BitSet optionals = new BitSet();
      if (struct.isSetCreationTime()) {
        optionals.set(0);
      }
      if (struct.isSetLastUpdateTime()) {
        optionals.set(1);
      }
      if (struct.isSetProcessStatus()) {
        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.isSetResourceSchedule()) {
        optionals.set(9);
      }
      if (struct.isSetTasks()) {
        optionals.set(10);
      }
      if (struct.isSetTaskDag()) {
        optionals.set(11);
      }
      if (struct.isSetProcessError()) {
        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);
      }
      oprot.writeBitSet(optionals, 21);
      if (struct.isSetCreationTime()) {
        oprot.writeI64(struct.creationTime);
      }
      if (struct.isSetLastUpdateTime()) {
        oprot.writeI64(struct.lastUpdateTime);
      }
      if (struct.isSetProcessStatus()) {
        struct.processStatus.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 _iter16 : struct.processInputs)
          {
            _iter16.write(oprot);
          }
        }
      }
      if (struct.isSetProcessOutputs()) {
        {
          oprot.writeI32(struct.processOutputs.size());
          for (org.apache.airavata.model.application.io.OutputDataObjectType _iter17 : struct.processOutputs)
          {
            _iter17.write(oprot);
          }
        }
      }
      if (struct.isSetResourceSchedule()) {
        struct.resourceSchedule.write(oprot);
      }
      if (struct.isSetTasks()) {
        {
          oprot.writeI32(struct.tasks.size());
          for (org.apache.airavata.model.task.TaskModel _iter18 : struct.tasks)
          {
            _iter18.write(oprot);
          }
        }
      }
      if (struct.isSetTaskDag()) {
        oprot.writeString(struct.taskDag);
      }
      if (struct.isSetProcessError()) {
        struct.processError.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 (String _iter19 : struct.emailAddresses)
          {
            oprot.writeString(_iter19);
          }
        }
      }
      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);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, ProcessModel struct) throws org.apache.thrift.TException {
      TTupleProtocol iprot = (TTupleProtocol) prot;
      struct.processId = iprot.readString();
      struct.setProcessIdIsSet(true);
      struct.experimentId = iprot.readString();
      struct.setExperimentIdIsSet(true);
      BitSet incoming = iprot.readBitSet(21);
      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)) {
        struct.processStatus = new org.apache.airavata.model.status.ProcessStatus();
        struct.processStatus.read(iprot);
        struct.setProcessStatusIsSet(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 _list20 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.processInputs = new ArrayList<org.apache.airavata.model.application.io.InputDataObjectType>(_list20.size);
          org.apache.airavata.model.application.io.InputDataObjectType _elem21;
          for (int _i22 = 0; _i22 < _list20.size; ++_i22)
          {
            _elem21 = new org.apache.airavata.model.application.io.InputDataObjectType();
            _elem21.read(iprot);
            struct.processInputs.add(_elem21);
          }
        }
        struct.setProcessInputsIsSet(true);
      }
      if (incoming.get(8)) {
        {
          org.apache.thrift.protocol.TList _list23 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.processOutputs = new ArrayList<org.apache.airavata.model.application.io.OutputDataObjectType>(_list23.size);
          org.apache.airavata.model.application.io.OutputDataObjectType _elem24;
          for (int _i25 = 0; _i25 < _list23.size; ++_i25)
          {
            _elem24 = new org.apache.airavata.model.application.io.OutputDataObjectType();
            _elem24.read(iprot);
            struct.processOutputs.add(_elem24);
          }
        }
        struct.setProcessOutputsIsSet(true);
      }
      if (incoming.get(9)) {
        struct.resourceSchedule = new org.apache.airavata.model.scheduling.ComputationalResourceSchedulingModel();
        struct.resourceSchedule.read(iprot);
        struct.setResourceScheduleIsSet(true);
      }
      if (incoming.get(10)) {
        {
          org.apache.thrift.protocol.TList _list26 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRUCT, iprot.readI32());
          struct.tasks = new ArrayList<org.apache.airavata.model.task.TaskModel>(_list26.size);
          org.apache.airavata.model.task.TaskModel _elem27;
          for (int _i28 = 0; _i28 < _list26.size; ++_i28)
          {
            _elem27 = new org.apache.airavata.model.task.TaskModel();
            _elem27.read(iprot);
            struct.tasks.add(_elem27);
          }
        }
        struct.setTasksIsSet(true);
      }
      if (incoming.get(11)) {
        struct.taskDag = iprot.readString();
        struct.setTaskDagIsSet(true);
      }
      if (incoming.get(12)) {
        struct.processError = new org.apache.airavata.model.commons.ErrorModel();
        struct.processError.read(iprot);
        struct.setProcessErrorIsSet(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 _list29 = new org.apache.thrift.protocol.TList(org.apache.thrift.protocol.TType.STRING, iprot.readI32());
          struct.emailAddresses = new ArrayList<String>(_list29.size);
          String _elem30;
          for (int _i31 = 0; _i31 < _list29.size; ++_i31)
          {
            _elem30 = iprot.readString();
            struct.emailAddresses.add(_elem30);
          }
        }
        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);
      }
    }
  }

}

