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

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

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

@SuppressWarnings({"cast", "rawtypes", "serial", "unchecked"})
@Generated(value = "Autogenerated by Thrift Compiler (0.9.2)", date = "2015-11-16")
public class JobModel implements org.apache.thrift.TBase<JobModel, JobModel._Fields>, java.io.Serializable, Cloneable, Comparable<JobModel> {
  private static final org.apache.thrift.protocol.TStruct STRUCT_DESC = new org.apache.thrift.protocol.TStruct("JobModel");

  private static final org.apache.thrift.protocol.TField JOB_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("jobId", org.apache.thrift.protocol.TType.STRING, (short)1);
  private static final org.apache.thrift.protocol.TField TASK_ID_FIELD_DESC = new org.apache.thrift.protocol.TField("taskId", org.apache.thrift.protocol.TType.STRING, (short)2);
  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)3);
  private static final org.apache.thrift.protocol.TField JOB_DESCRIPTION_FIELD_DESC = new org.apache.thrift.protocol.TField("jobDescription", org.apache.thrift.protocol.TType.STRING, (short)4);
  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)5);
  private static final org.apache.thrift.protocol.TField JOB_STATUS_FIELD_DESC = new org.apache.thrift.protocol.TField("jobStatus", org.apache.thrift.protocol.TType.STRUCT, (short)6);
  private static final org.apache.thrift.protocol.TField COMPUTE_RESOURCE_CONSUMED_FIELD_DESC = new org.apache.thrift.protocol.TField("computeResourceConsumed", org.apache.thrift.protocol.TType.STRING, (short)7);
  private static final org.apache.thrift.protocol.TField JOB_NAME_FIELD_DESC = new org.apache.thrift.protocol.TField("jobName", org.apache.thrift.protocol.TType.STRING, (short)8);
  private static final org.apache.thrift.protocol.TField WORKING_DIR_FIELD_DESC = new org.apache.thrift.protocol.TField("workingDir", org.apache.thrift.protocol.TType.STRING, (short)9);
  private static final org.apache.thrift.protocol.TField STD_OUT_FIELD_DESC = new org.apache.thrift.protocol.TField("stdOut", org.apache.thrift.protocol.TType.STRING, (short)10);
  private static final org.apache.thrift.protocol.TField STD_ERR_FIELD_DESC = new org.apache.thrift.protocol.TField("stdErr", org.apache.thrift.protocol.TType.STRING, (short)11);
  private static final org.apache.thrift.protocol.TField EXIT_CODE_FIELD_DESC = new org.apache.thrift.protocol.TField("exitCode", org.apache.thrift.protocol.TType.I32, (short)12);

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

  private String jobId; // required
  private String taskId; // required
  private String processId; // required
  private String jobDescription; // required
  private long creationTime; // optional
  private org.apache.airavata.model.status.JobStatus jobStatus; // optional
  private String computeResourceConsumed; // optional
  private String jobName; // optional
  private String workingDir; // optional
  private String stdOut; // optional
  private String stdErr; // optional
  private int exitCode; // 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 {
    JOB_ID((short)1, "jobId"),
    TASK_ID((short)2, "taskId"),
    PROCESS_ID((short)3, "processId"),
    JOB_DESCRIPTION((short)4, "jobDescription"),
    CREATION_TIME((short)5, "creationTime"),
    JOB_STATUS((short)6, "jobStatus"),
    COMPUTE_RESOURCE_CONSUMED((short)7, "computeResourceConsumed"),
    JOB_NAME((short)8, "jobName"),
    WORKING_DIR((short)9, "workingDir"),
    STD_OUT((short)10, "stdOut"),
    STD_ERR((short)11, "stdErr"),
    EXIT_CODE((short)12, "exitCode");

    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: // JOB_ID
          return JOB_ID;
        case 2: // TASK_ID
          return TASK_ID;
        case 3: // PROCESS_ID
          return PROCESS_ID;
        case 4: // JOB_DESCRIPTION
          return JOB_DESCRIPTION;
        case 5: // CREATION_TIME
          return CREATION_TIME;
        case 6: // JOB_STATUS
          return JOB_STATUS;
        case 7: // COMPUTE_RESOURCE_CONSUMED
          return COMPUTE_RESOURCE_CONSUMED;
        case 8: // JOB_NAME
          return JOB_NAME;
        case 9: // WORKING_DIR
          return WORKING_DIR;
        case 10: // STD_OUT
          return STD_OUT;
        case 11: // STD_ERR
          return STD_ERR;
        case 12: // EXIT_CODE
          return EXIT_CODE;
        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 __EXITCODE_ISSET_ID = 1;
  private byte __isset_bitfield = 0;
  private static final _Fields optionals[] = {_Fields.CREATION_TIME,_Fields.JOB_STATUS,_Fields.COMPUTE_RESOURCE_CONSUMED,_Fields.JOB_NAME,_Fields.WORKING_DIR,_Fields.STD_OUT,_Fields.STD_ERR,_Fields.EXIT_CODE};
  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.JOB_ID, new org.apache.thrift.meta_data.FieldMetaData("jobId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.TASK_ID, new org.apache.thrift.meta_data.FieldMetaData("taskId", org.apache.thrift.TFieldRequirementType.REQUIRED, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    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.JOB_DESCRIPTION, new org.apache.thrift.meta_data.FieldMetaData("jobDescription", 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.JOB_STATUS, new org.apache.thrift.meta_data.FieldMetaData("jobStatus", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.StructMetaData(org.apache.thrift.protocol.TType.STRUCT, org.apache.airavata.model.status.JobStatus.class)));
    tmpMap.put(_Fields.COMPUTE_RESOURCE_CONSUMED, new org.apache.thrift.meta_data.FieldMetaData("computeResourceConsumed", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.JOB_NAME, new org.apache.thrift.meta_data.FieldMetaData("jobName", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.WORKING_DIR, new org.apache.thrift.meta_data.FieldMetaData("workingDir", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.STD_OUT, new org.apache.thrift.meta_data.FieldMetaData("stdOut", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.STD_ERR, new org.apache.thrift.meta_data.FieldMetaData("stdErr", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.STRING)));
    tmpMap.put(_Fields.EXIT_CODE, new org.apache.thrift.meta_data.FieldMetaData("exitCode", org.apache.thrift.TFieldRequirementType.OPTIONAL, 
        new org.apache.thrift.meta_data.FieldValueMetaData(org.apache.thrift.protocol.TType.I32)));
    metaDataMap = Collections.unmodifiableMap(tmpMap);
    org.apache.thrift.meta_data.FieldMetaData.addStructMetaDataMap(JobModel.class, metaDataMap);
  }

  public JobModel() {
  }

  public JobModel(
    String jobId,
    String taskId,
    String processId,
    String jobDescription)
  {
    this();
    this.jobId = jobId;
    this.taskId = taskId;
    this.processId = processId;
    this.jobDescription = jobDescription;
  }

  /**
   * Performs a deep copy on <i>other</i>.
   */
  public JobModel(JobModel other) {
    __isset_bitfield = other.__isset_bitfield;
    if (other.isSetJobId()) {
      this.jobId = other.jobId;
    }
    if (other.isSetTaskId()) {
      this.taskId = other.taskId;
    }
    if (other.isSetProcessId()) {
      this.processId = other.processId;
    }
    if (other.isSetJobDescription()) {
      this.jobDescription = other.jobDescription;
    }
    this.creationTime = other.creationTime;
    if (other.isSetJobStatus()) {
      this.jobStatus = new org.apache.airavata.model.status.JobStatus(other.jobStatus);
    }
    if (other.isSetComputeResourceConsumed()) {
      this.computeResourceConsumed = other.computeResourceConsumed;
    }
    if (other.isSetJobName()) {
      this.jobName = other.jobName;
    }
    if (other.isSetWorkingDir()) {
      this.workingDir = other.workingDir;
    }
    if (other.isSetStdOut()) {
      this.stdOut = other.stdOut;
    }
    if (other.isSetStdErr()) {
      this.stdErr = other.stdErr;
    }
    this.exitCode = other.exitCode;
  }

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

  @Override
  public void clear() {
    this.jobId = null;
    this.taskId = null;
    this.processId = null;
    this.jobDescription = null;
    setCreationTimeIsSet(false);
    this.creationTime = 0;
    this.jobStatus = null;
    this.computeResourceConsumed = null;
    this.jobName = null;
    this.workingDir = null;
    this.stdOut = null;
    this.stdErr = null;
    setExitCodeIsSet(false);
    this.exitCode = 0;
  }

  public String getJobId() {
    return this.jobId;
  }

  public void setJobId(String jobId) {
    this.jobId = jobId;
  }

  public void unsetJobId() {
    this.jobId = null;
  }

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

  public void setJobIdIsSet(boolean value) {
    if (!value) {
      this.jobId = null;
    }
  }

  public String getTaskId() {
    return this.taskId;
  }

  public void setTaskId(String taskId) {
    this.taskId = taskId;
  }

  public void unsetTaskId() {
    this.taskId = null;
  }

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

  public void setTaskIdIsSet(boolean value) {
    if (!value) {
      this.taskId = 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 getJobDescription() {
    return this.jobDescription;
  }

  public void setJobDescription(String jobDescription) {
    this.jobDescription = jobDescription;
  }

  public void unsetJobDescription() {
    this.jobDescription = null;
  }

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

  public void setJobDescriptionIsSet(boolean value) {
    if (!value) {
      this.jobDescription = 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 org.apache.airavata.model.status.JobStatus getJobStatus() {
    return this.jobStatus;
  }

  public void setJobStatus(org.apache.airavata.model.status.JobStatus jobStatus) {
    this.jobStatus = jobStatus;
  }

  public void unsetJobStatus() {
    this.jobStatus = null;
  }

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

  public void setJobStatusIsSet(boolean value) {
    if (!value) {
      this.jobStatus = null;
    }
  }

  public String getComputeResourceConsumed() {
    return this.computeResourceConsumed;
  }

  public void setComputeResourceConsumed(String computeResourceConsumed) {
    this.computeResourceConsumed = computeResourceConsumed;
  }

  public void unsetComputeResourceConsumed() {
    this.computeResourceConsumed = null;
  }

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

  public void setComputeResourceConsumedIsSet(boolean value) {
    if (!value) {
      this.computeResourceConsumed = null;
    }
  }

  public String getJobName() {
    return this.jobName;
  }

  public void setJobName(String jobName) {
    this.jobName = jobName;
  }

  public void unsetJobName() {
    this.jobName = null;
  }

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

  public void setJobNameIsSet(boolean value) {
    if (!value) {
      this.jobName = null;
    }
  }

  public String getWorkingDir() {
    return this.workingDir;
  }

  public void setWorkingDir(String workingDir) {
    this.workingDir = workingDir;
  }

  public void unsetWorkingDir() {
    this.workingDir = null;
  }

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

  public void setWorkingDirIsSet(boolean value) {
    if (!value) {
      this.workingDir = null;
    }
  }

  public String getStdOut() {
    return this.stdOut;
  }

  public void setStdOut(String stdOut) {
    this.stdOut = stdOut;
  }

  public void unsetStdOut() {
    this.stdOut = null;
  }

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

  public void setStdOutIsSet(boolean value) {
    if (!value) {
      this.stdOut = null;
    }
  }

  public String getStdErr() {
    return this.stdErr;
  }

  public void setStdErr(String stdErr) {
    this.stdErr = stdErr;
  }

  public void unsetStdErr() {
    this.stdErr = null;
  }

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

  public void setStdErrIsSet(boolean value) {
    if (!value) {
      this.stdErr = null;
    }
  }

  public int getExitCode() {
    return this.exitCode;
  }

  public void setExitCode(int exitCode) {
    this.exitCode = exitCode;
    setExitCodeIsSet(true);
  }

  public void unsetExitCode() {
    __isset_bitfield = EncodingUtils.clearBit(__isset_bitfield, __EXITCODE_ISSET_ID);
  }

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

  public void setExitCodeIsSet(boolean value) {
    __isset_bitfield = EncodingUtils.setBit(__isset_bitfield, __EXITCODE_ISSET_ID, value);
  }

  public void setFieldValue(_Fields field, Object value) {
    switch (field) {
    case JOB_ID:
      if (value == null) {
        unsetJobId();
      } else {
        setJobId((String)value);
      }
      break;

    case TASK_ID:
      if (value == null) {
        unsetTaskId();
      } else {
        setTaskId((String)value);
      }
      break;

    case PROCESS_ID:
      if (value == null) {
        unsetProcessId();
      } else {
        setProcessId((String)value);
      }
      break;

    case JOB_DESCRIPTION:
      if (value == null) {
        unsetJobDescription();
      } else {
        setJobDescription((String)value);
      }
      break;

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

    case JOB_STATUS:
      if (value == null) {
        unsetJobStatus();
      } else {
        setJobStatus((org.apache.airavata.model.status.JobStatus)value);
      }
      break;

    case COMPUTE_RESOURCE_CONSUMED:
      if (value == null) {
        unsetComputeResourceConsumed();
      } else {
        setComputeResourceConsumed((String)value);
      }
      break;

    case JOB_NAME:
      if (value == null) {
        unsetJobName();
      } else {
        setJobName((String)value);
      }
      break;

    case WORKING_DIR:
      if (value == null) {
        unsetWorkingDir();
      } else {
        setWorkingDir((String)value);
      }
      break;

    case STD_OUT:
      if (value == null) {
        unsetStdOut();
      } else {
        setStdOut((String)value);
      }
      break;

    case STD_ERR:
      if (value == null) {
        unsetStdErr();
      } else {
        setStdErr((String)value);
      }
      break;

    case EXIT_CODE:
      if (value == null) {
        unsetExitCode();
      } else {
        setExitCode((Integer)value);
      }
      break;

    }
  }

  public Object getFieldValue(_Fields field) {
    switch (field) {
    case JOB_ID:
      return getJobId();

    case TASK_ID:
      return getTaskId();

    case PROCESS_ID:
      return getProcessId();

    case JOB_DESCRIPTION:
      return getJobDescription();

    case CREATION_TIME:
      return Long.valueOf(getCreationTime());

    case JOB_STATUS:
      return getJobStatus();

    case COMPUTE_RESOURCE_CONSUMED:
      return getComputeResourceConsumed();

    case JOB_NAME:
      return getJobName();

    case WORKING_DIR:
      return getWorkingDir();

    case STD_OUT:
      return getStdOut();

    case STD_ERR:
      return getStdErr();

    case EXIT_CODE:
      return Integer.valueOf(getExitCode());

    }
    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 JOB_ID:
      return isSetJobId();
    case TASK_ID:
      return isSetTaskId();
    case PROCESS_ID:
      return isSetProcessId();
    case JOB_DESCRIPTION:
      return isSetJobDescription();
    case CREATION_TIME:
      return isSetCreationTime();
    case JOB_STATUS:
      return isSetJobStatus();
    case COMPUTE_RESOURCE_CONSUMED:
      return isSetComputeResourceConsumed();
    case JOB_NAME:
      return isSetJobName();
    case WORKING_DIR:
      return isSetWorkingDir();
    case STD_OUT:
      return isSetStdOut();
    case STD_ERR:
      return isSetStdErr();
    case EXIT_CODE:
      return isSetExitCode();
    }
    throw new IllegalStateException();
  }

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

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

    boolean this_present_jobId = true && this.isSetJobId();
    boolean that_present_jobId = true && that.isSetJobId();
    if (this_present_jobId || that_present_jobId) {
      if (!(this_present_jobId && that_present_jobId))
        return false;
      if (!this.jobId.equals(that.jobId))
        return false;
    }

    boolean this_present_taskId = true && this.isSetTaskId();
    boolean that_present_taskId = true && that.isSetTaskId();
    if (this_present_taskId || that_present_taskId) {
      if (!(this_present_taskId && that_present_taskId))
        return false;
      if (!this.taskId.equals(that.taskId))
        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_jobDescription = true && this.isSetJobDescription();
    boolean that_present_jobDescription = true && that.isSetJobDescription();
    if (this_present_jobDescription || that_present_jobDescription) {
      if (!(this_present_jobDescription && that_present_jobDescription))
        return false;
      if (!this.jobDescription.equals(that.jobDescription))
        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_jobStatus = true && this.isSetJobStatus();
    boolean that_present_jobStatus = true && that.isSetJobStatus();
    if (this_present_jobStatus || that_present_jobStatus) {
      if (!(this_present_jobStatus && that_present_jobStatus))
        return false;
      if (!this.jobStatus.equals(that.jobStatus))
        return false;
    }

    boolean this_present_computeResourceConsumed = true && this.isSetComputeResourceConsumed();
    boolean that_present_computeResourceConsumed = true && that.isSetComputeResourceConsumed();
    if (this_present_computeResourceConsumed || that_present_computeResourceConsumed) {
      if (!(this_present_computeResourceConsumed && that_present_computeResourceConsumed))
        return false;
      if (!this.computeResourceConsumed.equals(that.computeResourceConsumed))
        return false;
    }

    boolean this_present_jobName = true && this.isSetJobName();
    boolean that_present_jobName = true && that.isSetJobName();
    if (this_present_jobName || that_present_jobName) {
      if (!(this_present_jobName && that_present_jobName))
        return false;
      if (!this.jobName.equals(that.jobName))
        return false;
    }

    boolean this_present_workingDir = true && this.isSetWorkingDir();
    boolean that_present_workingDir = true && that.isSetWorkingDir();
    if (this_present_workingDir || that_present_workingDir) {
      if (!(this_present_workingDir && that_present_workingDir))
        return false;
      if (!this.workingDir.equals(that.workingDir))
        return false;
    }

    boolean this_present_stdOut = true && this.isSetStdOut();
    boolean that_present_stdOut = true && that.isSetStdOut();
    if (this_present_stdOut || that_present_stdOut) {
      if (!(this_present_stdOut && that_present_stdOut))
        return false;
      if (!this.stdOut.equals(that.stdOut))
        return false;
    }

    boolean this_present_stdErr = true && this.isSetStdErr();
    boolean that_present_stdErr = true && that.isSetStdErr();
    if (this_present_stdErr || that_present_stdErr) {
      if (!(this_present_stdErr && that_present_stdErr))
        return false;
      if (!this.stdErr.equals(that.stdErr))
        return false;
    }

    boolean this_present_exitCode = true && this.isSetExitCode();
    boolean that_present_exitCode = true && that.isSetExitCode();
    if (this_present_exitCode || that_present_exitCode) {
      if (!(this_present_exitCode && that_present_exitCode))
        return false;
      if (this.exitCode != that.exitCode)
        return false;
    }

    return true;
  }

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

    boolean present_jobId = true && (isSetJobId());
    list.add(present_jobId);
    if (present_jobId)
      list.add(jobId);

    boolean present_taskId = true && (isSetTaskId());
    list.add(present_taskId);
    if (present_taskId)
      list.add(taskId);

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

    boolean present_jobDescription = true && (isSetJobDescription());
    list.add(present_jobDescription);
    if (present_jobDescription)
      list.add(jobDescription);

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

    boolean present_jobStatus = true && (isSetJobStatus());
    list.add(present_jobStatus);
    if (present_jobStatus)
      list.add(jobStatus);

    boolean present_computeResourceConsumed = true && (isSetComputeResourceConsumed());
    list.add(present_computeResourceConsumed);
    if (present_computeResourceConsumed)
      list.add(computeResourceConsumed);

    boolean present_jobName = true && (isSetJobName());
    list.add(present_jobName);
    if (present_jobName)
      list.add(jobName);

    boolean present_workingDir = true && (isSetWorkingDir());
    list.add(present_workingDir);
    if (present_workingDir)
      list.add(workingDir);

    boolean present_stdOut = true && (isSetStdOut());
    list.add(present_stdOut);
    if (present_stdOut)
      list.add(stdOut);

    boolean present_stdErr = true && (isSetStdErr());
    list.add(present_stdErr);
    if (present_stdErr)
      list.add(stdErr);

    boolean present_exitCode = true && (isSetExitCode());
    list.add(present_exitCode);
    if (present_exitCode)
      list.add(exitCode);

    return list.hashCode();
  }

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

    int lastComparison = 0;

    lastComparison = Boolean.valueOf(isSetJobId()).compareTo(other.isSetJobId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobId, other.jobId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetTaskId()).compareTo(other.isSetTaskId());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetTaskId()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.taskId, other.taskId);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    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(isSetJobDescription()).compareTo(other.isSetJobDescription());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobDescription()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobDescription, other.jobDescription);
      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(isSetJobStatus()).compareTo(other.isSetJobStatus());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobStatus()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobStatus, other.jobStatus);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetComputeResourceConsumed()).compareTo(other.isSetComputeResourceConsumed());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetComputeResourceConsumed()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.computeResourceConsumed, other.computeResourceConsumed);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetJobName()).compareTo(other.isSetJobName());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetJobName()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.jobName, other.jobName);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetWorkingDir()).compareTo(other.isSetWorkingDir());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetWorkingDir()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.workingDir, other.workingDir);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetStdOut()).compareTo(other.isSetStdOut());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStdOut()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.stdOut, other.stdOut);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetStdErr()).compareTo(other.isSetStdErr());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetStdErr()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.stdErr, other.stdErr);
      if (lastComparison != 0) {
        return lastComparison;
      }
    }
    lastComparison = Boolean.valueOf(isSetExitCode()).compareTo(other.isSetExitCode());
    if (lastComparison != 0) {
      return lastComparison;
    }
    if (isSetExitCode()) {
      lastComparison = org.apache.thrift.TBaseHelper.compareTo(this.exitCode, other.exitCode);
      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("JobModel(");
    boolean first = true;

    sb.append("jobId:");
    if (this.jobId == null) {
      sb.append("null");
    } else {
      sb.append(this.jobId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("taskId:");
    if (this.taskId == null) {
      sb.append("null");
    } else {
      sb.append(this.taskId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("processId:");
    if (this.processId == null) {
      sb.append("null");
    } else {
      sb.append(this.processId);
    }
    first = false;
    if (!first) sb.append(", ");
    sb.append("jobDescription:");
    if (this.jobDescription == null) {
      sb.append("null");
    } else {
      sb.append(this.jobDescription);
    }
    first = false;
    if (isSetCreationTime()) {
      if (!first) sb.append(", ");
      sb.append("creationTime:");
      sb.append(this.creationTime);
      first = false;
    }
    if (isSetJobStatus()) {
      if (!first) sb.append(", ");
      sb.append("jobStatus:");
      if (this.jobStatus == null) {
        sb.append("null");
      } else {
        sb.append(this.jobStatus);
      }
      first = false;
    }
    if (isSetComputeResourceConsumed()) {
      if (!first) sb.append(", ");
      sb.append("computeResourceConsumed:");
      if (this.computeResourceConsumed == null) {
        sb.append("null");
      } else {
        sb.append(this.computeResourceConsumed);
      }
      first = false;
    }
    if (isSetJobName()) {
      if (!first) sb.append(", ");
      sb.append("jobName:");
      if (this.jobName == null) {
        sb.append("null");
      } else {
        sb.append(this.jobName);
      }
      first = false;
    }
    if (isSetWorkingDir()) {
      if (!first) sb.append(", ");
      sb.append("workingDir:");
      if (this.workingDir == null) {
        sb.append("null");
      } else {
        sb.append(this.workingDir);
      }
      first = false;
    }
    if (isSetStdOut()) {
      if (!first) sb.append(", ");
      sb.append("stdOut:");
      if (this.stdOut == null) {
        sb.append("null");
      } else {
        sb.append(this.stdOut);
      }
      first = false;
    }
    if (isSetStdErr()) {
      if (!first) sb.append(", ");
      sb.append("stdErr:");
      if (this.stdErr == null) {
        sb.append("null");
      } else {
        sb.append(this.stdErr);
      }
      first = false;
    }
    if (isSetExitCode()) {
      if (!first) sb.append(", ");
      sb.append("exitCode:");
      sb.append(this.exitCode);
      first = false;
    }
    sb.append(")");
    return sb.toString();
  }

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

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

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

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

    // check for sub-struct validity
    if (jobStatus != null) {
      jobStatus.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 JobModelStandardSchemeFactory implements SchemeFactory {
    public JobModelStandardScheme getScheme() {
      return new JobModelStandardScheme();
    }
  }

  private static class JobModelStandardScheme extends StandardScheme<JobModel> {

    public void read(org.apache.thrift.protocol.TProtocol iprot, JobModel 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: // JOB_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobId = iprot.readString();
              struct.setJobIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 2: // TASK_ID
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.taskId = iprot.readString();
              struct.setTaskIdIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 3: // 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 4: // JOB_DESCRIPTION
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobDescription = iprot.readString();
              struct.setJobDescriptionIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 5: // 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 6: // JOB_STATUS
            if (schemeField.type == org.apache.thrift.protocol.TType.STRUCT) {
              struct.jobStatus = new org.apache.airavata.model.status.JobStatus();
              struct.jobStatus.read(iprot);
              struct.setJobStatusIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 7: // COMPUTE_RESOURCE_CONSUMED
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.computeResourceConsumed = iprot.readString();
              struct.setComputeResourceConsumedIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 8: // JOB_NAME
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.jobName = iprot.readString();
              struct.setJobNameIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 9: // WORKING_DIR
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.workingDir = iprot.readString();
              struct.setWorkingDirIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 10: // STD_OUT
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.stdOut = iprot.readString();
              struct.setStdOutIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 11: // STD_ERR
            if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
              struct.stdErr = iprot.readString();
              struct.setStdErrIsSet(true);
            } else { 
              org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
            }
            break;
          case 12: // EXIT_CODE
            if (schemeField.type == org.apache.thrift.protocol.TType.I32) {
              struct.exitCode = iprot.readI32();
              struct.setExitCodeIsSet(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, JobModel struct) throws org.apache.thrift.TException {
      struct.validate();

      oprot.writeStructBegin(STRUCT_DESC);
      if (struct.jobId != null) {
        oprot.writeFieldBegin(JOB_ID_FIELD_DESC);
        oprot.writeString(struct.jobId);
        oprot.writeFieldEnd();
      }
      if (struct.taskId != null) {
        oprot.writeFieldBegin(TASK_ID_FIELD_DESC);
        oprot.writeString(struct.taskId);
        oprot.writeFieldEnd();
      }
      if (struct.processId != null) {
        oprot.writeFieldBegin(PROCESS_ID_FIELD_DESC);
        oprot.writeString(struct.processId);
        oprot.writeFieldEnd();
      }
      if (struct.jobDescription != null) {
        oprot.writeFieldBegin(JOB_DESCRIPTION_FIELD_DESC);
        oprot.writeString(struct.jobDescription);
        oprot.writeFieldEnd();
      }
      if (struct.isSetCreationTime()) {
        oprot.writeFieldBegin(CREATION_TIME_FIELD_DESC);
        oprot.writeI64(struct.creationTime);
        oprot.writeFieldEnd();
      }
      if (struct.jobStatus != null) {
        if (struct.isSetJobStatus()) {
          oprot.writeFieldBegin(JOB_STATUS_FIELD_DESC);
          struct.jobStatus.write(oprot);
          oprot.writeFieldEnd();
        }
      }
      if (struct.computeResourceConsumed != null) {
        if (struct.isSetComputeResourceConsumed()) {
          oprot.writeFieldBegin(COMPUTE_RESOURCE_CONSUMED_FIELD_DESC);
          oprot.writeString(struct.computeResourceConsumed);
          oprot.writeFieldEnd();
        }
      }
      if (struct.jobName != null) {
        if (struct.isSetJobName()) {
          oprot.writeFieldBegin(JOB_NAME_FIELD_DESC);
          oprot.writeString(struct.jobName);
          oprot.writeFieldEnd();
        }
      }
      if (struct.workingDir != null) {
        if (struct.isSetWorkingDir()) {
          oprot.writeFieldBegin(WORKING_DIR_FIELD_DESC);
          oprot.writeString(struct.workingDir);
          oprot.writeFieldEnd();
        }
      }
      if (struct.stdOut != null) {
        if (struct.isSetStdOut()) {
          oprot.writeFieldBegin(STD_OUT_FIELD_DESC);
          oprot.writeString(struct.stdOut);
          oprot.writeFieldEnd();
        }
      }
      if (struct.stdErr != null) {
        if (struct.isSetStdErr()) {
          oprot.writeFieldBegin(STD_ERR_FIELD_DESC);
          oprot.writeString(struct.stdErr);
          oprot.writeFieldEnd();
        }
      }
      if (struct.isSetExitCode()) {
        oprot.writeFieldBegin(EXIT_CODE_FIELD_DESC);
        oprot.writeI32(struct.exitCode);
        oprot.writeFieldEnd();
      }
      oprot.writeFieldStop();
      oprot.writeStructEnd();
    }

  }

  private static class JobModelTupleSchemeFactory implements SchemeFactory {
    public JobModelTupleScheme getScheme() {
      return new JobModelTupleScheme();
    }
  }

  private static class JobModelTupleScheme extends TupleScheme<JobModel> {

    @Override
    public void write(org.apache.thrift.protocol.TProtocol prot, JobModel struct) throws org.apache.thrift.TException {
      TTupleProtocol oprot = (TTupleProtocol) prot;
      oprot.writeString(struct.jobId);
      oprot.writeString(struct.taskId);
      oprot.writeString(struct.processId);
      oprot.writeString(struct.jobDescription);
      BitSet optionals = new BitSet();
      if (struct.isSetCreationTime()) {
        optionals.set(0);
      }
      if (struct.isSetJobStatus()) {
        optionals.set(1);
      }
      if (struct.isSetComputeResourceConsumed()) {
        optionals.set(2);
      }
      if (struct.isSetJobName()) {
        optionals.set(3);
      }
      if (struct.isSetWorkingDir()) {
        optionals.set(4);
      }
      if (struct.isSetStdOut()) {
        optionals.set(5);
      }
      if (struct.isSetStdErr()) {
        optionals.set(6);
      }
      if (struct.isSetExitCode()) {
        optionals.set(7);
      }
      oprot.writeBitSet(optionals, 8);
      if (struct.isSetCreationTime()) {
        oprot.writeI64(struct.creationTime);
      }
      if (struct.isSetJobStatus()) {
        struct.jobStatus.write(oprot);
      }
      if (struct.isSetComputeResourceConsumed()) {
        oprot.writeString(struct.computeResourceConsumed);
      }
      if (struct.isSetJobName()) {
        oprot.writeString(struct.jobName);
      }
      if (struct.isSetWorkingDir()) {
        oprot.writeString(struct.workingDir);
      }
      if (struct.isSetStdOut()) {
        oprot.writeString(struct.stdOut);
      }
      if (struct.isSetStdErr()) {
        oprot.writeString(struct.stdErr);
      }
      if (struct.isSetExitCode()) {
        oprot.writeI32(struct.exitCode);
      }
    }

    @Override
    public void read(org.apache.thrift.protocol.TProtocol prot, JobModel struct) throws org.apache.thrift.TException {
      TTupleProtocol iprot = (TTupleProtocol) prot;
      struct.jobId = iprot.readString();
      struct.setJobIdIsSet(true);
      struct.taskId = iprot.readString();
      struct.setTaskIdIsSet(true);
      struct.processId = iprot.readString();
      struct.setProcessIdIsSet(true);
      struct.jobDescription = iprot.readString();
      struct.setJobDescriptionIsSet(true);
      BitSet incoming = iprot.readBitSet(8);
      if (incoming.get(0)) {
        struct.creationTime = iprot.readI64();
        struct.setCreationTimeIsSet(true);
      }
      if (incoming.get(1)) {
        struct.jobStatus = new org.apache.airavata.model.status.JobStatus();
        struct.jobStatus.read(iprot);
        struct.setJobStatusIsSet(true);
      }
      if (incoming.get(2)) {
        struct.computeResourceConsumed = iprot.readString();
        struct.setComputeResourceConsumedIsSet(true);
      }
      if (incoming.get(3)) {
        struct.jobName = iprot.readString();
        struct.setJobNameIsSet(true);
      }
      if (incoming.get(4)) {
        struct.workingDir = iprot.readString();
        struct.setWorkingDirIsSet(true);
      }
      if (incoming.get(5)) {
        struct.stdOut = iprot.readString();
        struct.setStdOutIsSet(true);
      }
      if (incoming.get(6)) {
        struct.stdErr = iprot.readString();
        struct.setStdErrIsSet(true);
      }
      if (incoming.get(7)) {
        struct.exitCode = iprot.readI32();
        struct.setExitCodeIsSet(true);
      }
    }
  }

}

